Changeset: 98edd5aa0196 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=98edd5aa0196 Modified Files: clients/ChangeLog.Feb2013 clients/odbc/driver/ODBCConvert.c clients/odbc/driver/ODBCDesc.h clients/odbc/driver/SQLFetch.c Branch: Feb2013 Log Message:
Implemented retrieving variable-length data in parts with SQLGetData. This fixes bug 3381. diffs (93 lines): diff --git a/clients/ChangeLog.Feb2013 b/clients/ChangeLog.Feb2013 --- a/clients/ChangeLog.Feb2013 +++ b/clients/ChangeLog.Feb2013 @@ -1,3 +1,7 @@ # ChangeLog file for clients # This file is updated with Maddlog +* Fri Oct 4 2013 Sjoerd Mullender <sjo...@acm.org> +- ODBC: Implemented retrieving variable-length data in parts with + SQLGetData. See bug 3381. + diff --git a/clients/odbc/driver/ODBCConvert.c b/clients/odbc/driver/ODBCConvert.c --- a/clients/odbc/driver/ODBCConvert.c +++ b/clients/odbc/driver/ODBCConvert.c @@ -1255,7 +1255,25 @@ ODBCFetch(ODBCStmt *stmt, case SQL_WCHAR: case SQL_WVARCHAR: case SQL_WLONGVARCHAR: - copyString(data, datalen, ptr, buflen, lenp, SQLLEN, addStmtError, stmt, return SQL_ERROR); + if (irdrec->already_returned > datalen) { + data += datalen; + datalen = 0; + } else { + data += irdrec->already_returned; + datalen -= irdrec->already_returned; + } + if (datalen == 0 && irdrec->already_returned != 0) { + /* no more data to return */ + if (type == SQL_C_WCHAR) + free(ptr); + return SQL_NO_DATA; + } + copyString(data, datalen, ptr, buflen, lenp, SQLLEN, + addStmtError, stmt, return SQL_ERROR); + if (datalen < (size_t) buflen) + irdrec->already_returned += datalen; + else + irdrec->already_returned += buflen; break; case SQL_BINARY: case SQL_VARBINARY: @@ -1273,6 +1291,19 @@ ODBCFetch(ODBCStmt *stmt, free(ptr); return SQL_ERROR; } + if (irdrec->already_returned > datalen) { + data += datalen; + datalen = 0; + } else { + data += irdrec->already_returned; + datalen -= irdrec->already_returned; + } + if (datalen == 0 && irdrec->already_returned != 0) { + /* no more data to return */ + if (type == SQL_C_WCHAR) + free(ptr); + return SQL_NO_DATA; + } for (k = 0; k < datalen; k++) { if ('0' <= data[k] && data[k] <= '9') n = data[k] - '0'; @@ -1296,6 +1327,7 @@ ODBCFetch(ODBCStmt *stmt, } else c = n << 4; } + irdrec->already_returned += k; if (lenp) *lenp = j; break; diff --git a/clients/odbc/driver/ODBCDesc.h b/clients/odbc/driver/ODBCDesc.h --- a/clients/odbc/driver/ODBCDesc.h +++ b/clients/odbc/driver/ODBCDesc.h @@ -59,6 +59,7 @@ typedef struct { SQLSMALLINT sql_desc_unnamed; SQLSMALLINT sql_desc_unsigned; SQLSMALLINT sql_desc_updatable; + size_t already_returned; } ODBCDescRec; typedef struct { diff --git a/clients/odbc/driver/SQLFetch.c b/clients/odbc/driver/SQLFetch.c --- a/clients/odbc/driver/SQLFetch.c +++ b/clients/odbc/driver/SQLFetch.c @@ -128,6 +128,9 @@ SQLFetch_(ODBCStmt *stmt) stmt->rowSetSize++; + for (i = 1; i <= ird->sql_desc_count; i++) + ird->descRec[i].already_returned = 0; + for (i = 1; i <= ard->sql_desc_count; i++) { rec = &ard->descRec[i]; if (rec->sql_desc_data_ptr == NULL) _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list