diff options
author | Edin Kadribasic <edink@php.net> | 2005-02-05 22:55:23 +0000 |
---|---|---|
committer | Edin Kadribasic <edink@php.net> | 2005-02-05 22:55:23 +0000 |
commit | bf77a39349b4180ba871ee72bfdb9ba0ab7bf49f (patch) | |
tree | d03461d5ae0847b8fbce82736c9a8cb3932bd188 /ext/pdo_pgsql/pgsql_statement.c | |
parent | 64e8c3105cb1da936cabf92e66e89ef3248fbf34 (diff) | |
download | php-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.c | 28 |
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; } } |