-
-
Notifications
You must be signed in to change notification settings - Fork 295
/
cursor.c
423 lines (336 loc) · 7.88 KB
/
cursor.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
/*!
\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;
}