diff --git a/scsh/odbc/odbc.c b/scsh/odbc/odbc.c index 5133f61..b99051b 100644 --- a/scsh/odbc/odbc.c +++ b/scsh/odbc/odbc.c @@ -1830,43 +1830,39 @@ s48_value odbc_sql_row_count(s48_value stmt_handle) } } -s48_value odbc_sql_get_data(s48_value stmt_handle, - s48_value column_number, - s48_value target_type) +s48_value odbc_sql_get_data(s48_value stmt_handle, s48_value column_number, + s48_value target_type, s48_value buffer_size) + { - SQLHSTMT sh; - SQLUSMALLINT cn; + SQLUSMALLINT cn, bl; SQLSMALLINT tt; SQLRETURN retval; - SQLINTEGER buffer_needed, buffer_len = ODBC_RETVAL_BUFFER_INITIAL_SIZE; + SQLINTEGER buffer_needed; void *buffer = NULL; + s48_value result = S48_UNSPECIFIC; + S48_DECLARE_GC_PROTECT(1); sh = (SQLHSTMT) s48_extract_integer(stmt_handle); cn = (SQLUSMALLINT) s48_extract_integer(column_number); tt = (SQLSMALLINT) s48_extract_integer(target_type); + bl = (SQLUSMALLINT) s48_extract_integer(buffer_size); - ODBC_DEBUG_PRINTF_4("odbc_sql_get_data() sh:%x cn:%d tt:%d\n", sh, cn, tt); + ODBC_DEBUG_PRINTF_5("odbc_sql_get_data() sh:%x cn:%d tt:%d bl:%d\n", sh, cn, tt, bl); - for (;;) - { - odbc_sql_alloc((void **) &buffer, buffer_len, - sizeof_sql_c_type_identifier(tt)); - retval = SQLGetData(sh, cn, tt, buffer, - buffer_len, &buffer_needed); - if (ODBC_SUCCESS(retval) && (buffer_needed > buffer_len)) - buffer_len = buffer_needed+1; - else - break; - } + odbc_sql_alloc((void **) &buffer, buffer_size, sizeof_sql_c_type_identifier(tt)); + retval = SQLGetData(sh, cn, tt, buffer, buffer_size, &buffer_needed); switch (retval) { case SQL_SUCCESS: case SQL_SUCCESS_WITH_INFO: { - s48_value res = buffer_to_s48_value(buffer, tt); + S48_GC_PROTECT_1(result); + result = s48_cons(buffer_to_s48_value(buffer, tt), + s48_enter_integer(buffer_needed)); free(buffer); - return res; + S48_GC_UNPROTECT(); + return result; } case SQL_NO_DATA: ODBC_RAISE_EXCEPTION("SQLGetData returned SQL_NO_DATA"); diff --git a/scsh/odbc/odbc.h b/scsh/odbc/odbc.h index 1757c0f..f812b18 100644 --- a/scsh/odbc/odbc.h +++ b/scsh/odbc/odbc.h @@ -5,6 +5,12 @@ #include #include +#include + +/* darwin 6.1 sql header files do not define SQLLEN */ +#ifndef SQLLEN +#define SQLLEN SQLINTEGER +#endif #define ERROR_MSG_BUFFER_LEN 255 @@ -317,9 +323,8 @@ s48_value odbc_sql_num_params(s48_value stmt_handle); s48_value odbc_sql_row_count(s48_value stmt_handle); -s48_value odbc_sql_get_data(s48_value stmt_handle, - s48_value column_number, - s48_value target_type); +s48_value odbc_sql_get_data(s48_value stmt_handle, s48_value column_number, + s48_value target_type, s48_value buffer_size); /* Positions a cursor within a fetched block of data and allows an application to refresh data in the rowset or to update or delete data in the result diff --git a/scsh/odbc/odbc.scm b/scsh/odbc/odbc.scm index 7329b12..fb00f22 100644 --- a/scsh/odbc/odbc.scm +++ b/scsh/odbc/odbc.scm @@ -763,13 +763,13 @@ (stmt-handle) "odbc_sql_row_count") -(define (odbc-sql-get-data stmt-handle column-number target-type) +(define (odbc-sql-get-data stmt-handle column-number target-type buffer-size) (check-arg statement-handle? stmt-handle odbc-sql-get-data) (odbc-sql-get-data-internal (statement-handle-handle stmt-handle) column-number target-type)) (import-lambda-definition odbc-sql-get-data-internal - (stmt-handle column-number target-type) + (stmt-handle column-number target-type buffer-size) "odbc_sql_get_data") (define (odbc-sql-set-pos stmt-handle row-number operation lock-type)