123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424 |
- /*!
- \file lib/db/dbmi_base/cursor.c
-
- \brief DBMI Library (base) - cursors management
-
- (C) 1999-2009 by the GRASS Development Team
-
- This program is free software under the GNU General Public
- License (>=v2). Read the file COPYING that comes with GRASS
- for details.
-
- \author Joel Jones (CERL/UIUC), Radim Blazek
- */
- #include <stdlib.h>
- #include <grass/dbmi.h>
- /*!
- \brief Initialize dbCursor
-
- \param cursor pointer to dbCursor to be initialized
- */
- void db_init_cursor(dbCursor *cursor)
- {
- G_zero(cursor, sizeof(dbCursor));
- cursor->token = -1;
- }
- /*!
- \brief Allocate table for cursor
- \param cursor pointer to dbCursor
- \param ncols number of column in table
- \return DB_OK on success
- \return error code on error
- */
- int db_alloc_cursor_table(dbCursor *cursor, int ncols)
- {
- cursor->table = db_alloc_table(ncols);
- if (cursor->table == NULL)
- return db_get_error_code();
- return DB_OK;
- }
- /*!
- \brief Free allocated dbCursor
- \param cursor pointer to dbCursor
- */
- void db_free_cursor(dbCursor *cursor)
- {
- if (cursor->table)
- db_free_table(cursor->table);
- if (cursor->column_flags)
- db_free_cursor_column_flags(cursor);
- db_init_cursor(cursor);
- }
- /*!
- \brief Get table allocated by cursor
- \param cursor pointer to dbCursor
-
- \return pointer to dbTable
- */
- dbTable *db_get_cursor_table(dbCursor *cursor)
- {
- return cursor->table;
- }
- /*!
- \brief Set table for given cursor
- \param cursor pointer to dbCursor
- \param table pointer to dbTable
- */
- void db_set_cursor_table(dbCursor *cursor, dbTable *table)
- {
- cursor->table = table;
- }
- /*!
- \brief Get cursor token
- \param cursor pointer to dbCursor
- \return pointer to dbToken
- */
- dbToken db_get_cursor_token(dbCursor *cursor)
- {
- return cursor->token;
- }
- /*!
- \brief Set cursor token
- \param cursor pointer to dbCursor
- \param token pointer to dbToken
- */
- void db_set_cursor_token(dbCursor *cursor, dbToken token)
- {
- cursor->token = token;
- }
- /*!
- \brief Set cursor to be read-only (select)
- \param cursor pointer to dbCursor
- */
- void db_set_cursor_type_readonly(dbCursor *cursor)
- {
- cursor->type = DB_READONLY;
- }
- /*!
- \brief Set cursor to be writable (update)
- \param cursor pointer to dbCursor
- */
- void db_set_cursor_type_update(dbCursor *cursor)
- {
- cursor->type = DB_UPDATE;
- }
- /*!
- \brief Set cursor to be writable (insert)
- \param cursor pointer to dbCursor
- */
- void db_set_cursor_type_insert(dbCursor *cursor)
- {
- cursor->type = DB_INSERT;
- }
- /*!
- \brief Check cursor type
- \param cursor pointer to dbCursor
- \return 1 for known cursor type
- \return 0 for unknown cursor type
- */
- int db_test_cursor_type_fetch(dbCursor *cursor)
- {
- return (cursor->type == DB_READONLY ||
- cursor->type == DB_UPDATE ||
- cursor->type == DB_INSERT);
- }
- /*!
- \brief Check if cursor type is 'update'
- \param cursor pointer to dbCursor
- \return 1 if cursor type is 'update'
- \return 0 otherwise
- */
- int db_test_cursor_type_update(dbCursor *cursor)
- {
- return (cursor->type == DB_UPDATE);
- }
- /*!
- \brief Check if cursor type is 'insert'
- \param cursor pointer to dbCursor
- \return 1 if cursor type is 'insert'
- \return 0 otherwise
- */
- int db_test_cursor_type_insert(dbCursor *cursor)
- {
- return (cursor->type == DB_INSERT);
- }
- /*!
- \brief Set cursor mode
- Modes:
- - DB_SCROLL
- - DB_INSENSITIVE
- \param cursor pointer to dbCursor
- \param mode cursor mode
- */
- void db_set_cursor_mode(dbCursor *cursor, int mode)
- {
- cursor->mode = mode;
- }
- /*!
- \brief Set 'scroll' cursor mode
- \param cursor pointer to dbCursor
- */
- void db_set_cursor_mode_scroll(dbCursor *cursor)
- {
- cursor->mode |= DB_SCROLL;
- }
- /*!
- \brief Unset 'scroll' cursor mode
- \param cursor pointer to dbCursor
- */
- void db_unset_cursor_mode_scroll(dbCursor *cursor)
- {
- cursor->mode &= ~DB_SCROLL;
- }
- /*!
- \brief Unset cursor mode
- \param cursor pointer to dbCursor
- */
- void db_unset_cursor_mode(dbCursor *cursor)
- {
- cursor->mode = 0;
- }
- /*!
- \brief Set 'intensive' cursor mode
- \param cursor pointer to dbCursor
- */
- void db_set_cursor_mode_insensitive(dbCursor *cursor)
- {
- cursor->mode |= DB_INSENSITIVE;
- }
- /*!
- \brief Unset 'intensive' cursor mode
- \param cursor pointer to dbCursor
- */
- void db_unset_cursor_mode_insensitive(dbCursor *cursor)
- {
- cursor->mode &= ~DB_INSENSITIVE;
- }
- /*!
- \brief Check if cursor mode is 'scroll'
- \param cursor pointer to dbCursor
- \return 1 if true
- \return 0 if false
- */
- int db_test_cursor_mode_scroll(dbCursor *cursor)
- {
- return (cursor->mode & DB_SCROLL);
- }
- /*!
- \brief Check if cursor mode is 'intensive'
- \param cursor pointer to dbCursor
- \return 1 if true
- \return 0 if false
- */
- int db_test_cursor_mode_insensitive(dbCursor *cursor)
- {
- return (cursor->mode & DB_INSENSITIVE);
- }
- /*!
- \brief Allocate columns' flags for cursor
- \param cursor pointer to dbCursor
- \return DB_OK on success
- \return error code on failure
- */
- int db_alloc_cursor_column_flags(dbCursor *cursor)
- {
- int ncols;
- int col;
- ncols = db_get_cursor_number_of_columns(cursor);
- cursor->column_flags = (short *)db_calloc(ncols, sizeof(short));
- if (cursor->column_flags == NULL)
- return db_get_error_code();
- for (col = 0; col < ncols; col++)
- db_unset_cursor_column_flag(cursor, col);
- return DB_OK;
- }
- /*!
- \brief Free columns' flags of cursor
- \param cursor pointer to dbCursor
- */
- void db_free_cursor_column_flags(dbCursor *cursor)
- {
- if (cursor->column_flags)
- db_free(cursor->column_flags);
- cursor->column_flags = NULL;
- }
- /*!
- \brief Set Column flag to 'update'
- \param cursor pointer to dbCursor
- \param col column index (starting with '0')
- */
- void db_set_cursor_column_for_update(dbCursor *cursor, int col)
- {
- db_set_cursor_column_flag(cursor, col);
- }
- /*!
- \brief Unset 'update' column flag
- \param cursor pointer to dbCursor
- \param col column index (starting with '0')
- */
- void db_unset_cursor_column_for_update(dbCursor *cursor, int col)
- {
- db_unset_cursor_column_flag(cursor, col);
- }
- /*!
- \brief Check if column flag is 'update'
- \param cursor pointer to dbCursor
- \param col column index (starting with '0')
- \return 1 if true
- \return 0 if false
- */
- int db_test_cursor_column_for_update(dbCursor *cursor, int col)
- {
- return db_test_cursor_column_flag(cursor, col);
- }
- /*!
- \brief Check if columns' flag is 'update'
- \param cursor pointer to dbCursor
- \return 1 if true
- \return 0 if false
- */
- int db_test_cursor_any_column_for_update(dbCursor *cursor)
- {
- return db_test_cursor_any_column_flag(cursor);
- }
- /*!
- \brief Set column's flag
- \param cursor pointer to dbCursor
- \param col column index (starting with '0')
- */
- void db_set_cursor_column_flag(dbCursor *cursor, int col)
- {
- if (cursor->column_flags)
- cursor->column_flags[col] = 1;
- }
- /*!
- \brief Unset column's flag
- \param cursor pointer to dbCursor
- \param col column index (starting with '0')
- */
- void db_unset_cursor_column_flag(dbCursor *cursor, int col)
- {
- if (cursor->column_flags)
- cursor->column_flags[col] = 0;
- }
- /*!
- \brief Checks column's flag
- \param cursor pointer to dbCursor
- \param col column index (starting with '0')
- \return 1 if flag is defined
- \return 0 otherwise
- */
- int db_test_cursor_column_flag(dbCursor *cursor, int col)
- {
- return cursor->column_flags && cursor->column_flags[col] ? 1 : 0;
- }
- /*!
- \brief Get number of columns
- \param cursor pointer to dbCursor
- */
- int db_get_cursor_number_of_columns(dbCursor *cursor)
- {
- dbTable *table;
- table = db_get_cursor_table(cursor);
- if (table)
- return db_get_table_number_of_columns(table);
- return 0;
- }
- /*!
- \brief Checks columns' flag
- Is any cursor column flag set?
- \param cursor pointer to dbCursor
- \return 1 if true
- \return 0 if false
- */
- int db_test_cursor_any_column_flag(dbCursor *cursor)
- {
- int ncols, col;
- ncols = db_get_cursor_number_of_columns(cursor);
- for (col = 0; col < ncols; col++)
- if (db_test_cursor_column_flag(cursor, col))
- return 1;
- return 0;
- }
|