#include #include "odbc.h" #include "globals.h" #include "proto.h" int db__driver_fetch(cn, position, more) dbCursor *cn; int position; int *more; { cursor *c; dbToken token; dbTable *table; dbColumn *column; dbValue *value; int col, ncols; SQLINTEGER len; int htype, sqltype, ctype; SQLRETURN ret; DATE_STRUCT date; TIME_STRUCT time; TIMESTAMP_STRUCT timestamp; /* get cursor token */ token = db_get_cursor_token(cn); /* get the cursor by its token */ if (!(c = (cursor *) db_find_token(token))) { db_error("cursor not found"); return DB_FAILED; } /* fetch on position */ switch (position) { case DB_NEXT: ret = SQLFetchScroll( c->stmt, SQL_FETCH_NEXT, 0 ); break; case DB_CURRENT: ret = SQLFetchScroll( c->stmt, SQL_FETCH_RELATIVE, 0 ); break; case DB_PREVIOUS: ret = SQLFetchScroll( c->stmt, SQL_FETCH_PRIOR , 0 ); break; case DB_FIRST: ret = SQLFetchScroll( c->stmt, SQL_FETCH_FIRST, 0 ); break; case DB_LAST: ret = SQLFetchScroll( c->stmt, SQL_FETCH_LAST, 0 ); break; default: return DB_FAILED; }; if ( ret == SQL_NO_DATA ) { *more = 0; return DB_OK; } if ( ! SQL_SUCCEEDED( ret )) { return DB_FAILED; } *more = 1; /* get the data out of the descriptor into the table */ table = db_get_cursor_table(cn); ncols = db_get_table_number_of_columns (table); for (col = 1; col <= ncols; col++) { column = db_get_table_column (table, col-1); value = db_get_column_value (column); db_free_string (&value->s); /* Is null? */ SQLGetData( c->stmt, col, SQL_C_CHAR, NULL, 0, &len ); if ( len == SQL_NULL_DATA ) { value->isNull = 1; continue; } else value->isNull = 0; sqltype = db_get_column_sqltype(column); ctype = db_sqltype_to_Ctype(sqltype); htype = db_get_column_host_type(column); switch (ctype) { case DB_C_TYPE_STRING: if (htype == SQL_CHAR) { len=db_get_column_length (column); db_enlarge_string (&value->s, len+1); ret = SQLGetData( c->stmt, col, SQL_C_CHAR, value->s.string, len+1, NULL ); } else if ( htype == SQL_VARCHAR) { ret = SQLGetData( c->stmt, col, SQL_C_CHAR, NULL, 0, &len ); db_enlarge_string (&value->s, len+1); ret = SQLGetData( c->stmt, col, SQL_C_CHAR, value->s.string, len+1, NULL ); } else { /* now the same as SQL_VARCHAR, could differ for other htype ? */ ret = SQLGetData( c->stmt, col, SQL_C_CHAR, NULL, 0, &len ); db_enlarge_string (&value->s, len+1); ret = SQLGetData( c->stmt, col, SQL_C_CHAR, value->s.string, len+1, NULL ); } break; case DB_C_TYPE_INT: ret = SQLGetData( c->stmt, col, SQL_C_LONG, &value->i, sizeof( value->i ), NULL ); break; case DB_C_TYPE_DOUBLE: ret = SQLGetData( c->stmt, col, SQL_C_DOUBLE, &value->d, sizeof( value->d ), NULL ); break; case DB_C_TYPE_DATETIME: switch( sqltype ) { case DB_SQL_TYPE_DATE: ret = SQLGetData( c->stmt, col, SQL_C_TYPE_DATE, &date, sizeof( date ), NULL ); value->t.year = date.year; value->t.month = date.month; value->t.day = date.day; value->t.hour = 0; value->t.minute = 0; value->t.seconds = 0.0; break; case DB_SQL_TYPE_TIME: ret = SQLGetData( c->stmt, col, SQL_C_TYPE_TIME, &time, sizeof( time ), NULL ); value->t.year = 0; value->t.month = 0; value->t.day = 0; value->t.hour = time.hour; value->t.minute = time.minute; value->t.seconds = time.second; break; case DB_SQL_TYPE_TIMESTAMP: ret = SQLGetData( c->stmt, col, SQL_C_TYPE_TIMESTAMP, ×tamp, sizeof( timestamp ), NULL ); value->t.year = timestamp.year; value->t.month = timestamp.month; value->t.day = timestamp.day; value->t.hour = timestamp.hour; value->t.minute = timestamp.minute; value->t.seconds = timestamp.second; break; /* case DB_SQL_TYPE_INTERVAL: break; default: break; */ } default: len=db_get_column_length (column); db_enlarge_string (&value->s, len+1); ret = SQLGetData( c->stmt, col, SQL_C_CHAR, value->s.string, len+1, NULL ); break; } } return DB_OK; } int db__driver_get_num_rows (cn ) dbCursor *cn; { cursor *c; dbToken token; /* get cursor token */ token = db_get_cursor_token(cn); /* get the cursor by its token */ if (!(c = (cursor *) db_find_token(token))) { db_error("cursor not found"); return DB_FAILED; } return ( c->nrows ); }