summaryrefslogtreecommitdiff
path: root/ext/pdo_pgsql/pgsql_statement.c
diff options
context:
space:
mode:
authorEdin Kadribasic <edink@php.net>2005-02-05 22:55:23 +0000
committerEdin Kadribasic <edink@php.net>2005-02-05 22:55:23 +0000
commitbf77a39349b4180ba871ee72bfdb9ba0ab7bf49f (patch)
treed03461d5ae0847b8fbce82736c9a8cb3932bd188 /ext/pdo_pgsql/pgsql_statement.c
parent64e8c3105cb1da936cabf92e66e89ef3248fbf34 (diff)
downloadphp-git-bf77a39349b4180ba871ee72bfdb9ba0ab7bf49f.tar.gz
Decode pgsql LOB objects (bytea type) on fetch
Diffstat (limited to 'ext/pdo_pgsql/pgsql_statement.c')
-rw-r--r--ext/pdo_pgsql/pgsql_statement.c28
1 files changed, 28 insertions, 0 deletions
diff --git a/ext/pdo_pgsql/pgsql_statement.c b/ext/pdo_pgsql/pgsql_statement.c
index f2267bc9c3..4d535c5517 100644
--- a/ext/pdo_pgsql/pgsql_statement.c
+++ b/ext/pdo_pgsql/pgsql_statement.c
@@ -39,6 +39,20 @@
#define OIDOID 26
+static void _pdo_pgsql_free_lobs(pdo_stmt_t *stmt TSRMLS_DC)
+{
+ pdo_pgsql_stmt *S = (pdo_pgsql_stmt*)stmt->driver_data;
+ int i;
+
+ for (i=0; i<stmt->column_count; i++) {
+ if (S->cols[i].lobval) {
+ free(S->cols[i].lobval);
+ S->cols[i].lobval = NULL;
+ S->cols[i].lobval = 0;
+ }
+ }
+}
+
static int pgsql_stmt_dtor(pdo_stmt_t *stmt TSRMLS_DC)
{
pdo_pgsql_stmt *S = (pdo_pgsql_stmt*)stmt->driver_data;
@@ -63,6 +77,7 @@ static int pgsql_stmt_dtor(pdo_stmt_t *stmt TSRMLS_DC)
}
if(S->cols) {
+ _pdo_pgsql_free_lobs(stmt TSRMLS_CC);
efree(S->cols);
S->cols = NULL;
}
@@ -126,6 +141,9 @@ static int pgsql_stmt_fetch(pdo_stmt_t *stmt,
{
pdo_pgsql_stmt *S = (pdo_pgsql_stmt*)stmt->driver_data;
+ /* free any allocated lob objects from the previos fetch operation */
+ _pdo_pgsql_free_lobs(stmt TSRMLS_CC);
+
if (S->cursor_name) {
char *ori_str = NULL;
char *q = NULL;
@@ -195,6 +213,10 @@ static int pgsql_stmt_describe(pdo_stmt_t *stmt, int colno TSRMLS_DC)
}
break;
+ case BYTEAOID:
+ cols[colno].param_type = PDO_PARAM_LOB;
+ break;
+
default:
cols[colno].param_type = PDO_PARAM_STR;
}
@@ -232,6 +254,12 @@ static int pgsql_stmt_get_col(pdo_stmt_t *stmt, int colno, char **ptr, unsigned
*ptr = (char *) &(S->cols[colno].boolval);
*len = sizeof(zend_bool);
break;
+
+ case PDO_PARAM_LOB:
+ S->cols[colno].lobval = PQunescapeBytea(*ptr, &(S->cols[colno].loblen));
+ *ptr = S->cols[colno].lobval;
+ *len = S->cols[colno].loblen;
+ break;
}
}