Re: SQLGetData() returns TEXT length minus one on Solaris 64b with SQL Server 2005
Sebastien FLAESCH <[email protected]>
| Newsgroups | gmane.comp.db.tds.freetds |
|---|---|
| Organization | Four Js Development Tools |
| Message-ID | <[email protected]> |
Hi Frediano,
FYI, we use a single-byte encoding (LANG=POSIX) ...
Here is the code we use, nothing particular, this is the same code we
use for different ODBC drivers...
#define BLOB_BLOCK_SIZE 4096
....
static SQLRETURN getBlobPieces(SqlStatement * st, SQLUSMALLINT fpos,
SQLSMALLINT ctype, MyLocator * loc,
FILE * out, SQLLEN * plen)
{
SQLRETURN r = 0;
char buf[BLOB_BLOCK_SIZE];
SQLLEN len;
int i = 0;
while (1) {
r = SQLGetData(st->stmtHandle, fpos, ctype,
(SQLPOINTER) buf, sizeof(buf), &len);
if (!SQL_SUCCEEDED(r) || len == 0 || len == SQL_NULL_DATA)
break;
if (len > (SQLLEN) sizeof(buf) || len == SQL_NO_TOTAL)
len = sizeof(buf);
/* Char data piece get \0, these must be removed! */
if (ctype == SQL_C_CHAR) {
if (buf[len - 1] == '\0') {
len--;
}
}
fwrite(buf, 1, len, out);
}
*plen = len;
return r;
}
Am I missusing SQLGetData()? As you can see, I modify the len after
Does this affect the next call to SQLGetData()?
Anyway, the INITIAL len returned by SQLGetData() is for sure:
(total-bytes - 1)
When using UTF-8, I get SQL_NO_TOTAL in the first call, but in ASCII,
I get the (total size - 1)...
Seb
On 02/02/2013 08:52 AM, Frediano Ziglio wrote:
> Il giorno 31/gen/2013, alle ore 14:28, Sebastien FLAESCH<[email protected]> ha scritto:
>
>> Hi all,
>>
>> Context:
>>
>> $ uname -a
>> SunOS s64x100 5.10 Generic_120012-14 i86pc i386 i86pc
>>
>> FreeTDS versions tested:
>> - freetds-0.92.dev.20120312
>> - freetds-dev.0.92.377
>>
>> When fetching a TEXT from the database (SQL Server 2005), using SQL_DATA_AT_EXEC,
>> it appears that the SQLGetData() function returns the size of the text data,
>> minus one...
>>
>> I have tested the same FreeTDS version on a Linux 32b, and SQLGetData() returns
>> the correct length as expected...
>>
>
> Strange! How do you read the length?
>
>> I will continue to investigate, but I wanted to ask if this is a know issue.
>>
>> When connecting to SQL Server 2008 R2, this does not occur, because SQLGetData()
>> returns SQL_NO_TOTAL and we fetch text pieces in a different way...
>>
>
> This is done to deal with different encodings.
>
>> Thanks
>> Seb
>
> Frediano
>
> _______________________________________________
> FreeTDS mailing list
> [email protected]
> http://lists.ibiblio.org/mailman/listinfo/freetds
>