PostgreSQL Source Code: src/interfaces/ecpg/ecpglib/descriptor.c File Reference (original) (raw)
235{
236 va_list args;
239 int ntuples,
240 act_tuple;
243
244 if (sqlca == NULL)
245 {
248 return false;
249 }
250
254 if (!ECPGresult)
255 {
256 va_end(args);
257 return false;
258 }
259
261
263 {
265 va_end(args);
266 return false;
267 }
268
269 ecpg_log("ECPGget_desc: reading items for tuple %d\n", index);
271
273
274 memset(&data_var, 0, sizeof data_var);
277
279 {
280 char type_str[20];
281 long varcharsize;
282 long offset;
283 long arrsize;
285 void *var;
286
288 var = va_arg(args, void *);
289 varcharsize = va_arg(args, long);
290 arrsize = va_arg(args, long);
291 offset = va_arg(args, long);
292
293 switch (type)
294 {
297 data_var.ind_type = vartype;
298 data_var.ind_pointer = var;
299 data_var.ind_varcharsize = varcharsize;
300 data_var.ind_arrsize = arrsize;
301 data_var.ind_offset = offset;
302 if (data_var.ind_arrsize == 0 || data_var.ind_varcharsize == 0)
303 data_var.ind_value = *((void **) (data_var.ind_pointer));
304 else
305 data_var.ind_value = data_var.ind_pointer;
306 break;
307
310 data_var.type = vartype;
311 data_var.pointer = var;
312 data_var.varcharsize = varcharsize;
313 data_var.arrsize = arrsize;
314 data_var.offset = offset;
315 if (data_var.arrsize == 0 || data_var.varcharsize == 0)
316 data_var.value = *((void **) (data_var.pointer));
317 else
318 data_var.value = data_var.pointer;
319 break;
320
323 {
324 va_end(args);
325 return false;
326 }
327
329 break;
330
333 {
334 va_end(args);
335 return false;
336 }
337
338 break;
339
342 {
343 va_end(args);
344 return false;
345 }
346
347 break;
348
351 {
352 va_end(args);
353 return false;
354 }
355
357 break;
358
361 {
362 va_end(args);
363 return false;
364 }
365
366 ecpg_log("ECPGget_desc: PRECISION = %d\n", PQfmod(ECPGresult, index) >> 16);
367 break;
368
371 {
372 va_end(args);
373 return false;
374 }
375
377 break;
378
381 {
382 va_end(args);
383 return false;
384 }
385
387 break;
388
391 {
392 va_end(args);
393 return false;
394 }
395
397 break;
398
401 {
402 va_end(args);
403 return false;
404 }
405
407 break;
408
411 {
412 va_end(args);
413 return false;
414 }
415
416 ecpg_log("ECPGget_desc: CARDINALITY = %d\n", PQntuples(ECPGresult));
417 break;
418
421
423
424
425
426
427 if (arrsize > 0 && ntuples > arrsize)
428 {
429 ecpg_log("ECPGget_desc on line %d: incorrect number of matches; %d don't fit into array of %ld\n",
430 lineno, ntuples, arrsize);
432 va_end(args);
433 return false;
434 }
435
436 if (arrsize == 0 && *(void **) var == NULL)
437 {
439
440 if (!mem)
441 {
442 va_end(args);
443 return false;
444 }
445 *(void **) var = mem;
446 var = mem;
447 }
448
449 for (act_tuple = 0; act_tuple < ntuples; act_tuple++)
450 {
452 {
453 va_end(args);
454 return false;
455 }
456 var = (char *) var + offset;
457 ecpg_log("ECPGget_desc: RETURNED[%d] = %d\n", act_tuple, PQgetlength(ECPGresult, act_tuple, index));
458 }
459 break;
460
461 default:
462 snprintf(type_str, sizeof(type_str), "%d", type);
464 va_end(args);
465 return false;
466 }
467
469 }
470
472 {
474
475 memset(&stmt, 0, sizeof stmt);
477
478
479
480
481#ifdef HAVE_USELOCALE
482
483
484
485
486
487
488
489
490 Assert(ecpg_clocale);
491 stmt.oldlocale = uselocale(ecpg_clocale);
492#else
493#ifdef WIN32
494 stmt.oldthreadlocale = _configthreadlocale(_ENABLE_PER_THREAD_LOCALE);
495#endif
498#endif
499
500
503
504#ifdef HAVE_USELOCALE
506 uselocale(stmt.oldlocale);
507#else
508 if (stmt.oldlocale)
509 {
512 }
513#ifdef WIN32
514 if (stmt.oldthreadlocale != -1)
515 _configthreadlocale(stmt.oldthreadlocale);
516#endif
517#endif
518 }
519 else if (data_var.ind_type != ECPGt_NO_INDICATOR && data_var.ind_pointer != NULL)
520
521
522
523
524
525
526 {
527
528
529
530
531 if (data_var.ind_arrsize > 0 && ntuples > data_var.ind_arrsize)
532 {
533 ecpg_log("ECPGget_desc on line %d: incorrect number of matches (indicator); %d don't fit into array of %ld\n",
534 lineno, ntuples, data_var.ind_arrsize);
536 va_end(args);
537 return false;
538 }
539
540
541 if (data_var.ind_arrsize == 0 && data_var.ind_value == NULL)
542 {
544
545 if (!mem)
546 {
547 va_end(args);
548 return false;
549 }
550 *(void **) data_var.ind_pointer = mem;
551 data_var.ind_value = mem;
552 }
553
554 for (act_tuple = 0; act_tuple < ntuples; act_tuple++)
555 {
557 {
558 va_end(args);
559 return false;
560 }
561 data_var.ind_value = (char *) data_var.ind_value + data_var.ind_offset;
562 ecpg_log("ECPGget_desc: INDICATOR[%d] = %d\n", act_tuple, -PQgetisnull(ECPGresult, act_tuple, index));
563 }
564 }
565 sqlca->sqlerrd[2] = ntuples;
566 va_end(args);
567 return true;
568}
#define ECPG_UNKNOWN_DESCRIPTOR_ITEM
#define ECPG_INVALID_DESCRIPTOR_INDEX
#define ECPG_TOO_MANY_MATCHES
static bool get_char_item(int lineno, void *var, enum ECPGttype vartype, char *value, int varcharsize)
#define RETURN_IF_NO_DATA
static PGresult * ecpg_result_by_descriptor(int line, const char *name)
static bool get_int_item(int lineno, void *var, enum ECPGttype vartype, int value)
static unsigned int ecpg_dynamic_type_DDT(Oid type)
bool ecpg_store_result(const PGresult *results, int act_field, const struct statement *stmt, struct variable *var)
char * ecpg_auto_alloc(long size, int lineno)
void ecpg_log(const char *format,...) pg_attribute_printf(1
#define ECPG_SQLSTATE_CARDINALITY_VIOLATION
#define ECPG_SQLSTATE_INVALID_DESCRIPTOR_INDEX
int ecpg_dynamic_type(Oid type)
char * ecpg_strdup(const char *string, int lineno)
int PQgetlength(const PGresult *res, int tup_num, int field_num)
Oid PQftype(const PGresult *res, int field_num)
int PQntuples(const PGresult *res)
char * PQfname(const PGresult *res, int field_num)
int PQfmod(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)
Assert(PointerIsAligned(start, uint64))