+ 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:
parent
ce96216d41
commit
41d219a5c1
|
@ -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");
|
||||
|
|
|
@ -5,6 +5,12 @@
|
|||
|
||||
#include <sql.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
|
||||
|
||||
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue