diff --git a/scsh/odbc/odbc.c b/scsh/odbc/odbc.c index eb285b9..3d2361e 100644 --- a/scsh/odbc/odbc.c +++ b/scsh/odbc/odbc.c @@ -243,7 +243,7 @@ s48_value odbc_sql_connect(s48_value connection_handle, */ /* Returns a list of available data sources. */ -s48_value odbc_sql_data_sources(s48_value env_handle, s48_value direction) +s48_value odbc_sql_data_sources(s48_value env_handle) { SQLHENV eh; @@ -257,7 +257,6 @@ s48_value odbc_sql_data_sources(s48_value env_handle, s48_value direction) int first; eh = (SQLHENV) s48_extract_integer(env_handle); - dir = (SQLUSMALLINT) s48_extract_integer(direction); ODBC_DEBUG_PRINTF("odbc_sql_data_sources\n"); @@ -267,7 +266,7 @@ s48_value odbc_sql_data_sources(s48_value env_handle, s48_value direction) while (1) { retval = SQLDataSources(eh, - (first ? dir : SQL_FETCH_NEXT), + (first ? SQL_FETCH_FIRST : SQL_FETCH_NEXT), server_name, SQL_MAX_DSN_LENGTH+1, &server_name_len, driver_descr, ODBC_MAX_DRIVER_NAME_LEN, &driver_descr_len); first = 0; @@ -1607,6 +1606,122 @@ s48_value odbc_sql_fetch(s48_value stmt_handle) } } +s48_value odbc_sql_num_result_cols(s48_value stmt_handle) +{ + + SQLHSTMT sh; + SQLSMALLINT numcols; + SQLRETURN retval; + + ODBC_DEBUG_PRINTF("odbc_sql_num_result_cols\n"); + + sh = (SQLHSTMT) s48_extract_integer(stmt_handle); + + retval = SQLNumResultCols(sh, &numcols); + + switch (retval) + { + case SQL_SUCCESS: case SQL_SUCCESS_WITH_INFO: + { + if (retval == SQL_SUCCESS_WITH_INFO) + ODBC_DEBUG_DIAGREC(SQL_HANDLE_STMT, sh); + + return s48_enter_integer(numcols); + } + case SQL_STILL_EXECUTING: + { + ODBC_RAISE_EXCEPTION("SQLNumResultCols returned SQL_STILL_EXECUTING, not yet implemented"); + break; + } + case SQL_ERROR: + { + ODBC_DEBUG_DIAGREC(SQL_HANDLE_STMT, sh); + ODBC_RAISE_EXCEPTION("SQLNumResultCols returned SQL_ERROR"); + break; + } + case SQL_INVALID_HANDLE: + { + ODBC_RAISE_EXCEPTION("SQLNumResultCols got invalid handle"); + break; + } + default: + { + ODBC_RAISE_EXCEPTION("SQLNumResultCols returned unknown error code"); + break; + } + } +} + +s48_value odbc_sql_describe_col(s48_value stmt_handle, s48_value column_number) +{ + + SQLHSTMT sh; + SQLSMALLINT cn; + SQLCHAR column_name[ODBC_DESCRIBE_COL_MAX_STR_LEN]; + SQLSMALLINT buf_len, data_type, digits, nullable; + SQLUINTEGER col_size; + s48_value col_rec; + SQLRETURN retval; + + ODBC_DEBUG_PRINTF("odbc_sql_describe_col\n"); + + sh = (SQLHSTMT) s48_extract_integer(stmt_handle); + cn = (SQLSMALLINT) s48_extract_integer(column_number); + + retval = SQLDescribeCol(sh, cn, + column_name, + ODBC_DESCRIBE_COL_MAX_STR_LEN - 1, + &buf_len, + &data_type, + &col_size, + &digits, + &nullable); + + switch (retval) + { + case SQL_SUCCESS: case SQL_SUCCESS_WITH_INFO: + { + if (retval == SQL_SUCCESS_WITH_INFO) + ODBC_DEBUG_DIAGREC(SQL_HANDLE_STMT, sh); + + col_rec = s48_make_record(odbc_column_record_type); + S48_RECORD_SET(col_rec, SR_ODBC_COLUMN_NAME, + s48_enter_string(column_name)); + S48_RECORD_SET(col_rec, SR_ODBC_COLUMN_TYPE, + s48_enter_integer(data_type)); + S48_RECORD_SET(col_rec, SR_ODBC_COLUMN_SIZE, + s48_enter_integer(col_size)); + S48_RECORD_SET(col_rec, SR_ODBC_COLUMN_DIGITS, + s48_enter_integer(digits)); + S48_RECORD_SET(col_rec, SR_ODBC_COLUMN_NULLABLE, + s48_enter_integer(nullable)); + + return col_rec; + } + case SQL_STILL_EXECUTING: + { + ODBC_RAISE_EXCEPTION("SQLDescribeCol returned SQL_STILL_EXECUTING, not yet implemented"); + break; + } + case SQL_ERROR: + { + ODBC_DEBUG_DIAGREC(SQL_HANDLE_STMT, sh); + ODBC_RAISE_EXCEPTION("SQLDescribeCol returned SQL_ERROR"); + break; + } + case SQL_INVALID_HANDLE: + { + ODBC_RAISE_EXCEPTION("SQLDescribeCol got invalid handle"); + break; + } + default: + { + ODBC_RAISE_EXCEPTION("SQLDescribeCol returned unknown error code"); + break; + } + } +} + /* * * PART 8 @@ -2108,6 +2223,8 @@ void s48_init_odbc(void) /* PART 7 */ S48_EXPORT_FUNCTION(odbc_sql_get_data); S48_EXPORT_FUNCTION(odbc_sql_fetch); + S48_EXPORT_FUNCTION(odbc_sql_num_result_cols); + S48_EXPORT_FUNCTION(odbc_sql_describe_col); /* PART 8 */