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

Reply via email to