123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191 |
- #include <grass/dbmi.h>
- #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);
- }
|