PostgreSQL Source Code: src/interfaces/ecpg/ecpglib/sqlda.c Source File (original) (raw)
1
2
3
4
5
6
7
8
9#define POSTGRES_ECPG_INTERNAL
11
12#include "catalog/pg_type_d.h"
22
23
24
25
26
27
28
29
30
31
32static void
34{
35 if (offset % alignment)
36 offset += alignment - (offset % alignment);
37 if (current)
38 *current = offset;
39 offset += size;
41 *next = offset;
42}
43
44static long
46{
47 long offset;
48 int i;
50
51
53
54
56 offset += strlen(PQfname(res, i)) + 1;
57
58
60
61 return offset;
62}
63
64static long
66{
68 int i;
69 long next_offset;
70
71
73 {
75
77 {
81 break;
85 break;
89 break;
93 break;
96 break;
99 break;
102 break;
105 break;
107
108
109
110
111
112
113
114
115
118 {
121
123 if (!num)
124 break;
125 if (num->buf)
128 }
129 break;
132 break;
135 break;
138 break;
142 default:
143 {
144 long datalen = strlen(PQgetvalue(res, row, i)) + 1;
145
147 break;
148 }
149 }
150 offset = next_offset;
151 }
152 return offset;
153}
154
155
156static long
158{
159 long offset;
160
162
163 if (row < 0)
164 return offset;
165
167 return offset;
168}
169
170static long
172{
173 long offset;
175
176
178
179
181
182 return offset;
183}
184
185static long
187{
188 long offset;
189
191
192 if (row < 0)
193 return offset;
194
196 return offset;
197}
198
199
200
201
202
203
206{
209 char *fname;
210 long size;
211 int sqld;
212 int i;
213
216 if (!sqlda)
217 return NULL;
218
219 memset(sqlda, 0, size);
222 fname = (char *) (sqlvar + sqld);
223
224 sqlda->sqld = sqld;
225 ecpg_log("ecpg_build_compat_sqlda on line %d sqld = %d\n", line, sqld);
226 sqlda->desc_occ = size;
227 sqlda->sqlvar = sqlvar;
228
229 for (i = 0; i < sqlda->sqld; i++)
230 {
232 strcpy(fname, PQfname(res, i));
235
236
237
238
239
240
243 }
244
245 return sqlda;
246}
247
248
249
250
253
254void
256{
258 int i;
259 long offset,
260 next_offset;
261
262 if (row < 0)
263 return;
264
265
267
268
269
270
271 for (i = 0; i < sqlda->sqld; i++)
272 {
273 int isnull;
274 int datalen;
275 bool set_data = true;
276
278 {
284 break;
290 break;
296 break;
302 break;
307 break;
312 break;
317 break;
322 break;
324 {
326 char *val;
327
328 set_data = false;
329
333
335 {
337 break;
338 }
339
342 if (!num)
343 {
345 break;
346 }
347
349
350 if (num->buf)
351 {
353 memcpy((char *) sqlda + offset, num->buf, num->digits - num->buf + num->ndigits);
354
357 }
358
360
361 break;
362 }
367 break;
372 break;
377 break;
381 default:
382 datalen = strlen(PQgetvalue(res, row, i)) + 1;
386 if (datalen > 32768)
388 break;
389 }
390
392 ecpg_log("ecpg_set_compat_sqlda on line %d row %d col %d %s\n", lineno, row, i, isnull ? "IS NULL" : "IS NOT NULL");
396 if (!isnull)
397 {
398 if (set_data)
403 }
404 else
406
407 offset = next_offset;
408 }
409}
410
413{
415 long size;
416 int i;
417
420 if (!sqlda)
421 return NULL;
422
423 memset(sqlda, 0, size);
424
427 ecpg_log("ecpg_build_native_sqlda on line %d sqld = %d\n", line, sqlda->sqld);
429
430 for (i = 0; i < sqlda->sqld; i++)
431 {
432 char *fname;
433
438 }
439
440 return sqlda;
441}
442
443void
445{
447 int i;
448 long offset,
449 next_offset;
450
451 if (row < 0)
452 return;
453
454
456
457
458
459
460 for (i = 0; i < sqlda->sqld; i++)
461 {
462 int isnull;
463 int datalen;
464 bool set_data = true;
465
467 {
473 break;
479 break;
485 break;
491 break;
496 break;
501 break;
506 break;
511 break;
513 {
515 char *val;
516
517 set_data = false;
518
522
524 {
526 break;
527 }
528
531 if (!num)
532 {
534 break;
535 }
536
538
539 if (num->buf)
540 {
542 memcpy((char *) sqlda + offset, num->buf, num->digits - num->buf + num->ndigits);
543
546 }
547
549
550 break;
551 }
556 break;
561 break;
566 break;
570 default:
571 datalen = strlen(PQgetvalue(res, row, i)) + 1;
575 break;
576 }
577
579 ecpg_log("ecpg_set_native_sqlda on line %d row %d col %d %s\n", lineno, row, i, isnull ? "IS NULL" : "IS NOT NULL");
581 if (!isnull)
582 {
583 if (set_data)
588 }
589
590 offset = next_offset;
591 }
592}
Datum numeric(PG_FUNCTION_ARGS)
bool ecpg_get_data(const PGresult *results, int act_tuple, int act_field, int lineno, enum ECPGttype type, enum ECPGttype ind_type, char *var, char *ind, long varcharsize, long offset, long ind_offset, enum ARRAY_TYPE isarray, enum COMPAT_MODE compat, bool force_indicator)
char * ecpg_alloc(long size, int lineno)
void ecpg_log(const char *format,...) pg_attribute_printf(1
int sqlda_dynamic_type(Oid type, enum COMPAT_MODE compat)
@ ECPGt_unsigned_long_long
Oid PQftype(const PGresult *res, int field_num)
char * PQgetvalue(const PGresult *res, int tup_num, int field_num)
char * PQfname(const PGresult *res, int field_num)
int PQgetisnull(const PGresult *res, int tup_num, int field_num)
int PQnfields(const PGresult *res)
int PQfsize(const PGresult *res, int field_num)
void ECPGset_noind_null(enum ECPGttype type, void *ptr)
void PGTYPESnumeric_free(numeric *var)
numeric * PGTYPESnumeric_from_asc(char *str, char **endptr)
static long sqlda_compat_total_size(const PGresult *res, int row, enum COMPAT_MODE compat)
static void ecpg_sqlda_align_add_size(long offset, int alignment, int size, long *current, long *next)
static long sqlda_common_total_size(const PGresult *res, int row, enum COMPAT_MODE compat, long offset)
struct sqlda_struct * ecpg_build_native_sqlda(int line, PGresult *res, int row, enum COMPAT_MODE compat)
static long sqlda_compat_empty_size(const PGresult *res)
struct sqlda_compat * ecpg_build_compat_sqlda(int line, PGresult *res, int row, enum COMPAT_MODE compat)
static long sqlda_native_empty_size(const PGresult *res)
void ecpg_set_compat_sqlda(int lineno, struct sqlda_compat **_sqlda, const PGresult *res, int row, enum COMPAT_MODE compat)
static long sqlda_native_total_size(const PGresult *res, int row, enum COMPAT_MODE compat)
static int16 value_is_null
void ecpg_set_native_sqlda(int lineno, struct sqlda_struct **_sqlda, const PGresult *res, int row, enum COMPAT_MODE compat)
static int16 value_is_not_null
struct sqlvar_compat * sqlvar
struct sqlvar_struct sqlvar[1]