18.patch
text/x-patch
Filename: 18.patch
Type: text/x-patch
Part: 9
Patch
Same data as JSON:
GET /api/v1/attachments/:id/patch
the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes.
API reference →
Format: unified
| File | + | − |
|---|---|---|
| src/interfaces/ecpg/ecpglib/data.c | 69 | 41 |
| src/interfaces/ecpg/ecpglib/execute.c | 2 | 2 |
| src/interfaces/ecpg/ecpglib/extern.h | 1 | 1 |
| src/interfaces/ecpg/ecpglib/sqlda.c | 2 | 2 |
commit 2b5d491573360ba1416fba831e62d95e785623c0
Author: Böszörményi Zoltán <zb@cybertec.at>
Date: Thu Nov 28 11:51:40 2013 +0100
ECPG: Explicitly decouple the tuple index from the array index
in ecpg_get_data(). Document the function arguments.
diff --git a/src/interfaces/ecpg/ecpglib/data.c b/src/interfaces/ecpg/ecpglib/data.c
index 5f9a3d4..7f3c7cb 100644
--- a/src/interfaces/ecpg/ecpglib/data.c
+++ b/src/interfaces/ecpg/ecpglib/data.c
@@ -119,8 +119,35 @@ check_special_value(char *ptr, double *retval, char **endptr)
return false;
}
+/*
+ * ecpg_get_data
+ * Store one field data from PQgetvalue(results, act_tuple, act_field)
+ * into a target variable. If the field is NULL, store the indication or
+ * emit an error about the fact that there is no NULL indicator given.
+ * Parameters:
+ * results: result set
+ * act_tuple: row index in the result set
+ * act_field: column index in the result set
+ * var_index: array index in the target variable
+ * lineno: line number in the ECPG source file for debugging
+ * type: type of target variable
+ * ind_type: type of NULL indicator variable
+ * var: target variable
+ * ind: NULL indicator variable
+ * varcharsize: size of the variable if it's varchar
+ * offset: size of the target variable
+ * (used for indexing in an array)
+ * ind_offset: size of the NULL indicator variable
+ * (used for indexing in an array)
+ * isarray: array type
+ * compat: native PostgreSQL or Informix compatibility mode
+ * force_indicator:
+ * if Informix compatibility mode is set and no NULL indicator
+ * is given, provide a way to indicate NULL value in the
+ * target variable itself
+ */
bool
-ecpg_get_data(const PGresult *results, int act_tuple, int act_field, int lineno,
+ecpg_get_data(const PGresult *results, int act_tuple, int act_field, int var_index, 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)
@@ -167,20 +194,20 @@ ecpg_get_data(const PGresult *results, int act_tuple, int act_field, int lineno,
{
case ECPGt_short:
case ECPGt_unsigned_short:
- *((short *) (ind + ind_offset * act_tuple)) = value_for_indicator;
+ *((short *) (ind + ind_offset * var_index)) = value_for_indicator;
break;
case ECPGt_int:
case ECPGt_unsigned_int:
- *((int *) (ind + ind_offset * act_tuple)) = value_for_indicator;
+ *((int *) (ind + ind_offset * var_index)) = value_for_indicator;
break;
case ECPGt_long:
case ECPGt_unsigned_long:
- *((long *) (ind + ind_offset * act_tuple)) = value_for_indicator;
+ *((long *) (ind + ind_offset * var_index)) = value_for_indicator;
break;
#ifdef HAVE_LONG_LONG_INT
case ECPGt_long_long:
case ECPGt_unsigned_long_long:
- *((long long int *) (ind + ind_offset * act_tuple)) = value_for_indicator;
+ *((long long int *) (ind + ind_offset * var_index)) = value_for_indicator;
break;
#endif /* HAVE_LONG_LONG_INT */
case ECPGt_NO_INDICATOR:
@@ -192,7 +219,7 @@ ecpg_get_data(const PGresult *results, int act_tuple, int act_field, int lineno,
* Informix has an additional way to specify NULLs note
* that this uses special values to denote NULL
*/
- ECPGset_noind_null(type, var + offset * act_tuple);
+ ECPGset_noind_null(type, var + offset * var_index);
}
else
{
@@ -243,10 +270,10 @@ ecpg_get_data(const PGresult *results, int act_tuple, int act_field, int lineno,
if (binary)
{
if (varcharsize == 0 || varcharsize * offset >= size)
- memcpy(var + offset * act_tuple, pval, size);
+ memcpy(var + offset * var_index, pval, size);
else
{
- memcpy(var + offset * act_tuple, pval, varcharsize * offset);
+ memcpy(var + offset * var_index, pval, varcharsize * offset);
if (varcharsize * offset < size)
{
@@ -255,20 +282,20 @@ ecpg_get_data(const PGresult *results, int act_tuple, int act_field, int lineno,
{
case ECPGt_short:
case ECPGt_unsigned_short:
- *((short *) (ind + ind_offset * act_tuple)) = size;
+ *((short *) (ind + ind_offset * var_index)) = size;
break;
case ECPGt_int:
case ECPGt_unsigned_int:
- *((int *) (ind + ind_offset * act_tuple)) = size;
+ *((int *) (ind + ind_offset * var_index)) = size;
break;
case ECPGt_long:
case ECPGt_unsigned_long:
- *((long *) (ind + ind_offset * act_tuple)) = size;
+ *((long *) (ind + ind_offset * var_index)) = size;
break;
#ifdef HAVE_LONG_LONG_INT
case ECPGt_long_long:
case ECPGt_unsigned_long_long:
- *((long long int *) (ind + ind_offset * act_tuple)) = size;
+ *((long long int *) (ind + ind_offset * var_index)) = size;
break;
#endif /* HAVE_LONG_LONG_INT */
default:
@@ -307,13 +334,13 @@ ecpg_get_data(const PGresult *results, int act_tuple, int act_field, int lineno,
switch (type)
{
case ECPGt_short:
- *((short *) (var + offset * act_tuple)) = (short) res;
+ *((short *) (var + offset * var_index)) = (short) res;
break;
case ECPGt_int:
- *((int *) (var + offset * act_tuple)) = (int) res;
+ *((int *) (var + offset * var_index)) = (int) res;
break;
case ECPGt_long:
- *((long *) (var + offset * act_tuple)) = (long) res;
+ *((long *) (var + offset * var_index)) = (long) res;
break;
default:
/* Cannot happen */
@@ -336,13 +363,13 @@ ecpg_get_data(const PGresult *results, int act_tuple, int act_field, int lineno,
switch (type)
{
case ECPGt_unsigned_short:
- *((unsigned short *) (var + offset * act_tuple)) = (unsigned short) ures;
+ *((unsigned short *) (var + offset * var_index)) = (unsigned short) ures;
break;
case ECPGt_unsigned_int:
- *((unsigned int *) (var + offset * act_tuple)) = (unsigned int) ures;
+ *((unsigned int *) (var + offset * var_index)) = (unsigned int) ures;
break;
case ECPGt_unsigned_long:
- *((unsigned long *) (var + offset * act_tuple)) = (unsigned long) ures;
+ *((unsigned long *) (var + offset * var_index)) = (unsigned long) ures;
break;
default:
/* Cannot happen */
@@ -353,7 +380,7 @@ ecpg_get_data(const PGresult *results, int act_tuple, int act_field, int lineno,
#ifdef HAVE_LONG_LONG_INT
#ifdef HAVE_STRTOLL
case ECPGt_long_long:
- *((long long int *) (var + offset * act_tuple)) = strtoll(pval, &scan_length, 10);
+ *((long long int *) (var + offset * var_index)) = strtoll(pval, &scan_length, 10);
if (garbage_left(isarray, scan_length, compat))
{
ecpg_raise(lineno, ECPG_INT_FORMAT, ECPG_SQLSTATE_DATATYPE_MISMATCH, pval);
@@ -365,7 +392,7 @@ ecpg_get_data(const PGresult *results, int act_tuple, int act_field, int lineno,
#endif /* HAVE_STRTOLL */
#ifdef HAVE_STRTOULL
case ECPGt_unsigned_long_long:
- *((unsigned long long int *) (var + offset * act_tuple)) = strtoull(pval, &scan_length, 10);
+ *((unsigned long long int *) (var + offset * var_index)) = strtoull(pval, &scan_length, 10);
if ((isarray && *scan_length != ',' && *scan_length != '}')
|| (!isarray && !(INFORMIX_MODE(compat) && *scan_length == '.') && *scan_length != '\0' && *scan_length != ' ')) /* Garbage left */
{
@@ -400,10 +427,10 @@ ecpg_get_data(const PGresult *results, int act_tuple, int act_field, int lineno,
switch (type)
{
case ECPGt_float:
- *((float *) (var + offset * act_tuple)) = dres;
+ *((float *) (var + offset * var_index)) = dres;
break;
case ECPGt_double:
- *((double *) (var + offset * act_tuple)) = dres;
+ *((double *) (var + offset * var_index)) = dres;
break;
default:
/* Cannot happen */
@@ -415,9 +442,9 @@ ecpg_get_data(const PGresult *results, int act_tuple, int act_field, int lineno,
if (pval[0] == 'f' && pval[1] == '\0')
{
if (offset == sizeof(char))
- *((char *) (var + offset * act_tuple)) = false;
+ *((char *) (var + offset * var_index)) = false;
else if (offset == sizeof(int))
- *((int *) (var + offset * act_tuple)) = false;
+ *((int *) (var + offset * var_index)) = false;
else
ecpg_raise(lineno, ECPG_CONVERT_BOOL,
ECPG_SQLSTATE_DATATYPE_MISMATCH,
@@ -428,9 +455,9 @@ ecpg_get_data(const PGresult *results, int act_tuple, int act_field, int lineno,
else if (pval[0] == 't' && pval[1] == '\0')
{
if (offset == sizeof(char))
- *((char *) (var + offset * act_tuple)) = true;
+ *((char *) (var + offset * var_index)) = true;
else if (offset == sizeof(int))
- *((int *) (var + offset * act_tuple)) = true;
+ *((int *) (var + offset * var_index)) = true;
else
ecpg_raise(lineno, ECPG_CONVERT_BOOL,
ECPG_SQLSTATE_DATATYPE_MISMATCH,
@@ -453,7 +480,7 @@ ecpg_get_data(const PGresult *results, int act_tuple, int act_field, int lineno,
case ECPGt_unsigned_char:
case ECPGt_string:
{
- char *str = (char *) (var + offset * act_tuple);
+ char *str = (char *) (var + offset * var_index);
if (varcharsize == 0 || varcharsize > size)
{
@@ -481,20 +508,20 @@ ecpg_get_data(const PGresult *results, int act_tuple, int act_field, int lineno,
{
case ECPGt_short:
case ECPGt_unsigned_short:
- *((short *) (ind + ind_offset * act_tuple)) = size;
+ *((short *) (ind + ind_offset * var_index)) = size;
break;
case ECPGt_int:
case ECPGt_unsigned_int:
- *((int *) (ind + ind_offset * act_tuple)) = size;
+ *((int *) (ind + ind_offset * var_index)) = size;
break;
case ECPGt_long:
case ECPGt_unsigned_long:
- *((long *) (ind + ind_offset * act_tuple)) = size;
+ *((long *) (ind + ind_offset * var_index)) = size;
break;
#ifdef HAVE_LONG_LONG_INT
case ECPGt_long_long:
case ECPGt_unsigned_long_long:
- *((long long int *) (ind + ind_offset * act_tuple)) = size;
+ *((long long int *) (ind + ind_offset * var_index)) = size;
break;
#endif /* HAVE_LONG_LONG_INT */
default:
@@ -510,7 +537,7 @@ ecpg_get_data(const PGresult *results, int act_tuple, int act_field, int lineno,
case ECPGt_varchar:
{
struct ECPGgeneric_varchar *variable =
- (struct ECPGgeneric_varchar *) (var + offset * act_tuple);
+ (struct ECPGgeneric_varchar *) (var + offset * var_index);
variable->len = size;
if (varcharsize == 0)
@@ -526,20 +553,20 @@ ecpg_get_data(const PGresult *results, int act_tuple, int act_field, int lineno,
{
case ECPGt_short:
case ECPGt_unsigned_short:
- *((short *) (ind + ind_offset * act_tuple)) = variable->len;
+ *((short *) (ind + ind_offset * var_index)) = variable->len;
break;
case ECPGt_int:
case ECPGt_unsigned_int:
- *((int *) (ind + ind_offset * act_tuple)) = variable->len;
+ *((int *) (ind + ind_offset * var_index)) = variable->len;
break;
case ECPGt_long:
case ECPGt_unsigned_long:
- *((long *) (ind + ind_offset * act_tuple)) = variable->len;
+ *((long *) (ind + ind_offset * var_index)) = variable->len;
break;
#ifdef HAVE_LONG_LONG_INT
case ECPGt_long_long:
case ECPGt_unsigned_long_long:
- *((long long int *) (ind + ind_offset * act_tuple)) = variable->len;
+ *((long long int *) (ind + ind_offset * var_index)) = variable->len;
break;
#endif /* HAVE_LONG_LONG_INT */
default:
@@ -606,9 +633,9 @@ ecpg_get_data(const PGresult *results, int act_tuple, int act_field, int lineno,
pval = scan_length;
if (type == ECPGt_numeric)
- PGTYPESnumeric_copy(nres, (numeric *) (var + offset * act_tuple));
+ PGTYPESnumeric_copy(nres, (numeric *) (var + offset * var_index));
else
- PGTYPESnumeric_to_decimal(nres, (decimal *) (var + offset * act_tuple));
+ PGTYPESnumeric_to_decimal(nres, (decimal *) (var + offset * var_index));
PGTYPESnumeric_free(nres);
break;
@@ -659,7 +686,7 @@ ecpg_get_data(const PGresult *results, int act_tuple, int act_field, int lineno,
}
pval = scan_length;
- PGTYPESinterval_copy(ires, (interval *) (var + offset * act_tuple));
+ PGTYPESinterval_copy(ires, (interval *) (var + offset * var_index));
free(ires);
break;
@@ -703,7 +730,7 @@ ecpg_get_data(const PGresult *results, int act_tuple, int act_field, int lineno,
}
}
- *((date *) (var + offset * act_tuple)) = ddres;
+ *((date *) (var + offset * var_index)) = ddres;
pval = scan_length;
break;
@@ -747,7 +774,7 @@ ecpg_get_data(const PGresult *results, int act_tuple, int act_field, int lineno,
}
}
- *((timestamp *) (var + offset * act_tuple)) = tres;
+ *((timestamp *) (var + offset * var_index)) = tres;
pval = scan_length;
break;
@@ -764,6 +791,7 @@ ecpg_get_data(const PGresult *results, int act_tuple, int act_field, int lineno,
/* set array to next entry */
++act_tuple;
+ ++var_index;
/* set pval to the next entry */
diff --git a/src/interfaces/ecpg/ecpglib/execute.c b/src/interfaces/ecpg/ecpglib/execute.c
index ca3e0ba..438d3ab 100644
--- a/src/interfaces/ecpg/ecpglib/execute.c
+++ b/src/interfaces/ecpg/ecpglib/execute.c
@@ -433,7 +433,7 @@ ecpg_store_result(const PGresult *results, int act_field,
{
int len = strlen(PQgetvalue(results, act_tuple, act_field)) + 1;
- if (!ecpg_get_data(results, act_tuple, act_field, stmt->lineno,
+ if (!ecpg_get_data(results, act_tuple, act_field, act_tuple, stmt->lineno,
var->type, var->ind_type, current_data_location,
var->ind_value, len, 0, var->ind_offset, isarray, stmt->compat, stmt->force_indicator))
status = false;
@@ -452,7 +452,7 @@ ecpg_store_result(const PGresult *results, int act_field,
{
for (act_tuple = 0; act_tuple < ntuples && status; act_tuple++)
{
- if (!ecpg_get_data(results, act_tuple, act_field, stmt->lineno,
+ if (!ecpg_get_data(results, act_tuple, act_field, act_tuple, stmt->lineno,
var->type, var->ind_type, var->value,
var->ind_value, var->varcharsize, var->offset, var->ind_offset, isarray, stmt->compat, stmt->force_indicator))
status = false;
diff --git a/src/interfaces/ecpg/ecpglib/extern.h b/src/interfaces/ecpg/ecpglib/extern.h
index 1f96869..f91867c 100644
--- a/src/interfaces/ecpg/ecpglib/extern.h
+++ b/src/interfaces/ecpg/ecpglib/extern.h
@@ -139,7 +139,7 @@ extern struct var_list *ivlist;
/* Returns a pointer to a string containing a simple type name. */
void ecpg_add_mem(void *ptr, int lineno);
-bool ecpg_get_data(const PGresult *, int, int, int, enum ECPGttype type,
+bool ecpg_get_data(const PGresult *, int, int, int, int, enum ECPGttype type,
enum ECPGttype, char *, char *, long, long, long,
enum ARRAY_TYPE, enum COMPAT_MODE, bool);
diff --git a/src/interfaces/ecpg/ecpglib/sqlda.c b/src/interfaces/ecpg/ecpglib/sqlda.c
index bc94f2f..9985a6c 100644
--- a/src/interfaces/ecpg/ecpglib/sqlda.c
+++ b/src/interfaces/ecpg/ecpglib/sqlda.c
@@ -393,7 +393,7 @@ ecpg_set_compat_sqlda(int lineno, struct sqlda_compat ** _sqlda, const PGresult
if (!isnull)
{
if (set_data)
- ecpg_get_data(res, row, i, lineno,
+ ecpg_get_data(res, row, i, 0, lineno,
sqlda->sqlvar[i].sqltype, ECPGt_NO_INDICATOR,
sqlda->sqlvar[i].sqldata, NULL, 0, 0, 0,
ECPG_ARRAY_NONE, compat, false);
@@ -578,7 +578,7 @@ ecpg_set_native_sqlda(int lineno, struct sqlda_struct ** _sqlda, const PGresult
if (!isnull)
{
if (set_data)
- ecpg_get_data(res, row, i, lineno,
+ ecpg_get_data(res, row, i, 0, lineno,
sqlda->sqlvar[i].sqltype, ECPGt_NO_INDICATOR,
sqlda->sqlvar[i].sqldata, NULL, 0, 0, 0,
ECPG_ARRAY_NONE, compat, false);