+ 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