diff options
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; } } |