GRASS 8 Programmer's Manual 8.6.0dev(2026)-1d1e47ad9d
Loading...
Searching...
No Matches
cursor.c
Go to the documentation of this file.
1/*!
2 \file lib/db/dbmi_base/cursor.c
3
4 \brief DBMI Library (base) - cursors management
5
6 (C) 1999-2009 by the GRASS Development Team
7
8 This program is free software under the GNU General Public
9 License (>=v2). Read the file COPYING that comes with GRASS
10 for details.
11
12 \author Joel Jones (CERL/UIUC), Radim Blazek
13 */
14
15#include <stdlib.h>
16#include <grass/dbmi.h>
17
18/*!
19 \brief Initialize dbCursor
20
21 \param cursor pointer to dbCursor to be initialized
22 */
24{
25 G_zero(cursor, sizeof(dbCursor));
26 cursor->token = -1;
27}
28
29/*!
30 \brief Allocate table for cursor
31
32 \param cursor pointer to dbCursor
33 \param ncols number of column in table
34
35 \return DB_OK on success
36 \return error code on error
37 */
39{
40 cursor->table = db_alloc_table(ncols);
41 if (cursor->table == NULL)
42 return db_get_error_code();
43 return DB_OK;
44}
45
46/*!
47 \brief Free allocated dbCursor
48
49 \param cursor pointer to dbCursor
50 */
52{
53 if (cursor->table)
54 db_free_table(cursor->table);
55 if (cursor->column_flags)
58}
59
60/*!
61 \brief Get table allocated by cursor
62
63 \param cursor pointer to dbCursor
64
65 \return pointer to dbTable
66 */
68{
69 return cursor->table;
70}
71
72/*!
73 \brief Set table for given cursor
74
75 \param cursor pointer to dbCursor
76 \param table pointer to dbTable
77 */
79{
80 cursor->table = table;
81}
82
83/*!
84 \brief Get cursor token
85
86 \param cursor pointer to dbCursor
87
88 \return pointer to dbToken
89 */
91{
92 return cursor->token;
93}
94
95/*!
96 \brief Set cursor token
97
98 \param cursor pointer to dbCursor
99 \param token pointer to dbToken
100 */
102{
103 cursor->token = token;
104}
105
106/*!
107 \brief Set cursor to be read-only (select)
108
109 \param cursor pointer to dbCursor
110 */
115
116/*!
117 \brief Set cursor to be writable (update)
118
119 \param cursor pointer to dbCursor
120 */
125
126/*!
127 \brief Set cursor to be writable (insert)
128
129 \param cursor pointer to dbCursor
130 */
135
136/*!
137 \brief Check cursor type
138
139 \param cursor pointer to dbCursor
140
141 \return 1 for known cursor type
142 \return 0 for unknown cursor type
143 */
145{
146 return (cursor->type == DB_READONLY || cursor->type == DB_UPDATE ||
147 cursor->type == DB_INSERT);
148}
149
150/*!
151 \brief Check if cursor type is 'update'
152
153 \param cursor pointer to dbCursor
154
155 \return 1 if cursor type is 'update'
156 \return 0 otherwise
157 */
159{
160 return (cursor->type == DB_UPDATE);
161}
162
163/*!
164 \brief Check if cursor type is 'insert'
165
166 \param cursor pointer to dbCursor
167
168 \return 1 if cursor type is 'insert'
169 \return 0 otherwise
170 */
172{
173 return (cursor->type == DB_INSERT);
174}
175
176/*!
177 \brief Set cursor mode
178
179 Modes:
180 - DB_SCROLL
181 - DB_INSENSITIVE
182
183 \param cursor pointer to dbCursor
184 \param mode cursor mode
185 */
187{
188 cursor->mode = mode;
189}
190
191/*!
192 \brief Set 'scroll' cursor mode
193
194 \param cursor pointer to dbCursor
195 */
200
201/*!
202 \brief Unset 'scroll' cursor mode
203
204 \param cursor pointer to dbCursor
205 */
207{
208 cursor->mode &= ~DB_SCROLL;
209}
210
211/*!
212 \brief Unset cursor mode
213
214 \param cursor pointer to dbCursor
215 */
217{
218 cursor->mode = 0;
219}
220
221/*!
222 \brief Set 'intensive' cursor mode
223
224 \param cursor pointer to dbCursor
225 */
230
231/*!
232 \brief Unset 'intensive' cursor mode
233
234 \param cursor pointer to dbCursor
235 */
237{
238 cursor->mode &= ~DB_INSENSITIVE;
239}
240
241/*!
242 \brief Check if cursor mode is 'scroll'
243
244 \param cursor pointer to dbCursor
245
246 \return 1 if true
247 \return 0 if false
248 */
250{
251 return (cursor->mode & DB_SCROLL);
252}
253
254/*!
255 \brief Check if cursor mode is 'intensive'
256
257 \param cursor pointer to dbCursor
258
259 \return 1 if true
260 \return 0 if false
261 */
266
267/*!
268 \brief Allocate columns' flags for cursor
269
270 \param cursor pointer to dbCursor
271
272 \return DB_OK on success
273 \return error code on failure
274 */
276{
277 int ncols;
278 int col;
279
281 cursor->column_flags = (short *)db_calloc(ncols, sizeof(short));
282 if (cursor->column_flags == NULL)
283 return db_get_error_code();
284 for (col = 0; col < ncols; col++)
286 return DB_OK;
287}
288
289/*!
290 \brief Free columns' flags of cursor
291
292 \param cursor pointer to dbCursor
293 */
295{
296 if (cursor->column_flags)
297 db_free(cursor->column_flags);
298 cursor->column_flags = NULL;
299}
300
301/*!
302 \brief Set Column flag to 'update'
303
304 \param cursor pointer to dbCursor
305 \param col column index (starting with '0')
306 */
311
312/*!
313 \brief Unset 'update' column flag
314
315 \param cursor pointer to dbCursor
316 \param col column index (starting with '0')
317 */
322
323/*!
324 \brief Check if column flag is 'update'
325
326 \param cursor pointer to dbCursor
327 \param col column index (starting with '0')
328
329 \return 1 if true
330 \return 0 if false
331 */
336
337/*!
338 \brief Check if columns' flag is 'update'
339
340 \param cursor pointer to dbCursor
341
342 \return 1 if true
343 \return 0 if false
344 */
349
350/*!
351 \brief Set column's flag
352
353 \param cursor pointer to dbCursor
354 \param col column index (starting with '0')
355 */
357{
358 if (cursor->column_flags)
359 cursor->column_flags[col] = 1;
360}
361
362/*!
363 \brief Unset column's flag
364
365 \param cursor pointer to dbCursor
366 \param col column index (starting with '0')
367 */
369{
370 if (cursor->column_flags)
371 cursor->column_flags[col] = 0;
372}
373
374/*!
375 \brief Checks column's flag
376
377 \param cursor pointer to dbCursor
378 \param col column index (starting with '0')
379
380 \return 1 if flag is defined
381 \return 0 otherwise
382 */
384{
385 return cursor->column_flags && cursor->column_flags[col] ? 1 : 0;
386}
387
388/*!
389 \brief Get number of columns
390
391 \param cursor pointer to dbCursor
392 */
394{
395 dbTable *table;
396
398 if (table)
399 return db_get_table_number_of_columns(table);
400 return 0;
401}
402
403/*!
404 \brief Checks columns' flag
405
406 Is any cursor column flag set?
407
408 \param cursor pointer to dbCursor
409
410 \return 1 if true
411 \return 0 if false
412 */
414{
415 int ncols, col;
416
418 for (col = 0; col < ncols; col++)
420 return 1;
421 return 0;
422}
#define NULL
Definition ccmath.h:32
void db_set_cursor_mode_scroll(dbCursor *cursor)
Set 'scroll' cursor mode.
Definition cursor.c:196
void db_set_cursor_token(dbCursor *cursor, dbToken token)
Set cursor token.
Definition cursor.c:101
int db_test_cursor_any_column_for_update(dbCursor *cursor)
Check if columns' flag is 'update'.
Definition cursor.c:345
int db_alloc_cursor_table(dbCursor *cursor, int ncols)
Allocate table for cursor.
Definition cursor.c:38
dbTable * db_get_cursor_table(dbCursor *cursor)
Get table allocated by cursor.
Definition cursor.c:67
void db_free_cursor(dbCursor *cursor)
Free allocated dbCursor.
Definition cursor.c:51
void db_free_cursor_column_flags(dbCursor *cursor)
Free columns' flags of cursor.
Definition cursor.c:294
dbToken db_get_cursor_token(dbCursor *cursor)
Get cursor token.
Definition cursor.c:90
int db_test_cursor_type_fetch(dbCursor *cursor)
Check cursor type.
Definition cursor.c:144
int db_test_cursor_mode_scroll(dbCursor *cursor)
Check if cursor mode is 'scroll'.
Definition cursor.c:249
void db_unset_cursor_mode_insensitive(dbCursor *cursor)
Unset 'intensive' cursor mode.
Definition cursor.c:236
void db_unset_cursor_column_for_update(dbCursor *cursor, int col)
Unset 'update' column flag.
Definition cursor.c:318
void db_set_cursor_table(dbCursor *cursor, dbTable *table)
Set table for given cursor.
Definition cursor.c:78
int db_test_cursor_column_flag(dbCursor *cursor, int col)
Checks column's flag.
Definition cursor.c:383
void db_set_cursor_type_readonly(dbCursor *cursor)
Set cursor to be read-only (select)
Definition cursor.c:111
void db_init_cursor(dbCursor *cursor)
Initialize dbCursor.
Definition cursor.c:23
int db_test_cursor_type_update(dbCursor *cursor)
Check if cursor type is 'update'.
Definition cursor.c:158
int db_alloc_cursor_column_flags(dbCursor *cursor)
Allocate columns' flags for cursor.
Definition cursor.c:275
int db_test_cursor_column_for_update(dbCursor *cursor, int col)
Check if column flag is 'update'.
Definition cursor.c:332
void db_set_cursor_mode_insensitive(dbCursor *cursor)
Set 'intensive' cursor mode.
Definition cursor.c:226
void db_set_cursor_type_insert(dbCursor *cursor)
Set cursor to be writable (insert)
Definition cursor.c:131
void db_set_cursor_column_for_update(dbCursor *cursor, int col)
Set Column flag to 'update'.
Definition cursor.c:307
void db_unset_cursor_mode_scroll(dbCursor *cursor)
Unset 'scroll' cursor mode.
Definition cursor.c:206
int db_get_cursor_number_of_columns(dbCursor *cursor)
Get number of columns.
Definition cursor.c:393
void db_unset_cursor_mode(dbCursor *cursor)
Unset cursor mode.
Definition cursor.c:216
void db_set_cursor_type_update(dbCursor *cursor)
Set cursor to be writable (update)
Definition cursor.c:121
int db_test_cursor_type_insert(dbCursor *cursor)
Check if cursor type is 'insert'.
Definition cursor.c:171
int db_test_cursor_any_column_flag(dbCursor *cursor)
Checks columns' flag.
Definition cursor.c:413
void db_set_cursor_mode(dbCursor *cursor, int mode)
Set cursor mode.
Definition cursor.c:186
int db_test_cursor_mode_insensitive(dbCursor *cursor)
Check if cursor mode is 'intensive'.
Definition cursor.c:262
void db_unset_cursor_column_flag(dbCursor *cursor, int col)
Unset column's flag.
Definition cursor.c:368
void db_set_cursor_column_flag(dbCursor *cursor, int col)
Set column's flag.
Definition cursor.c:356
Main header of GRASS DataBase Management Interface.
int dbToken
Definition dbmi.h:145
#define DB_INSENSITIVE
Definition dbmi.h:125
#define DB_SCROLL
Definition dbmi.h:124
#define DB_UPDATE
Definition dbmi.h:122
#define DB_OK
Definition dbmi.h:71
#define DB_INSERT
Definition dbmi.h:121
#define DB_READONLY
Definition dbmi.h:120
void db_free_table(dbTable *)
Free the table.
dbTable * db_alloc_table(int)
Allocate a table with a specific number of columns.
void * db_calloc(int, int)
Allocate memory.
int db_get_error_code(void)
Get error code.
void db_free(void *)
Free allocated memory.
int db_get_table_number_of_columns(dbTable *)
Return the number of columns of the table.
void G_zero(void *, int)
Zero out a buffer, buf, of length i.
Definition gis/zero.c:23