+ define SQLLEN if not defined (libiodbc on OS X doesn't have it)

+ new (less, but still) broken version of SQLGetData()
This commit is contained in:
eknauel 2002-10-05 18:00:59 +00:00
parent ce96216d41
commit 41d219a5c1
3 changed files with 26 additions and 25 deletions

View File

@ -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 odbc_sql_get_data(s48_value stmt_handle, s48_value column_number,
s48_value column_number, s48_value target_type, s48_value buffer_size)
s48_value target_type)
{ {
SQLHSTMT sh; SQLHSTMT sh;
SQLUSMALLINT cn; SQLUSMALLINT cn, bl;
SQLSMALLINT tt; SQLSMALLINT tt;
SQLRETURN retval; SQLRETURN retval;
SQLINTEGER buffer_needed, buffer_len = ODBC_RETVAL_BUFFER_INITIAL_SIZE; SQLINTEGER buffer_needed;
void *buffer = NULL; void *buffer = NULL;
s48_value result = S48_UNSPECIFIC;
S48_DECLARE_GC_PROTECT(1);
sh = (SQLHSTMT) s48_extract_integer(stmt_handle); sh = (SQLHSTMT) s48_extract_integer(stmt_handle);
cn = (SQLUSMALLINT) s48_extract_integer(column_number); cn = (SQLUSMALLINT) s48_extract_integer(column_number);
tt = (SQLSMALLINT) s48_extract_integer(target_type); 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_size, sizeof_sql_c_type_identifier(tt));
{ retval = SQLGetData(sh, cn, tt, buffer, buffer_size, &buffer_needed);
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;
}
switch (retval) switch (retval)
{ {
case SQL_SUCCESS: case SQL_SUCCESS_WITH_INFO: 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); free(buffer);
return res; S48_GC_UNPROTECT();
return result;
} }
case SQL_NO_DATA: case SQL_NO_DATA:
ODBC_RAISE_EXCEPTION("SQLGetData returned SQL_NO_DATA"); ODBC_RAISE_EXCEPTION("SQLGetData returned SQL_NO_DATA");

View File

@ -5,6 +5,12 @@
#include <sql.h> #include <sql.h>
#include <sqlext.h> #include <sqlext.h>
#include <sqltypes.h>
/* darwin 6.1 sql header files do not define SQLLEN */
#ifndef SQLLEN
#define SQLLEN SQLINTEGER
#endif
#define ERROR_MSG_BUFFER_LEN 255 #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_row_count(s48_value stmt_handle);
s48_value odbc_sql_get_data(s48_value stmt_handle, s48_value odbc_sql_get_data(s48_value stmt_handle, s48_value column_number,
s48_value column_number, s48_value target_type, s48_value buffer_size);
s48_value target_type);
/* Positions a cursor within a fetched block of data and allows an application /* 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 to refresh data in the rowset or to update or delete data in the result

View File

@ -763,13 +763,13 @@
(stmt-handle) (stmt-handle)
"odbc_sql_row_count") "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) (check-arg statement-handle? stmt-handle odbc-sql-get-data)
(odbc-sql-get-data-internal (statement-handle-handle stmt-handle) (odbc-sql-get-data-internal (statement-handle-handle stmt-handle)
column-number target-type)) column-number target-type))
(import-lambda-definition odbc-sql-get-data-internal (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") "odbc_sql_get_data")
(define (odbc-sql-set-pos stmt-handle row-number operation lock-type) (define (odbc-sql-set-pos stmt-handle row-number operation lock-type)