]> granicus.if.org Git - php/commitdiff
Make pg_convert/pg_insert/pg_select/pg_update/pg_delete a bit more flexible.
authorYasuo Ohgaki <yohgaki@php.net>
Tue, 23 Apr 2002 03:42:26 +0000 (03:42 +0000)
committerYasuo Ohgaki <yohgaki@php.net>
Tue, 23 Apr 2002 03:42:26 +0000 (03:42 +0000)
pg_convert() may ignore, NOT NULL and/or DEFAULT.
pg_insert/pg_update/pg_select/pg_update may return query string.

ext/pgsql/pgsql.c
ext/pgsql/php_pgsql.h
ext/pgsql/tests/12pg_insert.phpt
ext/pgsql/tests/13pg_select.phpt
ext/pgsql/tests/14pg_update.phpt
ext/pgsql/tests/pg_delete.inc
ext/pgsql/tests/pg_insert.inc
ext/pgsql/tests/pg_select.inc
ext/pgsql/tests/pg_update.inc

index fe49782b36dba1790ef20ba9952cfc48e062c1a3..9c98a71ee0d96c3f068bf1827bb33bd866f1dcc1 100644 (file)
@@ -397,7 +397,15 @@ PHP_MINIT_FUNCTION(pgsql)
        REGISTER_LONG_CONSTANT("PGSQL_BAD_RESPONSE", PGRES_BAD_RESPONSE, CONST_CS | CONST_PERSISTENT);
        REGISTER_LONG_CONSTANT("PGSQL_NONFATAL_ERROR", PGRES_NONFATAL_ERROR, CONST_CS | CONST_PERSISTENT);
        REGISTER_LONG_CONSTANT("PGSQL_FATAL_ERROR", PGRES_FATAL_ERROR, CONST_CS | CONST_PERSISTENT);
-       
+       /* pg_convert options */
+       REGISTER_LONG_CONSTANT("PGSQL_CONV_IGNORE_DEFAULT", PGSQL_CONV_IGNORE_DEFAULT, CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("PGSQL_CONV_FORCE_NULL", PGSQL_CONV_FORCE_NULL, CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("PGSQL_CONV_IGNORE_NOT_NULL", PGSQL_CONV_IGNORE_NOT_NULL, CONST_CS | CONST_PERSISTENT);
+       /* pg_insert/update/delete/select options */
+       REGISTER_LONG_CONSTANT("PGSQL_DML_NO_CONV", PGSQL_DML_NO_CONV, CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("PGSQL_DML_EXEC", PGSQL_DML_EXEC, CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("PGSQL_DML_ASYNC", PGSQL_DML_ASYNC, CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("PGSQL_DML_STRING", PGSQL_DML_STRING, CONST_CS | CONST_PERSISTENT);
        return SUCCESS;
 }
 /* }}} */
@@ -3047,10 +3055,26 @@ static int php_pgsql_add_quotes(zval *src, zend_bool should_free TSRMLS_DC)
 }
 /* }}} */
 
+#define PGSQL_CONV_CHECK_IGNORE() \
+                               if (!err && !strcmp(Z_STRVAL_P(new_val), "NULL")) { \
+                                       /* if value is NULL and has default, remove entry to use default value*/ \
+                                       if (!(opt & PGSQL_CONV_IGNORE_DEFAULT) && Z_BVAL_PP(has_default)) { \
+                                               zval_dtor(new_val); \
+                                               FREE_ZVAL(new_val); \
+                                               skip_field = 1; \
+                                       } \
+                                       /* raise error if it's not null */ \
+                                       else if (Z_BVAL_PP(not_null)) { \
+                                               php_error(E_NOTICE, "%s() detected NULL for 'NOT NULL' field '%s'", \
+                                                                 get_active_function_name(TSRMLS_C), field ); \
+                                               err = 1; \
+                                       } \
+                               }               
+
 /* {{{ php_pgsql_convert
  * check and convert array values (fieldname=>vlaue pair) for sql
  */
-PHPAPI int php_pgsql_convert(PGconn *pg_link, const char *table_name, const zval *values, zval *result TSRMLS_DC) 
+PHPAPI int php_pgsql_convert(PGconn *pg_link, const char *table_name, const zval *values, zval *result, ulong opt TSRMLS_DC) 
 {
        HashPosition pos;
        char *field = NULL;
@@ -3062,6 +3086,7 @@ PHPAPI int php_pgsql_convert(PGconn *pg_link, const char *table_name, const zval
        assert(pg_link != NULL);
        assert(Z_TYPE_P(values) == IS_ARRAY);
        assert(Z_TYPE_P(result) == IS_ARRAY);
+       assert(!(opt & ~PGSQL_CONV_OPTS));
 
        if (!table_name) {
                return FAILURE;
@@ -3179,20 +3204,7 @@ PHPAPI int php_pgsql_convert(PGconn *pg_link, const char *table_name, const zval
                                        default:
                                                err = 1;
                                }
-                               if (!err && !strcmp(Z_STRVAL_P(new_val), "NULL")) {
-                                       /* if value is NULL and has default, remove entry to use default value*/
-                                       if (Z_BVAL_PP(has_default)) {
-                                               zval_dtor(new_val);
-                                               FREE_ZVAL(new_val);
-                                               skip_field = 1;
-                                       }
-                                       /* raise error if it's not null */
-                                       else if (Z_BVAL_PP(not_null)) {
-                                               php_error(E_NOTICE, "%s() detected NULL for 'NOT NULL' field '%s'",
-                                                                 get_active_function_name(TSRMLS_C), field );
-                                               err = 1;
-                                       }
-                               }                               
+                               PGSQL_CONV_CHECK_IGNORE();
                                if (err) {
                                        php_error(E_NOTICE, "%s() expects string, null, long or boolelan value for pgsql '%s' (%s)",
                                                          get_active_function_name(TSRMLS_C), Z_STRVAL_PP(type), field);
@@ -3235,20 +3247,7 @@ PHPAPI int php_pgsql_convert(PGconn *pg_link, const char *table_name, const zval
                                        default:
                                                err = 1;
                                }
-                               if (!err && !strcmp(Z_STRVAL_P(new_val), "NULL")) {
-                                       /* if value is NULL and has default, remove entry to use default value*/
-                                       if (Z_BVAL_PP(has_default)) {
-                                               zval_dtor(new_val);
-                                               FREE_ZVAL(new_val);
-                                               skip_field = 1;
-                                       }
-                                       /* raise error if it's not null */
-                                       else if (Z_BVAL_PP(not_null)) {
-                                               php_error(E_NOTICE, "%s() detected NULL for 'NOT NULL' field '%s'",
-                                                                 get_active_function_name(TSRMLS_C), field );
-                                               err = 1;
-                                       }
-                               }                               
+                               PGSQL_CONV_CHECK_IGNORE();
                                if (err) {
                                        php_error(E_NOTICE, "%s() expects string, null, long or double value for pgsql '%s' (%s)",
                                                          get_active_function_name(TSRMLS_C), Z_STRVAL_PP(type), field);
@@ -3290,20 +3289,7 @@ PHPAPI int php_pgsql_convert(PGconn *pg_link, const char *table_name, const zval
                                        default:
                                                err = 1;
                                }
-                               if (!err && !strcmp(Z_STRVAL_P(new_val), "NULL")) {
-                                       /* if value is NULL and has default, remove entry to use default value*/
-                                       if (Z_BVAL_PP(has_default)) {
-                                               zval_dtor(new_val);
-                                               FREE_ZVAL(new_val);
-                                               skip_field = 1;
-                                       }
-                                       /* raise error if it's not null */
-                                       else if (Z_BVAL_PP(not_null)) {
-                                               php_error(E_NOTICE, "%s() detected NULL for 'NOT NULL' field '%s'",
-                                                                 get_active_function_name(TSRMLS_C), field );
-                                               err = 1;
-                                       }
-                               }                               
+                               PGSQL_CONV_CHECK_IGNORE();
                                if (err) {
                                        php_error(E_NOTICE, "%s() expects string, null, long or double value for pgsql '%s' (%s)",
                                                          get_active_function_name(TSRMLS_C), Z_STRVAL_PP(type), field);
@@ -3352,20 +3338,7 @@ PHPAPI int php_pgsql_convert(PGconn *pg_link, const char *table_name, const zval
                                        default:
                                                err = 1;
                                }
-                               if (!err && !strcmp(Z_STRVAL_P(new_val), "NULL")) {
-                                       /* if value is NULL and has default, remove entry to use default value*/
-                                       if (Z_BVAL_PP(has_default)) {
-                                               zval_dtor(new_val);
-                                               FREE_ZVAL(new_val);
-                                               skip_field = 1;
-                                       }
-                                       /* raise error if it's not null */
-                                       else if (Z_BVAL_PP(not_null)) {
-                                               php_error(E_NOTICE, "%s() detected NULL for 'NOT NULL' field '%s'",
-                                                                 get_active_function_name(TSRMLS_C), field );
-                                               err = 1;
-                                       }
-                               }                               
+                               PGSQL_CONV_CHECK_IGNORE();
                                if (err) {
                                        php_error(E_NOTICE, "%s() expects string, null, long or double value for pgsql '%s' (%s)",
                                                          get_active_function_name(TSRMLS_C), Z_STRVAL_PP(type), field);
@@ -3408,20 +3381,7 @@ PHPAPI int php_pgsql_convert(PGconn *pg_link, const char *table_name, const zval
                                        default:
                                                err = 1;
                                }
-                               if (!err && !strcmp(Z_STRVAL_P(new_val), "NULL")) {
-                                       /* if value is NULL and has default, remove entry to use default value*/
-                                       if (Z_BVAL_PP(has_default)) {
-                                               zval_dtor(new_val);
-                                               FREE_ZVAL(new_val);
-                                               skip_field = 1;
-                                       }
-                                       /* raise error if it's not null */
-                                       else if (Z_BVAL_PP(not_null)) {
-                                               php_error(E_NOTICE, "%s() detected NULL for 'NOT NULL' field '%s'",
-                                                                 get_active_function_name(TSRMLS_C), field );
-                                               err = 1;
-                                       }
-                               }                               
+                               PGSQL_CONV_CHECK_IGNORE();
                                if (err) {
                                        php_error(E_NOTICE, "%s() expects string, null, long or double value for '%s' (%s)",
                                                          get_active_function_name(TSRMLS_C), Z_STRVAL_PP(type), field);
@@ -3454,20 +3414,7 @@ PHPAPI int php_pgsql_convert(PGconn *pg_link, const char *table_name, const zval
                                        default:
                                                err = 1;
                                }                               
-                               if (!err && !strcmp(Z_STRVAL_P(new_val), "NULL")) {
-                                       /* if value is NULL and has default, remove entry to use default value*/
-                                       if (Z_BVAL_PP(has_default)) {
-                                               zval_dtor(new_val);
-                                               FREE_ZVAL(new_val);
-                                               skip_field = 1;
-                                       }
-                                       /* raise error if it's not null */
-                                       else if (Z_BVAL_PP(not_null)) {
-                                               php_error(E_NOTICE, "%s() detected NULL for 'NOT NULL' field '%s'",
-                                                                 get_active_function_name(TSRMLS_C), field );
-                                               err = 1;
-                                       }
-                               }                               
+                               PGSQL_CONV_CHECK_IGNORE();
                                if (err) {
                                        php_error(E_NOTICE, "%s() expects string or null for '%s' (%s)",
                                                          get_active_function_name(TSRMLS_C), Z_STRVAL_PP(type), field);
@@ -3500,20 +3447,7 @@ PHPAPI int php_pgsql_convert(PGconn *pg_link, const char *table_name, const zval
                                        default:
                                                err = 1;
                                }
-                               if (!err && !strcmp(Z_STRVAL_P(new_val), "NULL")) {
-                                       /* if value is NULL and has default, remove entry to use default value*/
-                                       if (Z_BVAL_PP(has_default)) {
-                                               zval_dtor(new_val);
-                                               FREE_ZVAL(new_val);
-                                               skip_field = 1;
-                                       }
-                                       /* raise error if it's not null */
-                                       else if (Z_BVAL_PP(not_null)) {
-                                               php_error(E_NOTICE, "%s() detected NULL for 'NOT NULL' field '%s'",
-                                                                 get_active_function_name(TSRMLS_C), field );
-                                               err = 1;
-                                       }
-                               }                               
+                               PGSQL_CONV_CHECK_IGNORE();
                                if (err) {
                                        php_error(E_NOTICE, "%s() expects string or null for pgsql %s field (%s)",
                                                          get_active_function_name(TSRMLS_C), Z_STRVAL_PP(type), field);
@@ -3545,20 +3479,7 @@ PHPAPI int php_pgsql_convert(PGconn *pg_link, const char *table_name, const zval
                                        default:
                                                err = 1;
                                }
-                               if (!err && !strcmp(Z_STRVAL_P(new_val), "NULL")) {
-                                       /* if value is NULL and has default, remove entry to use default value*/
-                                       if (Z_BVAL_PP(has_default)) {
-                                               zval_dtor(new_val);
-                                               FREE_ZVAL(new_val);
-                                               skip_field = 1;
-                                       }
-                                       /* raise error if it's not null */
-                                       else if (Z_BVAL_PP(not_null)) {
-                                               php_error(E_NOTICE, "%s() detected NULL for 'NOT NULL' field '%s'",
-                                                                 get_active_function_name(TSRMLS_C), field );
-                                               err = 1;
-                                       }
-                               }                               
+                               PGSQL_CONV_CHECK_IGNORE();
                                if (err) {
                                        php_error(E_NOTICE, "%s() expects string or null for pgsql %s field (%s)",
                                                          get_active_function_name(TSRMLS_C), Z_STRVAL_PP(type), field);
@@ -3590,20 +3511,7 @@ PHPAPI int php_pgsql_convert(PGconn *pg_link, const char *table_name, const zval
                                        default:
                                                err = 1;
                                }
-                               if (!err && !strcmp(Z_STRVAL_P(new_val), "NULL")) {
-                                       /* if value is NULL and has default, remove entry to use default value*/
-                                       if (Z_BVAL_PP(has_default)) {
-                                               zval_dtor(new_val);
-                                               FREE_ZVAL(new_val);
-                                               skip_field = 1;
-                                       }
-                                       /* raise error if it's not null */
-                                       else if (Z_BVAL_PP(not_null)) {
-                                               php_error(E_NOTICE, "%s() detected NULL for 'NOT NULL' field '%s'",
-                                                                 get_active_function_name(TSRMLS_C), field );
-                                               err = 1;
-                                       }
-                               }                               
+                               PGSQL_CONV_CHECK_IGNORE();
                                if (err) {
                                        php_error(E_NOTICE, "%s() expects string or null for pgsql %s field (%s)",
                                                          get_active_function_name(TSRMLS_C), Z_STRVAL_PP(type), field);
@@ -3636,20 +3544,7 @@ PHPAPI int php_pgsql_convert(PGconn *pg_link, const char *table_name, const zval
                                        default:
                                                err = 1;
                                }
-                               if (!err && !strcmp(Z_STRVAL_P(new_val), "NULL")) {
-                                       /* if value is NULL and has default, remove entry to use default value*/
-                                       if (Z_BVAL_PP(has_default)) {
-                                               zval_dtor(new_val);
-                                               FREE_ZVAL(new_val);
-                                               skip_field = 1;
-                                       }
-                                       /* raise error if it's not null */
-                                       else if (Z_BVAL_PP(not_null)) {
-                                               php_error(E_NOTICE, "%s() detected NULL for 'NOT NULL' field '%s'",
-                                                                 get_active_function_name(TSRMLS_C), field );
-                                               err = 1;
-                                       }
-                               }                               
+                               PGSQL_CONV_CHECK_IGNORE();
                                if (err) {
                                        php_error(E_NOTICE, "%s() expects string or null for pgsql %s field (%s)",
                                                          get_active_function_name(TSRMLS_C), Z_STRVAL_PP(type), field);
@@ -3693,20 +3588,7 @@ PHPAPI int php_pgsql_convert(PGconn *pg_link, const char *table_name, const zval
                                        default:
                                                err = 1;
                                }
-                               if (!err && !strcmp(Z_STRVAL_P(new_val), "NULL")) {
-                                       /* if value is NULL and has default, remove entry to use default value*/
-                                       if (Z_BVAL_PP(has_default)) {
-                                               zval_dtor(new_val);
-                                               FREE_ZVAL(new_val);
-                                               skip_field = 1;
-                                       }
-                                       /* raise error if it's not null */
-                                       else if (Z_BVAL_PP(not_null)) {
-                                               php_error(E_NOTICE, "%s() detected NULL for 'NOT NULL' field '%s'",
-                                                                 get_active_function_name(TSRMLS_C), field );
-                                               err = 1;
-                                       }
-                               }                               
+                               PGSQL_CONV_CHECK_IGNORE();
                                if (err) {
                                        php_error(E_NOTICE, "%s() expects string, null, long or double value for pgsql '%s' (%s)",
                                                          get_active_function_name(TSRMLS_C), Z_STRVAL_PP(type), field);
@@ -3738,20 +3620,7 @@ PHPAPI int php_pgsql_convert(PGconn *pg_link, const char *table_name, const zval
                                        default:
                                                err = 1;
                                }
-                               if (!err && !strcmp(Z_STRVAL_P(new_val), "NULL")) {
-                                       /* if value is NULL and has default, remove entry to use default value*/
-                                       if (Z_BVAL_PP(has_default)) {
-                                               zval_dtor(new_val);
-                                               FREE_ZVAL(new_val);
-                                               skip_field = 1;
-                                       }
-                                       /* raise error if it's not null */
-                                       else if (Z_BVAL_PP(not_null)) {
-                                               php_error(E_NOTICE, "%s() detected NULL for 'NOT NULL' field '%s'",
-                                                                 get_active_function_name(TSRMLS_C), field );
-                                               err = 1;
-                                       }
-                               }                               
+                               PGSQL_CONV_CHECK_IGNORE();
                                if (err) {
                                        php_error(E_NOTICE, "%s() expects string or null for pgsql %s field (%s)",
                                                          get_active_function_name(TSRMLS_C), Z_STRVAL_PP(type), field);
@@ -3806,21 +3675,26 @@ PHPAPI int php_pgsql_convert(PGconn *pg_link, const char *table_name, const zval
 /* }}} */
 
 
-/* {{{ proto array pg_convert(resource db, string table, array values)
+/* {{{ proto array pg_convert(resource db, string table, array values[, int options])
    Check and convert values for PostgreSQL SQL statement */
 PHP_FUNCTION(pg_convert)
 {
        zval *pgsql_link, *values;
        char *table_name;
        size_t table_name_len;
+       ulong option = 0;
        PGconn *pg_link;
        int id = -1;
        
        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC,
-                                                         "rsa", &pgsql_link, &table_name, &table_name_len, &values) == FAILURE) {
+                                                         "rsa|l", &pgsql_link, &table_name, &table_name_len, &values, &option) == FAILURE) {
                return;
        }
-
+       if (option & ~PGSQL_CONV_OPTS) {
+               php_error(E_WARNING, "%s() invalid option is spedified",
+                                 get_active_function_name(TSRMLS_C));
+               RETURN_FALSE;
+       }
        if (!table_name_len) {
                php_error(E_NOTICE, "%s() table name is invalid",
                                  get_active_function_name(TSRMLS_C));
@@ -3834,16 +3708,16 @@ PHP_FUNCTION(pg_convert)
                                  get_active_function_name(TSRMLS_C));
        }
        array_init(return_value);
-       if (php_pgsql_convert(pg_link, table_name, values, return_value TSRMLS_CC) == FAILURE) {
+       if (php_pgsql_convert(pg_link, table_name, values, return_value, option TSRMLS_CC) == FAILURE) {
                zval_dtor(return_value);
                RETURN_FALSE;
        }
 }
 /* }}} */
 
-static int do_exec(smart_str *querystr, int expect, PGconn *pg_link, zend_bool async TSRMLS_DC)
+static int do_exec(smart_str *querystr, int expect, PGconn *pg_link, ulong opt TSRMLS_DC)
 {
-       if (async) {
+       if (opt & PGSQL_DML_ASYNC) {
                if (PQsendQuery(pg_link, querystr->c)) {
                        return 0;
                }
@@ -3866,7 +3740,7 @@ static int do_exec(smart_str *querystr, int expect, PGconn *pg_link, zend_bool a
 
 /* {{{ php_pgsql_insert
  */
-PHPAPI int php_pgsql_insert(PGconn *pg_link, const char *table, zval *var_array, zend_bool convert, zend_bool async TSRMLS_DC)
+PHPAPI int php_pgsql_insert(PGconn *pg_link, const char *table, zval *var_array, ulong opt, char **sql TSRMLS_DC)
 {
        zval **val, *converted = NULL;
        char buf[256];
@@ -3879,18 +3753,16 @@ PHPAPI int php_pgsql_insert(PGconn *pg_link, const char *table, zval *var_array,
        assert(pg_link != NULL);
        assert(table != NULL);
        assert(Z_TYPE_P(var_array) == IS_ARRAY);
-       assert(convert == 1 || convert == 0);
-       assert(async == 1 || async == 0);
 
        if (zend_hash_num_elements(Z_ARRVAL_P(var_array)) == 0) {
                return FAILURE;
        }
 
        /* convert input array if needed */
-       if (convert) {
+       if (!(opt & PGSQL_DML_NO_CONV)) {
                MAKE_STD_ZVAL(converted);
                array_init(converted);
-               if (php_pgsql_convert(pg_link, table, var_array, converted TSRMLS_CC) == FAILURE) {
+               if (php_pgsql_convert(pg_link, table, var_array, converted, (opt & PGSQL_CONV_OPTS) TSRMLS_CC) == FAILURE) {
                        goto cleanup;
                }
                var_array = converted;
@@ -3945,34 +3817,49 @@ PHPAPI int php_pgsql_insert(PGconn *pg_link, const char *table, zval *var_array,
        smart_str_appends(&querystr, ");");
        smart_str_0(&querystr);
 
-       if (do_exec(&querystr, PGRES_COMMAND_OK, pg_link, async TSRMLS_CC) == 0)
+       if ((opt & (PGSQL_DML_EXEC|PGSQL_DML_ASYNC)) &&
+               do_exec(&querystr, PGRES_COMMAND_OK, pg_link, (opt & PGSQL_CONV_OPTS) TSRMLS_CC) == 0) {
                ret = SUCCESS;
-
+       }
+       else if (opt & PGSQL_DML_STRING) {
+               ret = SUCCESS;
+       }
+       
 cleanup:
-       if (convert) {
+       if (!(opt & PGSQL_DML_NO_CONV)) {
                zval_dtor(converted);                   
                FREE_ZVAL(converted);
        }
-       smart_str_free(&querystr);
+       if (ret == SUCCESS && (opt & PGSQL_DML_STRING)) {
+               *sql = querystr.c;
+       }
+       else {
+               smart_str_free(&querystr);
+       }
        return ret;
 }
 /* }}} */
 
-/* {{{ proto bool pg_insert(resource db, string table, array values[, bool convert[, bool async]])
+/* {{{ proto bool pg_insert(resource db, string table, array values[, int options])
    Insert values (filed=>value) to table */
 PHP_FUNCTION(pg_insert)
 {
        zval *pgsql_link, *values;
-       char *table;
+       char *table, *sql = NULL;
        ulong table_len;
-       zend_bool convert = 1, async = 1;
+       ulong option = PGSQL_DML_EXEC;
        PGconn *pg_link;
        int id = -1, argc = ZEND_NUM_ARGS();
 
-       if (zend_parse_parameters(argc TSRMLS_CC, "rsa|bb",
-                                                         &pgsql_link, &table, &table_len, &values, &convert, &async) == FAILURE) {
+       if (zend_parse_parameters(argc TSRMLS_CC, "rsa|l",
+                                                         &pgsql_link, &table, &table_len, &values, &option) == FAILURE) {
                return;
        }
+       if (option & ~(PGSQL_CONV_OPTS|PGSQL_DML_NO_CONV|PGSQL_DML_EXEC|PGSQL_DML_ASYNC|PGSQL_DML_STRING)) {
+               php_error(E_WARNING, "%s() invalid option is spedified",
+                                 get_active_function_name(TSRMLS_C));
+               RETURN_FALSE;
+       }
        
        ZEND_FETCH_RESOURCE2(pg_link, PGconn *, &pgsql_link, id, "PostgreSQL link", le_link, le_plink);
 
@@ -3980,9 +3867,12 @@ PHP_FUNCTION(pg_insert)
                php_error(E_NOTICE, "%s detected unhandled result(s) in connection",
                                  get_active_function_name(TSRMLS_C));
        }
-       if (php_pgsql_insert(pg_link, table, values, convert, async TSRMLS_CC) == FAILURE) {
+       if (php_pgsql_insert(pg_link, table, values, option, &sql TSRMLS_CC) == FAILURE) {
                RETURN_FALSE;
        }
+       if (option & PGSQL_DML_STRING) {
+               RETURN_STRING(sql, 0);
+       }
        RETURN_TRUE;
 }
 /* }}} */
@@ -4034,7 +3924,7 @@ static inline int build_assignment_string(smart_str *querystr, HashTable *ht, co
 
 /* {{{ php_pgsql_update
  */
-PHPAPI int php_pgsql_update(PGconn *pg_link, const char *table, zval *var_array, zval *ids_array, zend_bool convert, zend_bool async TSRMLS_DC) 
+PHPAPI int php_pgsql_update(PGconn *pg_link, const char *table, zval *var_array, zval *ids_array, ulong opt, char **sql TSRMLS_DC) 
 {
        zval *var_converted = NULL, *ids_converted = NULL;
        smart_str querystr = {0};
@@ -4044,24 +3934,23 @@ PHPAPI int php_pgsql_update(PGconn *pg_link, const char *table, zval *var_array,
        assert(table != NULL);
        assert(Z_TYPE_P(var_array) == IS_ARRAY);
        assert(Z_TYPE_P(ids_array) == IS_ARRAY);
-       assert(convert == 1 || convert == 0);
-       assert(async == 1 || async == 0);
+       assert(!(opt & ~(PGSQL_CONV_OPTS|PGSQL_DML_NO_CONV|PGSQL_DML_EXEC|PGSQL_DML_STRING)));
 
        if (zend_hash_num_elements(Z_ARRVAL_P(var_array)) == 0
                        || zend_hash_num_elements(Z_ARRVAL_P(ids_array)) == 0) {
                return FAILURE;
        }
 
-       if (convert) {
+       if (!(opt & PGSQL_DML_NO_CONV)) {
                MAKE_STD_ZVAL(var_converted);
                array_init(var_converted);
-               if (php_pgsql_convert(pg_link, table, var_array, var_converted TSRMLS_CC) == FAILURE) {
+               if (php_pgsql_convert(pg_link, table, var_array, var_converted, (opt & PGSQL_CONV_OPTS) TSRMLS_CC) == FAILURE) {
                        goto cleanup;
                }
                var_array = var_converted;
                MAKE_STD_ZVAL(ids_converted);
                array_init(ids_converted);
-               if (php_pgsql_convert(pg_link, table, ids_array, ids_converted TSRMLS_CC) == FAILURE) {
+               if (php_pgsql_convert(pg_link, table, ids_array, ids_converted, (opt & PGSQL_CONV_OPTS) TSRMLS_CC) == FAILURE) {
                        goto cleanup;
                }
                ids_array = ids_converted;
@@ -4082,7 +3971,7 @@ PHPAPI int php_pgsql_update(PGconn *pg_link, const char *table, zval *var_array,
        smart_str_appendc(&querystr, ';');      
        smart_str_0(&querystr);
 
-       if (do_exec(&querystr, PGRES_COMMAND_OK, pg_link, async TSRMLS_CC) == 0)
+       if (do_exec(&querystr, PGRES_COMMAND_OK, pg_link, opt TSRMLS_CC) == 0)
                ret = SUCCESS;
 
 cleanup:
@@ -4094,26 +3983,36 @@ cleanup:
                zval_dtor(ids_converted);
                FREE_ZVAL(ids_converted);
        }
-       smart_str_free(&querystr);
+       if (ret == SUCCESS && (opt & PGSQL_DML_STRING)) {
+               *sql = querystr.c;
+       }
+       else {
+               smart_str_free(&querystr);
+       }
        return ret;
 }
 /* }}} */
 
-/* {{{ proto bool pg_update(resource db, string table, array fields, array ids[, bool convert[, bool async]])
+/* {{{ proto bool pg_update(resource db, string table, array fields, array ids[, int options])
    Update table using values (field=>value) and ids (id=>value) */
 PHP_FUNCTION(pg_update)
 {
        zval *pgsql_link, *values, *ids;
-       char *table;
+       char *table, *sql = NULL;
        ulong table_len;
-       zend_bool convert = 1, async = 1;
+       ulong option =  PGSQL_DML_EXEC;
        PGconn *pg_link;
        int id = -1, argc = ZEND_NUM_ARGS();
 
-       if (zend_parse_parameters(argc TSRMLS_CC, "rsaa|bb",
-                                                         &pgsql_link, &table, &table_len, &values, &ids, &convert, &async) == FAILURE) {
+       if (zend_parse_parameters(argc TSRMLS_CC, "rsaa|l",
+                                                         &pgsql_link, &table, &table_len, &values, &ids, &option) == FAILURE) {
                return;
        }
+       if (option & ~(PGSQL_CONV_OPTS|PGSQL_DML_NO_CONV|PGSQL_DML_EXEC|PGSQL_DML_STRING)) {
+               php_error(E_WARNING, "%s() invalid option is spedified",
+                                 get_active_function_name(TSRMLS_C));
+               RETURN_FALSE;
+       }
        
        ZEND_FETCH_RESOURCE2(pg_link, PGconn *, &pgsql_link, id, "PostgreSQL link", le_link, le_plink);
 
@@ -4121,16 +4020,19 @@ PHP_FUNCTION(pg_update)
                php_error(E_NOTICE, "%s detected unhandled result(s) in connection",
                                  get_active_function_name(TSRMLS_C));
        }
-       if (php_pgsql_update(pg_link, table, values, ids, convert, async TSRMLS_CC) == FAILURE) {
+       if (php_pgsql_update(pg_link, table, values, ids, option, &sql TSRMLS_CC) == FAILURE) {
                RETURN_FALSE;
        }
+       if (option & PGSQL_DML_STRING) {
+               RETURN_STRING(sql, 0);
+       }
        RETURN_TRUE;
 } 
 /* }}} */
 
 /* {{{ php_pgsql_delete
  */
-PHPAPI int php_pgsql_delete(PGconn *pg_link, const char *table, zval *ids_array, zend_bool convert, zend_bool async TSRMLS_DC) 
+PHPAPI int php_pgsql_delete(PGconn *pg_link, const char *table, zval *ids_array, ulong opt, char **sql TSRMLS_DC) 
 {
        zval *ids_converted = NULL;
        smart_str querystr = {0};
@@ -4139,17 +4041,16 @@ PHPAPI int php_pgsql_delete(PGconn *pg_link, const char *table, zval *ids_array,
        assert(pg_link != NULL);
        assert(table != NULL);
        assert(Z_TYPE_P(ids_array) == IS_ARRAY);
-       assert(convert == 1 || convert == 0);
-       assert(async == 1 || async == 0);
-
+       assert(!(opt & ~(PGSQL_CONV_FORCE_NULL|PGSQL_DML_EXEC|PGSQL_DML_STRING)));
+       
        if (zend_hash_num_elements(Z_ARRVAL_P(ids_array)) == 0) {
                return FAILURE;
        }
 
-       if (convert) {
+       if (!(opt & PGSQL_DML_NO_CONV)) {
                MAKE_STD_ZVAL(ids_converted);
                array_init(ids_converted);
-               if (php_pgsql_convert(pg_link, table, ids_array, ids_converted TSRMLS_CC) == FAILURE) {
+               if (php_pgsql_convert(pg_link, table, ids_array, ids_converted, (opt & PGSQL_CONV_OPTS) TSRMLS_CC) == FAILURE) {
                        goto cleanup;
                }
                ids_array = ids_converted;
@@ -4165,34 +4066,43 @@ PHPAPI int php_pgsql_delete(PGconn *pg_link, const char *table, zval *ids_array,
        smart_str_appendc(&querystr, ';');
        smart_str_0(&querystr);
 
-       if (do_exec(&querystr, PGRES_TUPLES_OK, pg_link, async TSRMLS_CC) == 0)
+       if (do_exec(&querystr, PGRES_COMMAND_OK, pg_link, opt TSRMLS_CC) == 0)
                ret = SUCCESS;
 
 cleanup:
-       if (convert) {
+       if (!(opt & PGSQL_DML_NO_CONV)) {
                zval_dtor(ids_converted);                       
                FREE_ZVAL(ids_converted);
        }
-       smart_str_free(&querystr);
+       if (ret == SUCCESS && (opt & PGSQL_DML_STRING)) {
+               *sql = estrdup(querystr.c);
+       }
+       else {
+               smart_str_free(&querystr);
+       }
        return ret;
 }
 /* }}} */
 
-/* {{{ proto bool pg_delete(resource db, string table, array ids[, bool convert[, bool async]])
+/* {{{ proto bool pg_delete(resource db, string table, array ids[, int options])
    Delete records has ids (id=>value) */
 PHP_FUNCTION(pg_delete)
 {
        zval *pgsql_link, *ids;
-       char *table;
-       ulong table_len;
-       zend_bool convert = 1, async = 1;
+       char *table, *sql = NULL;
+       ulong table_len, option = PGSQL_DML_EXEC;
        PGconn *pg_link;
        int id = -1, argc = ZEND_NUM_ARGS();
 
-       if (zend_parse_parameters(argc TSRMLS_CC, "rsa|bb",
-                                                         &pgsql_link, &table, &table_len, &ids, &convert, &async) == FAILURE) {
+       if (zend_parse_parameters(argc TSRMLS_CC, "rsa|l",
+                                                         &pgsql_link, &table, &table_len, &ids, &option) == FAILURE) {
                return;
        }
+       if (option & ~(PGSQL_CONV_FORCE_NULL|PGSQL_DML_NO_CONV|PGSQL_DML_EXEC|PGSQL_DML_STRING)) {
+               php_error(E_WARNING, "%s() invalid option is spedified",
+                                 get_active_function_name(TSRMLS_C));
+               RETURN_FALSE;
+       }
        
        ZEND_FETCH_RESOURCE2(pg_link, PGconn *, &pgsql_link, id, "PostgreSQL link", le_link, le_plink);
 
@@ -4200,9 +4110,12 @@ PHP_FUNCTION(pg_delete)
                php_error(E_NOTICE, "%s detected unhandled result(s) in connection",
                                  get_active_function_name(TSRMLS_C));
        }
-       if (php_pgsql_delete(pg_link, table, ids, convert, async TSRMLS_CC) == FAILURE) {
+       if (php_pgsql_delete(pg_link, table, ids, option, &sql TSRMLS_CC) == FAILURE) {
                RETURN_FALSE;
        }
+       if (option & PGSQL_DML_STRING) {
+               RETURN_STRING(sql, 0);
+       }
        RETURN_TRUE;
 } 
 /* }}} */
@@ -4251,7 +4164,7 @@ PHPAPI int php_pgsql_result2array(PGresult *pg_result, zval *ret_array TSRMLS_DC
 
 /* {{{ php_pgsql_select
  */
-PHPAPI int php_pgsql_select(PGconn *pg_link, const char *table, zval *ids_array, zval *ret_array, zend_bool convert TSRMLS_DC) 
+PHPAPI int php_pgsql_select(PGconn *pg_link, const char *table, zval *ids_array, zval *ret_array, ulong opt, char **sql TSRMLS_DC) 
 {
        zval *ids_converted = NULL;
        smart_str querystr = {0};
@@ -4262,16 +4175,16 @@ PHPAPI int php_pgsql_select(PGconn *pg_link, const char *table, zval *ids_array,
        assert(table != NULL);
        assert(Z_TYPE_P(ids_array) == IS_ARRAY);
        assert(Z_TYPE_P(ret_array) == IS_ARRAY);
-       assert(convert == 1 || convert == 0);
-
+       assert(!(opt & ~(PGSQL_CONV_OPTS|PGSQL_DML_NO_CONV|PGSQL_DML_EXEC|PGSQL_DML_ASYNC|PGSQL_DML_STRING)));
+       
        if (zend_hash_num_elements(Z_ARRVAL_P(ids_array)) == 0) {
                return FAILURE;
        }
 
-       if (convert) {
+       if (!(opt & PGSQL_DML_NO_CONV)) {
                MAKE_STD_ZVAL(ids_converted);
                array_init(ids_converted);
-               if (php_pgsql_convert(pg_link, table, ids_array, ids_converted TSRMLS_CC) == FAILURE) {
+               if (php_pgsql_convert(pg_link, table, ids_array, ids_converted, (opt & PGSQL_CONV_OPTS) TSRMLS_CC) == FAILURE) {
                        goto cleanup;
                }
                ids_array = ids_converted;
@@ -4297,30 +4210,39 @@ PHPAPI int php_pgsql_select(PGconn *pg_link, const char *table, zval *ids_array,
        }
        
 cleanup:
-       if (convert) {
+       if (!(opt & PGSQL_DML_NO_CONV)) {
                zval_dtor(ids_converted);                       
                FREE_ZVAL(ids_converted);
        }
-       smart_str_free(&querystr);
+       if (ret == SUCCESS && (opt & PGSQL_DML_STRING)) {
+               *sql = querystr.c;
+       }
+       else {
+               smart_str_free(&querystr);
+       }
        return ret;
 }
 /* }}} */
 
-/* {{{ proto array pg_select(resource db, string table, array ids[, bool convert])
+/* {{{ proto array pg_select(resource db, string table, array ids[, int options])
    Select records that has ids (id=>value) */
 PHP_FUNCTION(pg_select)
 {
        zval *pgsql_link, *ids;
-       char *table;
-       ulong table_len;
-       zend_bool convert = 1;
+       char *table, *sql = NULL;
+       ulong table_len, option = PGSQL_DML_EXEC;
        PGconn *pg_link;
        int id = -1, argc = ZEND_NUM_ARGS();
 
-       if (zend_parse_parameters(argc TSRMLS_CC, "rsa|b",
-                                                         &pgsql_link, &table, &table_len, &ids, &convert) == FAILURE) {
+       if (zend_parse_parameters(argc TSRMLS_CC, "rsa|l",
+                                                         &pgsql_link, &table, &table_len, &ids, &option) == FAILURE) {
                return;
        }
+       if (option & ~(PGSQL_CONV_FORCE_NULL|PGSQL_DML_NO_CONV|PGSQL_DML_EXEC|PGSQL_DML_ASYNC|PGSQL_DML_STRING)) {
+               php_error(E_WARNING, "%s() invalid option is spedified",
+                                 get_active_function_name(TSRMLS_C));
+               RETURN_FALSE;
+       }
        
        ZEND_FETCH_RESOURCE2(pg_link, PGconn *, &pgsql_link, id, "PostgreSQL link", le_link, le_plink);
 
@@ -4329,10 +4251,14 @@ PHP_FUNCTION(pg_select)
                                  get_active_function_name(TSRMLS_C));
        }
        array_init(return_value);
-       if (php_pgsql_select(pg_link, table, ids, return_value, convert TSRMLS_CC) == FAILURE) {
+       if (php_pgsql_select(pg_link, table, ids, return_value, option, &sql TSRMLS_CC) == FAILURE) {
                zval_dtor(return_value);
                RETURN_FALSE;
        }
+       if (option & PGSQL_DML_STRING) {
+               zval_dtor(return_value);
+               RETURN_STRING(sql, 0);
+       }
        return;
 } 
 /* }}} */
index caab8a3ad9eea336e88404da1f081a37519f68e9..a1d547e6e8d695753512cd921689db0cca7027f2 100644 (file)
@@ -131,15 +131,27 @@ PHP_FUNCTION(pg_update);
 PHP_FUNCTION(pg_delete);
 PHP_FUNCTION(pg_select);
 
+/* php_pgsql_convert options */
+#define PGSQL_CONV_IGNORE_DEFAULT   (1<<1)     /* Do not use DEAFULT value by removing field from returned array */
+#define PGSQL_CONV_FORCE_NULL       (1<<2)     /* Convert to NULL if string is null string */
+#define PGSQL_CONV_IGNORE_NOT_NULL  (1<<3)     /* Ignore NOT NULL constraints */
+#define PGSQL_CONV_OPTS             (PGSQL_CONV_IGNORE_DEFAULT|PGSQL_CONV_FORCE_NULL|PGSQL_CONV_IGNORE_NOT_NULL)
+/* php_pgsql_insert/update/select/delete options */
+#define PGSQL_DML_NO_CONV           (1<<8)     /* Call php_pgsql_convert() */
+#define PGSQL_DML_EXEC              (1<<9)     /* Execute query */
+#define PGSQL_DML_ASYNC             (1<<10)    /* Do async query */
+#define PGSQL_DML_STRING            (1<<11)    /* Return query string */
+
+/* exported functions */
 PHPAPI int php_pgsql_metadata(PGconn *pg_link, const char *table_name, zval *meta TSRMLS_DC);
-PHPAPI int php_pgsql_convert(PGconn *pg_link, const char *table_name, const zval *values, zval *result TSRMLS_DC);
-PHPAPI int php_pgsql_insert(PGconn *pg_link, const char *table, zval *values, zend_bool convert, zend_bool async TSRMLS_DC);
-PHPAPI int php_pgsql_update(PGconn *pg_link, const char *table, zval *values, zval *ids, zend_bool convert, zend_bool async TSRMLS_DC);
-PHPAPI int php_pgsql_delete(PGconn *pg_link, const char *table, zval *ids, zend_bool convert, zend_bool async TSRMLS_DC);
-PHPAPI int php_pgsql_select(PGconn *pg_link, const char *table, zval *ids, zval *ret_array, zend_bool convert TSRMLS_DC);
+PHPAPI int php_pgsql_convert(PGconn *pg_link, const char *table_name, const zval *values, zval *result, ulong opt TSRMLS_DC);
+PHPAPI int php_pgsql_insert(PGconn *pg_link, const char *table, zval *values, ulong opt, char **sql TSRMLS_DC);
+PHPAPI int php_pgsql_update(PGconn *pg_link, const char *table, zval *values, zval *ids, ulong opt , char **sql TSRMLS_DC);
+PHPAPI int php_pgsql_delete(PGconn *pg_link, const char *table, zval *ids, ulong opt, char **sql TSRMLS_DC);
+PHPAPI int php_pgsql_select(PGconn *pg_link, const char *table, zval *ids, zval *ret_array, ulong opt, char **sql  TSRMLS_DC);
 
+/* internal functions */
 static void php_pgsql_do_connect(INTERNAL_FUNCTION_PARAMETERS,int persistent);
-/* static int php_pgsql_get_default_link(INTERNAL_FUNCTION_PARAMETERS); */
 static void php_pgsql_get_link_info(INTERNAL_FUNCTION_PARAMETERS, int entry_type);
 static void php_pgsql_get_result_info(INTERNAL_FUNCTION_PARAMETERS, int entry_type);
 static char *get_field_name(PGconn *pgsql, Oid oid, HashTable *list TSRMLS_DC);
index 8070df1539506007a343d9cae37f8942cd9e7f80..104b6fe662cabc0018fa3060fe2d54d3e96dc30d 100644 (file)
@@ -7,4 +7,5 @@ PostgreSQL pg_insert()
 include("pg_insert.inc");
 ?>
 --EXPECT--
+INSERT INTO php_pgsql_test (num,str,bin) VALUES (1234,'AAA','BBB');
 Ok
index 7c61436089a01a05d96eff84c3aa3993b33a237f..43c94c037f07d58211fa896c0977951827f1a5c5 100644 (file)
@@ -18,4 +18,5 @@ array(1) {
     string(3) "BBB"
   }
 }
+SELECT * FROM php_pgsql_test WHERE num=1234;
 Ok
index da78eeac92e15dff885e76f6afa9263e78390663..7dd4dd2d957745549f95cb76de2c4e5e15445df7 100644 (file)
@@ -7,4 +7,5 @@ PostgreSQL pg_update()
 include("pg_update.inc");
 ?>
 --EXPECT--
+UPDATE php_pgsql_test SET num=1234,str='ABC',bin='XYZ' WHERE num=1234;
 Ok
index 33e001081bef88d1189b944d26d15e4884e9b945..33ba80e727325461251ed417a627a6e5b70161b7 100644 (file)
@@ -7,7 +7,7 @@ $db = pg_connect($conn_str);
 
 $fields = array('num'=>'1234', 'str'=>'XXX', 'bin'=>'YYY');
 $ids = array('num'=>'1234');
-if (!pg_delete($db, $table_name, $ids, 1)) {
+if (!pg_delete($db, $table_name, $ids)) {
        echo "Error\n";
 }
 else {
index bfb2e90e8348ff18c520c702082754ccdf8a3825..e0777a215e3e8e355a40bc3101451d7a5c20368e 100644 (file)
@@ -4,13 +4,10 @@ error_reporting(E_ALL);
 include 'config.inc';
 
 $db = pg_connect($conn_str);
-
 $fields = array('num'=>'1234', 'str'=>'AAA', 'bin'=>'BBB');
-if (!pg_insert($db, $table_name, $fields, 1, 0)) {
-       echo "Error\n";
-}
-else {
-       echo "Ok\n";
-}
 
+pg_insert($db, $table_name, $fields) or print "Error in test 1\n";
+echo pg_insert($db, $table_name, $fields, PGSQL_DML_STRING)."\n";
+
+echo "Ok\n";
 ?>
index 04ca501deb91dc65fd712bb730a4e0cc5ce428e3..4d251bc9923c00fca36ddc57afc4532f1a5273b0 100644 (file)
@@ -4,15 +4,12 @@ error_reporting(E_ALL);
 include 'config.inc';
 
 $db = pg_connect($conn_str);
-
-$fields = array('num'=>'1234', 'str'=>'XXX', 'bin'=>'YYY');
+$fields = array('num'=>'1234', 'str'=>'ABC', 'bin'=>'XYZ');
 $ids = array('num'=>'1234');
-if (!($res = pg_select($db, $table_name, $ids, 1))) {
-       echo "Error\n";
-}
-else {
-       var_dump($res);
-       echo "Ok\n";
-}
+
+$res = pg_select($db, $table_name, $ids) or print "Error\n";
+var_dump($res);
+echo pg_select($db, $table_name, $ids, PGSQL_DML_STRING)."\n";
+echo "Ok\n";
 
 ?>
\ No newline at end of file
index 6501c09af5f5eb7b2cf6aa8afee3ec1684ace433..8fc8bb168b8f20756c75393a2fab1cf0fa69f225 100644 (file)
@@ -4,14 +4,12 @@ error_reporting(E_ALL);
 include 'config.inc';
 
 $db = pg_connect($conn_str);
-
-$fields = array('num'=>'1234', 'str'=>'XXX', 'bin'=>'YYY');
+$fields = array('num'=>'1234', 'str'=>'ABC', 'bin'=>'XYZ');
 $ids = array('num'=>'1234');
-if (!pg_update($db, $table_name, $fields, $ids, 1, 0)) {
-       echo "Error\n";
-}
-else {
-       echo "Ok\n";
-}
+
+pg_update($db, $table_name, $fields, $ids) or print "Error in test 1\n";
+echo pg_update($db, $table_name, $fields, $ids, PGSQL_DML_STRING)."\n";
+
+echo "Ok\n";
 
 ?>