00001 #include <stdlib.h>
00002 #include <grass/dbmi.h>
00003
00010 void
00011 db_init_cursor ( dbCursor *cursor)
00012 {
00013 cursor->driver = NULL;
00014 cursor->token = -1;
00015 cursor->type = 0;
00016 cursor->mode = 0;
00017 cursor->table = NULL;
00018 cursor->column_flags = NULL;
00019 }
00020
00027 int
00028 db_alloc_cursor_table ( dbCursor *cursor,
00029 int ncols)
00030 {
00031 cursor->table = db_alloc_table (ncols);
00032 if (cursor->table == NULL)
00033 return db_get_error_code();
00034 return DB_OK;
00035 }
00036
00043 void
00044 db_free_cursor ( dbCursor *cursor)
00045 {
00046 if (cursor->table)
00047 db_free_table (cursor->table);
00048 if (cursor->column_flags)
00049 db_free_cursor_column_flags (cursor);
00050 db_init_cursor(cursor);
00051 }
00052
00059 dbTable *
00060 db_get_cursor_table ( dbCursor *cursor)
00061 {
00062 return cursor->table;
00063 }
00064
00071 void
00072 db_set_cursor_table ( dbCursor *cursor,
00073 dbTable *table)
00074 {
00075 cursor->table = table;
00076 }
00077
00084 dbToken
00085 db_get_cursor_token(
00086 dbCursor *cursor)
00087 {
00088 return cursor->token;
00089 }
00090
00097 void
00098 db_set_cursor_token ( dbCursor *cursor, dbToken token)
00099 {
00100 cursor->token = token;
00101 }
00102
00109 void
00110 db_set_cursor_type_readonly ( dbCursor *cursor)
00111 {
00112 cursor->type = DB_READONLY;
00113 }
00114
00121 void
00122 db_set_cursor_type_update (dbCursor *cursor)
00123 {
00124 cursor->type = DB_UPDATE;
00125 }
00126
00133 void
00134 db_set_cursor_type_insert ( dbCursor *cursor)
00135 {
00136 cursor->type = DB_INSERT;
00137 }
00138
00145 int
00146 db_test_cursor_type_fetch( dbCursor *cursor)
00147 {
00148 return (cursor->type == DB_READONLY || cursor->type == DB_UPDATE);
00149 }
00150
00157 int
00158 db_test_cursor_type_update( dbCursor *cursor)
00159 {
00160 return (cursor->type == DB_UPDATE);
00161 }
00162
00169 int
00170 db_test_cursor_type_insert (dbCursor *cursor)
00171 {
00172 return (cursor->type == DB_INSERT);
00173 }
00174
00181 void
00182 db_set_cursor_mode( dbCursor *cursor,
00183 int mode)
00184 {
00185 cursor->mode = mode;
00186 }
00187
00194 void
00195 db_set_cursor_mode_scroll( dbCursor *cursor)
00196 {
00197 cursor->mode |= DB_SCROLL;
00198 }
00199
00206 void
00207 db_unset_cursor_mode_scroll ( dbCursor *cursor)
00208 {
00209 cursor->mode &= ~DB_SCROLL;
00210 }
00211
00218 void
00219 db_unset_cursor_mode (dbCursor *cursor)
00220 {
00221 cursor->mode = 0;
00222 }
00223
00230 void
00231 db_set_cursor_mode_insensitive ( dbCursor *cursor)
00232 {
00233 cursor->mode |= DB_INSENSITIVE;
00234 }
00235
00242 void
00243 db_unset_cursor_mode_insensitive (dbCursor *cursor)
00244 {
00245 cursor->mode &= ~DB_INSENSITIVE;
00246 }
00247
00254 int
00255 db_test_cursor_mode_scroll (dbCursor *cursor)
00256 {
00257 return (cursor->mode & DB_SCROLL);
00258 }
00259
00260
00267 int
00268 db_test_cursor_mode_insensitive (dbCursor *cursor)
00269 {
00270 return (cursor->mode & DB_INSENSITIVE);
00271 }
00272
00279 int
00280 db_alloc_cursor_column_flags ( dbCursor *cursor)
00281 {
00282 int ncols;
00283 int col;
00284
00285 ncols = db_get_cursor_number_of_columns (cursor);
00286 cursor->column_flags = (short *) db_calloc (ncols, sizeof(short));
00287 if (cursor->column_flags == NULL)
00288 return db_get_error_code();
00289 for (col = 0; col < ncols; col++)
00290 db_unset_cursor_column_flag (cursor, col);
00291 return DB_OK ;
00292 }
00293
00300 void
00301 db_free_cursor_column_flags ( dbCursor *cursor)
00302 {
00303 if(cursor->column_flags)
00304 free(cursor->column_flags);
00305 cursor->column_flags = NULL;
00306 }
00307
00314 void
00315 db_set_cursor_column_for_update ( dbCursor *cursor,
00316 int col)
00317 {
00318 db_set_cursor_column_flag (cursor, col);
00319 }
00320
00327 void
00328 db_unset_cursor_column_for_update (
00329 dbCursor *cursor,
00330 int col)
00331 {
00332 db_unset_cursor_column_flag (cursor, col);
00333 }
00334
00341 int
00342 db_test_cursor_column_for_update ( dbCursor *cursor,
00343 int col)
00344 {
00345 return db_test_cursor_column_flag (cursor, col);
00346 }
00347
00354 int
00355 db_test_cursor_any_column_for_update ( dbCursor *cursor)
00356 {
00357 return db_test_cursor_any_column_flag (cursor);
00358 }
00359
00366 void
00367 db_set_cursor_column_flag ( dbCursor *cursor,
00368 int col)
00369 {
00370 if (cursor->column_flags)
00371 cursor->column_flags[col] = 1;
00372 }
00373
00380 void
00381 db_unset_cursor_column_flag ( dbCursor *cursor,
00382 int col)
00383 {
00384 if (cursor->column_flags)
00385 cursor->column_flags[col] = 0;
00386 }
00387
00394 int
00395 db_test_cursor_column_flag ( dbCursor *cursor,
00396 int col)
00397 {
00398 return cursor->column_flags && cursor->column_flags[col] ? 1 : 0 ;
00399 }
00400
00407 int
00408 db_get_cursor_number_of_columns ( dbCursor *cursor)
00409 {
00410 dbTable *table;
00411
00412 table = db_get_cursor_table (cursor);
00413 if (table)
00414 return db_get_table_number_of_columns(table);
00415 return 0;
00416 }
00417
00424
00425 int
00426 db_test_cursor_any_column_flag ( dbCursor *cursor)
00427 {
00428 int ncols, col;
00429
00430 ncols = db_get_cursor_number_of_columns(cursor);
00431 for (col = 0; col < ncols; col++)
00432 if (db_test_cursor_column_flag(cursor, col))
00433 return 1;
00434 return 0;
00435 }