]> granicus.if.org Git - php/commitdiff
Decode pgsql LOB objects (bytea type) on fetch
authorEdin Kadribasic <edink@php.net>
Sat, 5 Feb 2005 22:55:23 +0000 (22:55 +0000)
committerEdin Kadribasic <edink@php.net>
Sat, 5 Feb 2005 22:55:23 +0000 (22:55 +0000)
ext/pdo_pgsql/pgsql_driver.c
ext/pdo_pgsql/pgsql_statement.c
ext/pdo_pgsql/php_pdo_pgsql_int.h

index 2ed09c2dd7440cdbb95187e22262c6497b571f41..5fc582099373a55b4783be5338e6692a53b80cab 100644 (file)
@@ -167,7 +167,7 @@ static long pgsql_handle_doer(pdo_dbh_t *dbh, const char *sql, long sql_len TSRM
        return 1;
 }
 
-static int pgsql_handle_quoter(pdo_dbh_t *dbh, const char *unquoted, int unquotedlen, char **quoted, int *quotedlen  TSRMLS_DC)
+static int pgsql_handle_quoter(pdo_dbh_t *dbh, const char *unquoted, int unquotedlen, char **quoted, int *quotedlen, enum pdo_param_type paramtype TSRMLS_DC)
 {
        *quoted = emalloc(2*unquotedlen + 3);
        (*quoted)[0] = '\'';
index f2267bc9c3fdadaafa628ef65effba2ebd0d4226..4d535c55171718363e71993f68144f4de61d650c 100644 (file)
 #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;
                }
        }
 
index ee3e290f83b0e2eec37cee110585ea308ba43b18..2955baf2a5f485fccd69c4043d1ff2b1f9207199 100644 (file)
@@ -46,6 +46,8 @@ typedef struct {
        Oid          pgsql_type;
        long         intval;
        zend_bool    boolval;
+       char         *lobval;
+       size_t       loblen;
 } pdo_pgsql_column;
 
 typedef struct {