+ 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 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");

View File

@ -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

View File

@ -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)