diff options
author | Michael Meskes <meskes@postgresql.org> | 2009-02-02 16:14:06 +0000 |
---|---|---|
committer | Michael Meskes <meskes@postgresql.org> | 2009-02-02 16:14:06 +0000 |
commit | 2d3c6911465a2214c0f82fb604c6098d9975c5a5 (patch) | |
tree | acce4aac600cfaf2c9b6b255ff0166a58ba8c657 /src/interfaces/ecpg/ecpglib/execute.c | |
parent | 77ca0453847fe98d109d9874d84dc91ec56d1209 (diff) |
Fixed auto allocation for binary data types.
Diffstat (limited to 'src/interfaces/ecpg/ecpglib/execute.c')
-rw-r--r-- | src/interfaces/ecpg/ecpglib/execute.c | 63 |
1 files changed, 34 insertions, 29 deletions
diff --git a/src/interfaces/ecpg/ecpglib/execute.c b/src/interfaces/ecpg/ecpglib/execute.c index 1605ec0dc8a..54636c4bc95 100644 --- a/src/interfaces/ecpg/ecpglib/execute.c +++ b/src/interfaces/ecpg/ecpglib/execute.c @@ -1,4 +1,4 @@ -/* $PostgreSQL: pgsql/src/interfaces/ecpg/ecpglib/execute.c,v 1.79 2009/01/15 11:52:55 petere Exp $ */ +/* $PostgreSQL: pgsql/src/interfaces/ecpg/ecpglib/execute.c,v 1.80 2009/02/02 16:14:06 meskes Exp $ */ /* * The aim is to get a simpler inteface to the database routines. @@ -353,40 +353,45 @@ ecpg_store_result(const PGresult *results, int act_field, { int len = 0; - switch (var->type) + if (!PQfformat(results, act_field)) { - case ECPGt_char: - case ECPGt_unsigned_char: - if (!var->varcharsize && !var->arrsize) - { - /* special mode for handling char**foo=0 */ - for (act_tuple = 0; act_tuple < ntuples; act_tuple++) - len += strlen(PQgetvalue(results, act_tuple, act_field)) + 1; - len *= var->offset; /* should be 1, but YMNK */ - len += (ntuples + 1) * sizeof(char *); - } - else - { - var->varcharsize = 0; - /* check strlen for each tuple */ - for (act_tuple = 0; act_tuple < ntuples; act_tuple++) + switch (var->type) + { + case ECPGt_char: + case ECPGt_unsigned_char: + if (!var->varcharsize && !var->arrsize) + { + /* special mode for handling char**foo=0 */ + for (act_tuple = 0; act_tuple < ntuples; act_tuple++) + len += strlen(PQgetvalue(results, act_tuple, act_field)) + 1; + len *= var->offset; /* should be 1, but YMNK */ + len += (ntuples + 1) * sizeof(char *); + } + else { - int len = strlen(PQgetvalue(results, act_tuple, act_field)) + 1; + var->varcharsize = 0; + /* check strlen for each tuple */ + for (act_tuple = 0; act_tuple < ntuples; act_tuple++) + { + int len = strlen(PQgetvalue(results, act_tuple, act_field)) + 1; - if (len > var->varcharsize) - var->varcharsize = len; + if (len > var->varcharsize) + var->varcharsize = len; + } + var->offset *= var->varcharsize; + len = var->offset * ntuples; } - var->offset *= var->varcharsize; + break; + case ECPGt_varchar: + len = ntuples * (var->varcharsize + sizeof(int)); + break; + default: len = var->offset * ntuples; - } - break; - case ECPGt_varchar: - len = ntuples * (var->varcharsize + sizeof(int)); - break; - default: - len = var->offset * ntuples; - break; + break; + } } + else + len = PQgetlength(results, act_tuple, act_field); ecpg_log("ecpg_store_result on line %d: allocating memory for %d tuples\n", stmt->lineno, ntuples); var->value = (char *) ecpg_alloc(len, stmt->lineno); if (!var->value) |