3#define POSTGRES_ECPG_INTERNAL
60 }
while (isdigit((
unsigned char) **scan_length));
63 if (**scan_length !=
' ' && **scan_length !=
'\0')
79 return (
double) INFINITY;
132 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
133 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
134 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
135 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, -1, -1, -1, -1, -1,
136 -1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1,
137 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
138 -1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1,
139 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
143 if (
c > 0 &&
c < 127)
163 if (*s ==
' ' || *s ==
'\n' || *s ==
'\t' || *s ==
'\r')
182 static const char hextbl[] =
"0123456789abcdef";
183 const char *end = src +
len;
187 *dst++ =
hextbl[(*src >> 4) & 0xF];
188 *dst++ =
hextbl[*src & 0xF];
197 char *var,
char *
ind,
long varcharsize,
long offset,
201 char *pval = (
char *)
PQgetvalue(results, act_tuple, act_field);
202 int binary =
PQfformat(results, act_field);
203 int size =
PQgetlength(results, act_tuple, act_field);
204 int value_for_indicator = 0;
223 ecpg_log(
"ecpg_get_data on line %d: RESULT: %s offset: %ld; array: %s\n", lineno, pval ? (binary ?
"BINARY" : pval) :
"EMPTY", log_offset,
ECPG_IS_ARRAY(isarray) ?
"yes" :
"no");
243 value_for_indicator = -1;
249 *((
short *) (
ind + ind_offset * act_tuple)) = value_for_indicator;
253 *((
int *) (
ind + ind_offset * act_tuple)) = value_for_indicator;
257 *((
long *) (
ind + ind_offset * act_tuple)) = value_for_indicator;
261 *((
long long int *) (
ind + ind_offset * act_tuple)) = value_for_indicator;
264 if (value_for_indicator == -1)
291 if (value_for_indicator == -1)
322 if (varcharsize == 0 || varcharsize * offset >= size)
323 memcpy(var + offset * act_tuple, pval, size);
326 memcpy(var + offset * act_tuple, pval, varcharsize * offset);
328 if (varcharsize * offset < size)
335 *((
short *) (
ind + ind_offset * act_tuple)) = size;
339 *((
int *) (
ind + ind_offset * act_tuple)) = size;
343 *((
long *) (
ind + ind_offset * act_tuple)) = size;
347 *((
long long int *) (
ind + ind_offset * act_tuple)) = size;
375 res = strtol(pval, &scan_length, 10);
387 *((
short *) (var + offset * act_tuple)) = (
short) res;
390 *((
int *) (var + offset * act_tuple)) = (
int) res;
393 *((
long *) (var + offset * act_tuple)) = (
long) res;
404 ures = strtoul(pval, &scan_length, 10);
416 *((
unsigned short *) (var + offset * act_tuple)) = (
unsigned short) ures;
419 *((
unsigned int *) (var + offset * act_tuple)) = (
unsigned int) ures;
422 *((
unsigned long *) (var + offset * act_tuple)) = (
unsigned long) ures;
431 *((
long long int *) (var + offset * act_tuple)) = strtoll(pval, &scan_length, 10);
442 *((
unsigned long long int *) (var + offset * act_tuple)) = strtoull(pval, &scan_length, 10);
454 if (isarray && *pval ==
'"')
458 dres = strtod(pval, &scan_length);
460 if (isarray && *scan_length ==
'"')
475 *((
float *) (var + offset * act_tuple)) = dres;
478 *((
double *) (var + offset * act_tuple)) = dres;
487 if (pval[0] ==
'f' && pval[1] ==
'\0')
489 *((
bool *) (var + offset * act_tuple)) =
false;
493 else if (pval[0] ==
't' && pval[1] ==
'\0')
495 *((
bool *) (var + offset * act_tuple)) =
true;
499 else if (pval[0] ==
'\0' &&
PQgetisnull(results, act_tuple, act_field))
520 dec_size = src_size < dst_size ? src_size : dst_size;
523 if (dst_size < src_size)
532 *((
short *) (
ind + ind_offset * act_tuple)) = rcv_size;
536 *((
int *) (
ind + ind_offset * act_tuple)) = rcv_size;
540 *((
long *) (
ind + ind_offset * act_tuple)) = rcv_size;
544 *((
long long int *) (
ind + ind_offset * act_tuple)) = rcv_size;
560 char *
str = (
char *) (var + offset * act_tuple);
567 if (varcharsize == 0 && offset ==
sizeof(
char *))
570 if (varcharsize > size)
578 memset(
str,
' ', varcharsize);
579 memcpy(
str, pval, size);
580 str[varcharsize - 1] =
'\0';
593 *((
short *) (
ind + ind_offset * act_tuple)) = -1;
597 *((
int *) (
ind + ind_offset * act_tuple)) = -1;
601 *((
long *) (
ind + ind_offset * act_tuple)) = -1;
605 *((
long long int *) (
ind + ind_offset * act_tuple)) = -1;
614 strncpy(
str, pval, size + 1);
619 char *last =
str + size;
621 while (last >
str && (*last ==
' ' || *last ==
'\0'))
630 int charsize = varcharsize;
636 if (varcharsize == 0)
639 strncpy(
str, pval, charsize);
645 str[charsize - 1] =
'\0';
655 *((
short *) (
ind + ind_offset * act_tuple)) = size;
659 *((
int *) (
ind + ind_offset * act_tuple)) = size;
663 *((
long *) (
ind + ind_offset * act_tuple)) = size;
667 *((
long long int *) (
ind + ind_offset * act_tuple)) = size;
685 if (varcharsize == 0)
689 strncpy(
variable->arr, pval, varcharsize);
698 *((
short *) (
ind + ind_offset * act_tuple)) =
variable->len;
702 *((
int *) (
ind + ind_offset * act_tuple)) =
variable->len;
706 *((
long *) (
ind + ind_offset * act_tuple)) =
variable->len;
710 *((
long long int *) (
ind + ind_offset * act_tuple)) =
variable->len;
726 for (endptr = pval; *endptr && *endptr !=
',' && *endptr !=
'}'; endptr++);
735 ecpg_log(
"ecpg_get_data on line %d: RESULT %s; errno %d\n",
736 lineno, pval, errno);
785 for (endptr = pval; *endptr && *endptr !=
',' && *endptr !=
'"' && *endptr !=
'}'; endptr++);
794 ecpg_log(
"ecpg_get_data on line %d: RESULT %s; errno %d\n",
795 lineno, pval, errno);
818 if (*scan_length ==
'"')
839 for (endptr = pval; *endptr && *endptr !=
',' && *endptr !=
'"' && *endptr !=
'}'; endptr++);
848 ecpg_log(
"ecpg_get_data on line %d: RESULT %s; errno %d\n",
849 lineno, pval, errno);
868 if (*scan_length ==
'"')
879 *((
date *) (var + offset * act_tuple)) = ddres;
887 for (endptr = pval; *endptr && *endptr !=
',' && *endptr !=
'"' && *endptr !=
'}'; endptr++);
896 ecpg_log(
"ecpg_get_data on line %d: RESULT %s; errno %d\n",
897 lineno, pval, errno);
916 if (*scan_length ==
'"')
927 *((
timestamp *) (var + offset * act_tuple)) = tres;
953 string =
string ?
false :
true;
unsigned ecpg_hex_enc_len(unsigned srclen)
static char get_hex(char c)
static bool garbage_left(enum ARRAY_TYPE isarray, char **scan_length, enum COMPAT_MODE compat)
unsigned ecpg_hex_dec_len(unsigned srclen)
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)
static double get_float8_nan(void)
static unsigned hex_decode(const char *src, unsigned len, char *dst)
unsigned ecpg_hex_encode(const char *src, unsigned len, char *dst)
static bool array_delimiter(enum ARRAY_TYPE isarray, char c)
static double get_float8_infinity(void)
static bool array_boundary(enum ARRAY_TYPE isarray, char c)
static bool check_special_value(char *ptr, double *retval, char **endptr)
#define ECPG_CONVERT_BOOL
#define ECPG_FLOAT_FORMAT
#define ECPG_MISSING_INDICATOR
#define ECPG_INTERVAL_FORMAT
#define ECPG_OUT_OF_MEMORY
#define ECPG_DATA_NOT_ARRAY
#define ECPG_NUMERIC_FORMAT
#define ECPG_TIMESTAMP_FORMAT
#define ECPG_SQLSTATE_NO_DATA
#define ECPG_SQLSTATE_ECPG_OUT_OF_MEMORY
char * ecpg_alloc(long size, int lineno)
#define ECPG_SQLSTATE_ECPG_INTERNAL_ERROR
#define ECPG_SQLSTATE_NULL_VALUE_NO_INDICATOR_PARAMETER
void ecpg_log(const char *format,...) pg_attribute_printf(1
const char * ecpg_type_name(enum ECPGttype typ)
#define ECPG_SQLSTATE_DATATYPE_MISMATCH
void ecpg_raise(int line, int code, const char *sqlstate, const char *str)
bool ecpg_internal_regression_mode
@ ECPGt_unsigned_long_long
static const int8 hexlookup[128]
int PQfformat(const PGresult *res, int field_num)
struct sqlca_t * ECPGget_sqlca(void)
void ECPGset_noind_null(enum ECPGttype type, void *ptr)
static const char hextbl[]
date PGTYPESdate_from_asc(char *str, char **endptr)
int PGTYPESinterval_copy(interval *intvlsrc, interval *intvldest)
interval * PGTYPESinterval_from_asc(char *str, char **endptr)
int PGTYPESnumeric_copy(numeric *src, numeric *dst)
numeric * PGTYPESnumeric_new(void)
int PGTYPESnumeric_to_decimal(numeric *src, decimal *dst)
void PGTYPESnumeric_free(numeric *var)
numeric * PGTYPESnumeric_from_asc(char *str, char **endptr)
timestamp PGTYPEStimestamp_from_asc(char *str, char **endptr)
int pg_strncasecmp(const char *s1, const char *s2, size_t n)