diff options
author | Michael Meskes <meskes@postgresql.org> | 2019-02-18 10:20:31 +0100 |
---|---|---|
committer | Michael Meskes <meskes@postgresql.org> | 2019-02-18 10:20:31 +0100 |
commit | 050710b36964dee7e1b2bf6b5ef00041fd5d2787 (patch) | |
tree | 888139b986d5d65660bd26d11c3c69d3b1d7e513 /src/interfaces/ecpg/ecpglib/descriptor.c | |
parent | 3fdc374b5d24b08119a91555ca2fae427af0b085 (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.c | 26 |
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; } |