+ 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 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");
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Loading…
Reference in New Issue