]> granicus.if.org Git - php/commitdiff
- MFB: New parameter parsing API
authorFelipe Pena <felipe@php.net>
Mon, 30 Jun 2008 01:59:35 +0000 (01:59 +0000)
committerFelipe Pena <felipe@php.net>
Mon, 30 Jun 2008 01:59:35 +0000 (01:59 +0000)
- Fixed tests

ext/pgsql/pgsql.c
ext/pgsql/tests/08escape.phpt
ext/pgsql/tests/98old_api.phpt

index 01e4a054a8816fb797eb2b8500cecccc7c602d68..3c26f08ac5d4aa3330388d5b9e0c33157f732f33 100644 (file)
@@ -848,37 +848,31 @@ PHP_FUNCTION(pg_pconnect)
    Close a PostgreSQL connection */ 
 PHP_FUNCTION(pg_close)
 {
-       zval **pgsql_link = NULL;
-       int id;
+       zval *pgsql_link = NULL;
+       int id = -1, argc = ZEND_NUM_ARGS();
        PGconn *pgsql;
        
-       switch (ZEND_NUM_ARGS()) {
-               case 0:
-                       id = PGG(default_link);
-                       CHECK_DEFAULT_LINK(id);
-                       break;
-               case 1:
-                       if (zend_get_parameters_ex(1, &pgsql_link)==FAILURE) {
-                               RETURN_FALSE;
-                       }
-                       id = -1;
-                       break;
-               default:
-                       WRONG_PARAM_COUNT;
-                       break;
+       if (zend_parse_parameters(argc TSRMLS_CC, "|r", &pgsql_link) == FAILURE) {
+               return;
        }
+       
+       if (argc == 0) {
+               id = PGG(default_link);
+               CHECK_DEFAULT_LINK(id);
+       }
+
        if (pgsql_link == NULL && id == -1) {
                RETURN_FALSE;
        }       
 
-       ZEND_FETCH_RESOURCE2(pgsql, PGconn *, pgsql_link, id, "PostgreSQL link", le_link, le_plink);
+       ZEND_FETCH_RESOURCE2(pgsql, PGconn *, &pgsql_link, id, "PostgreSQL link", le_link, le_plink);
 
        if (id==-1) { /* explicit resource number */
-               zend_list_delete(Z_RESVAL_PP(pgsql_link));
+               zend_list_delete(Z_RESVAL_P(pgsql_link));
        }
 
        if (id!=-1 
-               || (pgsql_link && Z_RESVAL_PP(pgsql_link)==PGG(default_link))) {
+               || (pgsql_link && Z_RESVAL_P(pgsql_link)==PGG(default_link))) {
                zend_list_delete(PGG(default_link));
                PGG(default_link) = -1;
        }
@@ -900,30 +894,25 @@ PHP_FUNCTION(pg_close)
  */
 static void php_pgsql_get_link_info(INTERNAL_FUNCTION_PARAMETERS, int entry_type)
 {
-       zval **pgsql_link = NULL;
-       int id = -1;
+       zval *pgsql_link = NULL;
+       int id = -1, argc = ZEND_NUM_ARGS();
        PGconn *pgsql;
        char *msgbuf;
 
-       switch(ZEND_NUM_ARGS()) {
-               case 0:
-                       id = PGG(default_link);
-                       CHECK_DEFAULT_LINK(id);
-                       break;
-               case 1:
-                       if (zend_get_parameters_ex(1, &pgsql_link)==FAILURE) {
-                               RETURN_FALSE;
-                       }
-                       break;
-               default:
-                       WRONG_PARAM_COUNT;
-                       break;
+       if (zend_parse_parameters(argc TSRMLS_CC, "|r", &pgsql_link) == FAILURE) {
+               return;
        }
+       
+       if (argc == 0) {
+               id = PGG(default_link);
+               CHECK_DEFAULT_LINK(id);
+       }
+       
        if (pgsql_link == NULL && id == -1) {
                RETURN_FALSE;
        }       
 
-       ZEND_FETCH_RESOURCE2(pgsql, PGconn *, pgsql_link, id, "PostgreSQL link", le_link, le_plink);
+       ZEND_FETCH_RESOURCE2(pgsql, PGconn *, &pgsql_link, id, "PostgreSQL link", le_link, le_plink);
 
        switch(entry_type) {
                case PHP_PG_DBNAME:
@@ -1103,38 +1092,33 @@ PHP_FUNCTION(pg_ping)
    Execute a query */
 PHP_FUNCTION(pg_query)
 {
-       zval **query, **pgsql_link = NULL;
-       int id = -1;
+       zval *pgsql_link = NULL;
+       char *query;
+       int id = -1, query_len, argc = ZEND_NUM_ARGS();
        int leftover = 0;
        PGconn *pgsql;
        PGresult *pgsql_result;
        ExecStatusType status;
        pgsql_result_handle *pg_result;
 
-       switch(ZEND_NUM_ARGS()) {
-               case 1:
-                       if (zend_get_parameters_ex(1, &query)==FAILURE) {
-                               RETURN_FALSE;
-                       }
-                       id = PGG(default_link);
-                       CHECK_DEFAULT_LINK(id);
-                       break;
-               case 2:
-                       if (zend_get_parameters_ex(2, &pgsql_link, &query)==FAILURE) {
-                               RETURN_FALSE;
-                       }
-                       break;
-               default:
-                       WRONG_PARAM_COUNT;
-                       break;
+       if (argc == 1) {
+               if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &query, &query_len) == FAILURE) {
+                       return;
+               }
+               id = PGG(default_link);
+               CHECK_DEFAULT_LINK(id);
+       } else {
+               if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &pgsql_link, &query, &query_len) == FAILURE) {
+                       return;
+               }
        }
+
        if (pgsql_link == NULL && id == -1) {
                RETURN_FALSE;
-       }       
+       }
 
-       ZEND_FETCH_RESOURCE2(pgsql, PGconn *, pgsql_link, id, "PostgreSQL link", le_link, le_plink);
+       ZEND_FETCH_RESOURCE2(pgsql, PGconn *, &pgsql_link, id, "PostgreSQL link", le_link, le_plink);
 
-       convert_to_string_ex(query);
        if (PQ_SETNONBLOCKING(pgsql, 0)) {
                php_error_docref(NULL TSRMLS_CC, E_NOTICE,"Cannot set connection to blocking mode");
                RETURN_FALSE;
@@ -1146,11 +1130,11 @@ PHP_FUNCTION(pg_query)
        if (leftover) {
                php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Found results on this connection. Use pg_get_result() to get these results first");
        }
-       pgsql_result = PQexec(pgsql, Z_STRVAL_PP(query));
+       pgsql_result = PQexec(pgsql, query);
        if ((PGG(auto_reset_persistent) & 2) && PQstatus(pgsql) != CONNECTION_OK) {
                PQclear(pgsql_result);
                PQreset(pgsql);
-               pgsql_result = PQexec(pgsql, Z_STRVAL_PP(query));
+               pgsql_result = PQexec(pgsql, query);
        }
 
        if (pgsql_result) {
@@ -1201,9 +1185,10 @@ static void _php_pgsql_free_params(char **params, int num_params)
    Execute a query */
 PHP_FUNCTION(pg_query_params)
 {
-       zval **query, **pgsql_link = NULL;
-       zval **pv_param_arr, **tmp;
-       int id = -1;
+       zval *pgsql_link = NULL;
+       zval *pv_param_arr, **tmp;
+       char *query;
+       int query_len, id = -1, argc = ZEND_NUM_ARGS();
        int leftover = 0;
        int num_params = 0;
        char **params = NULL;
@@ -1212,36 +1197,25 @@ PHP_FUNCTION(pg_query_params)
        PGresult *pgsql_result;
        ExecStatusType status;
        pgsql_result_handle *pg_result;
-
-       switch(ZEND_NUM_ARGS()) {
-               case 2:
-                       if (zend_get_parameters_ex(2, &query, &pv_param_arr)==FAILURE) {
-                               RETURN_FALSE;
-                       }
-                       id = PGG(default_link);
-                       CHECK_DEFAULT_LINK(id);
-                       break;
-               case 3:
-                       if (zend_get_parameters_ex(3, &pgsql_link, &query, &pv_param_arr)==FAILURE) {
-                               RETURN_FALSE;
-                       }
-                       break;
-               default:
-                       WRONG_PARAM_COUNT;
-                       break;
+       
+       if (argc == 2) {
+               if (zend_parse_parameters(argc TSRMLS_CC, "sa", &query, &query_len, &pv_param_arr) == FAILURE) {
+                       return;
+               }
+               id = PGG(default_link);
+               CHECK_DEFAULT_LINK(id);
+       } else {
+               if (zend_parse_parameters(argc TSRMLS_CC, "rsa", &pgsql_link, &query, &query_len, &pv_param_arr) == FAILURE) {
+                       return;
+               }
        }
-       if (pgsql_link == NULL && id == -1) {
-               RETURN_FALSE;
-       }       
 
-       if (Z_TYPE_PP(pv_param_arr) != IS_ARRAY) {
-               php_error_docref(NULL TSRMLS_CC, E_WARNING, "No array passed");
+       if (pgsql_link == NULL && id == -1) {
                RETURN_FALSE;
        }
 
-       ZEND_FETCH_RESOURCE2(pgsql, PGconn *, pgsql_link, id, "PostgreSQL link", le_link, le_plink);
+       ZEND_FETCH_RESOURCE2(pgsql, PGconn *, &pgsql_link, id, "PostgreSQL link", le_link, le_plink);
 
-       convert_to_string_ex(query);
        if (PQ_SETNONBLOCKING(pgsql, 0)) {
                php_error_docref(NULL TSRMLS_CC, E_NOTICE,"Cannot set connection to blocking mode");
                RETURN_FALSE;
@@ -1254,14 +1228,14 @@ PHP_FUNCTION(pg_query_params)
                php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Found results on this connection. Use pg_get_result() to get these results first");
        }
 
-       zend_hash_internal_pointer_reset(Z_ARRVAL_PP(pv_param_arr));
-       num_params = zend_hash_num_elements(Z_ARRVAL_PP(pv_param_arr));
+       zend_hash_internal_pointer_reset(Z_ARRVAL_P(pv_param_arr));
+       num_params = zend_hash_num_elements(Z_ARRVAL_P(pv_param_arr));
        if (num_params > 0) {
                int i = 0;
                params = (char **)safe_emalloc(sizeof(char *), num_params, 0);
                
                for(i = 0; i < num_params; i++) {
-                       if (zend_hash_get_current_data(Z_ARRVAL_PP(pv_param_arr), (void **) &tmp) == FAILURE) {
+                       if (zend_hash_get_current_data(Z_ARRVAL_P(pv_param_arr), (void **) &tmp) == FAILURE) {
                                php_error_docref(NULL TSRMLS_CC, E_WARNING,"Error getting parameter");
                                _php_pgsql_free_params(params, num_params);
                                RETURN_FALSE;
@@ -1282,16 +1256,16 @@ PHP_FUNCTION(pg_query_params)
                                params[i] = Z_STRVAL_PP(tmp);
                        }
 
-                       zend_hash_move_forward(Z_ARRVAL_PP(pv_param_arr));
+                       zend_hash_move_forward(Z_ARRVAL_P(pv_param_arr));
                }
        }
 
-       pgsql_result = PQexecParams(pgsql, Z_STRVAL_PP(query), num_params, 
+       pgsql_result = PQexecParams(pgsql, query, num_params, 
                                        NULL, (const char * const *)params, NULL, NULL, 0);
        if ((PGG(auto_reset_persistent) & 2) && PQstatus(pgsql) != CONNECTION_OK) {
                PQclear(pgsql_result);
                PQreset(pgsql);
-               pgsql_result = PQexecParams(pgsql, Z_STRVAL_PP(query), num_params, 
+               pgsql_result = PQexecParams(pgsql, query, num_params, 
                                                NULL, (const char * const *)params, NULL, NULL, 0);
        }
 
@@ -1335,39 +1309,33 @@ PHP_FUNCTION(pg_query_params)
    Prepare a query for future execution */
 PHP_FUNCTION(pg_prepare)
 {
-       zval **query, **stmtname, **pgsql_link = NULL;
-       int id = -1;
+       zval *pgsql_link = NULL;
+       char *query, *stmtname;
+       int query_len, stmtname_len, id = -1, argc = ZEND_NUM_ARGS();
        int leftover = 0;
        PGconn *pgsql;
        PGresult *pgsql_result;
        ExecStatusType status;
        pgsql_result_handle *pg_result;
 
-       switch(ZEND_NUM_ARGS()) {
-               case 2:
-                       if (zend_get_parameters_ex(2, &stmtname, &query)==FAILURE) {
-                               RETURN_FALSE;
-                       }
-                       id = PGG(default_link);
-                       CHECK_DEFAULT_LINK(id);
-                       break;
-               case 3:
-                       if (zend_get_parameters_ex(3, &pgsql_link, &stmtname, &query)==FAILURE) {
-                               RETURN_FALSE;
-                       }
-                       break;
-               default:
-                       WRONG_PARAM_COUNT;
-                       break;
+       if (argc == 2) {
+               if (zend_parse_parameters(argc TSRMLS_CC, "ss", &stmtname, &stmtname_len, &query, &query_len) == FAILURE) {
+                       return;
+               }
+               id = PGG(default_link);
+               CHECK_DEFAULT_LINK(id);
+       } else {
+               if (zend_parse_parameters(argc TSRMLS_CC, "rss", &pgsql_link, &stmtname, &stmtname_len, &query, &query_len) == FAILURE) {
+                       return;
+               }
        }
+       
        if (pgsql_link == NULL && id == -1) {
                RETURN_FALSE;
        }       
 
-       ZEND_FETCH_RESOURCE2(pgsql, PGconn *, pgsql_link, id, "PostgreSQL link", le_link, le_plink);
+       ZEND_FETCH_RESOURCE2(pgsql, PGconn *, &pgsql_link, id, "PostgreSQL link", le_link, le_plink);
 
-       convert_to_string_ex(stmtname);
-       convert_to_string_ex(query);
        if (PQ_SETNONBLOCKING(pgsql, 0)) {
                php_error_docref(NULL TSRMLS_CC, E_NOTICE,"Cannot set connection to blocking mode");
                RETURN_FALSE;
@@ -1379,11 +1347,11 @@ PHP_FUNCTION(pg_prepare)
        if (leftover) {
                php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Found results on this connection. Use pg_get_result() to get these results first");
        }
-       pgsql_result = PQprepare(pgsql, Z_STRVAL_PP(stmtname), Z_STRVAL_PP(query), 0, NULL);
+       pgsql_result = PQprepare(pgsql, stmtname, query, 0, NULL);
        if ((PGG(auto_reset_persistent) & 2) && PQstatus(pgsql) != CONNECTION_OK) {
                PQclear(pgsql_result);
                PQreset(pgsql);
-               pgsql_result = PQprepare(pgsql, Z_STRVAL_PP(stmtname), Z_STRVAL_PP(query), 0, NULL);
+               pgsql_result = PQprepare(pgsql, stmtname, query, 0, NULL);
        }
 
        if (pgsql_result) {
@@ -1424,9 +1392,10 @@ PHP_FUNCTION(pg_prepare)
    Execute a prepared query  */
 PHP_FUNCTION(pg_execute)
 {
-       zval **stmtname, **pgsql_link = NULL;
-       zval **pv_param_arr, **tmp;
-       int id = -1;
+       zval *pgsql_link = NULL;
+       zval *pv_param_arr, **tmp;
+       char *stmtname;
+       int stmtname_len, id = -1, argc = ZEND_NUM_ARGS();
        int leftover = 0;
        int num_params = 0;
        char **params = NULL;
@@ -1436,35 +1405,24 @@ PHP_FUNCTION(pg_execute)
        ExecStatusType status;
        pgsql_result_handle *pg_result;
 
-       switch(ZEND_NUM_ARGS()) {
-               case 2:
-                       if (zend_get_parameters_ex(2, &stmtname, &pv_param_arr)==FAILURE) {
-                               RETURN_FALSE;
-                       }
-                       id = PGG(default_link);
-                       CHECK_DEFAULT_LINK(id);
-                       break;
-               case 3:
-                       if (zend_get_parameters_ex(3, &pgsql_link, &stmtname, &pv_param_arr)==FAILURE) {
-                               RETURN_FALSE;
-                       }
-                       break;
-               default:
-                       WRONG_PARAM_COUNT;
-                       break;
+       if (argc == 2) {
+               if (zend_parse_parameters(argc TSRMLS_CC, "sa/", &stmtname, &stmtname_len, &pv_param_arr)==FAILURE) {
+                       return;
+               }
+               id = PGG(default_link);
+               CHECK_DEFAULT_LINK(id);
+       } else {
+               if (zend_parse_parameters(argc TSRMLS_CC, "rsa/", &pgsql_link, &stmtname, &stmtname_len, &pv_param_arr) == FAILURE) {
+                       return;
+               }
        }
-       if (pgsql_link == NULL && id == -1) {
-               RETURN_FALSE;
-       }       
 
-       if (Z_TYPE_PP(pv_param_arr) != IS_ARRAY) {
-               php_error_docref(NULL TSRMLS_CC, E_WARNING, "No array passed");
+       if (pgsql_link == NULL && id == -1) {
                RETURN_FALSE;
        }
 
-       ZEND_FETCH_RESOURCE2(pgsql, PGconn *, pgsql_link, id, "PostgreSQL link", le_link, le_plink);
+       ZEND_FETCH_RESOURCE2(pgsql, PGconn *, &pgsql_link, id, "PostgreSQL link", le_link, le_plink);
 
-       convert_to_string_ex(stmtname);
        if (PQ_SETNONBLOCKING(pgsql, 0)) {
                php_error_docref(NULL TSRMLS_CC, E_NOTICE,"Cannot set connection to blocking mode");
                RETURN_FALSE;
@@ -1477,15 +1435,14 @@ PHP_FUNCTION(pg_execute)
                php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Found results on this connection. Use pg_get_result() to get these results first");
        }
 
-       SEPARATE_ZVAL(pv_param_arr);
-       zend_hash_internal_pointer_reset(Z_ARRVAL_PP(pv_param_arr));
-       num_params = zend_hash_num_elements(Z_ARRVAL_PP(pv_param_arr));
+       zend_hash_internal_pointer_reset(Z_ARRVAL_P(pv_param_arr));
+       num_params = zend_hash_num_elements(Z_ARRVAL_P(pv_param_arr));
        if (num_params > 0) {
                int i = 0;
                params = (char **)safe_emalloc(sizeof(char *), num_params, 0);
                
                for(i = 0; i < num_params; i++) {
-                       if (zend_hash_get_current_data(Z_ARRVAL_PP(pv_param_arr), (void **) &tmp) == FAILURE) {
+                       if (zend_hash_get_current_data(Z_ARRVAL_P(pv_param_arr), (void **) &tmp) == FAILURE) {
                                php_error_docref(NULL TSRMLS_CC, E_WARNING,"Error getting parameter");
                                _php_pgsql_free_params(params, num_params);
                                RETURN_FALSE;
@@ -1506,16 +1463,16 @@ PHP_FUNCTION(pg_execute)
                                params[i] = Z_STRVAL_PP(tmp);
                        }
 
-                       zend_hash_move_forward(Z_ARRVAL_PP(pv_param_arr));
+                       zend_hash_move_forward(Z_ARRVAL_P(pv_param_arr));
                }
        }
 
-       pgsql_result = PQexecPrepared(pgsql, Z_STRVAL_PP(stmtname), num_params, 
+       pgsql_result = PQexecPrepared(pgsql, stmtname, num_params, 
                                        (const char * const *)params, NULL, NULL, 0);
        if ((PGG(auto_reset_persistent) & 2) && PQstatus(pgsql) != CONNECTION_OK) {
                PQclear(pgsql_result);
                PQreset(pgsql);
-               pgsql_result = PQexecPrepared(pgsql, Z_STRVAL_PP(stmtname), num_params, 
+               pgsql_result = PQexecPrepared(pgsql, stmtname, num_params, 
                                                (const char * const *)params, NULL, NULL, 0);
        }
 
@@ -1562,15 +1519,15 @@ PHP_FUNCTION(pg_execute)
  */
 static void php_pgsql_get_result_info(INTERNAL_FUNCTION_PARAMETERS, int entry_type)
 {
-       zval **result;
+       zval *result;
        PGresult *pgsql_result;
        pgsql_result_handle *pg_result;
 
-       if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &result)==FAILURE) {
-               WRONG_PARAM_COUNT;
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &result) == FAILURE) {
+               return;
        }
        
-       ZEND_FETCH_RESOURCE(pg_result, pgsql_result_handle *, result, -1, "PostgreSQL result", le_result);
+       ZEND_FETCH_RESOURCE(pg_result, pgsql_result_handle *, &result, -1, "PostgreSQL result", le_result);
 
        pgsql_result = pg_result->result;
 
@@ -1631,8 +1588,7 @@ PHP_FUNCTION(pg_last_notice)
        int id = -1;
        php_pgsql_notice **notice;
        
-       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r",
-                                                         &pgsql_link) == FAILURE) {
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &pgsql_link) == FAILURE) {
                return;
        }
        /* Just to check if user passed valid resoruce */
@@ -1806,44 +1762,44 @@ PHP_FUNCTION(pg_field_table)
  */
 static void php_pgsql_get_field_info(INTERNAL_FUNCTION_PARAMETERS, int entry_type)
 {
-       zval **result, **field;
+       zval *result;
+       long field;
        PGresult *pgsql_result;
        pgsql_result_handle *pg_result;
        Oid oid;
        
-       if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &result, &field)==FAILURE) {
-               WRONG_PARAM_COUNT;
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rl", &result, &field) == FAILURE) {
+               return;
        }
        
-       ZEND_FETCH_RESOURCE(pg_result, pgsql_result_handle *, result, -1, "PostgreSQL result", le_result);
+       ZEND_FETCH_RESOURCE(pg_result, pgsql_result_handle *, &result, -1, "PostgreSQL result", le_result);
 
        pgsql_result = pg_result->result;
-       convert_to_long_ex(field);
        
-       if (Z_LVAL_PP(field) < 0 || Z_LVAL_PP(field) >= PQnfields(pgsql_result)) {
+       if (field < 0 || field >= PQnfields(pgsql_result)) {
                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Bad field offset specified");
                RETURN_FALSE;
        }
        
        switch (entry_type) {
                case PHP_PG_FIELD_NAME:
-                       Z_STRVAL_P(return_value) = PQfname(pgsql_result, Z_LVAL_PP(field));
+                       Z_STRVAL_P(return_value) = PQfname(pgsql_result, field);
                        Z_STRLEN_P(return_value) = strlen(Z_STRVAL_P(return_value));
                        Z_STRVAL_P(return_value) = estrndup(Z_STRVAL_P(return_value),Z_STRLEN_P(return_value));
                        Z_TYPE_P(return_value) = IS_STRING;
                        break;
                case PHP_PG_FIELD_SIZE:
-                       Z_LVAL_P(return_value) = PQfsize(pgsql_result, Z_LVAL_PP(field));
+                       Z_LVAL_P(return_value) = PQfsize(pgsql_result, field);
                        Z_TYPE_P(return_value) = IS_LONG;
                        break;
                case PHP_PG_FIELD_TYPE:
-                       Z_STRVAL_P(return_value) = get_field_name(pg_result->conn, PQftype(pgsql_result, Z_LVAL_PP(field)), &EG(regular_list) TSRMLS_CC);
+                       Z_STRVAL_P(return_value) = get_field_name(pg_result->conn, PQftype(pgsql_result, field), &EG(regular_list) TSRMLS_CC);
                        Z_STRLEN_P(return_value) = strlen(Z_STRVAL_P(return_value));
                        Z_TYPE_P(return_value) = IS_STRING;
                        break;
                case PHP_PG_FIELD_TYPE_OID:
                        
-                       oid = PQftype(pgsql_result, Z_LVAL_PP(field));
+                       oid = PQftype(pgsql_result, field);
 
                        if (oid > LONG_MAX) {
                                smart_str s = {0};
@@ -1852,9 +1808,7 @@ static void php_pgsql_get_field_info(INTERNAL_FUNCTION_PARAMETERS, int entry_typ
                                Z_STRVAL_P(return_value) = s.c;
                                Z_STRLEN_P(return_value) = s.len;
                                Z_TYPE_P(return_value) = IS_STRING;
-                       }
-                       else
-                       {
+                       } else {
                                Z_LVAL_P(return_value) = (long)oid;
                                Z_TYPE_P(return_value) = IS_LONG;
                        }
@@ -1902,20 +1856,21 @@ PHP_FUNCTION(pg_field_type_oid)
    Returns the field number of the named field */
 PHP_FUNCTION(pg_field_num)
 {
-       zval **result, **field;
+       zval *result;
+       char *field;
+       int field_len;
        PGresult *pgsql_result;
        pgsql_result_handle *pg_result;
 
-       if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &result, &field)==FAILURE) {
-               WRONG_PARAM_COUNT;
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &result, &field, &field_len) == FAILURE) {
+               return;
        }
        
-       ZEND_FETCH_RESOURCE(pg_result, pgsql_result_handle *, result, -1, "PostgreSQL result", le_result);
+       ZEND_FETCH_RESOURCE(pg_result, pgsql_result_handle *, &result, -1, "PostgreSQL result", le_result);
 
        pgsql_result = pg_result->result;
        
-       convert_to_string_ex(field);
-       Z_LVAL_P(return_value) = PQfnumber(pgsql_result, Z_STRVAL_PP(field));
+       Z_LVAL_P(return_value) = PQfnumber(pgsql_result, field);
        Z_TYPE_P(return_value) = IS_LONG;
 }
 /* }}} */
@@ -1924,32 +1879,38 @@ PHP_FUNCTION(pg_field_num)
    Returns values from a result identifier */
 PHP_FUNCTION(pg_fetch_result)
 {
-       zval **result, **row, **field=NULL;
+       zval *result, **field=NULL;
+       long row;
        PGresult *pgsql_result;
        pgsql_result_handle *pg_result;
-       int field_offset, pgsql_row;
+       int field_offset, pgsql_row, argc = ZEND_NUM_ARGS();
        
-       if ((ZEND_NUM_ARGS() != 3 || zend_get_parameters_ex(3, &result, &row, &field)==FAILURE) &&
-           (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &result, &field)==FAILURE)) {
-               WRONG_PARAM_COUNT;
+       if (argc == 2) {
+               if (zend_parse_parameters(argc TSRMLS_CC, "rZ", &result, &field) == FAILURE) {
+                       return;
+               }
+       } else {
+               if (zend_parse_parameters(argc TSRMLS_CC, "rlZ", &result, &row, &field) == FAILURE) {
+                       return;
+               }
        }
        
-       ZEND_FETCH_RESOURCE(pg_result, pgsql_result_handle *, result, -1, "PostgreSQL result", le_result);
+       ZEND_FETCH_RESOURCE(pg_result, pgsql_result_handle *, &result, -1, "PostgreSQL result", le_result);
 
        pgsql_result = pg_result->result;
-       if (ZEND_NUM_ARGS() == 2) {
-               if (pg_result->row < 0)
+       if (argc == 2) {
+               if (pg_result->row < 0) {
                        pg_result->row = 0;
+               }
                pgsql_row = pg_result->row;
                if (pgsql_row >= PQntuples(pgsql_result)) {
                        RETURN_FALSE;
                }
        } else {
-               convert_to_long_ex(row);
-               pgsql_row = Z_LVAL_PP(row);
+               pgsql_row = row;
                if (pgsql_row < 0 || pgsql_row >= PQntuples(pgsql_result)) {
                        php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to jump to row %ld on PostgreSQL result index %ld",
-                                                       Z_LVAL_PP(row), Z_LVAL_PP(result));
+                                                       row, Z_LVAL_P(result));
                        RETURN_FALSE;
                }
        }
@@ -2192,8 +2153,7 @@ PHP_FUNCTION(pg_fetch_all)
        PGresult *pgsql_result;
        pgsql_result_handle *pg_result;
 
-       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r",
-                                                         &result) == FAILURE) {
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &result) == FAILURE) {
                return;
        }
 
@@ -2281,32 +2241,38 @@ PHP_FUNCTION(pg_result_seek)
  */
 static void php_pgsql_data_info(INTERNAL_FUNCTION_PARAMETERS, int entry_type)
 {
-       zval **result, **row, **field;
+       zval *result, **field;
+       long row;
        PGresult *pgsql_result;
        pgsql_result_handle *pg_result;
-       int field_offset, pgsql_row;
-       
-       if ((ZEND_NUM_ARGS() != 3 || zend_get_parameters_ex(3, &result, &row, &field)==FAILURE) &&
-           (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &result, &field)==FAILURE)) {
-               WRONG_PARAM_COUNT;
+       int field_offset, pgsql_row, argc = ZEND_NUM_ARGS();
+
+       if (argc == 2) {
+               if (zend_parse_parameters(argc TSRMLS_CC, "rZ", &result, &field) == FAILURE) {
+                       return;
+               }
+       } else {
+               if (zend_parse_parameters(argc TSRMLS_CC, "rlZ", &result, &row, &field) == FAILURE) {
+                       return;
+               }
        }
        
-       ZEND_FETCH_RESOURCE(pg_result, pgsql_result_handle *, result, -1, "PostgreSQL result", le_result);
+       ZEND_FETCH_RESOURCE(pg_result, pgsql_result_handle *, &result, -1, "PostgreSQL result", le_result);
 
        pgsql_result = pg_result->result;
-       if (ZEND_NUM_ARGS() == 2) {
-               if (pg_result->row < 0)
+       if (argc == 2) {
+               if (pg_result->row < 0) {
                        pg_result->row = 0;
+               }
                pgsql_row = pg_result->row;
                if (pgsql_row < 0 || pgsql_row >= PQntuples(pgsql_result)) {
                        RETURN_FALSE;
                }
        } else {
-               convert_to_long_ex(row);
-               pgsql_row = Z_LVAL_PP(row);
+               pgsql_row = row;
                if (pgsql_row < 0 || pgsql_row >= PQntuples(pgsql_result)) {
                        php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to jump to row %ld on PostgreSQL result index %ld",
-                                                       Z_LVAL_PP(row), Z_LVAL_PP(result));
+                                                       row, Z_LVAL_P(result));
                        RETURN_FALSE;
                }
        }
@@ -2358,18 +2324,18 @@ PHP_FUNCTION(pg_field_is_null)
    Free result memory */
 PHP_FUNCTION(pg_free_result)
 {
-       zval **result;
+       zval *result;
        pgsql_result_handle *pg_result;
        
-       if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &result)==FAILURE) {
-               WRONG_PARAM_COUNT;
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &result) == FAILURE) {
+               return;
        }
 
-       ZEND_FETCH_RESOURCE(pg_result, pgsql_result_handle *, result, -1, "PostgreSQL result", le_result);
-       if (Z_LVAL_PP(result) == 0) {
+       ZEND_FETCH_RESOURCE(pg_result, pgsql_result_handle *, &result, -1, "PostgreSQL result", le_result);
+       if (Z_LVAL_P(result) == 0) {
                RETURN_FALSE;
        }
-       zend_list_delete(Z_LVAL_PP(result));
+       zend_list_delete(Z_LVAL_P(result));
        RETURN_TRUE;
 }
 /* }}} */
@@ -2378,18 +2344,18 @@ PHP_FUNCTION(pg_free_result)
    Returns the last object identifier */
 PHP_FUNCTION(pg_last_oid)
 {
-       zval **result;
+       zval *result;
        PGresult *pgsql_result;
        pgsql_result_handle *pg_result;
 #ifdef HAVE_PQOIDVALUE
        Oid oid;
 #endif
 
-       if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &result)==FAILURE) {
-               WRONG_PARAM_COUNT;
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &result) == FAILURE) {
+               return;
        }
        
-       ZEND_FETCH_RESOURCE(pg_result, pgsql_result_handle *, result, -1, "PostgreSQL result", le_result);
+       ZEND_FETCH_RESOURCE(pg_result, pgsql_result_handle *, &result, -1, "PostgreSQL result", le_result);
        pgsql_result = pg_result->result;
 #ifdef HAVE_PQOIDVALUE
        oid = PQoidValue(pgsql_result);
@@ -2411,48 +2377,30 @@ PHP_FUNCTION(pg_last_oid)
    Enable tracing a PostgreSQL connection */
 PHP_FUNCTION(pg_trace)
 {
-       zval **z_filename, **z_mode, **pgsql_link = NULL;
-       int id = -1;
+       char *z_filename, *mode = "w";
+       int z_filename_len, mode_len;
+       zval *pgsql_link = NULL;
+       int id = -1, argc = ZEND_NUM_ARGS();
        PGconn *pgsql;
-       char *mode = "w";
        FILE *fp = NULL;
        php_stream *stream;
        id = PGG(default_link);
-
-       switch (ZEND_NUM_ARGS()) {
-               case 1:
-                       if (zend_get_parameters_ex(1, &z_filename)==FAILURE) {
-                               RETURN_FALSE;
-                       }
-                       CHECK_DEFAULT_LINK(id);
-                       break;
-               case 2:
-                       if (zend_get_parameters_ex(2, &z_filename, &z_mode)==FAILURE) {
-                               RETURN_FALSE;
-                       }
-                       CHECK_DEFAULT_LINK(id);
-                       convert_to_string_ex(z_mode);
-                       mode = Z_STRVAL_PP(z_mode);
-                       break;
-               case 3:
-                       if (zend_get_parameters_ex(3, &z_filename, &z_mode, &pgsql_link)==FAILURE) {
-                               RETURN_FALSE;
-                       }
-                       convert_to_string_ex(z_mode);
-                       mode = Z_STRVAL_PP(z_mode);
-                       break;
-               default:
-                       ZEND_WRONG_PARAM_COUNT();
-                       break;
+       
+       if (zend_parse_parameters(argc TSRMLS_CC, "s|sr", &z_filename, &z_filename_len, &mode, &mode_len, &pgsql_link) == FAILURE) {
+               return;
        }
+       
+       if (argc < 3) {
+               CHECK_DEFAULT_LINK(id);
+       }
+       
        if (pgsql_link == NULL && id == -1) {
                RETURN_FALSE;
        }       
 
-       ZEND_FETCH_RESOURCE2(pgsql, PGconn *, pgsql_link, id, "PostgreSQL link", le_link, le_plink);
-       convert_to_string_ex(z_filename);
-
-       stream = php_stream_open_wrapper(Z_STRVAL_PP(z_filename), mode, REPORT_ERRORS, NULL);
+       ZEND_FETCH_RESOURCE2(pgsql, PGconn *, &pgsql_link, id, "PostgreSQL link", le_link, le_plink);
+       
+       stream = php_stream_open_wrapper(z_filename, mode, ENFORCE_SAFE_MODE|REPORT_ERRORS, NULL);
 
        if (!stream) {
                RETURN_FALSE;
@@ -2472,29 +2420,24 @@ PHP_FUNCTION(pg_trace)
    Disable tracing of a PostgreSQL connection */
 PHP_FUNCTION(pg_untrace)
 {
-       zval **pgsql_link = NULL;
-       int id = -1;
+       zval *pgsql_link = NULL;
+       int id = -1, argc = ZEND_NUM_ARGS();
        PGconn *pgsql;
+       
+       if (zend_parse_parameters(argc TSRMLS_CC, "|r", &pgsql_link) == FAILURE) {
+               return;
+       }
 
-       switch (ZEND_NUM_ARGS()) {
-               case 0:
-                       id = PGG(default_link);
-                       CHECK_DEFAULT_LINK(id);
-                       break;
-               case 1:
-                       if (zend_get_parameters_ex(1, &pgsql_link)==FAILURE) {
-                               RETURN_FALSE;
-                       }
-                       break;
-               default:
-                       ZEND_WRONG_PARAM_COUNT();
-                       break;
+       if (argc == 0) { 
+               id = PGG(default_link);
+               CHECK_DEFAULT_LINK(id);
        }
+
        if (pgsql_link == NULL && id == -1) {
                RETURN_FALSE;
        }       
 
-       ZEND_FETCH_RESOURCE2(pgsql, PGconn *, pgsql_link, id, "PostgreSQL link", le_link, le_plink);
+       ZEND_FETCH_RESOURCE2(pgsql, PGconn *, &pgsql_link, id, "PostgreSQL link", le_link, le_plink);
        PQuntrace(pgsql);
        RETURN_TRUE;
 }
@@ -2504,30 +2447,25 @@ PHP_FUNCTION(pg_untrace)
    Create a large object */
 PHP_FUNCTION(pg_lo_create)
 {
-       zval **pgsql_link = NULL;
+       zval *pgsql_link = NULL;
        PGconn *pgsql;
        Oid pgsql_oid;
-       int id = -1;
+       int id = -1, argc = ZEND_NUM_ARGS();
 
-       switch(ZEND_NUM_ARGS()) {
-               case 0:
-                       id = PGG(default_link);
-                       CHECK_DEFAULT_LINK(id);
-                       break;
-               case 1:
-                       if (zend_get_parameters_ex(1, &pgsql_link)==FAILURE) {
-                               RETURN_FALSE;
-                       }
-                       break;
-               default:
-                       WRONG_PARAM_COUNT;
-                       break;
+       if (zend_parse_parameters(argc TSRMLS_CC, "|r", &pgsql_link) == FAILURE) {
+               return;
+       }
+       
+       if (argc == 0) {
+               id = PGG(default_link);
+               CHECK_DEFAULT_LINK(id);
        }
+
        if (pgsql_link == NULL && id == -1) {
                RETURN_FALSE;
        }       
 
-       ZEND_FETCH_RESOURCE2(pgsql, PGconn *, pgsql_link, id, "PostgreSQL link", le_link, le_plink);
+       ZEND_FETCH_RESOURCE2(pgsql, PGconn *, &pgsql_link, id, "PostgreSQL link", le_link, le_plink);
        
        /* NOTE: Archive modes not supported until I get some more data. Don't think anybody's
           using it anyway. I believe it's also somehow related to the 'time travel' feature of
@@ -2739,21 +2677,14 @@ PHP_FUNCTION(pg_lo_open)
    Close a large object */
 PHP_FUNCTION(pg_lo_close)
 {
-       zval **pgsql_lofp;
+       zval *pgsql_lofp;
        pgLofp *pgsql;
 
-       switch(ZEND_NUM_ARGS()) {
-               case 1:
-                       if (zend_get_parameters_ex(1, &pgsql_lofp)==FAILURE) {
-                               RETURN_FALSE;
-                       }
-                       break;
-               default:
-                       WRONG_PARAM_COUNT;
-                       break;
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &pgsql_lofp) == FAILURE) {
+               return;
        }
 
-       ZEND_FETCH_RESOURCE(pgsql, pgLofp *, pgsql_lofp, -1, "PostgreSQL large object", le_lofp);
+       ZEND_FETCH_RESOURCE(pgsql, pgLofp *, &pgsql_lofp, -1, "PostgreSQL large object", le_lofp);
        
        if (lo_close((PGconn *)pgsql->conn, pgsql->lofd) < 0) {
                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to close PostgreSQL large object descriptor %d", pgsql->lofd);
@@ -2762,7 +2693,7 @@ PHP_FUNCTION(pg_lo_close)
                RETVAL_TRUE;
        }
 
-       zend_list_delete(Z_RESVAL_PP(pgsql_lofp));
+       zend_list_delete(Z_RESVAL_P(pgsql_lofp));
        return;
 }
 /* }}} */
@@ -2773,21 +2704,20 @@ PHP_FUNCTION(pg_lo_close)
    Read a large object */
 PHP_FUNCTION(pg_lo_read)
 {
-       zval **pgsql_id, **len;
-       int buf_len = PGSQL_LO_READ_BUF_SIZE, nbytes;
+       zval *pgsql_id;
+       long len;
+       int buf_len = PGSQL_LO_READ_BUF_SIZE, nbytes, argc = ZEND_NUM_ARGS();
        char *buf;
        pgLofp *pgsql;
 
-       if (ZEND_NUM_ARGS() < 1 || ZEND_NUM_ARGS() > 2 ||
-           zend_get_parameters_ex(ZEND_NUM_ARGS(), &pgsql_id, &len) == FAILURE) {
-               WRONG_PARAM_COUNT;
+       if (zend_parse_parameters(argc TSRMLS_CC, "r|l", &pgsql_id, &len) == FAILURE) {
+               return;
        }
 
-       ZEND_FETCH_RESOURCE(pgsql, pgLofp *, pgsql_id, -1, "PostgreSQL large object", le_lofp);
+       ZEND_FETCH_RESOURCE(pgsql, pgLofp *, &pgsql_id, -1, "PostgreSQL large object", le_lofp);
 
-       if (ZEND_NUM_ARGS() > 1) {
-               convert_to_long_ex(len);
-               buf_len = Z_LVAL_PP(len);
+       if (argc > 1) {
+               buf_len = len;
        }
        
        buf = (char *) safe_emalloc(sizeof(char), (buf_len+1), 0);
@@ -2805,39 +2735,36 @@ PHP_FUNCTION(pg_lo_read)
    Write a large object */
 PHP_FUNCTION(pg_lo_write)
 {
-       zval **pgsql_id, **str, **z_len;
-       int nbytes;
+       zval *pgsql_id;
+       char *str;
+       long z_len;
+       int str_len, nbytes;
        int len;
        pgLofp *pgsql;
        int argc = ZEND_NUM_ARGS();
 
-       if (argc < 2 || argc > 3 ||
-           zend_get_parameters_ex(argc, &pgsql_id, &str, &z_len) == FAILURE) {
-               WRONG_PARAM_COUNT;
+       if (zend_parse_parameters(argc TSRMLS_CC, "rs|l", &pgsql_id, &str, &str_len, &z_len) == FAILURE) {
+               return;
        }
 
-       convert_to_string_ex(str);
-
        if (argc > 2) {
-               convert_to_long_ex(z_len);
-               if (Z_LVAL_PP(z_len) > Z_STRLEN_PP(str)) {
-                       php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot write more than buffer size %d. Tried to write %ld", 
-                                                       Z_STRLEN_PP(str), Z_LVAL_PP(z_len));
+               if (z_len > str_len) {
+                       php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot write more than buffer size %d. Tried to write %ld", str_len, z_len);
                        RETURN_FALSE;
                }
-               if (Z_LVAL_PP(z_len) < 0) {
-                       php_error_docref(NULL TSRMLS_CC, E_WARNING, "Buffer size must be larger than 0, but %ld was specified", Z_LVAL_PP(z_len));
+               if (z_len < 0) {
+                       php_error_docref(NULL TSRMLS_CC, E_WARNING, "Buffer size must be larger than 0, but %ld was specified", z_len);
                        RETURN_FALSE;
                }
-               len = Z_LVAL_PP(z_len);
+               len = z_len;
        }
        else {
-               len = Z_STRLEN_PP(str);
+               len = str_len;
        }
 
-       ZEND_FETCH_RESOURCE(pgsql, pgLofp *, pgsql_id, -1, "PostgreSQL large object", le_lofp);
+       ZEND_FETCH_RESOURCE(pgsql, pgLofp *, &pgsql_id, -1, "PostgreSQL large object", le_lofp);
 
-       if ((nbytes = lo_write((PGconn *)pgsql->conn, pgsql->lofd, Z_STRVAL_PP(str), len)) == -1) {
+       if ((nbytes = lo_write((PGconn *)pgsql->conn, pgsql->lofd, str, len)) == -1) {
                RETURN_FALSE;
        }
 
@@ -2849,24 +2776,17 @@ PHP_FUNCTION(pg_lo_write)
    Read a large object and send straight to browser */
 PHP_FUNCTION(pg_lo_read_all)
 {
-       zval **pgsql_id;
+       zval *pgsql_id;
        int tbytes;
        volatile int nbytes;
        char buf[PGSQL_LO_READ_BUF_SIZE];
        pgLofp *pgsql;
-
-       switch(ZEND_NUM_ARGS()) {
-               case 1:
-                       if (zend_get_parameters_ex(1, &pgsql_id)==FAILURE) {
-                               RETURN_FALSE;
-                       }
-                       break;
-               default:
-                       WRONG_PARAM_COUNT;
-                       break;
+       
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &pgsql_id) == FAILURE) {
+               return;
        }
 
-       ZEND_FETCH_RESOURCE(pgsql, pgLofp *, pgsql_id, -1, "PostgreSQL large object", le_lofp);
+       ZEND_FETCH_RESOURCE(pgsql, pgLofp *, &pgsql_id, -1, "PostgreSQL large object", le_lofp);
 
        tbytes = 0;
        while ((nbytes = lo_read((PGconn *)pgsql->conn, pgsql->lofd, buf, PGSQL_LO_READ_BUF_SIZE))>0) {
@@ -3068,38 +2988,31 @@ PHP_FUNCTION(pg_lo_tell)
    Set error verbosity */
 PHP_FUNCTION(pg_set_error_verbosity)
 {
-       zval **verbosity, **pgsql_link = NULL;
-       long val;
-       int id = -1;
+       zval *pgsql_link = NULL;
+       long verbosity;
+       int id = -1, argc = ZEND_NUM_ARGS();
        PGconn *pgsql;
 
-       switch(ZEND_NUM_ARGS()) {
-               case 1:
-                       if (zend_get_parameters_ex(1, &verbosity)==FAILURE) {
-                               RETURN_FALSE;
-                       }
-                       id = PGG(default_link);
-                       CHECK_DEFAULT_LINK(id);
-                       break;
-               case 2:
-                       if (zend_get_parameters_ex(2, &pgsql_link, &verbosity)==FAILURE) {
-                               RETURN_FALSE;
-                       }
-                       break;
-               default:
-                       WRONG_PARAM_COUNT;
-                       break;
+       if (argc == 1) {
+               if (zend_parse_parameters(argc TSRMLS_CC, "l", &verbosity) == FAILURE) {
+                       return;
+               }
+               id = PGG(default_link);
+               CHECK_DEFAULT_LINK(id);
+       } else {
+               if (zend_parse_parameters(argc TSRMLS_CC, "rl", &pgsql_link, &verbosity) == FAILURE) {
+                       return;
+               }
        }
+
        if (pgsql_link == NULL && id == -1) {
                RETURN_FALSE;
        }       
 
-       ZEND_FETCH_RESOURCE2(pgsql, PGconn *, pgsql_link, id, "PostgreSQL link", le_link, le_plink);
+       ZEND_FETCH_RESOURCE2(pgsql, PGconn *, &pgsql_link, id, "PostgreSQL link", le_link, le_plink);
 
-       convert_to_long_ex(verbosity);
-       val = Z_LVAL_PP(verbosity);
-       if (val & (PQERRORS_TERSE|PQERRORS_DEFAULT|PQERRORS_VERBOSE)) {
-               Z_LVAL_P(return_value) = PQsetErrorVerbosity(pgsql, val);
+       if (verbosity & (PQERRORS_TERSE|PQERRORS_DEFAULT|PQERRORS_VERBOSE)) {
+               Z_LVAL_P(return_value) = PQsetErrorVerbosity(pgsql, verbosity);
                Z_TYPE_P(return_value) = IS_LONG;
        } else {
                RETURN_FALSE;
@@ -3113,37 +3026,32 @@ PHP_FUNCTION(pg_set_error_verbosity)
    Set client encoding */
 PHP_FUNCTION(pg_set_client_encoding)
 {
-       zval **encoding, **pgsql_link = NULL;
-       int id = -1;
+       char *encoding;
+       int encoding_len;
+       zval *pgsql_link = NULL;
+       int id = -1, argc = ZEND_NUM_ARGS();
        PGconn *pgsql;
 
-       switch(ZEND_NUM_ARGS()) {
-               case 1:
-                       if (zend_get_parameters_ex(1, &encoding)==FAILURE) {
-                               RETURN_FALSE;
-                       }
-                       id = PGG(default_link);
-                       CHECK_DEFAULT_LINK(id);
-                       break;
-               case 2:
-                       if (zend_get_parameters_ex(2, &pgsql_link, &encoding)==FAILURE) {
-                               RETURN_FALSE;
-                       }
-                       break;
-               default:
-                       WRONG_PARAM_COUNT;
-                       break;
+       if (argc == 1) {
+               if (zend_parse_parameters(argc TSRMLS_CC, "s", &encoding, &encoding_len) == FAILURE) {
+                       return;
+               }
+               id = PGG(default_link);
+               CHECK_DEFAULT_LINK(id);
+       } else {
+               if (zend_parse_parameters(argc TSRMLS_CC, "rs", &pgsql_link, &encoding, &encoding_len) == FAILURE) {
+                       return;
+               }
        }
+
        if (pgsql_link == NULL && id == -1) {
                RETURN_FALSE;
        }       
 
-       ZEND_FETCH_RESOURCE2(pgsql, PGconn *, pgsql_link, id, "PostgreSQL link", le_link, le_plink);
+       ZEND_FETCH_RESOURCE2(pgsql, PGconn *, &pgsql_link, id, "PostgreSQL link", le_link, le_plink);
 
-       convert_to_string_ex(encoding);
-       Z_LVAL_P(return_value) = PQsetClientEncoding(pgsql, Z_STRVAL_PP(encoding));
+       Z_LVAL_P(return_value) = PQsetClientEncoding(pgsql, encoding);
        Z_TYPE_P(return_value) = IS_LONG;
-
 }
 /* }}} */
 
@@ -3151,29 +3059,24 @@ PHP_FUNCTION(pg_set_client_encoding)
    Get the current client encoding */
 PHP_FUNCTION(pg_client_encoding)
 {
-       zval **pgsql_link = NULL;
-       int id = -1;
+       zval *pgsql_link = NULL;
+       int id = -1, argc = ZEND_NUM_ARGS();
        PGconn *pgsql;
 
-       switch(ZEND_NUM_ARGS()) {
-               case 0:
-                       id = PGG(default_link);
-                       CHECK_DEFAULT_LINK(id);
-                       break;
-               case 1:
-                       if (zend_get_parameters_ex(1, &pgsql_link)==FAILURE) {
-                               RETURN_FALSE;
-                       }
-                       break;
-               default:
-                       WRONG_PARAM_COUNT;
-                       break;
+       if (zend_parse_parameters(argc TSRMLS_CC, "|r", &pgsql_link) == FAILURE) {
+               return;
        }
+       
+       if (argc == 0) {
+               id = PGG(default_link);
+               CHECK_DEFAULT_LINK(id);
+       }
+
        if (pgsql_link == NULL && id == -1) {
                RETURN_FALSE;
        }       
 
-       ZEND_FETCH_RESOURCE2(pgsql, PGconn *, pgsql_link, id, "PostgreSQL link", le_link, le_plink);
+       ZEND_FETCH_RESOURCE2(pgsql, PGconn *, &pgsql_link, id, "PostgreSQL link", le_link, le_plink);
 
        /* Just do the same as found in PostgreSQL sources... */
 
@@ -3181,8 +3084,7 @@ PHP_FUNCTION(pg_client_encoding)
 #define pg_encoding_to_char(x) "SQL_ASCII"
 #endif
 
-       Z_STRVAL_P(return_value) 
-       = (char *) pg_encoding_to_char(PQclientEncoding(pgsql));
+       Z_STRVAL_P(return_value) = (char *) pg_encoding_to_char(PQclientEncoding(pgsql));
        Z_STRLEN_P(return_value) = strlen(Z_STRVAL_P(return_value));
        Z_STRVAL_P(return_value) = (char *) estrdup(Z_STRVAL_P(return_value));
        Z_TYPE_P(return_value) = IS_STRING;
@@ -3198,30 +3100,25 @@ PHP_FUNCTION(pg_client_encoding)
    Sync with backend. Completes the Copy command */
 PHP_FUNCTION(pg_end_copy)
 {
-       zval **pgsql_link = NULL;
-       int id = -1;
+       zval *pgsql_link = NULL;
+       int id = -1, argc = ZEND_NUM_ARGS();
        PGconn *pgsql;
        int result = 0;
 
-       switch(ZEND_NUM_ARGS()) {
-               case 0:
-                       id = PGG(default_link);
-                       CHECK_DEFAULT_LINK(id);
-                       break;
-               case 1:
-                       if (zend_get_parameters_ex(1, &pgsql_link)==FAILURE) {
-                               RETURN_FALSE;
-                       }
-                       break;
-               default:
-                       WRONG_PARAM_COUNT;
-                       break;
+       if (zend_parse_parameters(argc TSRMLS_CC, "|r", &pgsql_link) == FAILURE) {
+               return;
        }
+       
+       if (argc == 0) {
+               id = PGG(default_link);
+               CHECK_DEFAULT_LINK(id);
+       }
+
        if (pgsql_link == NULL && id == -1) {
                RETURN_FALSE;
        }       
 
-       ZEND_FETCH_RESOURCE2(pgsql, PGconn *, pgsql_link, id, "PostgreSQL link", le_link, le_plink);
+       ZEND_FETCH_RESOURCE2(pgsql, PGconn *, &pgsql_link, id, "PostgreSQL link", le_link, le_plink);
 
        result = PQendcopy(pgsql);
 
@@ -3238,36 +3135,31 @@ PHP_FUNCTION(pg_end_copy)
    Send null-terminated string to backend server*/
 PHP_FUNCTION(pg_put_line)
 {
-       zval **query, **pgsql_link = NULL;
-       int id = -1;
+       char *query;
+       zval *pgsql_link = NULL;
+       int query_len, id = -1;
        PGconn *pgsql;
-       int result = 0;
+       int result = 0, argc = ZEND_NUM_ARGS();
 
-       switch(ZEND_NUM_ARGS()) {
-               case 1:
-                       if (zend_get_parameters_ex(1, &query)==FAILURE) {
-                               RETURN_FALSE;
-                       }
-                       id = PGG(default_link);
-                       CHECK_DEFAULT_LINK(id);
-                       break;
-               case 2:
-                       if (zend_get_parameters_ex(2, &pgsql_link, &query)==FAILURE) {
-                               RETURN_FALSE;
-                       }
-                       break;
-               default:
-                       WRONG_PARAM_COUNT;
-                       break;
+       if (argc == 1) {
+               if (zend_parse_parameters(argc TSRMLS_CC, "s", &query, &query_len) == FAILURE) {
+                       return;
+               }
+               id = PGG(default_link);
+               CHECK_DEFAULT_LINK(id);
+       } else {
+               if (zend_parse_parameters(argc TSRMLS_CC, "rs", &pgsql_link, &query, &query_len) == FAILURE) {
+                       return;
+               }
        }
+
        if (pgsql_link == NULL && id == -1) {
                RETURN_FALSE;
        }       
 
-       ZEND_FETCH_RESOURCE2(pgsql, PGconn *, pgsql_link, id, "PostgreSQL link", le_link, le_plink);
+       ZEND_FETCH_RESOURCE2(pgsql, PGconn *, &pgsql_link, id, "PostgreSQL link", le_link, le_plink);
 
-       convert_to_string_ex(query);
-       result = PQputline(pgsql, Z_STRVAL_PP(query));
+       result = PQputline(pgsql, query);
        if (result==EOF) {
                PHP_PQ_ERROR("Query failed: %s", pgsql);
                RETURN_FALSE;
@@ -4017,37 +3909,30 @@ PHP_FUNCTION(pg_send_query)
 /* }}} */
 
 #if HAVE_PQSENDQUERYPARAMS
-/* {{{ proto bool pg_send_query_params(resource connection, string query)
+/* {{{ proto bool pg_send_query_params(resource connection, string query, array params)
    Send asynchronous parameterized query */
 PHP_FUNCTION(pg_send_query_params)
 {
-       zval **pgsql_link;
-       zval **pv_param_arr, **tmp;
+       zval *pgsql_link, *pv_param_arr, **tmp;
        int num_params = 0;
        char **params = NULL;
        unsigned char otype;
-       zval **query;
-       int id = -1;
+       char *query;
+       int query_len, id = -1;
        PGconn *pgsql;
        PGresult *res;
        int leftover = 0;
 
-       if (zend_get_parameters_ex(3, &pgsql_link, &query, &pv_param_arr) == FAILURE) {
-               WRONG_PARAM_COUNT;
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rsa/", &pgsql_link, &query, &query_len, &pv_param_arr) == FAILURE) {
+               return;
        }
 
        if (pgsql_link == NULL && id == -1) {
                RETURN_FALSE;
-       }       
-
-       if (Z_TYPE_PP(pv_param_arr) != IS_ARRAY) {
-               php_error_docref(NULL TSRMLS_CC, E_WARNING, "No array passed");
-               RETURN_FALSE;
        }
 
-       ZEND_FETCH_RESOURCE2(pgsql, PGconn *, pgsql_link, id, "PostgreSQL link", le_link, le_plink);
+       ZEND_FETCH_RESOURCE2(pgsql, PGconn *, &pgsql_link, id, "PostgreSQL link", le_link, le_plink);
 
-       convert_to_string_ex(query);
        if (PQ_SETNONBLOCKING(pgsql, 1)) {
                php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Cannot set connection to nonblocking mode");
                RETURN_FALSE;
@@ -4060,15 +3945,14 @@ PHP_FUNCTION(pg_send_query_params)
                php_error_docref(NULL TSRMLS_CC, E_NOTICE, "There are results on this connection. Call pg_get_result() until it returns FALSE");
        }
 
-       SEPARATE_ZVAL(pv_param_arr);
-       zend_hash_internal_pointer_reset(Z_ARRVAL_PP(pv_param_arr));
-       num_params = zend_hash_num_elements(Z_ARRVAL_PP(pv_param_arr));
+       zend_hash_internal_pointer_reset(Z_ARRVAL_P(pv_param_arr));
+       num_params = zend_hash_num_elements(Z_ARRVAL_P(pv_param_arr));
        if (num_params > 0) {
                int i = 0;
                params = (char **)safe_emalloc(sizeof(char *), num_params, 0);
                
                for(i = 0; i < num_params; i++) {
-                       if (zend_hash_get_current_data(Z_ARRVAL_PP(pv_param_arr), (void **) &tmp) == FAILURE) {
+                       if (zend_hash_get_current_data(Z_ARRVAL_P(pv_param_arr), (void **) &tmp) == FAILURE) {
                                php_error_docref(NULL TSRMLS_CC, E_WARNING,"Error getting parameter");
                                _php_pgsql_free_params(params, num_params);
                                RETURN_FALSE;
@@ -4090,15 +3974,15 @@ PHP_FUNCTION(pg_send_query_params)
                                params[i] = Z_STRVAL_PP(tmp);
                        }
 
-                       zend_hash_move_forward(Z_ARRVAL_PP(pv_param_arr));
+                       zend_hash_move_forward(Z_ARRVAL_P(pv_param_arr));
                }
        }
 
-       if (!PQsendQueryParams(pgsql, Z_STRVAL_PP(query), num_params, NULL, (const char * const *)params, NULL, NULL, 0)) {
+       if (!PQsendQueryParams(pgsql, query, num_params, NULL, (const char * const *)params, NULL, NULL, 0)) {
                if ((PGG(auto_reset_persistent) & 2) && PQstatus(pgsql) != CONNECTION_OK) {
                        PQreset(pgsql);
                }
-               if (!PQsendQueryParams(pgsql, Z_STRVAL_PP(query), num_params, NULL, (const char * const *)params, NULL, NULL, 0)) {
+               if (!PQsendQueryParams(pgsql, query, num_params, NULL, (const char * const *)params, NULL, NULL, 0)) {
                        _php_pgsql_free_params(params, num_params);
                        RETURN_FALSE;
                }
@@ -4117,24 +4001,23 @@ PHP_FUNCTION(pg_send_query_params)
    Asynchronously prepare a query for future execution */
 PHP_FUNCTION(pg_send_prepare)
 {
-       zval **pgsql_link;
-       zval **query, **stmtname;
-       int id = -1;
+       zval *pgsql_link;
+       char *query, *stmtname;
+       int stmtname_len, query_len, id = -1;
        PGconn *pgsql;
        PGresult *res;
        int leftover = 0;
 
-       if (zend_get_parameters_ex(3, &pgsql_link, &stmtname, &query) == FAILURE) {
-               WRONG_PARAM_COUNT;
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rss", &pgsql_link, &stmtname, &stmtname_len, &query, &query_len) == FAILURE) {
+               return;
        }
+
        if (pgsql_link == NULL && id == -1) {
                RETURN_FALSE;
        }       
 
-       ZEND_FETCH_RESOURCE2(pgsql, PGconn *, pgsql_link, id, "PostgreSQL link", le_link, le_plink);
+       ZEND_FETCH_RESOURCE2(pgsql, PGconn *, &pgsql_link, id, "PostgreSQL link", le_link, le_plink);
 
-       convert_to_string_ex(stmtname);
-       convert_to_string_ex(query);
        if (PQ_SETNONBLOCKING(pgsql, 1)) {
                php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Cannot set connection to nonblocking mode");
                RETURN_FALSE;
@@ -4146,11 +4029,11 @@ PHP_FUNCTION(pg_send_prepare)
        if (leftover) {
                php_error_docref(NULL TSRMLS_CC, E_NOTICE, "There are results on this connection. Call pg_get_result() until it returns FALSE");
        }
-       if (!PQsendPrepare(pgsql, Z_STRVAL_PP(stmtname), Z_STRVAL_PP(query), 0, NULL)) {
+       if (!PQsendPrepare(pgsql, stmtname, query, 0, NULL)) {
                if ((PGG(auto_reset_persistent) & 2) && PQstatus(pgsql) != CONNECTION_OK) {
                        PQreset(pgsql);
                }
-               if (!PQsendPrepare(pgsql, Z_STRVAL_PP(stmtname), Z_STRVAL_PP(query), 0, NULL)) {
+               if (!PQsendPrepare(pgsql, stmtname, query, 0, NULL)) {
                        RETURN_FALSE;
                }
        }
@@ -4167,32 +4050,27 @@ PHP_FUNCTION(pg_send_prepare)
    Executes prevriously prepared stmtname asynchronously */
 PHP_FUNCTION(pg_send_execute)
 {
-       zval **pgsql_link;
-       zval **pv_param_arr, **tmp;
+       zval *pgsql_link;
+       zval *pv_param_arr, **tmp;
        int num_params = 0;
        char **params = NULL;
        unsigned char otype;
-       zval **stmtname;
-       int id = -1;
+       char *stmtname;
+       int stmtname_len, id = -1;
        PGconn *pgsql;
        PGresult *res;
        int leftover = 0;
 
-       if (zend_get_parameters_ex(3, &pgsql_link, &stmtname, &pv_param_arr)==FAILURE) {
-               WRONG_PARAM_COUNT;
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rsa", &pgsql_link, &stmtname, &stmtname_len, &pv_param_arr) == FAILURE) {
+               return;
        }
-       if (pgsql_link == NULL && id == -1) {
-               RETURN_FALSE;
-       }       
 
-       if (Z_TYPE_PP(pv_param_arr) != IS_ARRAY) {
-               php_error_docref(NULL TSRMLS_CC, E_WARNING, "No array passed");
+       if (pgsql_link == NULL && id == -1) {
                RETURN_FALSE;
        }
 
-       ZEND_FETCH_RESOURCE2(pgsql, PGconn *, pgsql_link, id, "PostgreSQL link", le_link, le_plink);
+       ZEND_FETCH_RESOURCE2(pgsql, PGconn *, &pgsql_link, id, "PostgreSQL link", le_link, le_plink);
 
-       convert_to_string_ex(stmtname);
        if (PQ_SETNONBLOCKING(pgsql, 1)) {
                php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Cannot set connection to nonblocking mode");
                RETURN_FALSE;
@@ -4205,14 +4083,14 @@ PHP_FUNCTION(pg_send_execute)
                php_error_docref(NULL TSRMLS_CC, E_NOTICE, "There are results on this connection. Call pg_get_result() until it returns FALSE");
        }
 
-       zend_hash_internal_pointer_reset(Z_ARRVAL_PP(pv_param_arr));
-       num_params = zend_hash_num_elements(Z_ARRVAL_PP(pv_param_arr));
+       zend_hash_internal_pointer_reset(Z_ARRVAL_P(pv_param_arr));
+       num_params = zend_hash_num_elements(Z_ARRVAL_P(pv_param_arr));
        if (num_params > 0) {
                int i = 0;
                params = (char **)safe_emalloc(sizeof(char *), num_params, 0);
                
                for(i = 0; i < num_params; i++) {
-                       if (zend_hash_get_current_data(Z_ARRVAL_PP(pv_param_arr), (void **) &tmp) == FAILURE) {
+                       if (zend_hash_get_current_data(Z_ARRVAL_P(pv_param_arr), (void **) &tmp) == FAILURE) {
                                php_error_docref(NULL TSRMLS_CC, E_WARNING,"Error getting parameter");
                                _php_pgsql_free_params(params, num_params);
                                RETURN_FALSE;
@@ -4233,15 +4111,15 @@ PHP_FUNCTION(pg_send_execute)
                                params[i] = Z_STRVAL_PP(tmp);
                        }
 
-                       zend_hash_move_forward(Z_ARRVAL_PP(pv_param_arr));
+                       zend_hash_move_forward(Z_ARRVAL_P(pv_param_arr));
                }
        }
 
-       if (!PQsendQueryPrepared(pgsql, Z_STRVAL_PP(stmtname), num_params, (const char * const *)params, NULL, NULL, 0)) {
+       if (!PQsendQueryPrepared(pgsql, stmtname, num_params, (const char * const *)params, NULL, NULL, 0)) {
                if ((PGG(auto_reset_persistent) & 2) && PQstatus(pgsql) != CONNECTION_OK) {
                        PQreset(pgsql);
                }
-               if (!PQsendQueryPrepared(pgsql, Z_STRVAL_PP(stmtname), num_params, (const char * const *)params, NULL, NULL, 0)) {
+               if (!PQsendQueryPrepared(pgsql, stmtname, num_params, (const char * const *)params, NULL, NULL, 0)) {
                        _php_pgsql_free_params(params, num_params);
                        RETURN_FALSE;
                }
@@ -4265,8 +4143,7 @@ PHP_FUNCTION(pg_get_result)
        PGresult *pgsql_result;
        pgsql_result_handle *pg_result;
 
-       if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, ZEND_NUM_ARGS() TSRMLS_CC, "r",
-                                                                &pgsql_link) == FAILURE) {
+       if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, ZEND_NUM_ARGS() TSRMLS_CC, "r", &pgsql_link) == FAILURE) {
                RETURN_FALSE;
        }
 
index cf23b50e3a80f3da4305cc575bb7873fef0f0d00..617b07470e8ce671ee6fdd0ef43621283a4bca9b 100644 (file)
@@ -61,8 +61,8 @@ else {
 ?>
 --EXPECT--
 pg_escape_string() is NOT Ok
-string(9) "ABC\ABC\'"
-string(12) "ABC\\ABC\\''"
-string(10) "ABC\\ABC\'"
+unicode(9) "ABC\ABC\'"
+unicode(12) "ABC\\ABC\\''"
+unicode(10) "ABC\\ABC\'"
 pg_escape_bytea() is Ok
 pg_escape_bytea() actually works with database
index 2667e097e303b7832477a41212d512ada53e327c..b391097131329ea1e14a278849261d79109ae7c7 100644 (file)
@@ -12,7 +12,7 @@ $result = pg_exec("SELECT * FROM ".$table_name);
 pg_numrows($result);
 pg_numfields($result);
 pg_fieldname($result, 0);
-pg_fieldsize($result, $field_name);
+pg_fieldsize($result, 0);
 pg_fieldtype($result, 0);
 pg_fieldprtlen($result, 0);
 pg_fieldisnull($result, 0);