Diff for /embedaddon/php/ext/pgsql/pgsql.c between versions 1.1 and 1.1.1.3

version 1.1, 2012/02/21 23:47:59 version 1.1.1.3, 2013/07/22 01:31:59
Line 2 Line 2
    +----------------------------------------------------------------------+     +----------------------------------------------------------------------+
    | PHP Version 5                                                        |     | PHP Version 5                                                        |
    +----------------------------------------------------------------------+     +----------------------------------------------------------------------+
   | Copyright (c) 1997-2012 The PHP Group                                |   | Copyright (c) 1997-2013 The PHP Group                                |
    +----------------------------------------------------------------------+     +----------------------------------------------------------------------+
    | This source file is subject to version 3.01 of the PHP license,      |     | This source file is subject to version 3.01 of the PHP license,      |
    | that is bundled with this package in the file LICENSE, and is        |     | that is bundled with this package in the file LICENSE, and is        |
Line 422  ZEND_BEGIN_ARG_INFO_EX(arginfo_pg_unescape_bytea, 0, 0 Line 422  ZEND_BEGIN_ARG_INFO_EX(arginfo_pg_unescape_bytea, 0, 0
 ZEND_END_ARG_INFO()  ZEND_END_ARG_INFO()
 #endif  #endif
   
   #if HAVE_PQESCAPE
   ZEND_BEGIN_ARG_INFO_EX(arginfo_pg_escape_literal, 0, 0, 0)
           ZEND_ARG_INFO(0, connection)
           ZEND_ARG_INFO(0, data)
   ZEND_END_ARG_INFO()
   ZEND_BEGIN_ARG_INFO_EX(arginfo_pg_escape_identifier, 0, 0, 0)
           ZEND_ARG_INFO(0, connection)
           ZEND_ARG_INFO(0, data)
   ZEND_END_ARG_INFO()
   #endif
   
 ZEND_BEGIN_ARG_INFO_EX(arginfo_pg_result_error, 0, 0, 1)  ZEND_BEGIN_ARG_INFO_EX(arginfo_pg_result_error, 0, 0, 1)
         ZEND_ARG_INFO(0, result)          ZEND_ARG_INFO(0, result)
 ZEND_END_ARG_INFO()  ZEND_END_ARG_INFO()
Line 652  const zend_function_entry pgsql_functions[] = { Line 663  const zend_function_entry pgsql_functions[] = {
         PHP_FE(pg_escape_string,        arginfo_pg_escape_string)          PHP_FE(pg_escape_string,        arginfo_pg_escape_string)
         PHP_FE(pg_escape_bytea,         arginfo_pg_escape_bytea)          PHP_FE(pg_escape_bytea,         arginfo_pg_escape_bytea)
         PHP_FE(pg_unescape_bytea,       arginfo_pg_unescape_bytea)          PHP_FE(pg_unescape_bytea,       arginfo_pg_unescape_bytea)
           PHP_FE(pg_escape_literal,       arginfo_pg_escape_literal)
           PHP_FE(pg_escape_identifier,    arginfo_pg_escape_identifier)
 #endif  #endif
 #if HAVE_PQSETERRORVERBOSITY  #if HAVE_PQSETERRORVERBOSITY
         PHP_FE(pg_set_error_verbosity,  arginfo_pg_set_error_verbosity)          PHP_FE(pg_set_error_verbosity,  arginfo_pg_set_error_verbosity)
Line 815  static void _php_pgsql_notice_handler(void *resource_i Line 828  static void _php_pgsql_notice_handler(void *resource_i
         TSRMLS_FETCH();          TSRMLS_FETCH();
         if (! PGG(ignore_notices)) {          if (! PGG(ignore_notices)) {
                 notice = (php_pgsql_notice *)emalloc(sizeof(php_pgsql_notice));                  notice = (php_pgsql_notice *)emalloc(sizeof(php_pgsql_notice));
                notice->message = _php_pgsql_trim_message(message, &notice->len);                notice->message = _php_pgsql_trim_message(message, (int *)&notice->len);
                 if (PGG(log_notices)) {                  if (PGG(log_notices)) {
                         php_error_docref(NULL TSRMLS_CC, E_NOTICE, "%s", notice->message);                          php_error_docref(NULL TSRMLS_CC, E_NOTICE, "%s", notice->message);
                 }                  }
Line 934  PHP_MINIT_FUNCTION(pgsql) Line 947  PHP_MINIT_FUNCTION(pgsql)
         le_result = zend_register_list_destructors_ex(_free_result, NULL, "pgsql result", module_number);          le_result = zend_register_list_destructors_ex(_free_result, NULL, "pgsql result", module_number);
         le_lofp = zend_register_list_destructors_ex(_free_ptr, NULL, "pgsql large object", module_number);          le_lofp = zend_register_list_destructors_ex(_free_ptr, NULL, "pgsql large object", module_number);
         le_string = zend_register_list_destructors_ex(_free_ptr, NULL, "pgsql string", module_number);          le_string = zend_register_list_destructors_ex(_free_ptr, NULL, "pgsql string", module_number);
   #if HAVE_PG_CONFIG_H
           /* PG_VERSION - libpq version */
           REGISTER_STRING_CONSTANT("PGSQL_LIBPQ_VERSION", PG_VERSION, CONST_CS | CONST_PERSISTENT);
           REGISTER_STRING_CONSTANT("PGSQL_LIBPQ_VERSION_STR", PG_VERSION_STR, CONST_CS | CONST_PERSISTENT);
   #endif
         /* For connection option */          /* For connection option */
         REGISTER_LONG_CONSTANT("PGSQL_CONNECT_FORCE_NEW", PGSQL_CONNECT_FORCE_NEW, CONST_CS | CONST_PERSISTENT);          REGISTER_LONG_CONSTANT("PGSQL_CONNECT_FORCE_NEW", PGSQL_CONNECT_FORCE_NEW, CONST_CS | CONST_PERSISTENT);
         /* For pg_fetch_array() */          /* For pg_fetch_array() */
Line 1048  PHP_MINFO_FUNCTION(pgsql) Line 1066  PHP_MINFO_FUNCTION(pgsql)
         php_info_print_table_header(2, "PostgreSQL Support", "enabled");          php_info_print_table_header(2, "PostgreSQL Support", "enabled");
 #if HAVE_PG_CONFIG_H  #if HAVE_PG_CONFIG_H
         php_info_print_table_row(2, "PostgreSQL(libpq) Version", PG_VERSION);          php_info_print_table_row(2, "PostgreSQL(libpq) Version", PG_VERSION);
           php_info_print_table_row(2, "PostgreSQL(libpq) ", PG_VERSION_STR);
 #ifdef HAVE_PGSQL_WITH_MULTIBYTE_SUPPORT  #ifdef HAVE_PGSQL_WITH_MULTIBYTE_SUPPORT
         php_info_print_table_row(2, "Multibyte character support", "enabled");          php_info_print_table_row(2, "Multibyte character support", "enabled");
 #else  #else
Line 2503  static void php_pgsql_fetch_hash(INTERNAL_FUNCTION_PAR Line 2522  static void php_pgsql_fetch_hash(INTERNAL_FUNCTION_PAR
                                 int should_copy=0;                                  int should_copy=0;
                                 const uint element_len = strlen(element);                                  const uint element_len = strlen(element);
   
                                if (PG(magic_quotes_runtime)) {                                data = safe_estrndup(element, element_len);
                                        data = php_addslashes(element, element_len, &data_len, 0 TSRMLS_CC);                                data_len = element_len;
                                } else { 
                                        data = safe_estrndup(element, element_len); 
                                        data_len = element_len; 
                                } 
                                                   
                                 if (result_type & PGSQL_NUM) {                                  if (result_type & PGSQL_NUM) {
                                         add_index_stringl(return_value, i, data, data_len, should_copy);                                          add_index_stringl(return_value, i, data, data_len, should_copy);
Line 2883  PHP_FUNCTION(pg_trace) Line 2898  PHP_FUNCTION(pg_trace)
   
         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);
   
        stream = php_stream_open_wrapper(z_filename, mode, ENFORCE_SAFE_MODE|REPORT_ERRORS, NULL);        stream = php_stream_open_wrapper(z_filename, mode, REPORT_ERRORS, NULL);
   
         if (!stream) {          if (!stream) {
                 RETURN_FALSE;                  RETURN_FALSE;
Line 3173  PHP_FUNCTION(pg_lo_open) Line 3188  PHP_FUNCTION(pg_lo_open)
                                 } else {                                  } else {
                                         pgsql_lofp->conn = pgsql;                                          pgsql_lofp->conn = pgsql;
                                         pgsql_lofp->lofd = pgsql_lofd;                                          pgsql_lofp->lofd = pgsql_lofd;
                                        Z_LVAL_P(return_value) = zend_list_insert(pgsql_lofp, le_lofp);                                        Z_LVAL_P(return_value) = zend_list_insert(pgsql_lofp, le_lofp TSRMLS_CC);
                                         Z_TYPE_P(return_value) = IS_LONG;                                          Z_TYPE_P(return_value) = IS_LONG;
                                 }                                  }
                         }                          }
Line 3326  PHP_FUNCTION(pg_lo_import) Line 3341  PHP_FUNCTION(pg_lo_import)
         Oid returned_oid;          Oid returned_oid;
   
         if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, argc TSRMLS_CC,          if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, argc TSRMLS_CC,
                                                                 "rs|z", &pgsql_link, &file_in, &name_len, &oid) == SUCCESS) {                                                                 "rp|z", &pgsql_link, &file_in, &name_len, &oid) == SUCCESS) {
                 ;                  ;
         }          }
         else if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, argc TSRMLS_CC,          else if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, argc TSRMLS_CC,
                                                                          "s|z", &file_in, &name_len, &oid) == SUCCESS) {                                                                          "p|z", &file_in, &name_len, &oid) == SUCCESS) {
                 id = PGG(default_link);                  id = PGG(default_link);
                 CHECK_DEFAULT_LINK(id);                  CHECK_DEFAULT_LINK(id);
         }          }
         /* old calling convention, deprecated since PHP 4.2 */          /* old calling convention, deprecated since PHP 4.2 */
         else if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, argc TSRMLS_CC,          else if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, argc TSRMLS_CC,
                                                                          "sr", &file_in, &name_len, &pgsql_link ) == SUCCESS) {                                                                          "pr", &file_in, &name_len, &pgsql_link ) == SUCCESS) {
                 php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Old API is used");                  php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Old API is used");
         }          }
         else {          else {
                 WRONG_PARAM_COUNT;                  WRONG_PARAM_COUNT;
         }          }
   
         if (strlen(file_in) != name_len) {  
                 RETURN_FALSE;  
         }  
   
         if (PG(safe_mode) &&(!php_checkuid(file_in, NULL, CHECKUID_CHECK_FILE_AND_DIR))) {  
                 RETURN_FALSE;  
         }  
                   
         if (php_check_open_basedir(file_in TSRMLS_CC)) {          if (php_check_open_basedir(file_in TSRMLS_CC)) {
                 RETURN_FALSE;                  RETURN_FALSE;
Line 3424  PHP_FUNCTION(pg_lo_export) Line 3431  PHP_FUNCTION(pg_lo_export)
   
         /* allow string to handle large OID value correctly */          /* allow string to handle large OID value correctly */
         if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, argc TSRMLS_CC,          if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, argc TSRMLS_CC,
                                                                 "rls", &pgsql_link, &oid_long, &file_out, &name_len) == SUCCESS) {                                                                 "rlp", &pgsql_link, &oid_long, &file_out, &name_len) == SUCCESS) {
                 if (oid_long <= InvalidOid) {                  if (oid_long <= InvalidOid) {
                         php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Invalid OID specified");                          php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Invalid OID specified");
                         RETURN_FALSE;                          RETURN_FALSE;
Line 3441  PHP_FUNCTION(pg_lo_export) Line 3448  PHP_FUNCTION(pg_lo_export)
                 }                  }
         }          }
         else if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, argc TSRMLS_CC,          else if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, argc TSRMLS_CC,
                                                                          "ls",  &oid_long, &file_out, &name_len) == SUCCESS) {                                                                          "lp",  &oid_long, &file_out, &name_len) == SUCCESS) {
                 if (oid_long <= InvalidOid) {                  if (oid_long <= InvalidOid) {
                         php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Invalid OID specified");                          php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Invalid OID specified");
                         RETURN_FALSE;                          RETURN_FALSE;
Line 3451  PHP_FUNCTION(pg_lo_export) Line 3458  PHP_FUNCTION(pg_lo_export)
                 CHECK_DEFAULT_LINK(id);                  CHECK_DEFAULT_LINK(id);
         }          }
         else if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, argc TSRMLS_CC,          else if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, argc TSRMLS_CC,
                                                                 "ss", &oid_string, &oid_strlen, &file_out, &name_len) == SUCCESS) {                                                                 "sp", &oid_string, &oid_strlen, &file_out, &name_len) == SUCCESS) {
                 oid = (Oid)strtoul(oid_string, &end_ptr, 10);                  oid = (Oid)strtoul(oid_string, &end_ptr, 10);
                 if ((oid_string+oid_strlen) != end_ptr) {                  if ((oid_string+oid_strlen) != end_ptr) {
                         /* wrong integer format */                          /* wrong integer format */
Line 3462  PHP_FUNCTION(pg_lo_export) Line 3469  PHP_FUNCTION(pg_lo_export)
                 CHECK_DEFAULT_LINK(id);                  CHECK_DEFAULT_LINK(id);
         }          }
         else if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, argc TSRMLS_CC,          else if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, argc TSRMLS_CC,
                                                                 "ssr", &oid_string, &oid_strlen, &file_out, &name_len, &pgsql_link) == SUCCESS) {                                                                 "spr", &oid_string, &oid_strlen, &file_out, &name_len, &pgsql_link) == SUCCESS) {
                 oid = (Oid)strtoul(oid_string, &end_ptr, 10);                  oid = (Oid)strtoul(oid_string, &end_ptr, 10);
                 if ((oid_string+oid_strlen) != end_ptr) {                  if ((oid_string+oid_strlen) != end_ptr) {
                         /* wrong integer format */                          /* wrong integer format */
Line 3471  PHP_FUNCTION(pg_lo_export) Line 3478  PHP_FUNCTION(pg_lo_export)
                 }                  }
         }          }
         else if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, argc TSRMLS_CC,          else if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, argc TSRMLS_CC,
                                                                          "lsr", &oid_long, &file_out, &name_len, &pgsql_link) == SUCCESS) {                                                                          "lpr", &oid_long, &file_out, &name_len, &pgsql_link) == SUCCESS) {
                 php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Old API is used");                  php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Old API is used");
                 if (oid_long <= InvalidOid) {                  if (oid_long <= InvalidOid) {
                         php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Invalid OID specified");                          php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Invalid OID specified");
Line 3483  PHP_FUNCTION(pg_lo_export) Line 3490  PHP_FUNCTION(pg_lo_export)
                 php_error_docref(NULL TSRMLS_CC, E_WARNING, "Requires 2 or 3 arguments");                  php_error_docref(NULL TSRMLS_CC, E_WARNING, "Requires 2 or 3 arguments");
                 RETURN_FALSE;                  RETURN_FALSE;
         }          }
   
         if (strlen(file_out) != name_len) {  
                 RETURN_FALSE;  
         }  
   
         if (PG(safe_mode) &&(!php_checkuid(file_out, NULL, CHECKUID_CHECK_FILE_AND_DIR))) {  
                 RETURN_FALSE;  
         }  
                   
         if (php_check_open_basedir(file_out TSRMLS_CC)) {          if (php_check_open_basedir(file_out TSRMLS_CC)) {
                 RETURN_FALSE;                  RETURN_FALSE;
Line 4220  PHP_FUNCTION(pg_unescape_bytea) Line 4219  PHP_FUNCTION(pg_unescape_bytea)
 /* }}} */  /* }}} */
 #endif  #endif
   
   #ifdef HAVE_PQESCAPE
   #if !HAVE_PQESCAPELITERAL
   /* emulate libpq's PQescapeInternal() 9.0 or later */
   static char* php_pgsql_PQescapeInternal(PGconn *conn, const char *str, size_t len, int escape_literal) {
           char *result, *rp;
           const char *s;
           size_t tmp_len;
           int input_len = len;
           char quote_char = escape_literal ? '\'' : '"';
   
           if (!conn) {
                   return NULL;
           }
   
           /*
            * NOTE: multibyte strings that could cointain slashes should be considered.
            * (e.g. SJIS, BIG5) However, it cannot be done without valid PGconn and mbstring. 
            * Therefore, this function does not support such encodings currently.
            * FIXME: add encoding check and skip multibyte char bytes if there is vaild PGconn.
            */
   
           /* allocate enough memory */
           rp = result = (char *)emalloc(len*2 + 5); /* leading " E" needs extra 2 bytes + quote_chars on both end for 2 bytes + NULL */
   
           if (escape_literal) {
                   /* check backslashes */
                   tmp_len = strspn(str, "\\");
                   if (tmp_len != len) {
                           /* add " E" for escaping slashes */
                           *rp++ = ' ';
                           *rp++ = 'E';
                   }
           }
           /* open quote */
           *rp++ = quote_char;
           for (s = str; s - str < input_len; ++s) {
                   if (*s == quote_char || (escape_literal && *s == '\\')) {
                           *rp++ = *s;
                           *rp++ = *s;
                   } else {
                           *rp++ = *s;
                   }
           }
           *rp++ = quote_char;
           *rp = '\0';
           
           return result;
   }
   #endif
   
   static void php_pgsql_escape_internal(INTERNAL_FUNCTION_PARAMETERS, int escape_literal) {
           char *from = NULL, *to = NULL, *tmp = NULL;
           zval *pgsql_link = NULL;
           PGconn *pgsql;
           int to_len;
           int from_len;
           int id = -1;
   
           switch (ZEND_NUM_ARGS()) {
                   case 1:
                           if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &from, &from_len) == FAILURE) {
                                   return;
                           }
                           pgsql_link = NULL;
                           id = PGG(default_link);
                           break;
   
                   default:
                           if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &pgsql_link, &from, &from_len) == FAILURE) {
                                   return;
                           }
                           break;
           }
   
           if (pgsql_link == NULL && id == -1) {
                   RETURN_FALSE;
           }
   
           ZEND_FETCH_RESOURCE2(pgsql, PGconn *, &pgsql_link, id, "PostgreSQL link", le_link, le_plink);
           if (pgsql == NULL) {
                   php_error_docref(NULL TSRMLS_CC, E_WARNING,"Cannot get default pgsql link");
                   RETURN_FALSE;
           }
   #ifdef HAVE_PQESCAPELITERAL
           if (escape_literal) {
                   tmp = PQescapeLiteral(pgsql, from, (size_t)from_len);
           } else {
                   tmp = PQescapeIdentifier(pgsql, from, (size_t)from_len);
           }
           if (!tmp) {
                   php_error_docref(NULL TSRMLS_CC, E_WARNING,"Failed to escape");
                   RETURN_FALSE;
           }
           to = estrdup(tmp);
           PQfreemem(tmp);
   #else 
           to = php_pgsql_PQescapeInternal(pgsql, from, (size_t)from_len, escape_literal);
           if (!to) {
                   php_error_docref(NULL TSRMLS_CC, E_WARNING,"Failed to escape");
                   RETURN_FALSE;
           }
   #endif
   
           RETURN_STRING(to, 0);
   }
   
   /* {{{ proto string pg_escape_literal([resource connection,] string data)
      Escape parameter as string literal (i.e. parameter)  */
   PHP_FUNCTION(pg_escape_literal)
   {
           php_pgsql_escape_internal(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1);
   }
   /* }}} */
   
   /* {{{ proto string pg_escape_identifier([resource connection,] string data)
      Escape identifier (i.e. table name, field name)      */
   PHP_FUNCTION(pg_escape_identifier)
   {
           php_pgsql_escape_internal(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0);
   }
   /* }}} */
   #endif
   
   
 /* {{{ proto string pg_result_error(resource result)  /* {{{ proto string pg_result_error(resource result)
    Get error message associated with result */     Get error message associated with result */
 PHP_FUNCTION(pg_result_error)  PHP_FUNCTION(pg_result_error)
Line 4807  PHP_FUNCTION(pg_get_notify) Line 4930  PHP_FUNCTION(pg_get_notify)
 #else   #else 
                 if (atof(PG_VERSION) >= 9.0) {                  if (atof(PG_VERSION) >= 9.0) {
 #endif   #endif 
   #if HAVE_PQPARAMETERSTATUS
                         add_index_string(return_value, 2, pgsql_notify->extra, 1);                          add_index_string(return_value, 2, pgsql_notify->extra, 1);
   #endif
                 }                  }
         }          }
         if (result_type & PGSQL_ASSOC) {          if (result_type & PGSQL_ASSOC) {
Line 4818  PHP_FUNCTION(pg_get_notify) Line 4943  PHP_FUNCTION(pg_get_notify)
 #else   #else 
                 if (atof(PG_VERSION) >= 9.0) {                  if (atof(PG_VERSION) >= 9.0) {
 #endif   #endif 
   #if HAVE_PQPARAMETERSTATUS
                         add_assoc_string(return_value, "payload", pgsql_notify->extra, 1);                          add_assoc_string(return_value, "payload", pgsql_notify->extra, 1);
   #endif
                 }                  }
         }          }
         PQfreemem(pgsql_notify);          PQfreemem(pgsql_notify);
Line 4871  PHP_PGSQL_API int php_pgsql_meta_data(PGconn *pg_link, Line 4998  PHP_PGSQL_API int php_pgsql_meta_data(PGconn *pg_link,
         }          }
   
         smart_str_appends(&querystr,           smart_str_appends(&querystr, 
                        "SELECT a.attname, a.attnum, t.typname, a.attlen, a.attnotNULL, a.atthasdef, a.attndims "                        "SELECT a.attname, a.attnum, t.typname, a.attlen, a.attnotnull, a.atthasdef, a.attndims, t.typtype = 'e' "
                         "FROM pg_class as c, pg_attribute a, pg_type t, pg_namespace n "                          "FROM pg_class as c, pg_attribute a, pg_type t, pg_namespace n "
                         "WHERE a.attnum > 0 AND a.attrelid = c.oid AND c.relname = '");                          "WHERE a.attnum > 0 AND a.attrelid = c.oid AND c.relname = '");
         tmp_name2 = php_addslashes(tmp_name2, strlen(tmp_name2), &new_len, 0 TSRMLS_CC);          tmp_name2 = php_addslashes(tmp_name2, strlen(tmp_name2), &new_len, 0 TSRMLS_CC);
Line 4917  PHP_PGSQL_API int php_pgsql_meta_data(PGconn *pg_link, Line 5044  PHP_PGSQL_API int php_pgsql_meta_data(PGconn *pg_link,
                         add_assoc_bool(elem, "has default", 0);                          add_assoc_bool(elem, "has default", 0);
                 }                  }
                 add_assoc_long(elem, "array dims", atoi(PQgetvalue(pg_result,i,6)));                  add_assoc_long(elem, "array dims", atoi(PQgetvalue(pg_result,i,6)));
                   if (!strcmp(PQgetvalue(pg_result,i,7), "t")) {
                           add_assoc_bool(elem, "is enum", 1);
                   }
                   else {
                           add_assoc_bool(elem, "is enum", 0);
                   }
                 name = PQgetvalue(pg_result,i,0);                  name = PQgetvalue(pg_result,i,0);
                 add_assoc_zval(meta, name, elem);                  add_assoc_zval(meta, name, elem);
         }          }
Line 4950  PHP_FUNCTION(pg_meta_data) Line 5083  PHP_FUNCTION(pg_meta_data)
                 zval_dtor(return_value); /* destroy array */                  zval_dtor(return_value); /* destroy array */
                 RETURN_FALSE;                  RETURN_FALSE;
         }          }
        else {
                 HashPosition pos;
                 zval **val;
 
                 for (zend_hash_internal_pointer_reset_ex(Z_ARRVAL_P(return_value), &pos);
                         zend_hash_get_current_data_ex(Z_ARRVAL_P(return_value), (void **)&val, &pos) == SUCCESS;
                         zend_hash_move_forward_ex(Z_ARRVAL_P(return_value), &pos)) {
                         /* delete newly added entry, in order to keep BC */
                         zend_hash_del_key_or_index(Z_ARRVAL_PP(val), "is enum", sizeof("is enum"), 0, HASH_DEL_KEY);
                 }
         }
 }
 /* }}} */  /* }}} */
   
 /* {{{ php_pgsql_get_data_type  /* {{{ php_pgsql_get_data_type
Line 5132  PHP_PGSQL_API int php_pgsql_convert(PGconn *pg_link, c Line 5276  PHP_PGSQL_API int php_pgsql_convert(PGconn *pg_link, c
         char *field = NULL;          char *field = NULL;
         uint field_len = -1;          uint field_len = -1;
         ulong num_idx = -1;          ulong num_idx = -1;
        zval *meta, **def, **type, **not_null, **has_default, **val, *new_val;        zval *meta, **def, **type, **not_null, **has_default, **is_enum, **val, *new_val;
         int new_len, key_type, err = 0, skip_field;          int new_len, key_type, err = 0, skip_field;
           php_pgsql_data_type data_type;
                   
         assert(pg_link != NULL);          assert(pg_link != NULL);
         assert(Z_TYPE_P(values) == IS_ARRAY);          assert(Z_TYPE_P(values) == IS_ARRAY);
Line 5184  PHP_PGSQL_API int php_pgsql_convert(PGconn *pg_link, c Line 5329  PHP_PGSQL_API int php_pgsql_convert(PGconn *pg_link, c
                         php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Detected broken meta data. Missing 'has default'");                          php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Detected broken meta data. Missing 'has default'");
                         err = 1;                          err = 1;
                 }                  }
                   if (!err && zend_hash_find(Z_ARRVAL_PP(def), "is enum", sizeof("is enum"), (void **)&is_enum) == FAILURE) {
                           php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Detected broken meta data. Missing 'is enum'");
                           err = 1;
                   }
                 if (!err && (Z_TYPE_PP(val) == IS_ARRAY ||                  if (!err && (Z_TYPE_PP(val) == IS_ARRAY ||
                          Z_TYPE_PP(val) == IS_OBJECT ||                           Z_TYPE_PP(val) == IS_OBJECT ||
                          Z_TYPE_PP(val) == IS_CONSTANT_ARRAY)) {                           Z_TYPE_PP(val) == IS_CONSTANT_ARRAY)) {
                        php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Expects scaler values as field values");                        php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Expects scalar values as field values");
                         err = 1;                          err = 1;
                 }                  }
                 if (err) {                  if (err) {
                         break; /* break out for() */                          break; /* break out for() */
                 }                  }
                 ALLOC_INIT_ZVAL(new_val);                  ALLOC_INIT_ZVAL(new_val);
                switch(php_pgsql_get_data_type(Z_STRVAL_PP(type), Z_STRLEN_PP(type)))
                 if (Z_BVAL_PP(is_enum)) {
                         /* enums need to be treated like strings */
                         data_type = PG_TEXT;
                 }
                 else {
                         data_type = php_pgsql_get_data_type(Z_STRVAL_PP(type), Z_STRLEN_PP(type));
                 }
 
                 switch(data_type)
                 {                  {
                         case PG_BOOL:                          case PG_BOOL:
                                 switch (Z_TYPE_PP(val)) {                                  switch (Z_TYPE_PP(val)) {
Line 6233  PHP_PGSQL_API int php_pgsql_result2array(PGresult *pg_ Line 6391  PHP_PGSQL_API int php_pgsql_result2array(PGresult *pg_
                                         size_t data_len;                                          size_t data_len;
                                         const size_t element_len = strlen(element);                                          const size_t element_len = strlen(element);
   
                                        if (PG(magic_quotes_runtime)) {                                        data = safe_estrndup(element, element_len);
                                                data = php_addslashes(element, element_len, &data_len, 0 TSRMLS_CC);                                        data_len = element_len;
                                        } else {                                        
                                                data = safe_estrndup(element, element_len); 
                                                data_len = element_len; 
                                        } 
                                         field_name = PQfname(pg_result, i);                                          field_name = PQfname(pg_result, i);
                                         add_assoc_stringl(row, field_name, data, data_len, 0);                                          add_assoc_stringl(row, field_name, data, data_len, 0);
                                 }                                  }

Removed from v.1.1  
changed lines
  Added in v.1.1.1.3


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>