PHP  
 PHP: Test and Code Coverage Analysis
downloads | QA | documentation | faq | getting help | mailing lists | reporting bugs | php.net sites | links | my php.net 
 

LTP GCOV extension - code coverage report
Current view: directory - mysqli - mysqli.c
Test: PHP Code Coverage
Date: 2009-11-19 Instrumented lines: 534
Code covered: 84.6 % Executed lines: 452
Legend: not executed executed

       1                 : /*
       2                 :   +----------------------------------------------------------------------+
       3                 :   | PHP Version 5                                                        |
       4                 :   +----------------------------------------------------------------------+
       5                 :   | Copyright (c) 1997-2009 The PHP Group                                |
       6                 :   +----------------------------------------------------------------------+
       7                 :   | This source file is subject to version 3.01 of the PHP license,      |
       8                 :   | that is bundled with this package in the file LICENSE, and is        |
       9                 :   | available through the world-wide-web at the following url:           |
      10                 :   | http://www.php.net/license/3_01.txt                                  |
      11                 :   | If you did not receive a copy of the PHP license and are unable to   |
      12                 :   | obtain it through the world-wide-web, please send a note to          |
      13                 :   | license@php.net so we can mail you a copy immediately.               |
      14                 :   +----------------------------------------------------------------------+
      15                 :   | Author: Georg Richter <georg@php.net>                                |
      16                 :   +----------------------------------------------------------------------+
      17                 : 
      18                 :   $Id: mysqli.c 290573 2009-11-12 08:20:57Z rasmus $ 
      19                 : */
      20                 : 
      21                 : #ifdef HAVE_CONFIG_H
      22                 : #include "config.h"
      23                 : #endif
      24                 : 
      25                 : #include <signal.h>
      26                 : 
      27                 : #include "php.h"
      28                 : #include "php_ini.h"
      29                 : #include "ext/standard/info.h"
      30                 : #include "ext/standard/php_string.h"
      31                 : #include "php_mysqli.h"
      32                 : #include "zend_exceptions.h"
      33                 : 
      34                 : #define MYSQLI_STORE_RESULT 0
      35                 : #define MYSQLI_USE_RESULT 1
      36                 : 
      37                 : ZEND_DECLARE_MODULE_GLOBALS(mysqli)
      38                 : static PHP_GINIT_FUNCTION(mysqli);
      39                 : 
      40                 : static zend_object_handlers mysqli_object_handlers;
      41                 : static HashTable classes;
      42                 : static HashTable mysqli_driver_properties;
      43                 : static HashTable mysqli_link_properties;
      44                 : static HashTable mysqli_result_properties;
      45                 : static HashTable mysqli_stmt_properties;
      46                 : static HashTable mysqli_warning_properties;
      47                 : 
      48                 : zend_class_entry *mysqli_link_class_entry;
      49                 : zend_class_entry *mysqli_stmt_class_entry;
      50                 : zend_class_entry *mysqli_result_class_entry;
      51                 : zend_class_entry *mysqli_driver_class_entry;
      52                 : zend_class_entry *mysqli_warning_class_entry;
      53                 : zend_class_entry *mysqli_exception_class_entry;
      54                 : 
      55                 : extern void php_mysqli_connect(INTERNAL_FUNCTION_PARAMETERS);
      56                 : 
      57                 : typedef int (*mysqli_read_t)(mysqli_object *obj, zval **retval TSRMLS_DC);
      58                 : typedef int (*mysqli_write_t)(mysqli_object *obj, zval *newval TSRMLS_DC);
      59                 : 
      60                 : typedef struct _mysqli_prop_handler {
      61                 :         mysqli_read_t read_func;
      62                 :         mysqli_write_t write_func;
      63                 : } mysqli_prop_handler;
      64                 : 
      65                 : /* {{{ php_free_stmt_bind_buffer */
      66                 : void php_free_stmt_bind_buffer(BIND_BUFFER bbuf, int type)
      67             126 : {
      68                 :         unsigned int i;
      69                 : 
      70             126 :         if (!bbuf.var_cnt) {
      71              70 :                 return;
      72                 :         }
      73                 : 
      74            1275 :         for (i=0; i < bbuf.var_cnt; i++) {
      75                 : 
      76                 :                 /* free temporary bind buffer */
      77            1219 :                 if (type == FETCH_RESULT && bbuf.buf[i].val) {
      78            1163 :                         efree(bbuf.buf[i].val);
      79                 :                 }
      80                 : 
      81            1219 :                 if (bbuf.vars[i]) {
      82            1218 :                         zval_ptr_dtor(&bbuf.vars[i]);
      83                 :                 }       
      84                 :         }
      85                 : 
      86              56 :         if (bbuf.vars) {
      87              56 :                 efree(bbuf.vars);
      88                 :         }
      89                 : 
      90                 :         /*
      91                 :           Don't free bbuf.is_null for FETCH_RESULT since we have allocated
      92                 :           is_null and buf in one block so we free only buf, which is the beginning
      93                 :           of the block. When FETCH_SIMPLE then buf wasn't allocated together with
      94                 :           buf and we have to free it.
      95                 :         */
      96              56 :         if (type == FETCH_RESULT) {
      97              42 :                 efree(bbuf.buf);
      98              14 :         } else if (type == FETCH_SIMPLE){
      99              14 :                 efree(bbuf.is_null);
     100                 :         }
     101                 : 
     102              56 :         bbuf.var_cnt = 0;
     103              56 :         return;
     104                 : }
     105                 : /* }}} */
     106                 : 
     107                 : /* {{{ php_clear_stmt_bind */
     108                 : void php_clear_stmt_bind(MY_STMT *stmt)
     109              62 : {
     110              62 :         if (stmt->stmt) {
     111               6 :                 mysql_stmt_close(stmt->stmt);
     112                 :         }
     113                 : 
     114              62 :         php_free_stmt_bind_buffer(stmt->param, FETCH_SIMPLE);
     115              62 :         php_free_stmt_bind_buffer(stmt->result, FETCH_RESULT);
     116                 : 
     117              62 :         if (stmt->query) {
     118               0 :                 efree(stmt->query);
     119                 :         }
     120              62 :         efree(stmt);
     121                 :         return;
     122                 : }
     123                 : /* }}} */
     124                 : 
     125                 : /* {{{ php_clear_mysql */
     126             197 : void php_clear_mysql(MY_MYSQL *mysql) {
     127             197 :         if (mysql->li_read) {
     128               1 :                 zval_ptr_dtor(&(mysql->li_read));
     129               1 :                 mysql->li_read = NULL;
     130                 :         }
     131             197 : }
     132                 : /* }}} */
     133                 : 
     134                 : /* {{{ mysqli_objects_free_storage
     135                 :  */
     136                 : static void mysqli_objects_free_storage(void *object TSRMLS_DC)
     137             592 : {
     138             592 :         zend_object *zo = (zend_object *)object;
     139             592 :         mysqli_object   *intern = (mysqli_object *)zo;
     140             592 :         MYSQLI_RESOURCE *my_res = (MYSQLI_RESOURCE *)intern->ptr;
     141                 : 
     142             592 :         my_efree(my_res);       
     143             592 :         zend_object_std_dtor(&intern->zo TSRMLS_CC);
     144             592 :         efree(intern);
     145             592 : }
     146                 : /* }}} */
     147                 : 
     148                 : /* {{{ mysqli_link_free_storage
     149                 :  */
     150                 : static void mysqli_link_free_storage(void *object TSRMLS_DC)
     151             200 : {
     152             200 :         zend_object *zo = (zend_object *)object;
     153             200 :         mysqli_object   *intern = (mysqli_object *)zo;
     154             200 :         MYSQLI_RESOURCE *my_res = (MYSQLI_RESOURCE *)intern->ptr;
     155                 : 
     156             200 :         if (my_res && my_res->ptr) {
     157             104 :                 MY_MYSQL *mysql = (MY_MYSQL *)my_res->ptr;
     158             104 :                 if (mysql->mysql) {
     159             104 :                         mysql_close(mysql->mysql);
     160                 :                 }
     161             104 :                 php_clear_mysql(mysql);
     162             104 :                 efree(mysql);
     163                 :         }
     164             200 :         mysqli_objects_free_storage(object TSRMLS_CC);
     165             200 : }
     166                 : /* }}} */
     167                 : 
     168                 : /* {{{ mysqli_stmt_free_storage
     169                 :  */
     170                 : static void mysqli_stmt_free_storage(void *object TSRMLS_DC)
     171              62 : {
     172              62 :         zend_object *zo = (zend_object *)object;
     173              62 :         mysqli_object   *intern = (mysqli_object *)zo;
     174              62 :         MYSQLI_RESOURCE *my_res = (MYSQLI_RESOURCE *)intern->ptr;
     175                 : 
     176              62 :         if (my_res && my_res->ptr) {
     177               6 :                 MY_STMT *stmt = (MY_STMT *)my_res->ptr;
     178               6 :                 php_clear_stmt_bind(stmt);
     179                 :         }
     180              62 :         mysqli_objects_free_storage(object TSRMLS_CC);
     181              62 : }
     182                 : /* }}} */
     183                 : 
     184                 : /* {{{ mysqli_result_free_storage
     185                 :  */
     186                 : static void mysqli_result_free_storage(void *object TSRMLS_DC)
     187              37 : {
     188              37 :         zend_object *zo = (zend_object *)object;
     189              37 :         mysqli_object   *intern = (mysqli_object *)zo;
     190              37 :         MYSQLI_RESOURCE *my_res = (MYSQLI_RESOURCE *)intern->ptr;
     191                 : 
     192              37 :         if (my_res && my_res->ptr) {
     193               4 :                 mysql_free_result(my_res->ptr);
     194                 :         }
     195              37 :         mysqli_objects_free_storage(object TSRMLS_CC);
     196              37 : }
     197                 : /* }}} */
     198                 : 
     199                 : /* {{{ mysqli_warning_free_storage
     200                 :  */
     201                 : static void mysqli_warning_free_storage(void *object TSRMLS_DC)
     202               2 : {
     203               2 :         zend_object *zo = (zend_object *)object;
     204               2 :         mysqli_object   *intern = (mysqli_object *)zo;
     205               2 :         MYSQLI_RESOURCE *my_res = (MYSQLI_RESOURCE *)intern->ptr;
     206                 : 
     207               2 :         if (my_res && my_res->ptr) {
     208               2 :                 php_clear_warnings((MYSQLI_WARNING *)my_res->info);
     209               2 :                 my_res->ptr = NULL;
     210                 :         }
     211               2 :         mysqli_objects_free_storage(object TSRMLS_CC);
     212               2 : }
     213                 : /* }}} */
     214                 : 
     215                 : /* {{{ mysqli_read_na */
     216                 : static int mysqli_read_na(mysqli_object *obj, zval **retval TSRMLS_DC)
     217               0 : {
     218               0 :         *retval = NULL;
     219               0 :         php_error_docref(NULL TSRMLS_CC, E_ERROR, "Cannot read property");
     220               0 :         return FAILURE;
     221                 : }
     222                 : /* }}} */
     223                 : 
     224                 : /* {{{ mysqli_write_na */
     225                 : static int mysqli_write_na(mysqli_object *obj, zval *newval TSRMLS_DC)
     226               0 : {
     227               0 :         php_error_docref(NULL TSRMLS_CC, E_ERROR, "Cannot write property");
     228               0 :         return FAILURE;
     229                 : }
     230                 : /* }}} */
     231                 : 
     232                 : /* {{{ mysqli_read_property */
     233                 : zval *mysqli_read_property(zval *object, zval *member, int type TSRMLS_DC)
     234             318 : {
     235                 :         zval tmp_member;
     236                 :         zval *retval;
     237                 :         mysqli_object *obj;
     238                 :         mysqli_prop_handler *hnd;
     239                 :         zend_object_handlers *std_hnd;
     240                 :         int ret;
     241                 : 
     242             318 :         ret = FAILURE;
     243             318 :         obj = (mysqli_object *)zend_objects_get_address(object TSRMLS_CC);
     244                 : 
     245             318 :         if (member->type != IS_STRING) {
     246               0 :                 tmp_member = *member;
     247               0 :                 zval_copy_ctor(&tmp_member);
     248               0 :                 convert_to_string(&tmp_member);
     249               0 :                 member = &tmp_member;
     250                 :         }
     251                 : 
     252             318 :         if (obj->prop_handler != NULL) {
     253             318 :                 ret = zend_hash_find(obj->prop_handler, Z_STRVAL_P(member), Z_STRLEN_P(member)+1, (void **) &hnd);
     254                 :         }
     255                 : 
     256             318 :         if (ret == SUCCESS) {
     257             316 :                 ret = hnd->read_func(obj, &retval TSRMLS_CC);
     258             316 :                 if (ret == SUCCESS) {
     259                 :                         /* ensure we're creating a temporary variable */
     260             316 :                         retval->refcount = 0;
     261                 :                 } else {
     262               0 :                         retval = EG(uninitialized_zval_ptr);
     263                 :                 }
     264                 :         } else {
     265               2 :                 std_hnd = zend_get_std_object_handlers();
     266               2 :                 retval = std_hnd->read_property(object, member, type TSRMLS_CC);
     267                 :         }
     268                 : 
     269             318 :         if (member == &tmp_member) {
     270               0 :                 zval_dtor(member);
     271                 :         }
     272             318 :         return(retval);
     273                 : }
     274                 : /* }}} */
     275                 : 
     276                 : /* {{{ mysqli_write_property */
     277                 : void mysqli_write_property(zval *object, zval *member, zval *value TSRMLS_DC)
     278               0 : {
     279                 :         zval tmp_member;
     280                 :         mysqli_object *obj;
     281                 :         mysqli_prop_handler *hnd;
     282                 :         zend_object_handlers *std_hnd;
     283                 :         int ret;
     284                 : 
     285               0 :         if (member->type != IS_STRING) {
     286               0 :                 tmp_member = *member;
     287               0 :                 zval_copy_ctor(&tmp_member);
     288               0 :                 convert_to_string(&tmp_member);
     289               0 :                 member = &tmp_member;
     290                 :         }
     291                 : 
     292               0 :         ret = FAILURE;
     293               0 :         obj = (mysqli_object *)zend_objects_get_address(object TSRMLS_CC);
     294                 : 
     295               0 :         if (obj->prop_handler != NULL) {
     296               0 :                 ret = zend_hash_find((HashTable *)obj->prop_handler, Z_STRVAL_P(member), Z_STRLEN_P(member)+1, (void **) &hnd);
     297                 :         }
     298               0 :         if (ret == SUCCESS) {
     299               0 :                 hnd->write_func(obj, value TSRMLS_CC);
     300               0 :                 if (! PZVAL_IS_REF(value) && value->refcount == 0) {
     301               0 :                         value->refcount++;
     302               0 :                         zval_ptr_dtor(&value);
     303                 :                 }
     304                 :         } else {
     305               0 :                 std_hnd = zend_get_std_object_handlers();
     306               0 :                 std_hnd->write_property(object, member, value TSRMLS_CC);
     307                 :         }
     308                 : 
     309               0 :         if (member == &tmp_member) {
     310               0 :                 zval_dtor(member);
     311                 :         }
     312               0 : }
     313                 : /* }}} */
     314                 : 
     315                 : /* {{{ void mysqli_add_property(HashTable *h, char *pname, mysqli_read_t r_func, mysqli_write_t w_func TSRMLS_DC) */
     316          542600 : void mysqli_add_property(HashTable *h, char *pname, mysqli_read_t r_func, mysqli_write_t w_func TSRMLS_DC) {
     317                 :         mysqli_prop_handler             p;
     318                 : 
     319          542600 :         p.read_func = (r_func) ? r_func : mysqli_read_na; 
     320          542600 :         p.write_func = (w_func) ? w_func : mysqli_write_na;
     321                 : 
     322          542600 :         zend_hash_add(h, pname, strlen(pname) + 1, &p, sizeof(mysqli_prop_handler), NULL);
     323          542600 : }
     324                 : /* }}} */
     325                 : 
     326                 : static union _zend_function *php_mysqli_constructor_get(zval *object TSRMLS_DC)
     327             327 : {
     328             327 :         mysqli_object *obj = (mysqli_object *)zend_objects_get_address(object TSRMLS_CC);
     329             327 :         zend_class_entry * ce = Z_OBJCE_P(object);
     330                 : 
     331             327 :         if (ce != mysqli_link_class_entry && ce != mysqli_stmt_class_entry &&
     332                 :                 ce != mysqli_result_class_entry && ce != mysqli_driver_class_entry && 
     333                 :                 ce != mysqli_warning_class_entry) {
     334              12 :                 return zend_std_get_constructor(object TSRMLS_CC);
     335                 :         } else {
     336                 :                 static zend_internal_function f;
     337                 : 
     338             315 :                 f.function_name = obj->zo.ce->name;
     339             315 :                 f.scope = obj->zo.ce;
     340             315 :                 f.arg_info = NULL;
     341             315 :                 f.num_args = 0;
     342             315 :                 f.fn_flags = 0;
     343                 : 
     344             315 :                 f.type = ZEND_INTERNAL_FUNCTION;
     345             315 :                 if (obj->zo.ce == mysqli_link_class_entry) {
     346              20 :                         f.handler = ZEND_FN(mysqli_connect);
     347             295 :                 } else if (obj->zo.ce == mysqli_stmt_class_entry) {
     348               2 :                         f.handler = ZEND_FN(mysqli_stmt_construct);
     349             293 :                 } else if (obj->zo.ce == mysqli_result_class_entry) {
     350               1 :                         f.handler = ZEND_FN(mysqli_result_construct);
     351             292 :                 } else if (obj->zo.ce == mysqli_driver_class_entry) {
     352             291 :                         f.handler = ZEND_FN(mysqli_driver_construct);
     353               1 :                 } else if (obj->zo.ce == mysqli_warning_class_entry) {
     354               1 :                         f.handler = ZEND_MN(mysqli_warning___construct);
     355                 :                 }
     356                 :         
     357             315 :                 return (union _zend_function*)&f;
     358                 :         }
     359                 : }
     360                 : 
     361                 : /* {{{ mysqli_objects_new
     362                 :  */
     363                 : PHP_MYSQLI_EXPORT(zend_object_value) mysqli_objects_new(zend_class_entry *class_type TSRMLS_DC)
     364             592 : {
     365                 :         zend_object_value retval;
     366                 :         mysqli_object *intern;
     367                 :         zval *tmp;
     368                 :         zend_class_entry *mysqli_base_class;
     369                 :         zend_objects_free_object_storage_t free_storage;
     370                 : 
     371             592 :         intern = emalloc(sizeof(mysqli_object));
     372             592 :         memset(intern, 0, sizeof(mysqli_object));
     373             592 :         intern->ptr = NULL;
     374             592 :         intern->prop_handler = NULL;
     375                 : 
     376             592 :         mysqli_base_class = class_type;
     377            1197 :         while (mysqli_base_class->type != ZEND_INTERNAL_CLASS && mysqli_base_class->parent != NULL)
     378                 :         {
     379              13 :                 mysqli_base_class = mysqli_base_class->parent;
     380                 :         }
     381             592 :         zend_hash_find(&classes, mysqli_base_class->name, mysqli_base_class->name_length + 1, 
     382                 :                                         (void **) &intern->prop_handler);
     383                 : 
     384             592 :         zend_object_std_init(&intern->zo, class_type TSRMLS_CC);
     385             592 :         zend_hash_copy(intern->zo.properties, &class_type->default_properties, (copy_ctor_func_t) zval_add_ref,
     386                 :                                         (void *) &tmp, sizeof(zval *));
     387                 : 
     388                 :         /* link object */
     389             592 :         if (instanceof_function(class_type, mysqli_link_class_entry TSRMLS_CC)) {
     390             200 :                 free_storage = mysqli_link_free_storage;
     391             392 :         } else if (instanceof_function(class_type, mysqli_stmt_class_entry TSRMLS_CC)) { /* stmt object */
     392              62 :                 free_storage = mysqli_stmt_free_storage;
     393             330 :         } else if (instanceof_function(class_type, mysqli_result_class_entry TSRMLS_CC)) { /* result object */
     394              37 :                 free_storage = mysqli_result_free_storage;
     395             293 :         } else if (instanceof_function(class_type, mysqli_warning_class_entry TSRMLS_CC)) { /* warning object */
     396               2 :                 free_storage = mysqli_warning_free_storage;
     397                 :         } else {
     398             291 :                 free_storage = mysqli_objects_free_storage;
     399                 :         }
     400                 : 
     401             592 :         retval.handle = zend_objects_store_put(intern, (zend_objects_store_dtor_t) zend_objects_destroy_object, free_storage, NULL TSRMLS_CC);
     402             592 :         retval.handlers = &mysqli_object_handlers;
     403                 : 
     404             592 :         return retval;
     405                 : }
     406                 : /* }}} */
     407                 :         
     408                 : /* {{{ mysqli_module_entry
     409                 :  */
     410                 : /* Dependancies */
     411                 : static zend_module_dep mysqli_deps[] = {
     412                 : #if defined(HAVE_SPL) && ((PHP_MAJOR_VERSION > 5) || (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION >= 1))
     413                 :         ZEND_MOD_REQUIRED("spl")
     414                 : #endif
     415                 :         {NULL, NULL, NULL}
     416                 : };
     417                 : 
     418                 : zend_module_entry mysqli_module_entry = {
     419                 : #if ZEND_MODULE_API_NO >= 20050922
     420                 :         STANDARD_MODULE_HEADER_EX, NULL,
     421                 :         mysqli_deps,
     422                 : #elif ZEND_MODULE_API_NO >= 20010901
     423                 :         STANDARD_MODULE_HEADER,
     424                 : #endif
     425                 :         "mysqli",
     426                 :         mysqli_functions,
     427                 :         PHP_MINIT(mysqli),
     428                 :         PHP_MSHUTDOWN(mysqli),
     429                 :         PHP_RINIT(mysqli),
     430                 :         PHP_RSHUTDOWN(mysqli),
     431                 :         PHP_MINFO(mysqli),
     432                 :         "0.1", /* Replace with version number for your extension */
     433                 :         PHP_MODULE_GLOBALS(mysqli),
     434                 :         PHP_GINIT(mysqli),
     435                 :         NULL,
     436                 :         NULL,
     437                 :         STANDARD_MODULE_PROPERTIES_EX
     438                 : };
     439                 : /* }}} */
     440                 : 
     441                 : #ifdef COMPILE_DL_MYSQLI
     442                 : ZEND_GET_MODULE(mysqli)
     443                 : #endif
     444                 : 
     445                 : /* {{{ PHP_INI_BEGIN
     446                 : */
     447                 : PHP_INI_BEGIN()
     448                 :         STD_PHP_INI_ENTRY_EX("mysqli.max_links",                      "-1", PHP_INI_SYSTEM,         OnUpdateLong,           max_links,                      zend_mysqli_globals,            mysqli_globals, display_link_numbers)
     449                 :         STD_PHP_INI_ENTRY("mysqli.default_host",                      NULL,   PHP_INI_ALL,            OnUpdateString,         default_host,           zend_mysqli_globals,            mysqli_globals)
     450                 :         STD_PHP_INI_ENTRY("mysqli.default_user",                      NULL,   PHP_INI_ALL,            OnUpdateString,         default_user,           zend_mysqli_globals,            mysqli_globals)
     451                 :         STD_PHP_INI_ENTRY("mysqli.default_pw",                                NULL,   PHP_INI_ALL,            OnUpdateString,         default_pw,                     zend_mysqli_globals,            mysqli_globals)
     452                 :         STD_PHP_INI_ENTRY("mysqli.default_port",                      "3306",       PHP_INI_ALL,            OnUpdateLong,           default_port,           zend_mysqli_globals,            mysqli_globals)
     453                 :         STD_PHP_INI_ENTRY("mysqli.default_socket",                    NULL,   PHP_INI_ALL,            OnUpdateStringUnempty,  default_socket, zend_mysqli_globals,            mysqli_globals)
     454                 :         STD_PHP_INI_BOOLEAN("mysqli.reconnect",                               "0",  PHP_INI_SYSTEM,         OnUpdateLong,           reconnect,                      zend_mysqli_globals,            mysqli_globals)
     455                 : PHP_INI_END()
     456                 : 
     457                 : /* }}} */
     458                 : 
     459                 : /* {{{ PHP_GINIT_FUNCTION
     460                 :  */
     461                 : static PHP_GINIT_FUNCTION(mysqli)
     462           13565 : {
     463           13565 :         mysqli_globals->num_links = 0;
     464           13565 :         mysqli_globals->max_links = 0;
     465           13565 :         mysqli_globals->default_port = 0;
     466           13565 :         mysqli_globals->default_host = NULL;
     467           13565 :         mysqli_globals->default_user = NULL;
     468           13565 :         mysqli_globals->default_pw = NULL;
     469           13565 :         mysqli_globals->default_socket = NULL;
     470           13565 :         mysqli_globals->reconnect = 0;
     471           13565 :         mysqli_globals->report_mode = 0;
     472           13565 :         mysqli_globals->report_ht = 0;
     473                 : #ifdef HAVE_EMBEDDED_MYSQLI
     474                 :         mysqli_globals->embedded = 1;
     475                 : #else
     476           13565 :         mysqli_globals->embedded = 0;
     477                 : #endif
     478           13565 : }
     479                 : /* }}} */
     480                 : 
     481                 : /* {{{ PHP_MINIT_FUNCTION
     482                 :  */
     483                 : PHP_MINIT_FUNCTION(mysqli)
     484           13565 : {
     485                 :         zend_class_entry *ce,cex;
     486           13565 :         zend_object_handlers *std_hnd = zend_get_std_object_handlers();
     487                 :         
     488           13565 :         REGISTER_INI_ENTRIES();
     489                 : 
     490                 : #if MYSQL_VERSION_ID >= 40000
     491           13565 :         if (mysql_server_init(0, NULL, NULL)) {
     492               0 :                 return FAILURE;
     493                 :         }
     494                 : #endif
     495                 : 
     496           13565 :         memcpy(&mysqli_object_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers));
     497           13565 :         mysqli_object_handlers.clone_obj = NULL;
     498           13565 :         mysqli_object_handlers.read_property = mysqli_read_property;
     499           13565 :         mysqli_object_handlers.write_property = mysqli_write_property;
     500           13565 :         mysqli_object_handlers.get_property_ptr_ptr = std_hnd->get_property_ptr_ptr;
     501           13565 :         mysqli_object_handlers.get_constructor = php_mysqli_constructor_get;
     502                 : 
     503           13565 :         zend_hash_init(&classes, 0, NULL, NULL, 1);
     504                 : 
     505           13565 :         INIT_CLASS_ENTRY(cex, "mysqli_sql_exception", mysqli_exception_methods);
     506                 : #ifdef HAVE_SPL
     507           13565 :         mysqli_exception_class_entry = zend_register_internal_class_ex(&cex, spl_ce_RuntimeException, NULL TSRMLS_CC);
     508                 : #else
     509                 :         mysqli_exception_class_entry = zend_register_internal_class_ex(&cex, zend_exception_get_default(TSRMLS_C), NULL TSRMLS_CC);
     510                 : #endif
     511           13565 :         mysqli_exception_class_entry->ce_flags |= ZEND_ACC_FINAL;
     512           13565 :         zend_declare_property_long(mysqli_exception_class_entry, "code", sizeof("code")-1, 0, ZEND_ACC_PROTECTED TSRMLS_CC);
     513           13565 :         zend_declare_property_string(mysqli_exception_class_entry, "sqlstate", sizeof("sqlstate")-1, "00000", ZEND_ACC_PROTECTED TSRMLS_CC);      
     514                 : 
     515           13565 :         REGISTER_MYSQLI_CLASS_ENTRY("mysqli_driver", mysqli_driver_class_entry, mysqli_driver_methods);
     516           13565 :         ce = mysqli_driver_class_entry;
     517           13565 :         zend_hash_init(&mysqli_driver_properties, 0, NULL, NULL, 1);
     518           13565 :         MYSQLI_ADD_PROPERTIES(&mysqli_driver_properties, mysqli_driver_property_entries);
     519           13565 :         zend_hash_add(&classes, ce->name, ce->name_length+1, &mysqli_driver_properties, sizeof(mysqli_driver_properties), NULL);
     520           13565 :         ce->ce_flags |= ZEND_ACC_FINAL_CLASS;
     521                 : 
     522           13565 :         REGISTER_MYSQLI_CLASS_ENTRY("mysqli", mysqli_link_class_entry, mysqli_link_methods);
     523           13565 :         ce = mysqli_link_class_entry;
     524           13565 :         zend_hash_init(&mysqli_link_properties, 0, NULL, NULL, 1);
     525           13565 :         MYSQLI_ADD_PROPERTIES(&mysqli_link_properties, mysqli_link_property_entries);
     526           13565 :         zend_hash_add(&classes, ce->name, ce->name_length+1, &mysqli_link_properties, sizeof(mysqli_link_properties), NULL);
     527                 : 
     528           13565 :         REGISTER_MYSQLI_CLASS_ENTRY("mysqli_warning", mysqli_warning_class_entry, mysqli_warning_methods);
     529           13565 :         ce = mysqli_warning_class_entry;
     530           13565 :         ce->ce_flags |= ZEND_ACC_FINAL_CLASS | ZEND_ACC_PROTECTED;
     531           13565 :         zend_hash_init(&mysqli_warning_properties, 0, NULL, NULL, 1);
     532           13565 :         MYSQLI_ADD_PROPERTIES(&mysqli_warning_properties, mysqli_warning_property_entries);
     533           13565 :         zend_hash_add(&classes, ce->name, ce->name_length+1, &mysqli_warning_properties, sizeof(mysqli_warning_properties), NULL);
     534                 : 
     535           13565 :         REGISTER_MYSQLI_CLASS_ENTRY("mysqli_result", mysqli_result_class_entry, mysqli_result_methods);
     536           13565 :         ce = mysqli_result_class_entry;
     537           13565 :         zend_hash_init(&mysqli_result_properties, 0, NULL, NULL, 1);
     538           13565 :         MYSQLI_ADD_PROPERTIES(&mysqli_result_properties, mysqli_result_property_entries);
     539           13565 :         zend_hash_add(&classes, ce->name, ce->name_length+1, &mysqli_result_properties, sizeof(mysqli_result_properties), NULL);
     540                 : 
     541           13565 :         REGISTER_MYSQLI_CLASS_ENTRY("mysqli_stmt", mysqli_stmt_class_entry, mysqli_stmt_methods);
     542           13565 :         ce = mysqli_stmt_class_entry;
     543           13565 :         zend_hash_init(&mysqli_stmt_properties, 0, NULL, NULL, 1);
     544           13565 :         MYSQLI_ADD_PROPERTIES(&mysqli_stmt_properties, mysqli_stmt_property_entries);
     545           13565 :         zend_hash_add(&classes, ce->name, ce->name_length+1, &mysqli_stmt_properties, sizeof(mysqli_stmt_properties), NULL);
     546                 :         
     547                 :         /* mysqli_options */
     548           13565 :         REGISTER_LONG_CONSTANT("MYSQLI_READ_DEFAULT_GROUP", MYSQL_READ_DEFAULT_GROUP, CONST_CS | CONST_PERSISTENT);
     549           13565 :         REGISTER_LONG_CONSTANT("MYSQLI_READ_DEFAULT_FILE", MYSQL_READ_DEFAULT_FILE, CONST_CS | CONST_PERSISTENT);
     550           13565 :         REGISTER_LONG_CONSTANT("MYSQLI_OPT_CONNECT_TIMEOUT", MYSQL_OPT_CONNECT_TIMEOUT, CONST_CS | CONST_PERSISTENT);
     551           13565 :         REGISTER_LONG_CONSTANT("MYSQLI_OPT_LOCAL_INFILE", MYSQL_OPT_LOCAL_INFILE, CONST_CS | CONST_PERSISTENT);
     552           13565 :         REGISTER_LONG_CONSTANT("MYSQLI_INIT_COMMAND", MYSQL_INIT_COMMAND, CONST_CS | CONST_PERSISTENT);
     553                 : 
     554                 :         /* mysqli_real_connect flags */ 
     555           13565 :         REGISTER_LONG_CONSTANT("MYSQLI_CLIENT_SSL", CLIENT_SSL, CONST_CS | CONST_PERSISTENT);
     556           13565 :         REGISTER_LONG_CONSTANT("MYSQLI_CLIENT_COMPRESS",CLIENT_COMPRESS, CONST_CS | CONST_PERSISTENT);
     557           13565 :         REGISTER_LONG_CONSTANT("MYSQLI_CLIENT_INTERACTIVE", CLIENT_INTERACTIVE, CONST_CS | CONST_PERSISTENT);
     558           13565 :         REGISTER_LONG_CONSTANT("MYSQLI_CLIENT_IGNORE_SPACE", CLIENT_IGNORE_SPACE, CONST_CS | CONST_PERSISTENT);
     559           13565 :         REGISTER_LONG_CONSTANT("MYSQLI_CLIENT_NO_SCHEMA", CLIENT_NO_SCHEMA, CONST_CS | CONST_PERSISTENT);
     560           13565 :         REGISTER_LONG_CONSTANT("MYSQLI_CLIENT_FOUND_ROWS", CLIENT_FOUND_ROWS, CONST_CS | CONST_PERSISTENT);
     561                 : 
     562                 :         /* for mysqli_query */
     563           13565 :         REGISTER_LONG_CONSTANT("MYSQLI_STORE_RESULT", 0, CONST_CS | CONST_PERSISTENT);
     564           13565 :         REGISTER_LONG_CONSTANT("MYSQLI_USE_RESULT", 1, CONST_CS | CONST_PERSISTENT);
     565                 : 
     566                 :         /* for mysqli_fetch_assoc */
     567           13565 :         REGISTER_LONG_CONSTANT("MYSQLI_ASSOC", MYSQLI_ASSOC, CONST_CS | CONST_PERSISTENT);
     568           13565 :         REGISTER_LONG_CONSTANT("MYSQLI_NUM", MYSQLI_NUM, CONST_CS | CONST_PERSISTENT);
     569           13565 :         REGISTER_LONG_CONSTANT("MYSQLI_BOTH", MYSQLI_BOTH, CONST_CS | CONST_PERSISTENT);
     570                 :         
     571                 :         /* for mysqli_stmt_set_attr */
     572           13565 :         REGISTER_LONG_CONSTANT("MYSQLI_STMT_ATTR_UPDATE_MAX_LENGTH", STMT_ATTR_UPDATE_MAX_LENGTH, CONST_CS | CONST_PERSISTENT);
     573                 : 
     574                 : #if MYSQL_VERSION_ID > 50003
     575           13565 :         REGISTER_LONG_CONSTANT("MYSQLI_STMT_ATTR_CURSOR_TYPE", STMT_ATTR_CURSOR_TYPE, CONST_CS | CONST_PERSISTENT);
     576           13565 :         REGISTER_LONG_CONSTANT("MYSQLI_CURSOR_TYPE_NO_CURSOR", CURSOR_TYPE_NO_CURSOR, CONST_CS | CONST_PERSISTENT);
     577           13565 :         REGISTER_LONG_CONSTANT("MYSQLI_CURSOR_TYPE_READ_ONLY", CURSOR_TYPE_READ_ONLY, CONST_CS | CONST_PERSISTENT);
     578           13565 :         REGISTER_LONG_CONSTANT("MYSQLI_CURSOR_TYPE_FOR_UPDATE", CURSOR_TYPE_FOR_UPDATE, CONST_CS | CONST_PERSISTENT);
     579           13565 :         REGISTER_LONG_CONSTANT("MYSQLI_CURSOR_TYPE_SCROLLABLE", CURSOR_TYPE_SCROLLABLE, CONST_CS | CONST_PERSISTENT);
     580                 : #endif
     581                 : 
     582                 : #if MYSQL_VERSION_ID > 50007
     583           13565 :         REGISTER_LONG_CONSTANT("MYSQLI_STMT_ATTR_PREFETCH_ROWS", STMT_ATTR_PREFETCH_ROWS, CONST_CS | CONST_PERSISTENT);
     584                 : #endif
     585                 :         
     586                 :         /* column information */
     587           13565 :         REGISTER_LONG_CONSTANT("MYSQLI_NOT_NULL_FLAG", NOT_NULL_FLAG, CONST_CS | CONST_PERSISTENT);
     588           13565 :         REGISTER_LONG_CONSTANT("MYSQLI_PRI_KEY_FLAG", PRI_KEY_FLAG, CONST_CS | CONST_PERSISTENT);
     589           13565 :         REGISTER_LONG_CONSTANT("MYSQLI_UNIQUE_KEY_FLAG", UNIQUE_KEY_FLAG, CONST_CS | CONST_PERSISTENT);
     590           13565 :         REGISTER_LONG_CONSTANT("MYSQLI_MULTIPLE_KEY_FLAG", MULTIPLE_KEY_FLAG, CONST_CS | CONST_PERSISTENT);
     591           13565 :         REGISTER_LONG_CONSTANT("MYSQLI_BLOB_FLAG", BLOB_FLAG, CONST_CS | CONST_PERSISTENT);
     592           13565 :         REGISTER_LONG_CONSTANT("MYSQLI_UNSIGNED_FLAG", UNSIGNED_FLAG, CONST_CS | CONST_PERSISTENT);
     593           13565 :         REGISTER_LONG_CONSTANT("MYSQLI_ZEROFILL_FLAG", ZEROFILL_FLAG, CONST_CS | CONST_PERSISTENT);
     594           13565 :         REGISTER_LONG_CONSTANT("MYSQLI_AUTO_INCREMENT_FLAG", AUTO_INCREMENT_FLAG, CONST_CS | CONST_PERSISTENT);
     595           13565 :         REGISTER_LONG_CONSTANT("MYSQLI_TIMESTAMP_FLAG", TIMESTAMP_FLAG, CONST_CS | CONST_PERSISTENT);
     596           13565 :         REGISTER_LONG_CONSTANT("MYSQLI_SET_FLAG", SET_FLAG, CONST_CS | CONST_PERSISTENT);
     597           13565 :         REGISTER_LONG_CONSTANT("MYSQLI_NUM_FLAG", NUM_FLAG, CONST_CS | CONST_PERSISTENT);
     598           13565 :         REGISTER_LONG_CONSTANT("MYSQLI_PART_KEY_FLAG", PART_KEY_FLAG, CONST_CS | CONST_PERSISTENT);
     599           13565 :         REGISTER_LONG_CONSTANT("MYSQLI_GROUP_FLAG", GROUP_FLAG, CONST_CS | CONST_PERSISTENT);
     600                 : 
     601           13565 :         REGISTER_LONG_CONSTANT("MYSQLI_TYPE_DECIMAL", FIELD_TYPE_DECIMAL, CONST_CS | CONST_PERSISTENT);
     602           13565 :         REGISTER_LONG_CONSTANT("MYSQLI_TYPE_TINY", FIELD_TYPE_TINY, CONST_CS | CONST_PERSISTENT);
     603           13565 :         REGISTER_LONG_CONSTANT("MYSQLI_TYPE_SHORT", FIELD_TYPE_SHORT, CONST_CS | CONST_PERSISTENT);
     604           13565 :         REGISTER_LONG_CONSTANT("MYSQLI_TYPE_LONG", FIELD_TYPE_LONG, CONST_CS | CONST_PERSISTENT);
     605           13565 :         REGISTER_LONG_CONSTANT("MYSQLI_TYPE_FLOAT", FIELD_TYPE_FLOAT, CONST_CS | CONST_PERSISTENT);
     606           13565 :         REGISTER_LONG_CONSTANT("MYSQLI_TYPE_DOUBLE", FIELD_TYPE_DOUBLE, CONST_CS | CONST_PERSISTENT);
     607           13565 :         REGISTER_LONG_CONSTANT("MYSQLI_TYPE_NULL", FIELD_TYPE_NULL, CONST_CS | CONST_PERSISTENT);
     608           13565 :         REGISTER_LONG_CONSTANT("MYSQLI_TYPE_TIMESTAMP", FIELD_TYPE_TIMESTAMP, CONST_CS | CONST_PERSISTENT);
     609           13565 :         REGISTER_LONG_CONSTANT("MYSQLI_TYPE_LONGLONG", FIELD_TYPE_LONGLONG, CONST_CS | CONST_PERSISTENT);
     610           13565 :         REGISTER_LONG_CONSTANT("MYSQLI_TYPE_INT24", FIELD_TYPE_INT24, CONST_CS | CONST_PERSISTENT);
     611           13565 :         REGISTER_LONG_CONSTANT("MYSQLI_TYPE_DATE", FIELD_TYPE_DATE, CONST_CS | CONST_PERSISTENT);
     612           13565 :         REGISTER_LONG_CONSTANT("MYSQLI_TYPE_TIME", FIELD_TYPE_TIME, CONST_CS | CONST_PERSISTENT);
     613           13565 :         REGISTER_LONG_CONSTANT("MYSQLI_TYPE_DATETIME", FIELD_TYPE_DATETIME    , CONST_CS | CONST_PERSISTENT);
     614           13565 :         REGISTER_LONG_CONSTANT("MYSQLI_TYPE_YEAR", FIELD_TYPE_YEAR, CONST_CS | CONST_PERSISTENT);
     615           13565 :         REGISTER_LONG_CONSTANT("MYSQLI_TYPE_NEWDATE", FIELD_TYPE_NEWDATE, CONST_CS | CONST_PERSISTENT);
     616           13565 :         REGISTER_LONG_CONSTANT("MYSQLI_TYPE_ENUM", FIELD_TYPE_ENUM, CONST_CS | CONST_PERSISTENT);
     617           13565 :         REGISTER_LONG_CONSTANT("MYSQLI_TYPE_SET", FIELD_TYPE_SET, CONST_CS | CONST_PERSISTENT);
     618           13565 :         REGISTER_LONG_CONSTANT("MYSQLI_TYPE_TINY_BLOB", FIELD_TYPE_TINY_BLOB, CONST_CS | CONST_PERSISTENT);
     619           13565 :         REGISTER_LONG_CONSTANT("MYSQLI_TYPE_MEDIUM_BLOB", FIELD_TYPE_MEDIUM_BLOB, CONST_CS | CONST_PERSISTENT);
     620           13565 :         REGISTER_LONG_CONSTANT("MYSQLI_TYPE_LONG_BLOB", FIELD_TYPE_LONG_BLOB, CONST_CS | CONST_PERSISTENT);
     621           13565 :         REGISTER_LONG_CONSTANT("MYSQLI_TYPE_BLOB", FIELD_TYPE_BLOB, CONST_CS | CONST_PERSISTENT);
     622           13565 :         REGISTER_LONG_CONSTANT("MYSQLI_TYPE_VAR_STRING", FIELD_TYPE_VAR_STRING, CONST_CS | CONST_PERSISTENT);
     623           13565 :         REGISTER_LONG_CONSTANT("MYSQLI_TYPE_STRING", FIELD_TYPE_STRING, CONST_CS | CONST_PERSISTENT);
     624           13565 :         REGISTER_LONG_CONSTANT("MYSQLI_TYPE_CHAR", FIELD_TYPE_CHAR, CONST_CS | CONST_PERSISTENT);
     625           13565 :         REGISTER_LONG_CONSTANT("MYSQLI_TYPE_INTERVAL", FIELD_TYPE_INTERVAL, CONST_CS | CONST_PERSISTENT);
     626           13565 :         REGISTER_LONG_CONSTANT("MYSQLI_TYPE_GEOMETRY", FIELD_TYPE_GEOMETRY, CONST_CS | CONST_PERSISTENT);
     627                 : 
     628                 : #if MYSQL_VERSION_ID > 50002
     629           13565 :         REGISTER_LONG_CONSTANT("MYSQLI_TYPE_NEWDECIMAL", FIELD_TYPE_NEWDECIMAL, CONST_CS | CONST_PERSISTENT);
     630           13565 :         REGISTER_LONG_CONSTANT("MYSQLI_TYPE_BIT", FIELD_TYPE_BIT, CONST_CS | CONST_PERSISTENT);
     631                 : #endif
     632                 : 
     633           13565 :         REGISTER_LONG_CONSTANT("MYSQLI_SET_CHARSET_NAME", MYSQL_SET_CHARSET_NAME, CONST_CS | CONST_PERSISTENT);
     634                 : 
     635                 : #ifdef HAVE_LIBMYSQL_REPLICATION
     636                 :         /* replication */
     637           13565 :         REGISTER_LONG_CONSTANT("MYSQLI_RPL_MASTER", MYSQL_RPL_MASTER, CONST_CS | CONST_PERSISTENT);
     638           13565 :         REGISTER_LONG_CONSTANT("MYSQLI_RPL_SLAVE", MYSQL_RPL_SLAVE, CONST_CS | CONST_PERSISTENT);
     639           13565 :         REGISTER_LONG_CONSTANT("MYSQLI_RPL_ADMIN", MYSQL_RPL_ADMIN, CONST_CS | CONST_PERSISTENT);
     640                 : #endif
     641                 : 
     642                 :         /* bind support */
     643           13565 :         REGISTER_LONG_CONSTANT("MYSQLI_NO_DATA", MYSQL_NO_DATA, CONST_CS | CONST_PERSISTENT);
     644                 : #ifdef MYSQL_DATA_TRUNCATED
     645           13565 :         REGISTER_LONG_CONSTANT("MYSQLI_DATA_TRUNCATED", MYSQL_DATA_TRUNCATED, CONST_CS | CONST_PERSISTENT);
     646                 : #endif
     647                 : 
     648                 :         /* reporting */
     649           13565 :         REGISTER_LONG_CONSTANT("MYSQLI_REPORT_INDEX", MYSQLI_REPORT_INDEX, CONST_CS | CONST_PERSISTENT);
     650           13565 :         REGISTER_LONG_CONSTANT("MYSQLI_REPORT_ERROR", MYSQLI_REPORT_ERROR, CONST_CS | CONST_PERSISTENT);
     651           13565 :         REGISTER_LONG_CONSTANT("MYSQLI_REPORT_STRICT", MYSQLI_REPORT_STRICT, CONST_CS | CONST_PERSISTENT);
     652           13565 :         REGISTER_LONG_CONSTANT("MYSQLI_REPORT_ALL", MYSQLI_REPORT_ALL, CONST_CS | CONST_PERSISTENT);
     653           13565 :         REGISTER_LONG_CONSTANT("MYSQLI_REPORT_OFF", 0, CONST_CS | CONST_PERSISTENT);
     654                 : 
     655           13565 :         return SUCCESS;
     656                 : }
     657                 : /* }}} */
     658                 : 
     659                 : /* {{{ PHP_MSHUTDOWN_FUNCTION
     660                 :  */
     661                 : PHP_MSHUTDOWN_FUNCTION(mysqli)
     662           13598 : {
     663                 : #if MYSQL_VERSION_ID >= 40000
     664                 : #ifdef PHP_WIN32
     665                 :         unsigned long client_ver = mysql_get_client_version();
     666                 :         /* Can't call mysql_server_end() multiple times prior to 5.0.42 on Windows */
     667                 :         if ((client_ver >= 50046 && client_ver < 50100) || client_ver > 50122) {
     668                 :                 mysql_server_end();
     669                 :         }
     670                 : #else
     671           13598 :         mysql_server_end();
     672                 : #endif
     673                 : #endif
     674                 : 
     675           13598 :         zend_hash_destroy(&mysqli_driver_properties);
     676           13598 :         zend_hash_destroy(&mysqli_result_properties);
     677           13598 :         zend_hash_destroy(&mysqli_stmt_properties);
     678           13598 :         zend_hash_destroy(&mysqli_warning_properties);
     679           13598 :         zend_hash_destroy(&mysqli_link_properties);
     680           13598 :         zend_hash_destroy(&classes);
     681                 : 
     682           13598 :         UNREGISTER_INI_ENTRIES();
     683           13598 :         return SUCCESS;
     684                 : }
     685                 : /* }}} */
     686                 : 
     687                 : /* {{{ PHP_RINIT_FUNCTION
     688                 :  */
     689                 : PHP_RINIT_FUNCTION(mysqli)
     690           13551 : {
     691                 : #if defined(ZTS) && MYSQL_VERSION_ID >= 40000
     692                 :         if (mysql_thread_init()) {
     693                 :                 return FAILURE;
     694                 :         }
     695                 : #endif
     696           13551 :         MyG(error_msg) = NULL;
     697           13551 :         MyG(error_no) = 0;
     698                 : 
     699           13551 :         return SUCCESS;
     700                 : }
     701                 : /* }}} */
     702                 : 
     703                 : /* {{{ PHP_RSHUTDOWN_FUNCTION
     704                 :  */
     705                 : PHP_RSHUTDOWN_FUNCTION(mysqli)
     706           13584 : {
     707                 : #if defined(ZTS) && MYSQL_VERSION_ID >= 40000
     708                 :         mysql_thread_end();
     709                 : #endif
     710           13584 :         if (MyG(error_msg)) {
     711               1 :                 efree(MyG(error_msg));
     712                 :         }
     713           13584 :         return SUCCESS;
     714                 : }
     715                 : /* }}} */
     716                 : 
     717                 : /* {{{ PHP_MINFO_FUNCTION
     718                 :  */
     719                 : PHP_MINFO_FUNCTION(mysqli)
     720               6 : {
     721               6 :         php_info_print_table_start();
     722               6 :         php_info_print_table_header(2, "MysqlI Support", "enabled");
     723               6 :         php_info_print_table_row(2, "Client API library version", mysql_get_client_info());
     724               6 :         php_info_print_table_row(2, "Client API header version", MYSQL_SERVER_VERSION);
     725               6 :         php_info_print_table_row(2, "MYSQLI_SOCKET", MYSQL_UNIX_ADDR);
     726                 :         
     727                 :         
     728               6 :         php_info_print_table_end();
     729                 : 
     730               6 :         DISPLAY_INI_ENTRIES();
     731               6 : }
     732                 : /* }}} */
     733                 : 
     734                 : /* {{{ mixed mysqli_stmt_construct() 
     735                 : constructor for statement object.
     736                 : Parameters: 
     737                 :   object -> mysqli_stmt_init
     738                 :   object, query -> mysqli_prepare
     739                 : */
     740                 : ZEND_FUNCTION(mysqli_stmt_construct)
     741               3 : {
     742                 :         MY_MYSQL                        *mysql;
     743                 :         zval                            *mysql_link;
     744                 :         MY_STMT                         *stmt;
     745                 :         MYSQLI_RESOURCE         *mysqli_resource;
     746                 :         char                            *statement;
     747                 :         int                                     stmt_len;
     748                 : 
     749               3 :         switch (ZEND_NUM_ARGS())
     750                 :         {
     751                 :                 case 1:  /* mysql_stmt_init */
     752               0 :                 if (zend_parse_parameters(1 TSRMLS_CC, "O", &mysql_link, mysqli_link_class_entry)==FAILURE) {
     753               0 :                                 return;
     754                 :                         }
     755               0 :                         MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
     756                 : 
     757               0 :                         stmt = (MY_STMT *)ecalloc(1,sizeof(MY_STMT));
     758                 : 
     759               0 :                         stmt->stmt = mysql_stmt_init(mysql->mysql);
     760               0 :                 break;
     761                 :                 case 2:
     762               3 :                 if (zend_parse_parameters(2 TSRMLS_CC, "Os", &mysql_link, mysqli_link_class_entry, &statement, &stmt_len)==FAILURE) {
     763               0 :                                 return;
     764                 :                         }
     765               3 :                         MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
     766                 : 
     767               3 :                         stmt = (MY_STMT *)ecalloc(1,sizeof(MY_STMT));
     768                 :         
     769               3 :                         if ((stmt->stmt = mysql_stmt_init(mysql->mysql))) {
     770               3 :                                 mysql_stmt_prepare(stmt->stmt, statement, stmt_len);
     771                 :                         }
     772               3 :                 break;
     773                 :                 default:
     774               0 :                         WRONG_PARAM_COUNT;
     775                 :                 break;
     776                 :         }
     777                 : 
     778               3 :         if (!stmt->stmt) {
     779               0 :                 efree(stmt);
     780               0 :                 RETURN_FALSE;
     781                 :         }
     782                 : 
     783               3 :         mysqli_resource = (MYSQLI_RESOURCE *)ecalloc (1, sizeof(MYSQLI_RESOURCE));
     784               3 :         mysqli_resource->ptr = (void *)stmt;
     785               3 :         mysqli_resource->status = (ZEND_NUM_ARGS() == 1) ? MYSQLI_STATUS_INITIALIZED : MYSQLI_STATUS_VALID;
     786                 : 
     787               3 :         ((mysqli_object *) zend_object_store_get_object(getThis() TSRMLS_CC))->ptr = mysqli_resource;
     788                 : }
     789                 : /* }}} */
     790                 : 
     791                 : /* {{{ mixed mysqli_result_construct() 
     792                 : constructor for result object.
     793                 : Parameters: 
     794                 :   object [, mode] -> mysqli_store/use_result
     795                 : */
     796                 : ZEND_FUNCTION(mysqli_result_construct)
     797               2 : {
     798                 :         MY_MYSQL                        *mysql;
     799                 :         MYSQL_RES                       *result;
     800                 :         zval                            *mysql_link;
     801                 :         MYSQLI_RESOURCE         *mysqli_resource;
     802               2 :         long                            resmode = MYSQLI_STORE_RESULT;
     803                 : 
     804               2 :         switch (ZEND_NUM_ARGS()) {
     805                 :                 case 1:
     806               1 :                 if (zend_parse_parameters(1 TSRMLS_CC, "O", &mysql_link, mysqli_link_class_entry)==FAILURE) {
     807               0 :                                 return;
     808                 :                         }
     809               1 :                 break;
     810                 :                 case 2:
     811               1 :                 if (zend_parse_parameters(2 TSRMLS_CC, "Ol", &mysql_link, mysqli_link_class_entry, &resmode)==FAILURE) {
     812               0 :                                 return;
     813                 :                         }
     814               1 :                 break;
     815                 :                 default:
     816               0 :                         WRONG_PARAM_COUNT;
     817                 :         }
     818                 : 
     819               2 :         MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link", MYSQLI_STATUS_VALID);
     820                 : 
     821               2 :         result = (resmode == MYSQLI_STORE_RESULT) ? mysql_store_result(mysql->mysql) :
     822                 :                                                                                                 mysql_use_result(mysql->mysql);
     823                 : 
     824               2 :         if (!result) {
     825               0 :                 RETURN_FALSE;
     826                 :         }
     827                 : 
     828               2 :         mysqli_resource = (MYSQLI_RESOURCE *)ecalloc (1, sizeof(MYSQLI_RESOURCE));
     829               2 :         mysqli_resource->ptr = (void *)result;
     830               2 :         mysqli_resource->status = MYSQLI_STATUS_VALID;
     831                 :         
     832               2 :         ((mysqli_object *) zend_object_store_get_object(getThis() TSRMLS_CC))->ptr = mysqli_resource;
     833                 : 
     834                 : }
     835                 : /* }}} */
     836                 : 
     837                 : /* {{{ php_mysqli_fetch_into_hash
     838                 :  */
     839                 : void php_mysqli_fetch_into_hash(INTERNAL_FUNCTION_PARAMETERS, int override_flags, int into_object)
     840              36 : {
     841                 :         MYSQL_RES               *result;
     842                 :         zval                    *mysql_result;
     843                 :         long                    fetchtype;
     844                 :         unsigned int    i;
     845                 :         MYSQL_FIELD             *fields;
     846                 :         MYSQL_ROW               row;
     847                 :         unsigned long   *field_len;
     848              36 :         zval            *ctor_params = NULL;
     849              36 :         zend_class_entry *ce = NULL;
     850                 : 
     851              36 :         if (into_object) {
     852                 :                 char *class_name;
     853                 :                 int class_name_len;
     854                 : 
     855               4 :                 if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O|sz", &mysql_result, mysqli_result_class_entry, &class_name, &class_name_len, &ctor_params) == FAILURE) {
     856               0 :                         return;
     857                 :                 }
     858               4 :                 if (ZEND_NUM_ARGS() < (getThis() ? 1 : 2)) {
     859               3 :                         ce = zend_standard_class_def;
     860                 :                 } else {
     861               1 :                         ce = zend_fetch_class(class_name, class_name_len, ZEND_FETCH_CLASS_AUTO TSRMLS_CC);
     862                 :                 }
     863               4 :                 if (!ce) {
     864               0 :                         php_error_docref(NULL TSRMLS_CC, E_WARNING, "Could not find class '%s'", class_name);
     865               0 :                         return;
     866                 :                 }
     867               4 :                 fetchtype = MYSQLI_ASSOC;
     868                 :         } else {
     869              32 :                 if (override_flags) {
     870              32 :                         if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_result, mysqli_result_class_entry) == FAILURE) {
     871               0 :                                 return;
     872                 :                         }
     873              32 :                         fetchtype = override_flags;
     874                 :                 } else {
     875               0 :                         fetchtype = MYSQLI_BOTH;
     876               0 :                         if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O|l", &mysql_result, mysqli_result_class_entry, &fetchtype) == FAILURE) {
     877               0 :                                 return;
     878                 :                         }
     879                 :                 }
     880                 :         }
     881              36 :         MYSQLI_FETCH_RESOURCE(result, MYSQL_RES *, &mysql_result, "mysqli_result", MYSQLI_STATUS_VALID); 
     882                 : 
     883              36 :         if ((fetchtype & MYSQLI_BOTH) == 0) {
     884               0 :                 php_error_docref(NULL TSRMLS_CC, E_WARNING, "The result type should be either MYSQLI_NUM, MYSQLI_ASSOC or MYSQLI_BOTH");
     885               0 :                 RETURN_FALSE;
     886                 :         }
     887                 : 
     888              36 :         if (!(row = mysql_fetch_row(result))) {
     889               7 :                 RETURN_NULL();
     890                 :         }
     891                 : 
     892              29 :         if (fetchtype & MYSQLI_ASSOC) {
     893              10 :                 fields = mysql_fetch_fields(result);
     894                 :         }
     895                 : 
     896              29 :         array_init(return_value);
     897              29 :         field_len = mysql_fetch_lengths(result);
     898                 : 
     899              85 :         for (i = 0; i < mysql_num_fields(result); i++) {
     900              56 :                 if (row[i]) {
     901                 :                         zval *res;
     902                 : 
     903              54 :                         MAKE_STD_ZVAL(res);
     904                 : 
     905                 :                         /* check if we need magic quotes */
     906              54 :                         if (PG(magic_quotes_runtime)) {
     907               0 :                                 Z_TYPE_P(res) = IS_STRING;
     908               0 :                                 Z_STRVAL_P(res) = php_addslashes(row[i], field_len[i], &Z_STRLEN_P(res), 0 TSRMLS_CC);
     909                 :                         } else {
     910              54 :                                 ZVAL_STRINGL(res, row[i], field_len[i], 1);     
     911                 :                         }
     912                 : 
     913              54 :                         if (fetchtype & MYSQLI_NUM) {
     914              34 :                                 add_index_zval(return_value, i, res);
     915                 :                         }
     916              54 :                         if (fetchtype & MYSQLI_ASSOC) {
     917              20 :                                 if (fetchtype & MYSQLI_NUM) {
     918               0 :                                         ZVAL_ADDREF(res);
     919                 :                                 }
     920              20 :                                 add_assoc_zval(return_value, fields[i].name, res);
     921                 :                         }
     922                 :                 } else {
     923               2 :                         if (fetchtype & MYSQLI_NUM) {
     924               0 :                                 add_index_null(return_value, i);
     925                 :                         }
     926               2 :                         if (fetchtype & MYSQLI_ASSOC) {
     927               2 :                                 add_assoc_null(return_value, fields[i].name);
     928                 :                         }
     929                 :                 }
     930                 :         }
     931                 : 
     932              29 :         if (into_object) {
     933               4 :                 zval dataset = *return_value;
     934                 :                 zend_fcall_info fci;
     935                 :                 zend_fcall_info_cache fcc;
     936                 :                 zval *retval_ptr; 
     937                 :         
     938               4 :                 object_and_properties_init(return_value, ce, NULL);
     939               4 :                 zend_merge_properties(return_value, Z_ARRVAL(dataset), 1 TSRMLS_CC);
     940                 :         
     941               4 :                 if (ce->constructor) {
     942               1 :                         fci.size = sizeof(fci);
     943               1 :                         fci.function_table = &ce->function_table;
     944               1 :                         fci.function_name = NULL;
     945               1 :                         fci.symbol_table = NULL;
     946               1 :                         fci.object_pp = &return_value;
     947               1 :                         fci.retval_ptr_ptr = &retval_ptr;
     948               2 :                         if (ctor_params && Z_TYPE_P(ctor_params) != IS_NULL) {
     949               1 :                                 if (Z_TYPE_P(ctor_params) == IS_ARRAY) {
     950               1 :                                         HashTable *ht = Z_ARRVAL_P(ctor_params);
     951                 :                                         Bucket *p;
     952                 :         
     953               1 :                                         fci.param_count = 0;
     954               1 :                                         fci.params = safe_emalloc(sizeof(zval*), ht->nNumOfElements, 0);
     955               1 :                                         p = ht->pListHead;
     956               4 :                                         while (p != NULL) {
     957               2 :                                                 fci.params[fci.param_count++] = (zval**)p->pData;
     958               2 :                                                 p = p->pListNext;
     959                 :                                         }
     960                 :                                 } else {
     961                 :                                         /* Two problems why we throw exceptions here: PHP is typeless
     962                 :                                          * and hence passing one argument that's not an array could be
     963                 :                                          * by mistake and the other way round is possible, too. The 
     964                 :                                          * single value is an array. Also we'd have to make that one
     965                 :                                          * argument passed by reference.
     966                 :                                          */
     967               0 :                                         zend_throw_exception(zend_exception_get_default(TSRMLS_C), "Parameter ctor_params must be an array", 0 TSRMLS_CC);
     968               0 :                                         return;
     969                 :                                 }
     970                 :                         } else {
     971               0 :                                 fci.param_count = 0;
     972               0 :                                 fci.params = NULL;
     973                 :                         }
     974               1 :                         fci.no_separation = 1;
     975                 : 
     976               1 :                         fcc.initialized = 1;
     977               1 :                         fcc.function_handler = ce->constructor;
     978               1 :                         fcc.calling_scope = EG(scope);
     979               1 :                         fcc.object_pp = &return_value;
     980                 :                 
     981               1 :                         if (zend_call_function(&fci, &fcc TSRMLS_CC) == FAILURE) {
     982               0 :                                 zend_throw_exception_ex(zend_exception_get_default(TSRMLS_C), 0 TSRMLS_CC, "Could not execute %s::%s()", ce->name, ce->constructor->common.function_name);
     983                 :                         } else {
     984               1 :                                 if (retval_ptr) {
     985               1 :                                         zval_ptr_dtor(&retval_ptr);
     986                 :                                 }
     987                 :                         }
     988               1 :                         if (fci.params) {
     989               1 :                                 efree(fci.params);
     990                 :                         }
     991               3 :                 } else if (ctor_params) {
     992               0 :                         zend_throw_exception_ex(zend_exception_get_default(TSRMLS_C), 0 TSRMLS_CC, "Class %s does not have a constructor hence you cannot use ctor_params", ce->name);
     993                 :                 }
     994                 :         }
     995                 : }
     996                 : /* }}} */
     997                 : 
     998                 : /* {{{ php_mysqli_set_error
     999                 :  */
    1000                 : PHP_MYSQLI_API void php_mysqli_set_error(long mysql_errno, char *mysql_err TSRMLS_DC)
    1001             195 : {
    1002             195 :         MyG(error_no) = mysql_errno;
    1003             195 :         if (MyG(error_msg)) {
    1004               0 :                 efree(MyG(error_msg));
    1005                 :         }
    1006             196 :         if(mysql_err && *mysql_err) {
    1007               1 :                 MyG(error_msg) = estrdup(mysql_err);
    1008                 :         } else {
    1009             194 :                 MyG(error_msg) = NULL;
    1010                 :         }
    1011             195 : }
    1012                 : /* }}} */
    1013                 : 
    1014                 : #define ALLOC_CALLBACK_ARGS(a, b, c)\
    1015                 : if (c) {\
    1016                 :         a = (zval ***)safe_emalloc(c, sizeof(zval **), 0);\
    1017                 :         for (i = b; i < c; i++) {\
    1018                 :                 a[i] = emalloc(sizeof(zval *));\
    1019                 :                 MAKE_STD_ZVAL(*a[i]);\
    1020                 :         }\
    1021                 : }
    1022                 : 
    1023                 : #define FREE_CALLBACK_ARGS(a, b, c)\
    1024                 : if (a) {\
    1025                 :         for (i=b; i < c; i++) {\
    1026                 :                 zval_ptr_dtor(a[i]);\
    1027                 :                 efree(a[i]);\
    1028                 :         }\
    1029                 :         efree(a);\
    1030                 : }
    1031                 : 
    1032                 : #define LOCAL_INFILE_ERROR_MSG(source,dest)\
    1033                 : memset(source, 0, LOCAL_INFILE_ERROR_LEN);\
    1034                 : memcpy(source, dest, LOCAL_INFILE_ERROR_LEN-1);
    1035                 : 
    1036                 : /* {{{ void php_set_local_infile_handler_default 
    1037                 : */
    1038             194 : void php_set_local_infile_handler_default(MY_MYSQL *mysql) {
    1039                 :         /* register internal callback functions */
    1040             194 :         mysql_set_local_infile_handler(mysql->mysql, &php_local_infile_init, &php_local_infile_read,
    1041                 :                                 &php_local_infile_end, &php_local_infile_error, (void *)mysql);
    1042             194 :         mysql->li_read = NULL;
    1043             194 : }
    1044                 : /* }}} */
    1045                 : 
    1046                 : /* {{{ php_local_infile_init
    1047                 :  */
    1048                 : int php_local_infile_init(void **ptr, const char *filename, void *userdata)
    1049               3 : {
    1050                 :         mysqli_local_infile                     *data;
    1051                 :         MY_MYSQL                                        *mysql;
    1052               3 :         php_stream_context                      *context = NULL;
    1053                 : 
    1054                 :         TSRMLS_FETCH();
    1055                 : 
    1056                 :         /* save pointer to MY_MYSQL structure (userdata) */
    1057               3 :         if (!(*ptr= data= ((mysqli_local_infile *)calloc(1, sizeof(mysqli_local_infile))))) {
    1058               0 :                 return 1;
    1059                 :         }
    1060                 : 
    1061               3 :         if (!(mysql = (MY_MYSQL *)userdata)) {
    1062               0 :                 LOCAL_INFILE_ERROR_MSG(data->error_msg, ER(CR_UNKNOWN_ERROR));
    1063               0 :                 return 1;
    1064                 :         }
    1065                 : 
    1066                 :         /* check open_basedir */
    1067               3 :         if (PG(open_basedir)) {
    1068               3 :                 if (php_check_open_basedir_ex(filename, 0 TSRMLS_CC) == -1) {
    1069               0 :                         LOCAL_INFILE_ERROR_MSG(data->error_msg, "open_basedir restriction in effect. Unable to open file");
    1070               0 :                         return 1;
    1071                 :                 }
    1072                 :         }
    1073                 : 
    1074               3 :         mysql->li_stream = php_stream_open_wrapper_ex((char *)filename, "r", 0, NULL, context);
    1075                 : 
    1076               3 :         if (mysql->li_stream == NULL) {
    1077               1 :                 snprintf((char *)data->error_msg, sizeof(data->error_msg), "Can't find file '%-.64s'.", filename);      
    1078               1 :                 return 1;
    1079                 :         }
    1080                 : 
    1081               2 :         data->userdata = mysql;
    1082                 : 
    1083               2 :         return 0;
    1084                 : }
    1085                 : /* }}} */
    1086                 : 
    1087                 : /* {{{ int php_local_infile_read */
    1088                 : int php_local_infile_read(void *ptr, char *buf, uint buf_len)
    1089               4 : {
    1090                 :         mysqli_local_infile             *data;
    1091                 :         MY_MYSQL                                        *mysql;
    1092                 :         zval                                            ***callback_args;
    1093                 :         zval                                            *retval;
    1094                 :         zval                                            *fp;
    1095               4 :         int                                                     argc = 4;
    1096                 :         int                                                     i;
    1097                 :         long                                            rc;
    1098                 : 
    1099                 :         TSRMLS_FETCH();
    1100                 : 
    1101               4 :         data= (mysqli_local_infile *)ptr;
    1102               4 :         mysql = data->userdata;
    1103                 : 
    1104                 :         /* default processing */
    1105               4 :         if (!mysql->li_read) {
    1106                 :                 int                     count;
    1107                 : 
    1108               2 :                 count = (int)php_stream_read(mysql->li_stream, buf, buf_len);
    1109                 : 
    1110               2 :                 if (count < 0) {
    1111               0 :                         LOCAL_INFILE_ERROR_MSG(data->error_msg, ER(2));
    1112                 :                 }
    1113                 : 
    1114               2 :                 return count;
    1115                 :         }
    1116                 : 
    1117               2 :         ALLOC_CALLBACK_ARGS(callback_args, 1, argc);
    1118                 :         
    1119                 :         /* set parameters: filepointer, buffer, buffer_len, errormsg */
    1120                 : 
    1121               2 :         MAKE_STD_ZVAL(fp);
    1122               2 :         php_stream_to_zval(mysql->li_stream, fp);
    1123               2 :         callback_args[0] = &fp;
    1124               2 :         ZVAL_STRING(*callback_args[1], "", 1);        
    1125               2 :         ZVAL_LONG(*callback_args[2], buf_len);  
    1126               2 :         ZVAL_STRING(*callback_args[3], "", 1);        
    1127                 :         
    1128               2 :         if (call_user_function_ex(EG(function_table), 
    1129                 :                                                 NULL,
    1130                 :                                                 mysql->li_read,
    1131                 :                                                 &retval,
    1132                 :                                                 argc,           
    1133                 :                                                 callback_args,
    1134                 :                                                 0,
    1135                 :                                                 NULL TSRMLS_CC) == SUCCESS) {
    1136                 : 
    1137               2 :                 rc = Z_LVAL_P(retval);
    1138               2 :                 zval_ptr_dtor(&retval);
    1139                 : 
    1140               2 :                 if (rc > 0) {
    1141               1 :                         if (rc > buf_len) {
    1142                 :                                 /* check buffer overflow */
    1143               0 :                                 LOCAL_INFILE_ERROR_MSG(data->error_msg, "Read buffer too large");
    1144               0 :                                 rc = -1;
    1145                 :                         } else {
    1146               1 :                                 memcpy(buf, Z_STRVAL_P(*callback_args[1]), rc);
    1147                 :                         }
    1148                 :                 }
    1149               2 :                 if (rc < 0) {
    1150               0 :                         LOCAL_INFILE_ERROR_MSG(data->error_msg, Z_STRVAL_P(*callback_args[3]));
    1151                 :                 }
    1152                 :         } else {
    1153               0 :                 LOCAL_INFILE_ERROR_MSG(data->error_msg, "Can't execute load data local init callback function");
    1154               0 :                 rc = -1;
    1155                 :         }
    1156                 :         
    1157               2 :         FREE_CALLBACK_ARGS(callback_args, 1, argc);
    1158               2 :         efree(fp);
    1159               2 :         return rc;
    1160                 : }
    1161                 : /* }}} */
    1162                 : 
    1163                 : /* {{{ php_local_infile_error
    1164                 :  */
    1165                 : int php_local_infile_error(void *ptr, char *error_msg, uint error_msg_len)
    1166               1 : {
    1167               1 :         mysqli_local_infile *data = (mysqli_local_infile *) ptr;
    1168                 : 
    1169               1 :         if (data) {
    1170               1 :                 strlcpy(error_msg, data->error_msg, error_msg_len);
    1171               1 :                 return 2000;
    1172                 :         } 
    1173               0 :         strlcpy(error_msg, ER(CR_OUT_OF_MEMORY), error_msg_len);
    1174               0 :         return CR_OUT_OF_MEMORY;
    1175                 : }
    1176                 : /* }}} */
    1177                 : 
    1178                 : /* {{{ php_local_infile_end
    1179                 :  */
    1180                 : void php_local_infile_end(void *ptr) 
    1181               3 : {
    1182                 :         mysqli_local_infile                     *data;
    1183                 :         MY_MYSQL                                        *mysql;
    1184                 : 
    1185                 :         TSRMLS_FETCH();
    1186                 : 
    1187               3 :         data= (mysqli_local_infile *)ptr;
    1188                 : 
    1189               3 :         if (!data || !(mysql = data->userdata)) {
    1190               1 :                 if (data) {
    1191               1 :                         free(data);
    1192                 :                 }
    1193               1 :                 return;
    1194                 :         }
    1195                 : 
    1196               2 :         if (mysql->li_stream) {
    1197               2 :                 php_stream_close(mysql->li_stream);
    1198                 :         }
    1199               2 :         free(data);
    1200               2 :         return; 
    1201                 : }
    1202                 : /* }}} */
    1203                 : 
    1204                 : /*
    1205                 :  * Local variables:
    1206                 :  * tab-width: 4
    1207                 :  * c-basic-offset: 4
    1208                 :  * End:
    1209                 :  * vim600: noet sw=4 ts=4 fdm=marker
    1210                 :  * vim<600: noet sw=4 ts=4
    1211                 :  */

Generated by: LTP GCOV extension version 1.5

Generated at Thu, 19 Nov 2009 08:20:13 +0000 (5 days ago)

Copyright © 2005-2009 The PHP Group
All rights reserved.