1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114
|
/**************************************************
* _GetData
*
**************************************************
* This code was created by Peter Harvey @ CodeByDesign.
* Released under LGPL 31.JAN.99
*
* Contributions from...
* -----------------------------------------------
* Peter Harvey - pharvey@codebydesign.com
**************************************************/
#include <config.h>
#include "driver.h"
SQLRETURN _GetData( SQLHSTMT hDrvStmt,
SQLUSMALLINT nCol,
SQLSMALLINT nTargetType, /* C DATA TYPE */
SQLPOINTER pTarget,
SQLINTEGER nTargetLength,
SQLINTEGER *pnLengthOrIndicator )
{
HDRVSTMT hStmt = (HDRVSTMT)hDrvStmt;
char *pSourceData = NULL;
/* SANITY CHECKS */
if ( hStmt == SQL_NULL_HSTMT )
return SQL_INVALID_HANDLE;
if ( hStmt->hStmtExtras == SQL_NULL_HSTMT )
return SQL_INVALID_HANDLE;
if ( hStmt->hStmtExtras->nRows == 0 )
{
logPushMsg( hStmt->hLog, __FILE__, __FILE__, __LINE__, LOG_WARNING, LOG_WARNING, "SQL_ERROR No result set." );
return SQL_ERROR;
}
/**********************************************************************
* GET pSourceData FOR NORMAL RESULT SETS
**********************************************************************/
if ( hStmt->hStmtExtras->nRow > hStmt->hStmtExtras->nRows || hStmt->hStmtExtras->nRow < 1 )
{
logPushMsg( hStmt->hLog, __FILE__, __FILE__, __LINE__, LOG_WARNING, LOG_WARNING, "SQL_ERROR No current row" );
return SQL_ERROR;
}
pSourceData = (hStmt->hStmtExtras->aResults)[hStmt->hStmtExtras->nRow*hStmt->hStmtExtras->nCols+nCol];
/****************************
* ALL cols are stored as SQL_CHAR... bad for storage... good for code
* SO no need to determine the source type when translating to destination
***************************/
if ( pSourceData == NULL )
{
/*********************
* Now get the col if value = NULL
*********************/
if ( pnLengthOrIndicator != NULL )
*pnLengthOrIndicator = SQL_NULL_DATA;
switch ( nTargetType )
{
case SQL_C_LONG:
memset( pTarget, 0, sizeof(int) );
break;
case SQL_C_FLOAT:
memset( pTarget, 0, sizeof(float) );
break;
case SQL_C_CHAR:
*((char *)pTarget) = '\0';
break;
default:
sprintf( hStmt->szSqlMsg, "SQL_ERROR Unknown target type %d", nTargetType );
logPushMsg( hStmt->hLog, __FILE__, __FILE__, __LINE__, LOG_WARNING, LOG_WARNING, hStmt->szSqlMsg );
}
}
else
{
/*********************
* Now get the col when we have a value
*********************/
switch ( nTargetType )
{
case SQL_C_LONG:
*((int *)pTarget) = atoi(pSourceData);
if ( NULL != pnLengthOrIndicator )
*pnLengthOrIndicator = sizeof( int );
break;
case SQL_C_FLOAT:
sscanf( pSourceData, "%g", pTarget );
if ( NULL != pnLengthOrIndicator )
*pnLengthOrIndicator = sizeof( float );
break;
case SQL_C_CHAR:
strncpy( pTarget, pSourceData, nTargetLength );
if ( NULL != pnLengthOrIndicator )
*pnLengthOrIndicator = strlen(pTarget);
break;
default:
sprintf( hStmt->szSqlMsg, "SQL_ERROR Unknown target type %d", nTargetType );
logPushMsg( hStmt->hLog, __FILE__, __FILE__, __LINE__, LOG_WARNING, LOG_WARNING, hStmt->szSqlMsg );
}
}
logPushMsg( hStmt->hLog, __FILE__, __FILE__, __LINE__, LOG_INFO, LOG_INFO, "SQL_SUCCESS" );
return SQL_SUCCESS;
}
|