Here's a patch to add pgsqlGetCopyData, pgsqlPutCopyData, and pgsqlEndCopyData methods. I opened bug #50092 but I don't seem able to attach the patch, so I attached it here.

--Tim


Index: ext/pdo_pgsql/pgsql_driver.c
===================================================================
--- ext/pdo_pgsql/pgsql_driver.c        (revision 290359)
+++ ext/pdo_pgsql/pgsql_driver.c        (working copy)
@@ -292,7 +292,7 @@
                return -1;
        }
        qs = PQresultStatus(res);
-       if (qs != PGRES_COMMAND_OK && qs != PGRES_TUPLES_OK) {
+       if (qs != PGRES_COMMAND_OK && qs != PGRES_TUPLES_OK && qs != 
PGRES_COPY_OUT && qs != PGRES_COPY_IN) {
                pdo_pgsql_error(dbh, qs, pdo_pgsql_sqlstate(res));
                PQclear(res);
                return -1;
@@ -603,11 +603,99 @@
 }
 /* }}} */
 
+/* {{{ proto string PDO::pgsqlGetCopyData()
+   Receives data after issuing a COPY TO STDOUT query. */
+static PHP_METHOD(PDO, pgsqlGetCopyData)
+{
+       pdo_dbh_t *dbh;
+       pdo_pgsql_db_handle *H;
+       int res;
+       char *buffer;
+       
+       dbh = zend_object_store_get_object(getThis() TSRMLS_CC);
+       PDO_CONSTRUCT_CHECK;
 
+       H = (pdo_pgsql_db_handle *)dbh->driver_data;
+
+       res = PQgetCopyData(H->server, &buffer, 0);
+
+       if (res > 0) {
+               char *ret = emalloc(res);
+               memcpy(ret, buffer, res);
+               PQfreemem(buffer);
+               RETURN_STRINGL(ret, res, 0);
+       } else if (res == -1) {
+               /* Done copying */
+               RETURN_FALSE;
+       } else {
+               pdo_pgsql_error(dbh, PGRES_FATAL_ERROR, "HY000");
+       }
+       RETURN_FALSE;
+}
+/* }}} */
+
+/* {{{ proto boolean PDO::pgsqlPutCopyData(string)
+   Send data to the postgresql server after issuing a COPY FROM STDIN. */
+static PHP_METHOD(PDO, pgsqlPutCopyData)
+{
+       pdo_dbh_t *dbh;
+       pdo_pgsql_db_handle *H;
+       int res;
+       char *buffer;
+       int bufferlen;
+
+       if (FAILURE == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s",
+                               &buffer, &bufferlen)) {
+               RETURN_FALSE;
+       }
+
+       dbh = zend_object_store_get_object(getThis() TSRMLS_CC);
+       PDO_CONSTRUCT_CHECK;
+
+       H = (pdo_pgsql_db_handle *)dbh->driver_data;
+
+       res = PQputCopyData(H->server, buffer, bufferlen);
+
+       if (res == 1) {
+               RETURN_TRUE;
+       } else {
+               pdo_pgsql_error(dbh, PGRES_FATAL_ERROR, "HY000");
+       }
+       RETURN_FALSE;
+}
+/* }}} */
+
+/* {{{ proto boolean PDO::pgsqlPutCopyEnd()
+   End sending data to the postgresql server after issuing a COPY FROM STDIN. 
*/
+static PHP_METHOD(PDO, pgsqlPutCopyEnd)
+{
+       pdo_dbh_t *dbh;
+       pdo_pgsql_db_handle *H;
+       int res;
+
+       dbh = zend_object_store_get_object(getThis() TSRMLS_CC);
+       PDO_CONSTRUCT_CHECK;
+
+       H = (pdo_pgsql_db_handle *)dbh->driver_data;
+
+       res = PQputCopyEnd(H->server, NULL);
+
+       if (res == 1) {
+               RETURN_TRUE;
+       } else {
+               pdo_pgsql_error(dbh, PGRES_FATAL_ERROR, "HY000");
+       }
+       RETURN_FALSE;
+}
+/* }}} */
+
 static const zend_function_entry dbh_methods[] = {
        PHP_ME(PDO, pgsqlLOBCreate, NULL, ZEND_ACC_PUBLIC)
        PHP_ME(PDO, pgsqlLOBOpen, NULL, ZEND_ACC_PUBLIC)
        PHP_ME(PDO, pgsqlLOBUnlink, NULL, ZEND_ACC_PUBLIC)
+       PHP_ME(PDO, pgsqlGetCopyData, NULL, ZEND_ACC_PUBLIC)
+       PHP_ME(PDO, pgsqlPutCopyData, NULL, ZEND_ACC_PUBLIC)
+       PHP_ME(PDO, pgsqlPutCopyEnd, NULL, ZEND_ACC_PUBLIC)
        {NULL, NULL, NULL}
 };
 
Index: ext/pdo_pgsql/pgsql_statement.c
===================================================================
--- ext/pdo_pgsql/pgsql_statement.c     (revision 290359)
+++ ext/pdo_pgsql/pgsql_statement.c     (working copy)
@@ -215,7 +215,7 @@
        }
        status = PQresultStatus(S->result);
 
-       if (status != PGRES_COMMAND_OK && status != PGRES_TUPLES_OK) {
+       if (status != PGRES_COMMAND_OK && status != PGRES_TUPLES_OK && status 
!= PGRES_COPY_OUT && status != PGRES_COPY_IN) {
                pdo_pgsql_error_stmt(stmt, status, 
pdo_pgsql_sqlstate(S->result));
                return 0;
        }
@@ -228,7 +228,7 @@
        if (status == PGRES_COMMAND_OK) {
                stmt->row_count = (long)atoi(PQcmdTuples(S->result));
                H->pgoid = PQoidValue(S->result);
-       } else {
+       } else if (status == PGRES_TUPLES_OK) {
                stmt->row_count = (long)PQntuples(S->result);
        }
 
@@ -423,6 +423,11 @@
        
        if (!S->result) {
                return 0;
+       } else {
+               ExecStatusType status = PQresultStatus(S->result);
+               if (status != PGRES_COMMAND_OK && status != PGRES_TUPLES_OK) {
+                       return 0;
+               }
        }
 
        cols[colno].name = estrdup(PQfname(S->result, colno));
-- 
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to