[freetds] Specifying a 0 length for the binary data
shiv kumar
shivblore2000 at gmail.com
Thu Nov 23 07:19:42 EST 2006
Hi all,
I have found what the error is because of the below code. The problem is
that eventhough the "len" is "0" during the return, the "length" is assigned
with a value "-4" instead of "0" . Can any one please let me know why this
happening? T(this happening only with AIX). I tried changing "size_t len" to
"TDS_INT len" but it didn't worked.
static TDS_INT
binary_to_result(const void *data, size_t len, CONV_RESULT * cr)
{
cr->ib = (TDS_CHAR *) malloc(len);
test_alloc(cr->ib);
memcpy(cr->ib, data, len);
return len;
}
static TDS_INT
tds_convert_char(int srctype, const TDS_CHAR * src, TDS_UINT srclen,
intdesttype, CONV_RESULT * cr)
{
:
case CASE_ALL_BINARY:
return binary_to_result(src, srclen, cr);
break;
* :*
*}*
* *
TDS_INT
tds_convert(TDSCONTEXT * tds_ctx, int srctype, const TDS_CHAR * src,
TDS_UINT srclen, int desttype, CONV_RESULT * cr)
{
:
case SYBLONGBINARY:
case CASE_ALL_BINARY:
length = tds_convert_binary(srctype, (const TDS_UCHAR *) src,
srclen, desttype, cr);
break;
:
return length;
}
**
*Thanks,*
*Shiva*
> Hi All,
>
> Please find the simplified below code which is giving problem: In the code
> if I replace the "ValSz_ind3 = 8;" to "ValSz_ind3 = 0;" then the
> SQLExecute is returning the SQL_ERROR. Unfortunately after
> this if I call
> "SQLGetDiagRec" it is returning a null empty string. The same code is
> working well with the solaris and unix. I am using the uniXODBC
> 2.2.11version and hopefully I am not building it as 64-bit driver. I
> have tried
> with both FreeTDS0.63 and FreeTDS 0.64 version.
>
> PLEASE HELP.
>
> int spcall (char*)
> {
> int retcode;
> long ValSz_ind1, ValSz_ind2, ValSz_ind3 = 0 ;
> int p1 = 0, p2 = 1;
> char p3[32];
> retcode = SQLFreeStmt(hstmt1, SQL_CLOSE);
> retcode = HandleError( hstmt1, 2, retcode);
> retcode = SQLFreeStmt(hstmt1, SQL_UNBIND);
> retcode = HandleError( hstmt1, 2, retcode);
> retcode = SQLPrepare (hstmt1, (SQLCHAR *) "{ ? = CALL RPC_Read
(> ?, ? ) }" , SQL_NTS);
> if(!HandleError(hstmt1, 2, retcode))
> return 65302;
> retcode = SQLBindParameter(hstmt1, 1, SQL_PARAM_OUTPUT /*>
SQL_RETURN_VALUE */, SQL_C_LONG, SQL_INTEGER, 0, 0, (SQLPOINTER)&p1, 0,
&ValSz_ind1);
> if(!HandleError(hstmt1, 2, retcode))
> return 65302;
> retcode = SQLBindParameter(hstmt1, 2, SQL_PARAM_INPUT /*
SQL_RETURN_VALUE */, SQL_C_LONG, SQL_INTEGER, 0, 0, (SQLPOINTER)&p2,
0,&ValSz_ind2);
> if(!HandleError(hstmt1, 2, retcode))
> return 65302;
> ValSz_ind3 = 8; // If I specify this a
> retcode = SQLBindParameter(hstmt1, 3,
SQL_PARAM_INPUT, SQL_C_BINARY, SQL_VARBINARY, 8, 0 , p3, 8, &ValSz_ind3);
> if(!HandleError(hstmt1, 2, retcode))
> return 65302;
> retcode = SQLExecute(hstmt1);
> if(!HandleError(hstmt1, 2, retcode))
> return 65302;
> retcode = SQLFetch(hstmt1);
> return 0;
>}
More information about the FreeTDS
mailing list