summaryrefslogtreecommitdiff
path: root/src/interfaces/ecpg/ecpglib/descriptor.c
diff options
context:
space:
mode:
authorMichael Meskes <meskes@postgresql.org>2019-02-18 10:20:31 +0100
committerMichael Meskes <meskes@postgresql.org>2019-02-18 10:20:31 +0100
commit050710b36964dee7e1b2bf6b5ef00041fd5d2787 (patch)
tree888139b986d5d65660bd26d11c3c69d3b1d7e513 /src/interfaces/ecpg/ecpglib/descriptor.c
parent3fdc374b5d24b08119a91555ca2fae427af0b085 (diff)
Add bytea datatype to ECPG.
So far ECPG programs had to treat binary data for bytea column as 'char' type. But this meant converting from/to escaped format with PQunescapeBytea/ PQescapeBytea() and therefore forcing users to add unnecessary code and cost for the conversion in runtime. By adding a dedicated datatype for bytea most of this special handling is no longer needed. Author: Matsumura-san ("Matsumura, Ryo" <matsumura.ryo@jp.fujitsu.com>) Discussion: https://postgr.es/m/flat/03040DFF97E6E54E88D3BFEE5F5480F737A141F9@G01JPEXMBYT04
Diffstat (limited to 'src/interfaces/ecpg/ecpglib/descriptor.c')
-rw-r--r--src/interfaces/ecpg/ecpglib/descriptor.c26
1 files changed, 23 insertions, 3 deletions
diff --git a/src/interfaces/ecpg/ecpglib/descriptor.c b/src/interfaces/ecpg/ecpglib/descriptor.c
index d19dce21108..97849d0793b 100644
--- a/src/interfaces/ecpg/ecpglib/descriptor.c
+++ b/src/interfaces/ecpg/ecpglib/descriptor.c
@@ -587,6 +587,28 @@ ECPGset_desc_header(int lineno, const char *desc_name, int count)
return true;
}
+static void
+set_desc_attr(struct descriptor_item *desc_item, struct variable *var,
+ char *tobeinserted)
+{
+ if (var->type != ECPGt_bytea)
+ desc_item->is_binary = false;
+
+ else
+ {
+ struct ECPGgeneric_varchar *variable =
+ (struct ECPGgeneric_varchar *) (var->value);
+
+ desc_item->is_binary = true;
+ desc_item->data_len = variable->len;
+ }
+
+ ecpg_free(desc_item->data); /* free() takes care of a
+ * potential NULL value */
+ desc_item->data = (char *) tobeinserted;
+}
+
+
bool
ECPGset_desc(int lineno, const char *desc_name, int index,...)
{
@@ -666,9 +688,7 @@ ECPGset_desc(int lineno, const char *desc_name, int index,...)
return false;
}
- ecpg_free(desc_item->data); /* free() takes care of a
- * potential NULL value */
- desc_item->data = (char *) tobeinserted;
+ set_desc_attr(desc_item, var, tobeinserted);
tobeinserted = NULL;
break;
}