3 #define POSTGRES_ECPG_INTERNAL
60 }
while (isdigit((
unsigned char) **scan_length));
63 if (**scan_length !=
' ' && **scan_length !=
'\0')
73 #if defined(WIN32) && !defined(NAN)
74 static const uint32 nan[2] = {0xffffffff, 0x7fffffff};
76 #define NAN (*(const double *) nan)
83 return (
double) INFINITY;
85 return (
double) (HUGE_VAL * HUGE_VAL);
93 #if defined(NAN) && !(defined(__NetBSD__) && defined(__mips__))
96 return (
double) (0.0 / 0.0);
143 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
144 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
145 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
146 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, -1, -1, -1, -1, -1,
147 -1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1,
148 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
149 -1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1,
150 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
154 if (
c > 0 &&
c < 127)
174 if (*s ==
' ' || *s ==
'\n' || *s ==
'\t' || *s ==
'\r')
193 static const char hextbl[] =
"0123456789abcdef";
194 const char *end = src +
len;
198 *dst++ =
hextbl[(*src >> 4) & 0xF];
199 *dst++ =
hextbl[*src & 0xF];
208 char *var,
char *
ind,
long varcharsize,
long offset,
212 char *pval = (
char *)
PQgetvalue(results, act_tuple, act_field);
213 int binary =
PQfformat(results, act_field);
214 int size =
PQgetlength(results, act_tuple, act_field);
215 int value_for_indicator = 0;
234 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");
254 value_for_indicator = -1;
260 *((
short *) (
ind + ind_offset * act_tuple)) = value_for_indicator;
264 *((
int *) (
ind + ind_offset * act_tuple)) = value_for_indicator;
268 *((
long *) (
ind + ind_offset * act_tuple)) = value_for_indicator;
272 *((
long long int *) (
ind + ind_offset * act_tuple)) = value_for_indicator;
275 if (value_for_indicator == -1)
302 if (value_for_indicator == -1)
333 if (varcharsize == 0 || varcharsize * offset >= size)
334 memcpy(var + offset * act_tuple, pval, size);
337 memcpy(var + offset * act_tuple, pval, varcharsize * offset);
339 if (varcharsize * offset < size)
346 *((
short *) (
ind + ind_offset * act_tuple)) = size;
350 *((
int *) (
ind + ind_offset * act_tuple)) = size;
354 *((
long *) (
ind + ind_offset * act_tuple)) = size;
358 *((
long long int *) (
ind + ind_offset * act_tuple)) = size;
386 res = strtol(pval, &scan_length, 10);
398 *((
short *) (var + offset * act_tuple)) = (
short)
res;
401 *((
int *) (var + offset * act_tuple)) = (
int)
res;
404 *((
long *) (var + offset * act_tuple)) = (
long)
res;
415 ures = strtoul(pval, &scan_length, 10);
427 *((
unsigned short *) (var + offset * act_tuple)) = (
unsigned short) ures;
430 *((
unsigned int *) (var + offset * act_tuple)) = (
unsigned int) ures;
433 *((
unsigned long *) (var + offset * act_tuple)) = (
unsigned long) ures;
443 *((
long long int *) (var + offset * act_tuple)) = strtoll(pval, &scan_length, 10);
455 *((
unsigned long long int *) (var + offset * act_tuple)) = strtoull(pval, &scan_length, 10);
468 if (isarray && *pval ==
'"')
472 dres = strtod(pval, &scan_length);
474 if (isarray && *scan_length ==
'"')
489 *((
float *) (var + offset * act_tuple)) = dres;
492 *((
double *) (var + offset * act_tuple)) = dres;
501 if (pval[0] ==
'f' && pval[1] ==
'\0')
503 *((
bool *) (var + offset * act_tuple)) =
false;
507 else if (pval[0] ==
't' && pval[1] ==
'\0')
509 *((
bool *) (var + offset * act_tuple)) =
true;
513 else if (pval[0] ==
'\0' &&
PQgetisnull(results, act_tuple, act_field))
534 dec_size = src_size < dst_size ? src_size : dst_size;
537 if (dst_size < src_size)
546 *((
short *) (
ind + ind_offset * act_tuple)) = rcv_size;
550 *((
int *) (
ind + ind_offset * act_tuple)) = rcv_size;
554 *((
long *) (
ind + ind_offset * act_tuple)) = rcv_size;
558 *((
long long int *) (
ind + ind_offset * act_tuple)) = rcv_size;
574 char *
str = (
char *) (var + offset * act_tuple);
581 if (varcharsize == 0 && offset ==
sizeof(
char *))
584 if (varcharsize == 0 || varcharsize > size)
592 memset(
str,
' ', varcharsize);
593 memcpy(
str, pval, size);
594 str[varcharsize - 1] =
'\0';
607 *((
short *) (
ind + ind_offset * act_tuple)) = -1;
611 *((
int *) (
ind + ind_offset * act_tuple)) = -1;
615 *((
long *) (
ind + ind_offset * act_tuple)) = -1;
619 *((
long long int *) (
ind + ind_offset * act_tuple)) = -1;
628 strncpy(
str, pval, size + 1);
633 char *last =
str + size;
635 while (last >
str && (*last ==
' ' || *last ==
'\0'))
644 strncpy(
str, pval, varcharsize);
650 str[varcharsize - 1] =
'\0';
660 *((
short *) (
ind + ind_offset * act_tuple)) = size;
664 *((
int *) (
ind + ind_offset * act_tuple)) = size;
668 *((
long *) (
ind + ind_offset * act_tuple)) = size;
672 *((
long long int *) (
ind + ind_offset * act_tuple)) = size;
690 if (varcharsize == 0)
694 strncpy(
variable->arr, pval, varcharsize);
703 *((
short *) (
ind + ind_offset * act_tuple)) =
variable->len;
707 *((
int *) (
ind + ind_offset * act_tuple)) =
variable->len;
711 *((
long *) (
ind + ind_offset * act_tuple)) =
variable->len;
715 *((
long long int *) (
ind + ind_offset * act_tuple)) =
variable->len;
731 for (endptr = pval; *endptr && *endptr !=
',' && *endptr !=
'}'; endptr++);
740 ecpg_log(
"ecpg_get_data on line %d: RESULT %s; errno %d\n",
741 lineno, pval, errno);
790 for (endptr = pval; *endptr && *endptr !=
',' && *endptr !=
'"' && *endptr !=
'}'; endptr++);
799 ecpg_log(
"ecpg_get_data on line %d: RESULT %s; errno %d\n",
800 lineno, pval, errno);
823 if (*scan_length ==
'"')
844 for (endptr = pval; *endptr && *endptr !=
',' && *endptr !=
'"' && *endptr !=
'}'; endptr++);
853 ecpg_log(
"ecpg_get_data on line %d: RESULT %s; errno %d\n",
854 lineno, pval, errno);
873 if (*scan_length ==
'"')
884 *((
date *) (var + offset * act_tuple)) = ddres;
892 for (endptr = pval; *endptr && *endptr !=
',' && *endptr !=
'"' && *endptr !=
'}'; endptr++);
901 ecpg_log(
"ecpg_get_data on line %d: RESULT %s; errno %d\n",
902 lineno, pval, errno);
921 if (*scan_length ==
'"')
932 *((
timestamp *) (var + offset * act_tuple)) = tres;
958 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)
static void PGresult * res
#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
char * ecpg_alloc(long, int)
#define ECPG_SQLSTATE_NO_DATA
#define ECPG_SQLSTATE_ECPG_OUT_OF_MEMORY
#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)
#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 PQgetlength(const PGresult *res, int tup_num, int field_num)
int PQfformat(const PGresult *res, int field_num)
char * PQgetvalue(const PGresult *res, int tup_num, int field_num)
int PQgetisnull(const PGresult *res, int tup_num, int field_num)
void ECPGset_noind_null(enum ECPGttype type, void *ptr)
struct sqlca_t * ECPGget_sqlca(void)
static const char hextbl[]
date PGTYPESdate_from_asc(char *, char **)
interval * PGTYPESinterval_from_asc(char *, char **)
int PGTYPESinterval_copy(interval *, interval *)
int PGTYPESnumeric_copy(numeric *, numeric *)
numeric * PGTYPESnumeric_new(void)
int PGTYPESnumeric_to_decimal(numeric *, decimal *)
void PGTYPESnumeric_free(numeric *)
numeric * PGTYPESnumeric_from_asc(char *, char **)
timestamp PGTYPEStimestamp_from_asc(char *, char **)
int pg_strncasecmp(const char *s1, const char *s2, size_t n)