+ 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