]> granicus.if.org Git - php/commitdiff
Merge mysql changes
authorJohannes Schlüter <johannes@php.net>
Wed, 20 Jan 2010 17:09:28 +0000 (17:09 +0000)
committerJohannes Schlüter <johannes@php.net>
Wed, 20 Jan 2010 17:09:28 +0000 (17:09 +0000)
292528 Unify. The typedef-ed structs in mysqlnd are always capitalized. (andrey)
293076 The internal zval cache has been removed and not been reintroduced... remove cor (uw)
293080 Tweaking test. Andrey, you once requested such a test, please have a look if it (uw)
293084 Fixing test(uw)
293085 The internal zval cache has been removed and not been reintroduced... remove cor (uw)
292986 Updating test to new libmysql feature set (first introduced in MySQL 6.0 but now (uw)
293229 Change of way the packet objects are created/initialised (andrey)
293273 add restart_psession and end_psession hooks (andrey)
293286 improve the stats subsystem. Reduce the number of macro definitions (andrey)
293287 export some calls to init/deinit code outside of the module (andrey)
293402 missed to commit to the branch (andrey)
293407 Rework the statistics macros to be reusable by external entities. (andrey)
293418 missed to commit in 5_3, here it comes, reusability of stats (andrey)
293424 remove extern defintion of a variable that is no more (andrey)
293428 cosmetics. typedef-ed types should be in capital case (andrey)
293429 removed stale export (andrey)
293430 more typedef cosmetics (andrey)
293504 make mysqlnd's tracing API more reusable (andrey)
293512 more PHPAPI for phpize-d builds (andrey)
293535 Fix build of mysqli when libmysql is used, mysqlnd_portability.h (andrey)
293537 removed redefinition of bit_uint8korr (andrey)
293539 Fix compiler warning (andrey)
293542 Fix compiler warning, copy&paste error (andrey)
293723 fix windows (andrey)
293725 Make it GCC only feature (tracing). VC7 and up do the work (andrey)

35 files changed:
ext/mysql/tests/mysql_phpinfo.phpt
ext/mysqli/mysqli.c
ext/mysqli/mysqli_api.c
ext/mysqli/mysqli_libmysql.h
ext/mysqli/mysqli_mysqlnd.h
ext/mysqli/mysqli_nonapi.c
ext/mysqli/tests/mysqli_connect_oo_defaults.phpt
ext/mysqli/tests/mysqli_constants.phpt
ext/mysqli/tests/mysqli_get_cache_stats.phpt [deleted file]
ext/mysqli/tests/mysqli_get_cache_stats_free_buffered.phpt [deleted file]
ext/mysqli/tests/mysqli_insert_packet_overflow.phpt
ext/mysqli/tests/mysqli_phpinfo.phpt
ext/mysqlnd/mysqlnd.c
ext/mysqlnd/mysqlnd.h
ext/mysqlnd/mysqlnd_block_alloc.c
ext/mysqlnd/mysqlnd_block_alloc.h
ext/mysqlnd/mysqlnd_debug.c
ext/mysqlnd/mysqlnd_debug.h
ext/mysqlnd/mysqlnd_enum_n_def.h
ext/mysqlnd/mysqlnd_net.c
ext/mysqlnd/mysqlnd_net.h
ext/mysqlnd/mysqlnd_portability.h
ext/mysqlnd/mysqlnd_priv.h
ext/mysqlnd/mysqlnd_ps.c
ext/mysqlnd/mysqlnd_result.c
ext/mysqlnd/mysqlnd_result.h
ext/mysqlnd/mysqlnd_result_meta.c
ext/mysqlnd/mysqlnd_result_meta.h
ext/mysqlnd/mysqlnd_statistics.c
ext/mysqlnd/mysqlnd_statistics.h
ext/mysqlnd/mysqlnd_structs.h
ext/mysqlnd/mysqlnd_wireprotocol.c
ext/mysqlnd/mysqlnd_wireprotocol.h
ext/mysqlnd/php_mysqlnd.c
ext/pdo_mysql/pdo_mysql.c

index a57e42e6bdb83012097cc87fa0bfea5bb4d11658..46600ab2d2ef9cef47cb1ac542ce26bd1f900773 100644 (file)
@@ -1,8 +1,8 @@
 --TEST--
 phpinfo() mysql section
 --SKIPIF--
-<?php 
-require_once('skipif.inc'); 
+<?php
+require_once('skipif.inc');
 require_once('skipifconnectfailure.inc');
 ?>
 --FILE--
@@ -62,8 +62,7 @@ if ($IS_MYSQLND) {
                'connect_failure', 'connection_reused', 'explicit_close', 'implicit_close',
                'disconnect_close', 'in_middle_of_command_close', 'explicit_free_result',
                'implicit_free_result', 'explicit_stmt_close', 'implicit_stmt_close',
-               'put_hits', 'put_misses', 'get_hits', 'get_misses',
-               'size', 'free_items', 'references', 'mysql.cache_size',
+               'size',
        );
        foreach ($expected as $k => $entry)
                if (!stristr($phpinfo, $entry))
index 80e3759640b87f470aeb80ba71774a31096dab00..0f5bc71c63282b8e6cd68e918fa2fb0d917caae8 100644 (file)
@@ -32,7 +32,6 @@
 #include "ext/standard/php_string.h"
 #include "php_mysqli_structs.h"
 #include "zend_exceptions.h"
-#include "ext/mysqlnd/mysqlnd_portability.h"
 
 ZEND_DECLARE_MODULE_GLOBALS(mysqli)
 static PHP_GINIT_FUNCTION(mysqli);
index de07e841d56fa26df00c34a25e1c8379896f8c86..43b60848ca362dada91b6802906f1cdd3d05b0da 100644 (file)
@@ -31,7 +31,6 @@
 #include "php_globals.h"
 #include "ext/standard/info.h"
 #include "php_mysqli_structs.h"
-#include "ext/mysqlnd/mysqlnd_portability.h"
 
 /* {{{ proto mixed mysqli_affected_rows(object link)
    Get number of affected rows in previous MySQL operation */
@@ -1760,7 +1759,7 @@ PHP_FUNCTION(mysqli_prepare)
                        memcpy(last_error, stmt->stmt->last_error, MYSQL_ERRMSG_SIZE);
                        memcpy(sqlstate, mysql->mysql->net.sqlstate, SQLSTATE_LENGTH+1);
 #else
-                       mysqlnd_error_info error_info = mysql->mysql->error_info;
+                       MYSQLND_ERROR_INFO error_info = mysql->mysql->error_info;
 #endif
                        mysqli_stmt_close(stmt->stmt, FALSE);
                        stmt->stmt = NULL;
index 592435a35358fd3f5f6a06ee3a71dab0f143ac7e..84fb7c81ae70b5be118c589133154f451f30309d 100644 (file)
@@ -1,9 +1,9 @@
 /*
-  +----------------------------------------------------------------------+
+  ----------------------------------------------------------------------
   | PHP Version 6                                                        |
-  +----------------------------------------------------------------------+
+  ----------------------------------------------------------------------
   | Copyright (c) 2007 The PHP Group                                     |
-  +----------------------------------------------------------------------+
+  ----------------------------------------------------------------------
   | 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        |
   | available through the world-wide-web at the following url:           |
   | If you did not receive a copy of the PHP license and are unable to   |
   | obtain it through the world-wide-web, please send a note to          |
   | license@php.net so we can mail you a copy immediately.               |
-  +----------------------------------------------------------------------+
+  ----------------------------------------------------------------------
   | Authors: Georg Richter <georg@mysql.com>                             |
   |          Andrey Hristov <andrey@mysql.com>                           |
   |          Ulf Wendel <uwendel@mysql.com>                              |
-  +----------------------------------------------------------------------+
+  ----------------------------------------------------------------------
 
 */
 
+#ifndef MYSQLI_LIBMYSQL_H
+#define MYSQLI_LIBMYSQL_H
+
 /* These are unused */
 #define MYSQLI_CLOSE_EXPLICIT 0
 #define MYSQLI_CLOSE_IMPLICIT 1
 #define mysqli_free_result(r, is_forced)       mysql_free_result((r))
 #define mysqli_change_user_silent(c, u, p, d)   mysql_change_user((c), (u), (p), (d))
 
+
+/*
+  These functions also reside in ext/mysqlnd/mysqlnd_portability.h but since it is only made
+  available if one wants to build mysqli against mysqlnd and they are useful for libmysql as 
+  well, we check whether they're not defined [build with libmysql is desired] and define them.
+
+  Bit values are sent in reverted order of bytes, compared to normal !!!
+*/
+
+
+#ifndef uint1korr
+#define uint1korr(A)   (*(((uint8_t*)(A))))
+#endif
+
+#ifndef bit_uint2korr
+#define bit_uint2korr(A) ((uint16_t) (((uint16_t) (((unsigned char*) (A))[1])) +\
+                                   ((uint16_t) (((unsigned char*) (A))[0]) << 8)))
+#endif
+
+#ifndef bit_uint3korr
+#define bit_uint3korr(A) ((uint32_t) (((uint32_t) (((unsigned char*) (A))[2])) +\
+                                   (((uint32_t) (((unsigned char*) (A))[1])) << 8) +\
+                                   (((uint32_t) (((unsigned char*) (A))[0])) << 16)))
+#endif
+
+#ifndef bit_uint4korr
+#define bit_uint4korr(A) ((uint32_t) (((uint32_t) (((unsigned char*) (A))[3])) +\
+                                   (((uint32_t) (((unsigned char*) (A))[2])) << 8) +\
+                                   (((uint32_t) (((unsigned char*) (A))[1])) << 16) +\
+                                   (((uint32_t) (((unsigned char*) (A))[0])) << 24)))
+#endif
+
+#ifndef bit_uint5korr
+#define bit_uint5korr(A) ((uint64_t)(((uint32_t) (((unsigned char*) (A))[4])) +\
+                                    (((uint32_t) (((unsigned char*) (A))[3])) << 8) +\
+                                    (((uint32_t) (((unsigned char*) (A))[2])) << 16) +\
+                                   (((uint32_t) (((unsigned char*) (A))[1])) << 24)) +\
+                                    (((uint64_t) (((unsigned char*) (A))[0])) << 32))
+#endif
+
+#ifndef bit_uint6korr
+#define bit_uint6korr(A) ((uint64_t)(((uint32_t) (((unsigned char*) (A))[5])) +\
+                                    (((uint32_t) (((unsigned char*) (A))[4])) << 8) +\
+                                    (((uint32_t) (((unsigned char*) (A))[3])) << 16) +\
+                                    (((uint32_t) (((unsigned char*) (A))[2])) << 24)) +\
+                        (((uint64_t) (((uint32_t) (((unsigned char*) (A))[1])) +\
+                                    (((uint32_t) (((unsigned char*) (A))[0]) << 8)))) <<\
+                                     32))
+#endif
+
+#ifndef bit_uint7korr
+#define bit_uint7korr(A) ((uint64_t)(((uint32_t) (((unsigned char*) (A))[6])) +\
+                                    (((uint32_t) (((unsigned char*) (A))[5])) << 8) +\
+                                    (((uint32_t) (((unsigned char*) (A))[4])) << 16) +\
+                                   (((uint32_t) (((unsigned char*) (A))[3])) << 24)) +\
+                        (((uint64_t) (((uint32_t) (((unsigned char*) (A))[2])) +\
+                                    (((uint32_t) (((unsigned char*) (A))[1])) << 8) +\
+                                    (((uint32_t) (((unsigned char*) (A))[0])) << 16))) <<\
+                                     32))
+#endif
+
+#ifndef bit_uint8korr
+#define bit_uint8korr(A) ((uint64_t)(((uint32_t) (((unsigned char*) (A))[7])) +\
+                                    (((uint32_t) (((unsigned char*) (A))[6])) << 8) +\
+                                    (((uint32_t) (((unsigned char*) (A))[5])) << 16) +\
+                                    (((uint32_t) (((unsigned char*) (A))[4])) << 24)) +\
+                        (((uint64_t) (((uint32_t) (((unsigned char*) (A))[3])) +\
+                                    (((uint32_t) (((unsigned char*) (A))[2])) << 8) +\
+                                    (((uint32_t) (((unsigned char*) (A))[1])) << 16) +\
+                                    (((uint32_t) (((unsigned char*) (A))[0])) << 24))) <<\
+                                    32))
+#endif
+
+#endif /* MYSQLI_LIBMYSQL_H */
+
index 121db7725340e5e779cb1681107df1cbd1611a36..1468ef224446054f4fa3f793f83bba034d44dd85 100644 (file)
@@ -23,6 +23,7 @@
 #define MYSQLI_MYSQLND_H
 
 #include "ext/mysqlnd/mysqlnd_libmysql_compat.h"
+#include "ext/mysqlnd/mysqlnd_portability.h"
 
 /* Here comes non-libmysql API to have less ifdefs in mysqli*/
 #define MYSQLI_CLOSE_EXPLICIT                  MYSQLND_CLOSE_EXPLICIT
index 87e5f84c1839fb0f2f23407137d750a87df86fc6..9cbf8d2607fa5ec8de5b559a195b80c7ebe0023b 100644 (file)
@@ -486,7 +486,7 @@ PHP_FUNCTION(mysqli_multi_query)
                strcpy(s_sqlstate, mysql_sqlstate(mysql->mysql));
                s_errno = mysql_errno(mysql->mysql);
 #else
-               mysqlnd_error_info error_info = mysql->mysql->error_info;
+               MYSQLND_ERROR_INFO error_info = mysql->mysql->error_info;
 #endif
                MYSQLI_REPORT_MYSQL_ERROR(mysql->mysql);
                MYSQLI_DISABLE_MQ;
index 899d353f4a04446c084142a77fbc2cb324f347c4..2636abdfddcf4270bbec3f56c18a0b90326f5047 100644 (file)
@@ -30,9 +30,14 @@ new mysqli()
 
                        if (!$res = $mysqli->query("SELECT 'mysqli.default_socket' AS testing"))
                                printf("[001] [%d] %s\n", $mysqli->errno, $mysqli->error);
-                       var_dump($res->fetch_assoc());
+                       $tmp = $res->fetch_assoc();
                        $res->free_result();
 
+                       if (!isset($tmp['testing']) || $tmp['testing'] != $socket) {
+                               printf("[002] mysqli.default_socket not properly set?\n");
+                               var_dump($tmp);
+                       }
+
                        $mysqli->close();
 
                } catch (mysqli_sql_exception $e) {
@@ -149,10 +154,6 @@ new mysqli()
        print "done!";
 ?>
 --EXPECTF--
-array(1) {
-  [%u|b%"testing"]=>
-  %unicode|string%(21) "mysqli.default_socket"
-}
 array(1) {
   [%u|b%"testing"]=>
   %unicode|string%(19) "mysqli.default_port"
index 23f5772217a5ed154962c4e347225df799bb3f48..32a259350adab40589d526775556cc4ca748d934 100644 (file)
@@ -117,7 +117,9 @@ require_once('skipifconnectfailure.inc');
        if (($version > 51122 && $version < 60000) || ($version > 60003) || $IS_MYSQLND) {
                $expected_constants['MYSQLI_ON_UPDATE_NOW_FLAG'] = true;
        }
-       if ($version > 60005 || $IS_MYSQLND) {
+
+       /* First introduced in MySQL 6.0, backported to MySQL 5.5 */
+       if ($version >= 50500 || $IS_MYSQLND) {
                $expected_constants['MYSQLI_SERVER_QUERY_WAS_SLOW'] = true;
        }
 
diff --git a/ext/mysqli/tests/mysqli_get_cache_stats.phpt b/ext/mysqli/tests/mysqli_get_cache_stats.phpt
deleted file mode 100644 (file)
index 572be47..0000000
+++ /dev/null
@@ -1,116 +0,0 @@
---TEST--
-mysqli_get_cache_stats()
---XFAIL--
-zval caching has been temporarily disabled for the 5.3.0 release
---INI--
-mysqlnd.collect_statistics="1"
-mysqlnd.collect_memory_statistics="1"
---SKIPIF--
-<?PHP
-require_once('skipif.inc');
-require_once('skipifemb.inc');
-require_once('skipifconnectfailure.inc');
-if (!function_exists('mysqli_get_cache_stats')) {
-       die("skip only available with mysqlnd");
-}
-?>
---FILE--
-<?php
-       $tmp = $link = null;
-       if (!is_null($tmp = @mysqli_get_cache_stats($link)))
-               printf("[001] Expecting NULL, got %s/%s\n", gettype($tmp), $tmp);
-
-       require_once("connect.inc");
-
-       if (!is_array($info = mysqli_get_cache_stats()) || empty($info))
-               printf("[002] Expecting array/any_non_empty, got %s/%s\n", gettype($info), $info);
-
-       var_dump($info);
-
-       if ($info["size"] !== $info['free_items'])
-               printf("[003] Unused cache should have size (%d) == free_items (%d)\n",
-                       $info["size"], $info['free_items']);
-
-       require_once('table.inc');
-
-       if (!is_array($new_info = mysqli_get_cache_stats()) || empty($new_info))
-               printf("[004] Expecting array/any_non_empty, got %s/%s\n", gettype($new_info), $new_info);
-
-       if ($info['size'] !== $new_info['size'])
-               printf("[005] Cache size should not have changes! Expecting int/%d, got %s/%d\n",
-                       $info['size'], gettype($new_info['size']), $new_info['size']);
-
-       if (count($info) != count($new_info)) {
-               printf("[006] Both arrays should have the same number of entries\n");
-               var_dump($info);
-               var_dump($new_info);
-       }
-
-       if (!$res = mysqli_real_query($link, "SELECT id, label FROM test ORDER BY id"))
-               printf("[007] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
-
-       if (!is_object($res = mysqli_use_result($link)))
-               printf("[008] Expecting object, got %s/%s. [%d] %s\n",
-                       gettype($res), $res, mysqli_errno($link), mysqli_error($link));
-
-       if (!$row = mysqli_fetch_assoc($res))
-               printf("[009] There should be at least one row in the test table for this test, [%d] %s\n",
-                       mysqli_errno($link), mysqli_error($link));
-
-       if (!is_array($new_info = mysqli_get_cache_stats()) || empty($new_info))
-               printf("[010] Expecting array/any_non_empty, got %s/%s\n", gettype($new_info), $new_info);
-
-       if ($new_info['get_hits'] <= $info['get_hits'])
-               printf("[011] get_hits should have increased, %d (new) <= %d (old)!\n",
-                       $new_info['get_hits'], $info['get_hits']);
-
-       if (!$row = mysqli_fetch_assoc($res))
-               printf("[012] There should be two rows in the test table for this test, [%d] %s\n",
-                       mysqli_errno($link), mysqli_error($link));
-
-       if (!is_array($new_info = mysqli_get_cache_stats()) || empty($new_info))
-               printf("[013] Expecting array/any_non_empty, got %s/%s\n", gettype($new_info), $new_info);
-
-       if ($new_info['put_misses'] <= $info['put_misses'])
-               printf("[014] put_misses should have increased, %d (new) <= %d (old)!\n",
-                       $new_info['put_misses'], $info['put_misses']);
-
-       if ($new_info['references'] < $info['references'] + 2)
-               printf("[015] reference counter should have increased, %d (new) < %d + 2 (old)!\n",
-                       $new_info['references'], $info['references']);
-
-       unset($row);
-       mysqli_free_result($res);
-
-       if (!is_array($info = mysqli_get_cache_stats()) || empty($info))
-               printf("[016] Expecting array/any_non_empty, got %s/%s\n", gettype($info), $info);
-
-       if ($info['free_items'] <= $new_info['free_items'])
-               printf("[017] Looks like cached entries never get free'd.\n");
-
-       mysqli_close($link);
-
-       print "done!";
-?>
---CLEAN--
-<?php
-       require_once("clean_table.inc");
-?>
---EXPECTF--
-array(7) {
-  [%u|b%"put_hits"]=>
-  int(0)
-  [%u|b%"put_misses"]=>
-  int(0)
-  [%u|b%"get_hits"]=>
-  int(0)
-  [%u|b%"get_misses"]=>
-  int(0)
-  [%u|b%"size"]=>
-  int(%d)
-  [%u|b%"free_items"]=>
-  int(%d)
-  [%u|b%"references"]=>
-  int(%d)
-}
-done!
\ No newline at end of file
diff --git a/ext/mysqli/tests/mysqli_get_cache_stats_free_buffered.phpt b/ext/mysqli/tests/mysqli_get_cache_stats_free_buffered.phpt
deleted file mode 100644 (file)
index a1feed0..0000000
+++ /dev/null
@@ -1,98 +0,0 @@
---TEST--
-mysqli_get_cache_stats() - freeing for buffered result sets
---XFAIL--
-zval caching has been temporarily disabled for the 5.3.0 release
---INI--
-mysqlnd.collect_statistics="1"
-mysqlnd.collect_memory_statistics="1"
---SKIPIF--
-<?PHP
-require_once('skipif.inc');
-require_once('skipifemb.inc');
-require_once('skipifconnectfailure.inc');
-if (!function_exists('mysqli_get_cache_stats')) {
-       die("skip only available with mysqlnd");
-}
-?>
---FILE--
-<?php
-       require_once('table.inc');
-
-       if (!is_array($info = mysqli_get_cache_stats()) || empty($info))
-               printf("[001] Expecting array/any_non_empty, got %s/%s\n", gettype($info), $info);
-
-       if (!$res = mysqli_query($link, "SELECT id, label FROM test ORDER BY id"))
-               printf("[002] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
-
-       $rows = array();
-       while ($rows[] = mysqli_fetch_assoc($res))
-               ;
-       mysqli_free_result($res);
-
-       if (!is_array($new_info = mysqli_get_cache_stats()) || empty($new_info))
-               printf("[003] Expecting array/any_non_empty, got %s/%s\n", gettype($new_info), $new_info);
-
-       if ($new_info['free_items'] >= $info['free_items']) {
-               printf("[004] mysqli_free_result() should not yet have free slots again, because \$rows still exists\n");
-               var_dump($info);
-                       var_dump($new_info);
-       }
-
-       /* nothing should change because GC will happen some time after free_result */
-       unset($rows);
-
-       if (!is_array($new_info = mysqli_get_cache_stats()) || empty($new_info))
-               printf("[005] Expecting array/any_non_empty, got %s/%s\n", gettype($new_info), $new_info);
-
-       if (defined("WE_HAVE_GARBAGE_COLLECTOR_TO_FREE_AFTER_ON_UNSET_AFTER_FREE_RESULT")) {
-               /*
-                       For now we can't reclaim the slots after the free_result is called.
-                       unset() should happen before free_result().
-               */
-               if ($new_info['free_items'] < $info['free_items']) {
-                       printf("[006] \$rows has been unset, free item count should be back to the original value\n");
-                       var_dump($info);
-                       var_dump($new_info);
-               }
-       } else {
-               /* We have to reset $info */
-               $info = mysqli_get_cache_stats();
-       }
-
-       if (!$res = mysqli_query($link, "SELECT id, label FROM test ORDER BY id"))
-               printf("[007] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
-
-       $rows = array();
-       while ($rows[] = mysqli_fetch_assoc($res))
-               ;
-       unset($rows);
-       mysqli_free_result($res);
-
-       if (!is_array($new_info = mysqli_get_cache_stats()) || empty($new_info))
-               printf("[008] Expecting array/any_non_empty, got %s/%s\n", gettype($new_info), $new_info);
-
-       if ($new_info['free_items'] < $info['free_items']) {
-               printf("[009] \$rows has been unset, mysqli_free_result() has been called, free item count should be back to the original value\n");
-               var_dump($info);
-               var_dump($new_info);
-       }
-
-       mysqli_close($link);
-
-       if (!is_array($new_info = mysqli_get_cache_stats()) || empty($new_info))
-               printf("[010] Expecting array/any_non_empty, got %s/%s\n", gettype($new_info), $new_info);
-
-       if ($new_info['free_items'] < $info['free_items']) {
-               printf("[011] connection has been closed, free item count should be back to the original value\n");
-               var_dump($info);
-               var_dump($new_info);
-       }
-
-       print "done!";
-?>
---CLEAN--
-<?php
-       require_once("clean_table.inc");
-?>
---EXPECTF--
-done!
\ No newline at end of file
index 777610ee8b5ab9bd0a61ba698f54ae91afc4bfe8..725636e146231c1e8040a8eaa51be8a8bc8607b2 100644 (file)
@@ -4,6 +4,18 @@ INSERT and packet overflow
 <?php
 require_once('skipif.inc');
 require_once('skipifconnectfailure.inc');
+
+if (!$link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket))
+       die(sprintf("SKIP [%d] %s\n", mysqli_connect_errno(), mysqli_connect_error()));
+
+$max_len = pow(2, 24);
+if (!$res = mysqli_query($link, "SHOW GLOBAL VARIABLES LIKE 'max_allowed_packet'"))
+       die(sprintf("SKIP [%d] %s\n", mysqli_errno($link), mysqli_error($link)));
+
+if (!mysqli_query($link, "SET NAMES 'latin1'"))
+       die(sprintf("SKIP [%d] %s\n", mysqli_errno($link), mysqli_error($link)));
+
+mysqli_close($link);
 ?>
 --INI--
 memory_limit=256M
@@ -33,45 +45,48 @@ memory_limit=256M
        if (!$link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket))
                printf("[006] [%d] %s\n", mysqli_connect_errno(), mysqli_connect_error());
 
+       if (!mysqli_query($link, "SET NAMES 'latin1'"))
+               printf("[007] [%d] %s\n", mysqli_connect_errno(), mysqli_connect_error());
+
        if (!$res = mysqli_query($link, "SHOW GLOBAL VARIABLES LIKE 'max_allowed_packet'"))
-               printf("[007] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
+               printf("[008] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
 
        if (!$row = mysqli_fetch_assoc($res))
-               printf("[008] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
+               printf("[009] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
 
        mysqli_free_result($res);
 
        if (0 === ($max_allowed_packet = (int)$row['Value']))
-               printf("[009] Cannot determine max_allowed_packet size and/or bogus max_allowed_packet setting used.\n");
+               printf("[010] Cannot determine max_allowed_packet size and/or bogus max_allowed_packet setting used.\n");
 
        $max_len = pow(2, 24);
        if ($max_allowed_packet < $max_len) {
-               printf("[010] Failed to change max_allowed_packet");
+               printf("[011] Failed to change max_allowed_packet");
        }
 
        if (!mysqli_query($link, "CREATE TABLE test(col_blob LONGBLOB) ENGINE=" . $engine))
-               printf("[011] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
+               printf("[012] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
 
        $query_prefix = 'INSERT INTO test(col_blob) VALUES ("';
        $query_postfix = '")';
        $query_len = strlen($query_prefix) + strlen($query_postfix);
-       $com_query_len = 1;
+       $com_query_len = 2;
 
 
        $blob = str_repeat('a', $max_len - $com_query_len - $query_len);
        $query = sprintf("%s%s%s", $query_prefix, $blob, $query_postfix);
 
        if (!mysqli_query($link, $query))
-               printf("[012] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
+               printf("[013] max_allowed_packet = %d, strlen(query) = %d, [%d] %s\n", $max_allowed_packet, strlen($query), mysqli_errno($link), mysqli_error($link));
 
        if (!$res = mysqli_query($link, "SELECT col_blob FROM test"))
-               printf("[013] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
+               printf("[014] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
 
        if (!$row = mysqli_fetch_assoc($res)) {
-               printf("[014] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
+               printf("[015] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
        } else {
                if ($row['col_blob'] != $blob) {
-                       printf("[015] Blob seems wrong, dumping data\n");
+                       printf("[016] Blob seems wrong, dumping data\n");
                        var_dump(strlen($row['col_blob']));
                        var_dump(strlen($blob));
                }
@@ -79,7 +94,7 @@ memory_limit=256M
        }
 
        if (!mysqli_query($link, "SET GLOBAL max_allowed_packet = " . $org_max_allowed_packet))
-               printf("[016] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
+               printf("[017] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
 
        mysqli_close($link);
 
index 14fdfcd650ce9e1f919c90c4dd11010dd2415264..d60636ae4077901c764103d21937fe53cc424306 100644 (file)
@@ -57,8 +57,7 @@ require_once('skipifconnectfailure.inc');
                        'connect_failure', 'connection_reused', 'explicit_close', 'implicit_close',
                        'disconnect_close', 'in_middle_of_command_close', 'explicit_free_result',
                        'implicit_free_result', 'explicit_stmt_close', 'implicit_stmt_close',
-                       'put_hits', 'put_misses', 'get_hits', 'get_misses',
-                       'size', 'free_items', 'references', 'mysqli.cache_size',
+                       'size',
                        'mysqli.allow_local_infile',
                        'mysqli.allow_persistent', 'mysqli.max_persistent'
                );
index e76d9ab05ec2f956e069d65302a5cfb6b22357aa..bf3f475a5a4c05cd02863e7e00cf98ebb75e806a 100644 (file)
@@ -57,11 +57,11 @@ extern MYSQLND_CHARSET *mysqlnd_charsets;
 
 
 
-const char * const mysqlnd_old_passwd  = "mysqlnd cannot connect to MySQL 4.1+ using old authentication";
-const char * const mysqlnd_server_gone = "MySQL server has gone away";
-const char * const mysqlnd_out_of_sync = "Commands out of sync; you can't run this command now";
+PHPAPI const char * const mysqlnd_old_passwd  = "mysqlnd cannot connect to MySQL 4.1+ using old authentication";
+PHPAPI const char * const mysqlnd_server_gone = "MySQL server has gone away";
+PHPAPI const char * const mysqlnd_out_of_sync = "Commands out of sync; you can't run this command now";
 
-MYSQLND_STATS *mysqlnd_global_stats = NULL;
+PHPAPI MYSQLND_STATS *mysqlnd_global_stats = NULL;
 static zend_bool mysqlnd_library_initted = FALSE;
 
 static enum_func_status mysqlnd_send_close(MYSQLND * conn TSRMLS_DC);
@@ -69,7 +69,7 @@ static enum_func_status mysqlnd_send_close(MYSQLND * conn TSRMLS_DC);
 static struct st_mysqlnd_conn_methods *mysqlnd_conn_methods;
 
 /* {{{ mysqlnd_library_end */
-void mysqlnd_library_end(TSRMLS_D)
+PHPAPI void mysqlnd_library_end(TSRMLS_D)
 {
        if (mysqlnd_library_initted == TRUE) {
                mysqlnd_stats_end(mysqlnd_global_stats);
@@ -222,6 +222,16 @@ MYSQLND_METHOD_PRIVATE(mysqlnd_conn, dtor)(MYSQLND *conn TSRMLS_DC)
                conn->net = NULL;
        }
 
+       if (conn->protocol) {
+               DBG_INF("Freeing protocol");
+               mysqlnd_protocol_free(conn->protocol TSRMLS_CC);
+               conn->protocol = NULL;
+       }
+
+       if (conn->stats) {
+               mysqlnd_stats_end(conn->stats);
+       }
+
        mnd_pefree(conn, conn->persistent);
 
        DBG_VOID_RETURN;
@@ -231,7 +241,7 @@ MYSQLND_METHOD_PRIVATE(mysqlnd_conn, dtor)(MYSQLND *conn TSRMLS_DC)
 
 /* {{{ mysqlnd_conn::simple_command_handle_response */
 static enum_func_status
-MYSQLND_METHOD(mysqlnd_conn, simple_command_handle_response)(MYSQLND *conn, enum php_mysql_packet_type ok_packet,
+MYSQLND_METHOD(mysqlnd_conn, simple_command_handle_response)(MYSQLND *conn, enum mysqlnd_packet_type ok_packet,
                                                                                                                         zend_bool silent, enum php_mysqlnd_server_command command,
                                                                                                                         zend_bool ignore_upsert_status TSRMLS_DC)
 {
@@ -242,9 +252,8 @@ MYSQLND_METHOD(mysqlnd_conn, simple_command_handle_response)(MYSQLND *conn, enum
 
        switch (ok_packet) {
                case PROT_OK_PACKET:{
-                       php_mysql_packet_ok ok_response;
-                       PACKET_INIT_ALLOCA(ok_response, PROT_OK_PACKET);
-                       if (FAIL == (ret = PACKET_READ_ALLOCA(ok_response, conn))) {
+                       MYSQLND_PACKET_OK * ok_response = conn->protocol->m.get_ok_packet(conn->protocol, FALSE TSRMLS_CC);
+                       if (FAIL == (ret = PACKET_READ(ok_response, conn))) {
                                if (!silent) {
                                        DBG_ERR_FMT("Error while reading %s's OK packet", mysqlnd_command_to_text[command]);
                                        php_error_docref(NULL TSRMLS_CC, E_WARNING, "Error while reading %s's OK packet. PID=%d",
@@ -252,10 +261,9 @@ MYSQLND_METHOD(mysqlnd_conn, simple_command_handle_response)(MYSQLND *conn, enum
                                }
                        } else {
                                DBG_INF_FMT("OK from server");
-                               if (0xFF == ok_response.field_count) {
+                               if (0xFF == ok_response->field_count) {
                                        /* The server signalled error. Set the error */
-                                       SET_CLIENT_ERROR(conn->error_info, ok_response.error_no,
-                                                                        ok_response.sqlstate, ok_response.error);
+                                       SET_CLIENT_ERROR(conn->error_info, ok_response->error_no, ok_response->sqlstate, ok_response->error);
                                        ret = FAIL;
                                        /*
                                          Cover a protocol design error: error packet does not
@@ -270,24 +278,23 @@ MYSQLND_METHOD(mysqlnd_conn, simple_command_handle_response)(MYSQLND *conn, enum
                                        SET_ERROR_AFF_ROWS(conn);
                                } else {
                                        SET_NEW_MESSAGE(conn->last_message, conn->last_message_len,
-                                                                       ok_response.message, ok_response.message_len,
+                                                                       ok_response->message, ok_response->message_len,
                                                                        conn->persistent);
 
                                        if (!ignore_upsert_status) {
-                                               conn->upsert_status.warning_count = ok_response.warning_count;
-                                               conn->upsert_status.server_status = ok_response.server_status;
-                                               conn->upsert_status.affected_rows = ok_response.affected_rows;
-                                               conn->upsert_status.last_insert_id = ok_response.last_insert_id;
+                                               conn->upsert_status.warning_count = ok_response->warning_count;
+                                               conn->upsert_status.server_status = ok_response->server_status;
+                                               conn->upsert_status.affected_rows = ok_response->affected_rows;
+                                               conn->upsert_status.last_insert_id = ok_response->last_insert_id;
                                        }
                                }
                        }
-                       PACKET_FREE_ALLOCA(ok_response);
+                       PACKET_FREE(ok_response);
                        break;
                }
                case PROT_EOF_PACKET:{
-                       php_mysql_packet_eof ok_response;
-                       PACKET_INIT_ALLOCA(ok_response, PROT_EOF_PACKET);
-                       if (FAIL == (ret = PACKET_READ_ALLOCA(ok_response, conn))) {
+                       MYSQLND_PACKET_EOF * ok_response = conn->protocol->m.get_eof_packet(conn->protocol, FALSE TSRMLS_CC);
+                       if (FAIL == (ret = PACKET_READ(ok_response, conn))) {
                                SET_CLIENT_ERROR(conn->error_info, CR_MALFORMED_PACKET, UNKNOWN_SQLSTATE,
                                                                 "Malformed packet");
                                if (!silent) {
@@ -295,24 +302,23 @@ MYSQLND_METHOD(mysqlnd_conn, simple_command_handle_response)(MYSQLND *conn, enum
                                        php_error_docref(NULL TSRMLS_CC, E_WARNING, "Error while reading %s's EOF packet. PID=%d",
                                                                        mysqlnd_command_to_text[command], getpid());
                                }
-                       } else if (0xFF == ok_response.field_count) {
+                       } else if (0xFF == ok_response->field_count) {
                                /* The server signalled error. Set the error */
-                               SET_CLIENT_ERROR(conn->error_info, ok_response.error_no,
-                                                                ok_response.sqlstate, ok_response.error);
+                               SET_CLIENT_ERROR(conn->error_info, ok_response->error_no, ok_response->sqlstate, ok_response->error);
                                SET_ERROR_AFF_ROWS(conn);
-                       } else if (0xFE != ok_response.field_count) {
+                       } else if (0xFE != ok_response->field_count) {
                                SET_CLIENT_ERROR(conn->error_info, CR_MALFORMED_PACKET, UNKNOWN_SQLSTATE,
                                                                 "Malformed packet");
                                if (!silent) {
-                                       DBG_ERR_FMT("EOF packet expected, field count wasn't 0xFE but 0x%2X", ok_response.field_count);
+                                       DBG_ERR_FMT("EOF packet expected, field count wasn't 0xFE but 0x%2X", ok_response->field_count);
                                        php_error_docref(NULL TSRMLS_CC, E_WARNING,
                                                                        "EOF packet expected, field count wasn't 0xFE but 0x%2X",
-                                                                       ok_response.field_count);
+                                                                       ok_response->field_count);
                                }
                        } else {
                                DBG_INF_FMT("OK from server");
                        }
-                       PACKET_FREE_ALLOCA(ok_response);
+                       PACKET_FREE(ok_response);
                        break;
                }
                default:
@@ -332,11 +338,11 @@ MYSQLND_METHOD(mysqlnd_conn, simple_command_handle_response)(MYSQLND *conn, enum
 /* {{{ mysqlnd_conn::simple_command */
 static enum_func_status
 MYSQLND_METHOD(mysqlnd_conn, simple_command)(MYSQLND *conn, enum php_mysqlnd_server_command command,
-                          const char * const arg, size_t arg_len, enum php_mysql_packet_type ok_packet, zend_bool silent,
+                          const char * const arg, size_t arg_len, enum mysqlnd_packet_type ok_packet, zend_bool silent,
                           zend_bool ignore_upsert_status TSRMLS_DC)
 {
        enum_func_status ret = PASS;
-       php_mysql_packet_command cmd_packet;
+       MYSQLND_PACKET_COMMAND * cmd_packet;
 
        DBG_ENTER("mysqlnd_conn::simple_command");
        DBG_INF_FMT("command=%s ok_packet=%d silent=%d", mysqlnd_command_to_text[command], ok_packet, silent);
@@ -362,16 +368,16 @@ MYSQLND_METHOD(mysqlnd_conn, simple_command)(MYSQLND *conn, enum php_mysqlnd_ser
        SET_ERROR_AFF_ROWS(conn);
        SET_EMPTY_ERROR(conn->error_info);
 
-       PACKET_INIT_ALLOCA(cmd_packet, PROT_CMD_PACKET);
-       cmd_packet.command = command;
+       cmd_packet = conn->protocol->m.get_command_packet(conn->protocol, FALSE TSRMLS_CC);
+       cmd_packet->command = command;
        if (arg && arg_len) {
-               cmd_packet.argument = arg;
-               cmd_packet.arg_len  = arg_len;
+               cmd_packet->argument = arg;
+               cmd_packet->arg_len  = arg_len;
        }
 
-       MYSQLND_INC_CONN_STATISTIC(&conn->stats, STAT_COM_QUIT + command - 1 /* because of COM_SLEEP */ );
+       MYSQLND_INC_CONN_STATISTIC(conn->stats, STAT_COM_QUIT + command - 1 /* because of COM_SLEEP */ );
 
-       if (! PACKET_WRITE_ALLOCA(cmd_packet, conn)) {
+       if (! PACKET_WRITE(cmd_packet, conn)) {
                if (!silent) {
                        DBG_ERR_FMT("Error while sending %s packet", mysqlnd_command_to_text[command]);
                        php_error(E_WARNING, "Error while sending %s packet. PID=%d", mysqlnd_command_to_text[command], getpid());
@@ -382,12 +388,7 @@ MYSQLND_METHOD(mysqlnd_conn, simple_command)(MYSQLND *conn, enum php_mysqlnd_ser
                ret = conn->m->simple_command_handle_response(conn, ok_packet, silent, command, ignore_upsert_status TSRMLS_CC);
        }
 
-       /*
-         There is no need to call FREE_ALLOCA on cmd_packet as the
-         only allocated string is cmd_packet.argument and it was passed
-         to us. We should not free it.
-       */
-
+       PACKET_FREE(cmd_packet);
        DBG_INF(ret == PASS ? "PASS":"FAIL");
        DBG_RETURN(ret);
 }
@@ -414,16 +415,7 @@ MYSQLND_METHOD(mysqlnd_conn, set_server_option)(MYSQLND * const conn,
 PHPAPI void _mysqlnd_restart_psession(MYSQLND *conn TSRMLS_DC)
 {
        DBG_ENTER("_mysqlnd_restart_psession");
-       MYSQLND_INC_CONN_STATISTIC(&conn->stats, STAT_CONNECT_REUSED);
-       /* Free here what should not be seen by the next script */
-       if (conn->last_message) {
-               mnd_pefree(conn->last_message, conn->persistent);
-               conn->last_message = NULL;
-       }
-       /*
-         The thd zval cache is always freed on request shutdown, so this has happened already.
-         Don't touch the old value! Get new reference
-       */
+       conn->m->restart_psession(conn TSRMLS_CC);
        DBG_VOID_RETURN;
 }
 /* }}} */
@@ -433,10 +425,36 @@ PHPAPI void _mysqlnd_restart_psession(MYSQLND *conn TSRMLS_DC)
 PHPAPI void _mysqlnd_end_psession(MYSQLND *conn TSRMLS_DC)
 {
        DBG_ENTER("_mysqlnd_end_psession");
+       conn->m->end_psession(conn TSRMLS_CC);
        DBG_VOID_RETURN;
 }
 /* }}} */
 
+/* {{{ mysqlnd_conn::restart_psession */
+static enum_func_status
+MYSQLND_METHOD(mysqlnd_conn, restart_psession)(MYSQLND * conn TSRMLS_DC)
+{
+       DBG_ENTER("mysqlnd_conn::restart_psession");
+       MYSQLND_INC_CONN_STATISTIC(conn->stats, STAT_CONNECT_REUSED);
+       /* Free here what should not be seen by the next script */
+       if (conn->last_message) {
+               mnd_pefree(conn->last_message, conn->persistent);
+               conn->last_message = NULL;
+       }
+       DBG_RETURN(PASS);
+}
+/* }}} */
+
+
+/* {{{ mysqlnd_conn::end_psession */
+static enum_func_status
+MYSQLND_METHOD(mysqlnd_conn, end_psession)(MYSQLND * conn TSRMLS_DC)
+{
+       DBG_ENTER("mysqlnd_conn::end_psession");
+       DBG_RETURN(PASS);
+}
+/* }}} */
+
 
 /* {{{ mysqlnd_conn::connect */
 static enum_func_status
@@ -457,9 +475,9 @@ MYSQLND_METHOD(mysqlnd_conn, connect)(MYSQLND *conn,
        zend_bool reconnect = FALSE;
        zend_bool saved_compression = FALSE;
 
-       php_mysql_packet_greet greet_packet;
-       php_mysql_packet_auth *auth_packet;
-       php_mysql_packet_ok ok_packet;
+       MYSQLND_PACKET_GREET * greet_packet = NULL;
+       MYSQLND_PACKET_AUTH * auth_packet = NULL;
+       MYSQLND_PACKET_OK * ok_packet = NULL;
 
        DBG_ENTER("mysqlnd_conn::connect");
 
@@ -472,15 +490,15 @@ MYSQLND_METHOD(mysqlnd_conn, connect)(MYSQLND *conn,
                DBG_INF("Connecting on a connected handle.");
 
                if (CONN_GET_STATE(conn) < CONN_QUIT_SENT) {
-                       MYSQLND_INC_CONN_STATISTIC(&conn->stats, STAT_CLOSE_IMPLICIT);
+                       MYSQLND_INC_CONN_STATISTIC(conn->stats, STAT_CLOSE_IMPLICIT);
                        reconnect = TRUE;
                        mysqlnd_send_close(conn TSRMLS_CC);
                }
 
                conn->m->free_contents(conn TSRMLS_CC);
-               MYSQLND_DEC_CONN_STATISTIC(&conn->stats, STAT_OPENED_CONNECTIONS);
+               MYSQLND_DEC_CONN_STATISTIC(conn->stats, STAT_OPENED_CONNECTIONS);
                if (conn->persistent) {
-                       MYSQLND_DEC_CONN_STATISTIC(&conn->stats, STAT_OPENED_PERSISTENT_CONNECTIONS);
+                       MYSQLND_DEC_CONN_STATISTIC(conn->stats, STAT_OPENED_PERSISTENT_CONNECTIONS);
                }
                /* Now reconnect using the same handle */
                if (conn->net->compressed) {
@@ -527,9 +545,9 @@ MYSQLND_METHOD(mysqlnd_conn, connect)(MYSQLND *conn,
        DBG_INF_FMT("transport=%s", transport);
 
 
-       PACKET_INIT_ALLOCA(greet_packet, PROT_GREET_PACKET);
-       PACKET_INIT(auth_packet, PROT_AUTH_PACKET, php_mysql_packet_auth *, FALSE);
-       PACKET_INIT_ALLOCA(ok_packet, PROT_OK_PACKET);
+       greet_packet = conn->protocol->m.get_greet_packet(conn->protocol, FALSE TSRMLS_CC);
+       auth_packet = conn->protocol->m.get_auth_packet(conn->protocol, FALSE TSRMLS_CC);
+       ok_packet = conn->protocol->m.get_ok_packet(conn->protocol, FALSE TSRMLS_CC);
 
        if (conn->persistent) {
                conn->scheme = pestrndup(transport, transport_len, 1);
@@ -545,30 +563,28 @@ MYSQLND_METHOD(mysqlnd_conn, connect)(MYSQLND *conn,
 
        DBG_INF_FMT("stream=%p", conn->net->stream);
 
-       if (FAIL == PACKET_READ_ALLOCA(greet_packet, conn)) {
+       if (FAIL == PACKET_READ(greet_packet, conn)) {
                DBG_ERR("Error while reading greeting packet");
                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Error while reading greeting packet. PID=%d", getpid());
                goto err;
-       } else if (greet_packet.error_no) {
-               DBG_ERR_FMT("errorno=%d error=%s", greet_packet.error_no, greet_packet.error);
-               SET_CLIENT_ERROR(conn->error_info, greet_packet.error_no,
-                                                greet_packet.sqlstate, greet_packet.error);
+       } else if (greet_packet->error_no) {
+               DBG_ERR_FMT("errorno=%d error=%s", greet_packet->error_no, greet_packet->error);
+               SET_CLIENT_ERROR(conn->error_info, greet_packet->error_no, greet_packet->sqlstate, greet_packet->error);
                goto err;
-       } else if (greet_packet.pre41) {
-               DBG_ERR_FMT("Connecting to 3.22, 3.23 & 4.0 is not supported. Server is %-.32s",
-                                       greet_packet.server_version);
+       } else if (greet_packet->pre41) {
+               DBG_ERR_FMT("Connecting to 3.22, 3.23 & 4.0 is not supported. Server is %-.32s", greet_packet->server_version);
                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Connecting to 3.22, 3.23 & 4.0 "
-                                               " is not supported. Server is %-.32s", greet_packet.server_version);
+                                               " is not supported. Server is %-.32s", greet_packet->server_version);
                SET_CLIENT_ERROR(conn->error_info, CR_NOT_IMPLEMENTED, UNKNOWN_SQLSTATE,
                                                 "Connecting to 3.22, 3.23 & 4.0 servers is not supported");
                goto err;
        }
 
-       conn->thread_id                 = greet_packet.thread_id;
-       conn->protocol_version  = greet_packet.protocol_version;
-       conn->server_version    = pestrdup(greet_packet.server_version, conn->persistent);
+       conn->thread_id                 = greet_packet->thread_id;
+       conn->protocol_version  = greet_packet->protocol_version;
+       conn->server_version    = pestrdup(greet_packet->server_version, conn->persistent);
 
-       conn->greet_charset = mysqlnd_find_charset_nr(greet_packet.charset_no);
+       conn->greet_charset = mysqlnd_find_charset_nr(greet_packet->charset_no);
        /* we allow load data local infile by default */
        mysql_flags  |= CLIENT_LOCAL_FILES | CLIENT_PS_MULTI_RESULTS;
 #ifndef MYSQLND_COMPRESSION_ENABLED
@@ -588,7 +604,7 @@ MYSQLND_METHOD(mysqlnd_conn, connect)(MYSQLND *conn,
 #if PHP_MAJOR_VERSION >= 6
                auth_packet->charset_no = 200;/* utf8 - swedish collation, check mysqlnd_charset.c */
 #else
-               auth_packet->charset_no = greet_packet.charset_no;
+               auth_packet->charset_no = greet_packet->charset_no;
 #endif
        }
        auth_packet->db                 = db;
@@ -597,29 +613,28 @@ MYSQLND_METHOD(mysqlnd_conn, connect)(MYSQLND *conn,
        auth_packet->client_flags= mysql_flags;
 
        conn->scramble = auth_packet->server_scramble_buf = mnd_pemalloc(SCRAMBLE_LENGTH, conn->persistent);
-       memcpy(auth_packet->server_scramble_buf, greet_packet.scramble_buf, SCRAMBLE_LENGTH);
+       memcpy(auth_packet->server_scramble_buf, greet_packet->scramble_buf, SCRAMBLE_LENGTH);
        if (!PACKET_WRITE(auth_packet, conn)) {
                CONN_SET_STATE(conn, CONN_QUIT_SENT);
                SET_CLIENT_ERROR(conn->error_info, CR_SERVER_GONE_ERROR, UNKNOWN_SQLSTATE, mysqlnd_server_gone);
                goto err;
        }
 
-       if (FAIL == PACKET_READ_ALLOCA(ok_packet, conn) || ok_packet.field_count >= 0xFE) {
-               if (ok_packet.field_count == 0xFE) {
+       if (FAIL == PACKET_READ(ok_packet, conn) || ok_packet->field_count >= 0xFE) {
+               if (ok_packet->field_count == 0xFE) {
                        /* old authentication with new server  !*/
                        DBG_ERR(mysqlnd_old_passwd);
                        SET_CLIENT_ERROR(conn->error_info, CR_UNKNOWN_ERROR, UNKNOWN_SQLSTATE, mysqlnd_old_passwd);
-               } else if (ok_packet.field_count == 0xFF) {
-                       if (ok_packet.sqlstate[0]) {
+               } else if (ok_packet->field_count == 0xFF) {
+                       if (ok_packet->sqlstate[0]) {
                                if (!self_alloced) {
-                                       strlcpy(conn->error_info.sqlstate, ok_packet.sqlstate, sizeof(conn->error_info.sqlstate));
+                                       strlcpy(conn->error_info.sqlstate, ok_packet->sqlstate, sizeof(conn->error_info.sqlstate));
                                }
-                               DBG_ERR_FMT("ERROR:%d [SQLSTATE:%s] %s",
-                                                       ok_packet.error_no, ok_packet.sqlstate, ok_packet.error);
+                               DBG_ERR_FMT("ERROR:%d [SQLSTATE:%s] %s", ok_packet->error_no, ok_packet->sqlstate, ok_packet->error);
                        }
                        if (!self_alloced) {
-                               conn->error_info.error_no = ok_packet.error_no;
-                               strlcpy(conn->error_info.error, ok_packet.error, sizeof(conn->error_info.error));
+                               conn->error_info.error_no = ok_packet->error_no;
+                               strlcpy(conn->error_info.error, ok_packet->error, sizeof(conn->error_info.error));
                        }
                }
        } else {
@@ -663,12 +678,12 @@ MYSQLND_METHOD(mysqlnd_conn, connect)(MYSQLND *conn,
                conn->max_packet_size   = auth_packet->max_packet_size;
                /* todo: check if charset is available */
                conn->charset                   = mysqlnd_find_charset_nr(auth_packet->charset_no);
-               conn->server_capabilities = greet_packet.server_capabilities;
+               conn->server_capabilities = greet_packet->server_capabilities;
                conn->upsert_status.warning_count = 0;
-               conn->upsert_status.server_status = greet_packet.server_status;
+               conn->upsert_status.server_status = greet_packet->server_status;
                conn->upsert_status.affected_rows = 0;
                SET_NEW_MESSAGE(conn->last_message, conn->last_message_len,
-                                               ok_packet.message, ok_packet.message_len,
+                                               ok_packet->message, ok_packet->message_len,
                                                conn->persistent);
 
                SET_EMPTY_ERROR(conn->error_info);
@@ -679,12 +694,12 @@ MYSQLND_METHOD(mysqlnd_conn, connect)(MYSQLND *conn,
                        conn->m->set_client_option(conn, MYSQLND_OPT_NET_CMD_BUFFER_SIZE, (char *)&buf_size TSRMLS_CC);
                }
 
-               MYSQLND_INC_CONN_STATISTIC_W_VALUE2(&conn->stats, STAT_CONNECT_SUCCESS, 1, STAT_OPENED_CONNECTIONS, 1);
+               MYSQLND_INC_CONN_STATISTIC_W_VALUE2(conn->stats, STAT_CONNECT_SUCCESS, 1, STAT_OPENED_CONNECTIONS, 1);
                if (reconnect) {
                        MYSQLND_INC_GLOBAL_STATISTIC(STAT_RECONNECT);
                }
                if (conn->persistent) {
-                       MYSQLND_INC_CONN_STATISTIC_W_VALUE2(&conn->stats, STAT_PCONNECT_SUCCESS, 1, STAT_OPENED_PERSISTENT_CONNECTIONS, 1);
+                       MYSQLND_INC_CONN_STATISTIC_W_VALUE2(conn->stats, STAT_PCONNECT_SUCCESS, 1, STAT_OPENED_PERSISTENT_CONNECTIONS, 1);
                }
 
                DBG_INF_FMT("connection_id=%llu", conn->thread_id);
@@ -701,9 +716,9 @@ MYSQLND_METHOD(mysqlnd_conn, connect)(MYSQLND *conn,
                        int current_command = 0;
                        for (; current_command < conn->options.num_commands; ++current_command) {
                                const char * const command = conn->options.init_commands[current_command];
-                               MYSQLND_INC_CONN_STATISTIC(&conn->stats, STAT_INIT_COMMAND_EXECUTED_COUNT);
+                               MYSQLND_INC_CONN_STATISTIC(conn->stats, STAT_INIT_COMMAND_EXECUTED_COUNT);
                                if (PASS != conn->m->query(conn, command, strlen(command) TSRMLS_CC)) {
-                                       MYSQLND_INC_CONN_STATISTIC(&conn->stats, STAT_INIT_COMMAND_FAILED_COUNT);
+                                       MYSQLND_INC_CONN_STATISTIC(conn->stats, STAT_INIT_COMMAND_FAILED_COUNT);
                                        goto err;
                                }
                                if (conn->last_query_type == QUERY_SELECT) {
@@ -713,16 +728,16 @@ MYSQLND_METHOD(mysqlnd_conn, connect)(MYSQLND *conn,
                        }
                }
 
-               PACKET_FREE_ALLOCA(greet_packet);
+               PACKET_FREE(greet_packet);
                PACKET_FREE(auth_packet);
-               PACKET_FREE_ALLOCA(ok_packet);
+               PACKET_FREE(ok_packet);
 
                DBG_RETURN(PASS);
        }
 err:
-       PACKET_FREE_ALLOCA(greet_packet);
+       PACKET_FREE(greet_packet);
        PACKET_FREE(auth_packet);
-       PACKET_FREE_ALLOCA(ok_packet);
+       PACKET_FREE(ok_packet);
 
        if (errstr) {
                DBG_ERR_FMT("[%d] %.64s (trying to connect via %s)", errcode, errstr, conn->scheme);
@@ -737,7 +752,7 @@ err:
                conn->scheme = NULL;
        }
 
-       MYSQLND_INC_CONN_STATISTIC(&conn->stats, STAT_CONNECT_FAILURE);
+       MYSQLND_INC_CONN_STATISTIC(conn->stats, STAT_CONNECT_FAILURE);
 
        DBG_RETURN(FAIL);
 }
@@ -809,7 +824,7 @@ MYSQLND_METHOD(mysqlnd_conn, query)(MYSQLND *conn, const char *query, unsigned i
        */
        ret = conn->m->query_read_result_set_header(conn, NULL TSRMLS_CC);
        if (ret == PASS && conn->last_query_type == QUERY_UPSERT && conn->upsert_status.affected_rows) {
-               MYSQLND_INC_CONN_STATISTIC_W_VALUE(&conn->stats, STAT_ROWS_AFFECTED_NORMAL, conn->upsert_status.affected_rows);
+               MYSQLND_INC_CONN_STATISTIC_W_VALUE(conn->stats, STAT_ROWS_AFFECTED_NORMAL, conn->upsert_status.affected_rows);
        }
 
        DBG_RETURN(ret);
@@ -833,7 +848,8 @@ MYSQLND_METHOD(mysqlnd_conn, send_query)(MYSQLND *conn, const char *query, unsig
 }
 /* }}} */
 
-/* {{{ mysqlnd_conn::send_query */
+
+/* {{{ mysqlnd_conn::reap_query */
 static enum_func_status
 MYSQLND_METHOD(mysqlnd_conn, reap_query)(MYSQLND * conn TSRMLS_DC)
 {
@@ -843,6 +859,7 @@ MYSQLND_METHOD(mysqlnd_conn, reap_query)(MYSQLND * conn TSRMLS_DC)
 
        if (state <= CONN_READY || state == CONN_QUIT_SENT) {
                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Connection not opened, clear or has been closed");
+               DBG_ERR_FMT("Connection not opened, clear or has been closed. State=%d", state);
                DBG_RETURN(FAIL);
        }
        DBG_RETURN(conn->m->query_read_result_set_header(conn, NULL TSRMLS_CC));
@@ -991,6 +1008,7 @@ _mysqlnd_poll(MYSQLND **r_array, MYSQLND **e_array, MYSQLND ***dont_poll, long s
 
        if (!sets) {
                php_error_docref(NULL TSRMLS_CC, E_WARNING, *dont_poll ? "All arrays passed are clear":"No stream arrays were passed");
+               DBG_ERR_FMT(*dont_poll ? "All arrays passed are clear":"No stream arrays were passed");
                DBG_RETURN(FAIL);
        }
 
@@ -1244,7 +1262,7 @@ static enum_func_status
 MYSQLND_METHOD(mysqlnd_conn, stat)(MYSQLND *conn, char **message, unsigned int * message_len TSRMLS_DC)
 {
        enum_func_status ret;
-       php_mysql_packet_stats stats_header;
+       MYSQLND_PACKET_STATS * stats_header;
 
        DBG_ENTER("mysqlnd_conn::stat");
        DBG_INF_FMT("conn=%llu", conn->thread_id);
@@ -1253,15 +1271,15 @@ MYSQLND_METHOD(mysqlnd_conn, stat)(MYSQLND *conn, char **message, unsigned int *
        if (FAIL == ret) {
                DBG_RETURN(FAIL);
        }
-       PACKET_INIT_ALLOCA(stats_header, PROT_STATS_PACKET);
-       if (FAIL == (ret = PACKET_READ_ALLOCA(stats_header, conn))) {
+       stats_header = conn->protocol->m.get_stats_packet(conn->protocol, FALSE TSRMLS_CC);
+       if (FAIL == (ret = PACKET_READ(stats_header, conn))) {
                DBG_RETURN(FAIL);
        }
-       *message = stats_header.message;
-       *message_len = stats_header.message_len;
+       *message = stats_header->message;
+       *message_len = stats_header->message_len;
        /* Ownership transfer */
-       stats_header.message = NULL;
-       PACKET_FREE_ALLOCA(stats_header);
+       stats_header->message = NULL;
+       PACKET_FREE(stats_header);
 
        DBG_INF(*message);
        DBG_RETURN(PASS);
@@ -1434,10 +1452,10 @@ MYSQLND_METHOD(mysqlnd_conn, close)(MYSQLND * conn, enum_connection_close_type c
        DBG_INF_FMT("conn=%llu", conn->thread_id);
 
        if (conn->state >= CONN_READY) {
-               MYSQLND_INC_CONN_STATISTIC(&conn->stats, stat);
-               MYSQLND_DEC_CONN_STATISTIC(&conn->stats, STAT_OPENED_CONNECTIONS);
+               MYSQLND_INC_CONN_STATISTIC(conn->stats, stat);
+               MYSQLND_DEC_CONN_STATISTIC(conn->stats, STAT_OPENED_CONNECTIONS);
                if (conn->persistent) {
-                       MYSQLND_DEC_CONN_STATISTIC(&conn->stats, STAT_OPENED_PERSISTENT_CONNECTIONS);
+                       MYSQLND_DEC_CONN_STATISTIC(conn->stats, STAT_OPENED_PERSISTENT_CONNECTIONS);
                }
        }
 
@@ -1752,7 +1770,7 @@ MYSQLND_METHOD(mysqlnd_conn, change_user)(MYSQLND * const conn,
        */
        size_t user_len;
        enum_func_status ret;
-       php_mysql_packet_chg_user_resp chg_user_resp;
+       MYSQLND_PACKET_CHG_USER_RESPONSE * chg_user_resp;
        char buffer[MYSQLND_MAX_ALLOWED_USER_LEN + 1 + SCRAMBLE_LENGTH + MYSQLND_MAX_ALLOWED_DB_LEN + 1];
        char *p = buffer;
 
@@ -1799,10 +1817,10 @@ MYSQLND_METHOD(mysqlnd_conn, change_user)(MYSQLND * const conn,
                DBG_RETURN(FAIL);
        }
 
-       PACKET_INIT_ALLOCA(chg_user_resp, PROT_CHG_USER_PACKET);
-       ret = PACKET_READ_ALLOCA(chg_user_resp, conn);
-       conn->error_info = chg_user_resp.error_info;
-       PACKET_FREE_ALLOCA(chg_user_resp);
+       chg_user_resp = conn->protocol->m.get_change_user_response_packet(conn->protocol, FALSE TSRMLS_CC);
+       ret = PACKET_READ(chg_user_resp, conn);
+       conn->error_info = chg_user_resp->error_info;
+       PACKET_FREE(chg_user_resp);
 
        if (conn->error_info.error_no) {
                ret = FAIL;
@@ -1814,10 +1832,9 @@ MYSQLND_METHOD(mysqlnd_conn, change_user)(MYSQLND * const conn,
                if (mysqlnd_get_server_version(conn) > 50113L &&
                        mysqlnd_get_server_version(conn) < 50118L)
                {
-                       php_mysql_packet_ok redundant_error_packet;
-                       PACKET_INIT_ALLOCA(redundant_error_packet, PROT_OK_PACKET);
-                       PACKET_READ_ALLOCA(redundant_error_packet, conn);
-                       PACKET_FREE_ALLOCA(redundant_error_packet);
+                       MYSQLND_PACKET_OK * redundant_error_packet = conn->protocol->m.get_ok_packet(conn->protocol, FALSE TSRMLS_CC);
+                       PACKET_READ(redundant_error_packet, conn);
+                       PACKET_FREE(redundant_error_packet);
                        DBG_INF_FMT("Server is %d, buggy, sends two ERR messages", mysqlnd_get_server_version(conn));
                }
        }
@@ -1960,7 +1977,7 @@ MYSQLND_METHOD(mysqlnd_conn, use_result)(MYSQLND * const conn TSRMLS_DC)
                DBG_RETURN(NULL);
        }
 
-       MYSQLND_INC_CONN_STATISTIC(&conn->stats, STAT_UNBUFFERED_SETS);
+       MYSQLND_INC_CONN_STATISTIC(conn->stats, STAT_UNBUFFERED_SETS);
 
        result = conn->current_result;
        conn->current_result = NULL;
@@ -1993,7 +2010,7 @@ MYSQLND_METHOD(mysqlnd_conn, store_result)(MYSQLND * const conn TSRMLS_DC)
                DBG_RETURN(NULL);
        }
 
-       MYSQLND_INC_CONN_STATISTIC(&conn->stats, STAT_BUFFERED_SETS);
+       MYSQLND_INC_CONN_STATISTIC(conn->stats, STAT_BUFFERED_SETS);
 
        result = conn->current_result;
        conn->current_result = NULL;
@@ -2012,15 +2029,18 @@ MYSQLND_METHOD(mysqlnd_conn, get_connection_stats)(const MYSQLND * const conn,
 {
        DBG_ENTER("mysqlnd_conn::get_connection_stats");
        DBG_INF_FMT("conn=%llu", conn->thread_id);
-       mysqlnd_fill_stats_hash(&(conn->stats), return_value TSRMLS_CC ZEND_FILE_LINE_CC);
+       mysqlnd_fill_stats_hash(conn->stats, mysqlnd_stats_values_names, return_value TSRMLS_CC ZEND_FILE_LINE_CC);
        DBG_VOID_RETURN;
 }
 /* }}} */
 
 
 MYSQLND_STMT * _mysqlnd_stmt_init(MYSQLND * const conn TSRMLS_DC);
+static void MYSQLND_METHOD(mysqlnd_conn, init)(MYSQLND * conn TSRMLS_DC);
 
+static
 MYSQLND_CLASS_METHODS_START(mysqlnd_conn)
+       MYSQLND_METHOD(mysqlnd_conn, init),
        MYSQLND_METHOD(mysqlnd_conn, connect),
 
        MYSQLND_METHOD(mysqlnd_conn, escape_string),
@@ -2082,12 +2102,30 @@ MYSQLND_CLASS_METHODS_START(mysqlnd_conn)
        MYSQLND_METHOD_PRIVATE(mysqlnd_conn, set_state),
 
        MYSQLND_METHOD(mysqlnd_conn, simple_command),
-       MYSQLND_METHOD(mysqlnd_conn, simple_command_handle_response)
+       MYSQLND_METHOD(mysqlnd_conn, simple_command_handle_response),
+       MYSQLND_METHOD(mysqlnd_conn, restart_psession),
+       MYSQLND_METHOD(mysqlnd_conn, end_psession)
 MYSQLND_CLASS_METHODS_END;
 
 
+/* {{{ mysqlnd_conn::init */
+static void
+MYSQLND_METHOD(mysqlnd_conn, init)(MYSQLND * conn TSRMLS_DC)
+{
+       DBG_ENTER("mysqlnd_conn::init");
+       conn->net = mysqlnd_net_init(conn->persistent TSRMLS_CC);
+       conn->protocol = mysqlnd_protocol_init(conn->persistent TSRMLS_CC);
+       mysqlnd_stats_init(&conn->stats, STAT_LAST);
+
+       SET_ERROR_AFF_ROWS(conn);
+
+       DBG_VOID_RETURN;
+}
+/* }}} */
+
+
 /* {{{ mysqlnd_init */
-PHPAPI MYSQLND *_mysqlnd_init(zend_bool persistent TSRMLS_DC)
+PHPAPI MYSQLND * _mysqlnd_init(zend_bool persistent TSRMLS_DC)
 {
        size_t alloc_size = sizeof(MYSQLND) + mysqlnd_plugin_count() * sizeof(void *);
        MYSQLND *ret = mnd_pecalloc(1, alloc_size, persistent);
@@ -2095,29 +2133,27 @@ PHPAPI MYSQLND *_mysqlnd_init(zend_bool persistent TSRMLS_DC)
        DBG_ENTER("mysqlnd_init");
        DBG_INF_FMT("persistent=%d", persistent);
 
-       SET_ERROR_AFF_ROWS(ret);
        ret->persistent = persistent;
-
        ret->m = mysqlnd_conn_methods;
+       CONN_SET_STATE(ret, CONN_ALLOCED);
        ret->m->get_reference(ret TSRMLS_CC);
 
-       ret->net = mysqlnd_net_init(persistent TSRMLS_CC);
-
-       CONN_SET_STATE(ret, CONN_ALLOCED);
+       ret->m->init(ret TSRMLS_CC);
 
        DBG_RETURN(ret);
 }
 /* }}} */
 
+
 /* {{{ mysqlnd_library_init */
-void mysqlnd_library_init(TSRMLS_D)
+PHPAPI void mysqlnd_library_init(TSRMLS_D)
 {
        if (mysqlnd_library_initted == FALSE) {
                mysqlnd_library_initted = TRUE;
                mysqlnd_conn_methods = &MYSQLND_CLASS_METHOD_TABLE_NAME(mysqlnd_conn);
                _mysqlnd_init_ps_subsystem();
                /* Should be calloc, as mnd_calloc will reference LOCK_access*/
-               mysqlnd_stats_init(&mysqlnd_global_stats);
+               mysqlnd_stats_init(&mysqlnd_global_stats, STAT_LAST);
        }
 }
 /* }}} */
index a3a38c73141e6acd76d6aee0c1750002f3da3ab7..739e95d2c71d206609da34711fd89327443a4048 100644 (file)
@@ -60,8 +60,8 @@
 
 
 /* Library related */
-void mysqlnd_library_init(TSRMLS_D);
-void mysqlnd_library_end(TSRMLS_D);
+PHPAPI void mysqlnd_library_init(TSRMLS_D);
+PHPAPI void mysqlnd_library_end(TSRMLS_D);
 
 PHPAPI unsigned int mysqlnd_plugin_register();
 PHPAPI unsigned int mysqlnd_plugin_count();
@@ -74,6 +74,9 @@ PHPAPI void ** _mysqlnd_plugin_get_plugin_result_data(const MYSQLND_RES * result
 PHPAPI void ** _mysqlnd_plugin_get_plugin_stmt_data(const MYSQLND_STMT * stmt, unsigned int plugin_id TSRMLS_DC);
 #define mysqlnd_plugin_get_plugin_stmt_data(s, p_id) _mysqlnd_plugin_get_plugin_stmt_data((s), (p_id) TSRMLS_CC)
 
+PHPAPI void ** _mysqlnd_plugin_get_plugin_protocol_data(const MYSQLND_PROTOCOL * protocol, unsigned int plugin_id TSRMLS_DC);
+#define mysqlnd_plugin_get_plugin_protocol_data(p, p_id) _mysqlnd_plugin_get_plugin_protocol_data((p), (p_id) TSRMLS_CC)
+
 
 PHPAPI struct st_mysqlnd_conn_methods * mysqlnd_conn_get_methods();
 PHPAPI void mysqlnd_conn_set_methods(struct st_mysqlnd_conn_methods *methods);
@@ -333,6 +336,8 @@ ZEND_EXTERN_MODULE_GLOBALS(mysqlnd);
 #endif
 
 
+PHPAPI void mysqlnd_minfo_print_hash(zval *values);
+
 #endif /* MYSQLND_H */
 
 
index 2dcedcbfe65ef1eccd465731dad2557f175ce41b..90159148c2202fff89490ce0a34d37d9a575fdf9 100644 (file)
@@ -160,7 +160,7 @@ MYSQLND_MEMORY_POOL_CHUNK * mysqlnd_mempool_get_chunk(MYSQLND_MEMORY_POOL * pool
 
 
 /* {{{ mysqlnd_mempool_create */
-MYSQLND_MEMORY_POOL *
+PHPAPI MYSQLND_MEMORY_POOL *
 mysqlnd_mempool_create(size_t arena_size TSRMLS_DC)
 {
        /* We calloc, because we free(). We don't mnd_calloc()  for a reason. */
@@ -179,7 +179,7 @@ mysqlnd_mempool_create(size_t arena_size TSRMLS_DC)
 
 
 /* {{{ mysqlnd_mempool_destroy */
-void
+PHPAPI void
 mysqlnd_mempool_destroy(MYSQLND_MEMORY_POOL * pool TSRMLS_DC)
 {
        DBG_ENTER("mysqlnd_mempool_destroy");
index 505a23b2ee3ba26b1b1d663f24431fd1fab2608f..0f234a6ee3e227d0844a8cb426883b4a2daec4de 100644 (file)
@@ -23,8 +23,8 @@
 #ifndef MYSQLND_BLOCK_ALLOC_H
 #define MYSQLND_BLOCK_ALLOC_H
 
-MYSQLND_MEMORY_POOL *  mysqlnd_mempool_create(size_t arena_size TSRMLS_DC);
-void                                   mysqlnd_mempool_destroy(MYSQLND_MEMORY_POOL * pool TSRMLS_DC);
+PHPAPI MYSQLND_MEMORY_POOL *   mysqlnd_mempool_create(size_t arena_size TSRMLS_DC);
+PHPAPI void                                    mysqlnd_mempool_destroy(MYSQLND_MEMORY_POOL * pool TSRMLS_DC);
 
 #endif /* MYSQLND_BLOCK_ALLOC_H */
 
index d964dc1b14215592724c7f3c9876a88975288fd6..1de52920d065085f1c31f0aa417db98c11d67a05 100644 (file)
@@ -47,18 +47,37 @@ static const char * const mysqlnd_debug_default_trace_file = "/tmp/mysqlnd.trace
 #define MYSQLND_DEBUG_FLUSH                                    128
 #define MYSQLND_DEBUG_TRACE_MEMORY_CALLS       256
 
-static char * mysqlnd_emalloc_name     = "_mysqlnd_emalloc";
-static char * mysqlnd_pemalloc_name    = "_mysqlnd_pemalloc";
-static char * mysqlnd_ecalloc_name     = "_mysqlnd_ecalloc";
-static char * mysqlnd_pecalloc_name    = "_mysqlnd_pecalloc";
-static char * mysqlnd_erealloc_name    = "_mysqlnd_erealloc";
-static char * mysqlnd_perealloc_name= "_mysqlnd_perealloc";
-static char * mysqlnd_efree_name       = "_mysqlnd_efree";
-static char * mysqlnd_pefree_name      = "_mysqlnd_pefree";
-static char * mysqlnd_malloc_name      = "_mysqlnd_malloc";
-static char * mysqlnd_calloc_name      = "_mysqlnd_calloc";
-static char * mysqlnd_realloc_name     = "_mysqlnd_realloc";
-static char * mysqlnd_free_name                = "_mysqlnd_free";
+static const char mysqlnd_emalloc_name[]       = "_mysqlnd_emalloc";
+static const char mysqlnd_pemalloc_name[]      = "_mysqlnd_pemalloc";
+static const char mysqlnd_ecalloc_name[]       = "_mysqlnd_ecalloc";
+static const char mysqlnd_pecalloc_name[]      = "_mysqlnd_pecalloc";
+static const char mysqlnd_erealloc_name[]      = "_mysqlnd_erealloc";
+static const char mysqlnd_perealloc_name[]     = "_mysqlnd_perealloc";
+static const char mysqlnd_efree_name[]         = "_mysqlnd_efree";
+static const char mysqlnd_pefree_name[]                = "_mysqlnd_pefree";
+static const char mysqlnd_malloc_name[]                = "_mysqlnd_malloc";
+static const char mysqlnd_calloc_name[]                = "_mysqlnd_calloc";
+static const char mysqlnd_realloc_name[]       = "_mysqlnd_realloc";
+static const char mysqlnd_free_name[]          = "_mysqlnd_free";
+
+const char * mysqlnd_debug_std_no_trace_funcs[] =
+{
+       mysqlnd_emalloc_name,
+       mysqlnd_ecalloc_name,
+       mysqlnd_efree_name,
+       mysqlnd_erealloc_name,
+       mysqlnd_pemalloc_name,
+       mysqlnd_pecalloc_name,
+       mysqlnd_pefree_name,
+       mysqlnd_perealloc_name,
+       mysqlnd_malloc_name,
+       mysqlnd_calloc_name,
+       mysqlnd_realloc_name,
+       mysqlnd_free_name,
+       mysqlnd_read_header_name,
+       mysqlnd_read_body_name,
+       NULL /* must be always last */
+};
 
 /* {{{ mysqlnd_debug::open */
 static enum_func_status
@@ -288,7 +307,7 @@ MYSQLND_METHOD(mysqlnd_debug, log_va)(MYSQLND_DEBUG *self,
 static zend_bool
 MYSQLND_METHOD(mysqlnd_debug, func_enter)(MYSQLND_DEBUG * self,
                                                                                  unsigned int line, const char * const file,
-                                                                                 char * func_name, unsigned int func_name_len)
+                                                                                 const char * const func_name, unsigned int func_name_len)
 {
        if ((self->flags & MYSQLND_DEBUG_DUMP_TRACE) == 0 || self->file_name == NULL) {
                return FALSE;
@@ -297,16 +316,15 @@ MYSQLND_METHOD(mysqlnd_debug, func_enter)(MYSQLND_DEBUG * self,
                return FALSE;
        }
 
-       if ((self->flags & MYSQLND_DEBUG_TRACE_MEMORY_CALLS) == 0 && 
-               (func_name == mysqlnd_emalloc_name      || func_name == mysqlnd_pemalloc_name   ||
-                func_name == mysqlnd_ecalloc_name      || func_name == mysqlnd_pecalloc_name   ||
-                func_name == mysqlnd_erealloc_name || func_name == mysqlnd_perealloc_name      ||
-                func_name == mysqlnd_efree_name        || func_name == mysqlnd_pefree_name             || 
-                func_name == mysqlnd_malloc_name       || func_name == mysqlnd_calloc_name             || 
-                func_name == mysqlnd_realloc_name      || func_name == mysqlnd_free_name               ||
-                func_name == mysqlnd_read_header_name || func_name == mysqlnd_read_body_name)) {
-               zend_stack_push(&self->call_stack, "", sizeof(""));
-               return FALSE;
+       if ((self->flags & MYSQLND_DEBUG_TRACE_MEMORY_CALLS) == 0 && self->skip_functions) {
+               const char ** p = self->skip_functions;
+               while (*p) {
+                       if (*p == func_name) {
+                               zend_stack_push(&self->call_stack, "", sizeof(""));
+                               return FALSE;   
+                       }
+                       p++;
+               }
        }
 
        zend_stack_push(&self->call_stack, func_name, func_name_len + 1);
@@ -588,7 +606,8 @@ MYSQLND_CLASS_METHODS_END;
 
 
 /* {{{ mysqlnd_debug_init */
-PHPAPI MYSQLND_DEBUG *mysqlnd_debug_init(TSRMLS_D)
+PHPAPI MYSQLND_DEBUG *
+mysqlnd_debug_init(const char * skip_functions[] TSRMLS_DC)
 {
        MYSQLND_DEBUG *ret = ecalloc(1, sizeof(MYSQLND_DEBUG));
 #ifdef ZTS
@@ -600,6 +619,7 @@ PHPAPI MYSQLND_DEBUG *mysqlnd_debug_init(TSRMLS_D)
        zend_hash_init(&ret->not_filtered_functions, 0, NULL, NULL, 0);
 
        ret->m = & mysqlnd_mysqlnd_debug_methods;
+       ret->skip_functions = skip_functions;
        
        return ret;
 }
@@ -607,12 +627,12 @@ PHPAPI MYSQLND_DEBUG *mysqlnd_debug_init(TSRMLS_D)
 
 
 /* {{{ _mysqlnd_debug */
-PHPAPI void _mysqlnd_debug(const char *mode TSRMLS_DC)
+PHPAPI void _mysqlnd_debug(const char * mode TSRMLS_DC)
 {
 #ifdef PHP_DEBUG
        MYSQLND_DEBUG *dbg = MYSQLND_G(dbg);
        if (!dbg) {
-               MYSQLND_G(dbg) = dbg = mysqlnd_debug_init(TSRMLS_C);
+               MYSQLND_G(dbg) = dbg = mysqlnd_debug_init(mysqlnd_debug_std_no_trace_funcs TSRMLS_CC);
                if (!dbg) {
                        return;
                }
index f872099d4aa9e6779caf99e6ecbe66babfe3c4ad..fa6246f9f212a5cae71f9d23f81733bc414840fd 100644 (file)
@@ -36,7 +36,7 @@ struct st_mysqlnd_debug_methods
        enum_func_status (*log_va)(MYSQLND_DEBUG *self, unsigned int line, const char * const file,
                                                           unsigned int level, const char * type, const char *format, ...);
        zend_bool (*func_enter)(MYSQLND_DEBUG *self, unsigned int line, const char * const file,
-                                                       char * func_name, unsigned int func_name_len);
+                                                       const char * const func_name, unsigned int func_name_len);
        enum_func_status (*func_leave)(MYSQLND_DEBUG *self, unsigned int line, const char * const file);
        enum_func_status (*close)(MYSQLND_DEBUG *self);
        enum_func_status (*free_handle)(MYSQLND_DEBUG *self);
@@ -55,43 +55,67 @@ struct st_mysqlnd_debug
        zend_stack call_stack;
        HashTable not_filtered_functions;
        struct st_mysqlnd_debug_methods *m;
+       const char ** skip_functions;
 };
 
+PHPAPI extern const char * mysqlnd_debug_std_no_trace_funcs[];
 
-PHPAPI MYSQLND_DEBUG *mysqlnd_debug_init(TSRMLS_D);
+PHPAPI MYSQLND_DEBUG * mysqlnd_debug_init(const char * skip_functions[] TSRMLS_DC);
 
 #define MYSQLND_MEM_D  TSRMLS_DC ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC
 
 
-void * _mysqlnd_emalloc(size_t size MYSQLND_MEM_D);
-void * _mysqlnd_pemalloc(size_t size, zend_bool persistent MYSQLND_MEM_D);
-void * _mysqlnd_ecalloc(unsigned int nmemb, size_t size MYSQLND_MEM_D);
-void * _mysqlnd_pecalloc(unsigned int nmemb, size_t size, zend_bool persistent MYSQLND_MEM_D);
-void * _mysqlnd_erealloc(void *ptr, size_t new_size MYSQLND_MEM_D);
-void * _mysqlnd_perealloc(void *ptr, size_t new_size, zend_bool persistent MYSQLND_MEM_D);
-void   _mysqlnd_efree(void *ptr MYSQLND_MEM_D);
-void   _mysqlnd_pefree(void *ptr, zend_bool persistent MYSQLND_MEM_D);
-void * _mysqlnd_malloc(size_t size MYSQLND_MEM_D);
-void * _mysqlnd_calloc(unsigned int nmemb, size_t size MYSQLND_MEM_D);
-void * _mysqlnd_realloc(void *ptr, size_t new_size MYSQLND_MEM_D);
-void   _mysqlnd_free(void *ptr MYSQLND_MEM_D);
+PHPAPI void *  _mysqlnd_emalloc(size_t size MYSQLND_MEM_D);
+PHPAPI void *  _mysqlnd_pemalloc(size_t size, zend_bool persistent MYSQLND_MEM_D);
+PHPAPI void *  _mysqlnd_ecalloc(unsigned int nmemb, size_t size MYSQLND_MEM_D);
+PHPAPI void *  _mysqlnd_pecalloc(unsigned int nmemb, size_t size, zend_bool persistent MYSQLND_MEM_D);
+PHPAPI void *  _mysqlnd_erealloc(void *ptr, size_t new_size MYSQLND_MEM_D);
+PHPAPI void *  _mysqlnd_perealloc(void *ptr, size_t new_size, zend_bool persistent MYSQLND_MEM_D);
+PHPAPI void    _mysqlnd_efree(void *ptr MYSQLND_MEM_D);
+PHPAPI void    _mysqlnd_pefree(void *ptr, zend_bool persistent MYSQLND_MEM_D);
+PHPAPI void *  _mysqlnd_malloc(size_t size MYSQLND_MEM_D);
+PHPAPI void *  _mysqlnd_calloc(unsigned int nmemb, size_t size MYSQLND_MEM_D);
+PHPAPI void *  _mysqlnd_realloc(void *ptr, size_t new_size MYSQLND_MEM_D);
+PHPAPI void    _mysqlnd_free(void *ptr MYSQLND_MEM_D);
 
-char * mysqlnd_get_backtrace(TSRMLS_D);
+PHPAPI char *  mysqlnd_get_backtrace(TSRMLS_D);
+
+#if defined(__GNUC__)
+#define DBG_INF_EX(dbg_obj, msg)               do { if (dbg_skip_trace == FALSE) (dbg_obj)->m->log((dbg_obj), __LINE__, __FILE__, -1, "info : ", (msg)); } while (0)
+#define DBG_ERR_EX(dbg_obj, msg)               do { if (dbg_skip_trace == FALSE) (dbg_obj)->m->log((dbg_obj), __LINE__, __FILE__, -1, "error: ", (msg)); } while (0)
+#define DBG_INF_FMT_EX(dbg_obj, ...)   do { if (dbg_skip_trace == FALSE) (dbg_obj)->m->log_va((dbg_obj), __LINE__, __FILE__, -1, "info : ", __VA_ARGS__); } while (0)
+#define DBG_ERR_FMT_EX(dbg_obj, ...)   do { if (dbg_skip_trace == FALSE) (dbg_obj)->m->log_va((dbg_obj), __LINE__, __FILE__, -1, "error: ", __VA_ARGS__); } while (0)
+
+#define DBG_ENTER_EX(dbg_obj, func_name) zend_bool dbg_skip_trace = TRUE; if ((dbg_obj)) dbg_skip_trace = !(dbg_obj)->m->func_enter((dbg_obj), __LINE__, __FILE__, func_name, strlen(func_name));
+#define DBG_RETURN_EX(dbg_obj, value)  do { if ((dbg_obj)) (dbg_obj)->m->func_leave((dbg_obj), __LINE__, __FILE__); return (value); } while (0)
+#define DBG_VOID_RETURN_EX(dbg_obj)            do { if ((dbg_obj)) (dbg_obj)->m->func_leave((dbg_obj), __LINE__, __FILE__); return; } while (0)
+
+#else
+static inline void DBG_INF_EX(MYSQLND_DEBUG * dbg_obj, const char * const msg) {}
+static inline void DBG_ERR_EX(MYSQLND_DEBUG * dbg_obj, const char * const msg) {}
+static inline void DBG_INF_FMT_EX(MYSQLND_DEBUG * dbg_obj, ...) {}
+static inline void DBG_ERR_FMT_EX(MYSQLND_DEBUG * dbg_obj, ...) {}
+static inline void DBG_ENTER_EX(MYSQLND_DEBUG * dbg_obj, const char * const func_name) {}
+#define DBG_RETURN_EX(dbg_obj, value) return (value)
+#define DBG_VOID_RETURN_EX(dbg_obj) return
+
+#endif
 
 #if MYSQLND_DBG_ENABLED == 1
 
-#define DBG_INF(msg) do { if (dbg_skip_trace == FALSE) MYSQLND_G(dbg)->m->log(MYSQLND_G(dbg), __LINE__, __FILE__, -1, "info : ", (msg)); } while (0)
-#define DBG_ERR(msg) do { if (dbg_skip_trace == FALSE) MYSQLND_G(dbg)->m->log(MYSQLND_G(dbg), __LINE__, __FILE__, -1, "error: ", (msg)); } while (0)
-#define DBG_INF_FMT(...) do { if (dbg_skip_trace == FALSE) MYSQLND_G(dbg)->m->log_va(MYSQLND_G(dbg), __LINE__, __FILE__, -1, "info : ", __VA_ARGS__); } while (0)
-#define DBG_ERR_FMT(...) do { if (dbg_skip_trace == FALSE) MYSQLND_G(dbg)->m->log_va(MYSQLND_G(dbg), __LINE__, __FILE__, -1, "error: ", __VA_ARGS__); } while (0)
+#define DBG_INF(msg)           DBG_INF_EX(MYSQLND_G(dbg), (msg))
+#define DBG_ERR(msg)           DBG_ERR_EX(MYSQLND_G(dbg), (msg))
+#define DBG_INF_FMT(...)       DBG_INF_FMT_EX(MYSQLND_G(dbg), __VA_ARGS__)
+#define DBG_ERR_FMT(...)       DBG_ERR_FMT_EX(MYSQLND_G(dbg), __VA_ARGS__)
 
-#define DBG_ENTER(func_name) zend_bool dbg_skip_trace = TRUE; if (MYSQLND_G(dbg)) dbg_skip_trace = !MYSQLND_G(dbg)->m->func_enter(MYSQLND_G(dbg), __LINE__, __FILE__, func_name, strlen(func_name));
-#define DBG_RETURN(value)      do { if (MYSQLND_G(dbg)) MYSQLND_G(dbg)->m->func_leave(MYSQLND_G(dbg), __LINE__, __FILE__); return (value); } while (0)
-#define DBG_VOID_RETURN                do { if (MYSQLND_G(dbg)) MYSQLND_G(dbg)->m->func_leave(MYSQLND_G(dbg), __LINE__, __FILE__); return; } while (0)
+#define DBG_ENTER(func_name)   DBG_ENTER_EX(MYSQLND_G(dbg), (func_name))
+#define DBG_RETURN(value)              DBG_RETURN_EX(MYSQLND_G(dbg), (value))
+#define DBG_VOID_RETURN                        DBG_VOID_RETURN_EX(MYSQLND_G(dbg))
 
 #elif MYSQLND_DBG_ENABLED == 0
 
 
+
 static inline void DBG_INF(const char * const msg) {}
 static inline void DBG_ERR(const char * const msg) {}
 static inline void DBG_INF_FMT(const char * const format, ...) {}
@@ -99,6 +123,7 @@ static inline void DBG_ERR_FMT(const char * const format, ...) {}
 static inline void DBG_ENTER(const char * const func_name) {}
 #define DBG_RETURN(value)      return (value)
 #define DBG_VOID_RETURN                return
+
 #endif
 
 
index 693ec9f491eb43d9b884402215e1049101638e6b..8404fbeb6e2a8bccb666f7679e41dae71968b8ab 100644 (file)
@@ -479,7 +479,7 @@ typedef enum mysqlnd_collected_stats
 
 
 /* Enums */
-enum php_mysql_packet_type
+enum mysqlnd_packet_type
 {
        PROT_GREET_PACKET= 0,
        PROT_AUTH_PACKET,
@@ -491,7 +491,7 @@ enum php_mysql_packet_type
        PROT_ROW_PACKET,
        PROT_STATS_PACKET,
        PROT_PREPARE_RESP_PACKET,
-       PROT_CHG_USER_PACKET,
+       PROT_CHG_USER_RESP_PACKET,
        PROT_LAST, /* should always be last */
 };
 
index 820855eaf72881449c94a50d8f59aaa365ee9825..8f4c46e9dfe9e18793e9689dc47232d917ac70ff 100644 (file)
@@ -78,7 +78,7 @@ MYSQLND_METHOD(mysqlnd_net, network_read)(MYSQLND * conn, zend_uchar * buffer, s
                buffer += ret;
                to_read -= ret;
        }
-       MYSQLND_INC_CONN_STATISTIC_W_VALUE(&conn->stats, STAT_BYTES_RECEIVED, count);
+       MYSQLND_INC_CONN_STATISTIC_W_VALUE(conn->stats, STAT_BYTES_RECEIVED, count);
        conn->net->stream->chunk_size = old_chunk_size;
        DBG_RETURN(PASS);
 }
@@ -307,7 +307,7 @@ MYSQLND_METHOD(mysqlnd_net, send)(MYSQLND * const conn, char * const buf, size_t
                SET_CLIENT_ERROR(conn->error_info, CR_SERVER_GONE_ERROR, UNKNOWN_SQLSTATE, mysqlnd_server_gone);
        }
 
-       MYSQLND_INC_CONN_STATISTIC_W_VALUE3(&conn->stats,
+       MYSQLND_INC_CONN_STATISTIC_W_VALUE3(conn->stats,
                        STAT_BYTES_SENT, count + packets_sent * MYSQLND_HEADER_SIZE,
                        STAT_PROTOCOL_OVERHEAD_OUT, packets_sent * MYSQLND_HEADER_SIZE,
                        STAT_PACKETS_SENT, packets_sent);
@@ -475,7 +475,7 @@ MYSQLND_METHOD(mysqlnd_net, encode)(zend_uchar * compress_buffer, size_t compres
 
 
 /* {{{ mysqlnd_net::receive */
-static enum_func_status
+static size_t
 MYSQLND_METHOD(mysqlnd_net, receive)(MYSQLND * conn, zend_uchar * buffer, size_t count TSRMLS_DC)
 {
        size_t to_read = count;
@@ -658,10 +658,11 @@ MYSQLND_METHOD(mysqlnd_net, free_contents)(MYSQLND_NET * net TSRMLS_DC)
 
 
 /* {{{ mysqlnd_net_init */
-MYSQLND_NET *
+PHPAPI MYSQLND_NET *
 mysqlnd_net_init(zend_bool persistent TSRMLS_DC)
 {
-       MYSQLND_NET * net = mnd_pecalloc(1, sizeof(MYSQLND_NET), persistent);
+       size_t alloc_size = sizeof(MYSQLND_NET) + mysqlnd_plugin_count() * sizeof(void *);
+       MYSQLND_NET * net = mnd_pecalloc(1, alloc_size, persistent);
 
        DBG_ENTER("mysqlnd_net_init");
        DBG_INF_FMT("persistent=%d", persistent);
@@ -687,9 +688,9 @@ mysqlnd_net_init(zend_bool persistent TSRMLS_DC)
 /* }}} */
 
 
-/* {{{ mysqlnd_net_init */
-void
-mysqlnd_net_free(MYSQLND_NET * net TSRMLS_DC)
+/* {{{ mysqlnd_net_free */
+PHPAPI void
+mysqlnd_net_free(MYSQLND_NET * const net TSRMLS_DC)
 {
        zend_bool pers = net->persistent;
 
@@ -719,6 +720,20 @@ mysqlnd_net_free(MYSQLND_NET * net TSRMLS_DC)
 /* }}} */
 
 
+/* {{{ _mysqlnd_plugin_get_plugin_net_data */
+PHPAPI void ** _mysqlnd_plugin_get_plugin_net_data(const MYSQLND_NET * net, unsigned int plugin_id TSRMLS_DC)
+{
+       DBG_ENTER("_mysqlnd_plugin_get_plugin_net_data");
+       DBG_INF_FMT("plugin_id=%u", plugin_id);
+       if (!net || plugin_id >= mysqlnd_plugin_count()) {
+               return NULL;
+       }
+       DBG_RETURN((void *)((char *)net + sizeof(MYSQLND_NET) + plugin_id * sizeof(void *)));
+}
+/* }}} */
+
+
+
 /*
  * Local variables:
  * tab-width: 4
index 6f9e5d9918a756d2aa989d3e23baf3aa5eea7153..8f75a8eb298d45bd63308c3c96cc5e8836be0746 100644 (file)
@@ -23,8 +23,8 @@
 #ifndef MYSQLND_NET_H
 #define MYSQLND_NET_H
 
-MYSQLND_NET * mysqlnd_net_init(zend_bool persistent TSRMLS_DC);
-void mysqlnd_net_free(MYSQLND_NET * net TSRMLS_DC);
+PHPAPI MYSQLND_NET * mysqlnd_net_init(zend_bool persistent TSRMLS_DC);
+PHPAPI void mysqlnd_net_free(MYSQLND_NET * const net TSRMLS_DC);
 
 #endif /* MYSQLND_NET_H */
 
index a38e08e61af0bb6af946d1559a27e6d85820e508..ed0a5c8b1485ed3b333a3bb11fbfef0696ea3701 100644 (file)
@@ -369,16 +369,6 @@ typedef union {
                                (((uint32_t) ((zend_uchar) (A)[2])) << 16) +\
                                (((uint32_t) ((zend_uchar) (A)[3])) << 24))
 
-
-#define bit_uint8korr(A) ((uint64_t)(((uint32_t) (((zend_uchar*) (A))[7])) +\
-                                                                       (((uint32_t) (((zend_uchar*) (A))[6])) << 8) +\
-                                                                       (((uint32_t) (((zend_uchar*) (A))[5])) << 16) +\
-                                                                       (((uint32_t) (((zend_uchar*) (A))[4])) << 24)) +\
-                                                                       (((uint64_t) (((uint32_t) (((zend_uchar*) (A))[3])) +\
-                                                                       (((uint32_t) (((zend_uchar*) (A))[2])) << 8) +\
-                                                                       (((uint32_t) (((zend_uchar*) (A))[1])) << 16) +\
-                                                                       (((uint32_t) (((zend_uchar*) (A))[0])) << 24))) << 32))
-
 #define uint8korr(A)   ((uint64_t)(((uint32_t) ((zend_uchar) (A)[0])) +\
                                                                        (((uint32_t) ((zend_uchar) (A)[1])) << 8) +\
                                                                        (((uint32_t) ((zend_uchar) (A)[2])) << 16) +\
index b92a90f6160e6daaea8e5217c1dff8dbcd97cdea..7eb38b68dd4ea863624a0c795cda4705b3ce1dbd 100644 (file)
@@ -154,9 +154,9 @@ struct st_mysqlnd_perm_bind {
 
 extern struct st_mysqlnd_perm_bind mysqlnd_ps_fetch_functions[MYSQL_TYPE_LAST + 1];
 
-extern const char * const mysqlnd_old_passwd;
-extern const char * const mysqlnd_out_of_sync;
-extern const char * const mysqlnd_server_gone;
+PHPAPI extern const char * const mysqlnd_old_passwd;
+PHPAPI extern const char * const mysqlnd_out_of_sync;
+PHPAPI extern const char * const mysqlnd_server_gone;
 
 enum_func_status mysqlnd_handle_local_infile(MYSQLND *conn, const char *filename, zend_bool *is_warning TSRMLS_DC);
 
index d57320d6c4fc2925ee8f377b1b8ffdf6fa727f88..d5677ed6d668f33afc81f967bae640d276bb3480 100644 (file)
@@ -94,7 +94,7 @@ MYSQLND_METHOD(mysqlnd_stmt, store_result)(MYSQLND_STMT * const stmt TSRMLS_DC)
 
        SET_EMPTY_ERROR(stmt->error_info);
        SET_EMPTY_ERROR(stmt->conn->error_info);
-       MYSQLND_INC_CONN_STATISTIC(&conn->stats, STAT_PS_BUFFERED_SETS);
+       MYSQLND_INC_CONN_STATISTIC(conn->stats, STAT_PS_BUFFERED_SETS);
 
        result = stmt->result;
        result->type                    = MYSQLND_RES_PS_BUF;
@@ -152,7 +152,7 @@ MYSQLND_METHOD(mysqlnd_stmt, get_result)(MYSQLND_STMT * const stmt TSRMLS_DC)
 
        SET_EMPTY_ERROR(stmt->error_info);
        SET_EMPTY_ERROR(stmt->conn->error_info);
-       MYSQLND_INC_CONN_STATISTIC(&conn->stats, STAT_BUFFERED_SETS);
+       MYSQLND_INC_CONN_STATISTIC(conn->stats, STAT_BUFFERED_SETS);
 
        result = mysqlnd_result_init(stmt->result->field_count TSRMLS_CC);      
 
@@ -218,20 +218,20 @@ mysqlnd_stmt_skip_metadata(MYSQLND_STMT *stmt TSRMLS_DC)
        /* Follows parameter metadata, we have just to skip it, as libmysql does */
        unsigned int i = 0;
        enum_func_status ret = PASS;
-       php_mysql_packet_res_field field_packet;
+       MYSQLND_PACKET_RES_FIELD * field_packet;
 
        DBG_ENTER("mysqlnd_stmt_skip_metadata");
        DBG_INF_FMT("stmt=%lu", stmt->stmt_id);
 
-       PACKET_INIT_ALLOCA(field_packet, PROT_RSET_FLD_PACKET);
-       field_packet.skip_parsing = TRUE;
+       field_packet = stmt->conn->protocol->m.get_result_field_packet(stmt->conn->protocol, FALSE TSRMLS_CC);
+       field_packet->skip_parsing = TRUE;
        for (;i < stmt->param_count; i++) {
-               if (FAIL == PACKET_READ_ALLOCA(field_packet, stmt->conn)) {
+               if (FAIL == PACKET_READ(field_packet, stmt->conn)) {
                        ret = FAIL;
                        break;
                }
        }
-       PACKET_FREE_ALLOCA(field_packet);
+       PACKET_FREE(field_packet);
 
        DBG_RETURN(ret);
 }
@@ -242,31 +242,31 @@ mysqlnd_stmt_skip_metadata(MYSQLND_STMT *stmt TSRMLS_DC)
 static enum_func_status
 mysqlnd_stmt_read_prepare_response(MYSQLND_STMT *stmt TSRMLS_DC)
 {
-       php_mysql_packet_prepare_response prepare_resp;
+       MYSQLND_PACKET_PREPARE_RESPONSE * prepare_resp;
        enum_func_status ret = PASS;
 
        DBG_ENTER("mysqlnd_stmt_read_prepare_response");
        DBG_INF_FMT("stmt=%lu", stmt->stmt_id);
 
-       PACKET_INIT_ALLOCA(prepare_resp, PROT_PREPARE_RESP_PACKET);
-       if (FAIL == PACKET_READ_ALLOCA(prepare_resp, stmt->conn)) {
+       prepare_resp = stmt->conn->protocol->m.get_prepare_response_packet(stmt->conn->protocol, FALSE TSRMLS_CC);
+       if (FAIL == PACKET_READ(prepare_resp, stmt->conn)) {
                ret = FAIL;
                goto done;
        }
 
-       if (0xFF == prepare_resp.error_code) {
-               stmt->error_info = stmt->conn->error_info = prepare_resp.error_info;
+       if (0xFF == prepare_resp->error_code) {
+               stmt->error_info = stmt->conn->error_info = prepare_resp->error_info;
                ret = FAIL;
                goto done;
        }
 
-       stmt->stmt_id = prepare_resp.stmt_id;
-       stmt->warning_count = stmt->conn->upsert_status.warning_count = prepare_resp.warning_count;
-       stmt->field_count = stmt->conn->field_count = prepare_resp.field_count;
-       stmt->param_count = prepare_resp.param_count;
-       PACKET_FREE_ALLOCA(prepare_resp);
-
+       stmt->stmt_id = prepare_resp->stmt_id;
+       stmt->warning_count = stmt->conn->upsert_status.warning_count = prepare_resp->warning_count;
+       stmt->field_count = stmt->conn->field_count = prepare_resp->field_count;
+       stmt->param_count = prepare_resp->param_count;
 done:
+       PACKET_FREE(prepare_resp);
+
        DBG_RETURN(ret);
 }
 /* }}} */
@@ -276,14 +276,14 @@ done:
 static enum_func_status
 mysqlnd_stmt_prepare_read_eof(MYSQLND_STMT *stmt TSRMLS_DC)
 {
-       php_mysql_packet_eof fields_eof;
+       MYSQLND_PACKET_EOF * fields_eof;
        enum_func_status ret;
 
        DBG_ENTER("mysqlnd_stmt_prepare_read_eof");
        DBG_INF_FMT("stmt=%lu", stmt->stmt_id);
 
-       PACKET_INIT_ALLOCA(fields_eof, PROT_EOF_PACKET);
-       if (FAIL == (ret = PACKET_READ_ALLOCA(fields_eof, stmt->conn))) {
+       fields_eof = stmt->conn->protocol->m.get_eof_packet(stmt->conn->protocol, FALSE TSRMLS_CC);
+       if (FAIL == (ret = PACKET_READ(fields_eof, stmt->conn))) {
                if (stmt->result) {
                        stmt->result->m.free_result_contents(stmt->result TSRMLS_CC);
                        mnd_efree(stmt->result);
@@ -291,11 +291,11 @@ mysqlnd_stmt_prepare_read_eof(MYSQLND_STMT *stmt TSRMLS_DC)
                        stmt->state = MYSQLND_STMT_INITTED;
                }
        } else {
-               stmt->upsert_status.server_status = fields_eof.server_status;
-               stmt->upsert_status.warning_count = fields_eof.warning_count;
+               stmt->upsert_status.server_status = fields_eof->server_status;
+               stmt->upsert_status.warning_count = fields_eof->warning_count;
                stmt->state = MYSQLND_STMT_PREPARED;
        }
-       PACKET_FREE_ALLOCA(fields_eof);
+       PACKET_FREE(fields_eof);
 
        DBG_RETURN(ret);
 }
@@ -616,7 +616,7 @@ MYSQLND_METHOD(mysqlnd_stmt, execute)(MYSQLND_STMT * const stmt TSRMLS_DC)
        ret = mysqlnd_stmt_execute_parse_response(stmt TSRMLS_CC);
 
        if (ret == PASS && conn->last_query_type == QUERY_UPSERT && stmt->upsert_status.affected_rows) {
-               MYSQLND_INC_CONN_STATISTIC_W_VALUE(&conn->stats, STAT_ROWS_AFFECTED_PS, stmt->upsert_status.affected_rows);
+               MYSQLND_INC_CONN_STATISTIC_W_VALUE(conn->stats, STAT_ROWS_AFFECTED_PS, stmt->upsert_status.affected_rows);
        }
        DBG_RETURN(ret);
 }
@@ -655,7 +655,7 @@ mysqlnd_fetch_stmt_row_buffered(MYSQLND_RES *result, void *param, unsigned int f
                                                                          result->stored_data->persistent,
                                                                          result->conn->options.numeric_and_datetime_as_unicode,
                                                                          result->conn->options.int_and_float_native,
-                                                                         &result->conn->stats TSRMLS_CC);
+                                                                         result->conn->stats TSRMLS_CC);
                                if (stmt->update_max_length) {
                                        for (i = 0; i < result->field_count; i++) {
                                                /*
@@ -726,7 +726,7 @@ mysqlnd_stmt_fetch_row_unbuffered(MYSQLND_RES *result, void *param, unsigned int
 {
        enum_func_status ret;
        MYSQLND_STMT *stmt = (MYSQLND_STMT *) param;
-       php_mysql_packet_row *row_packet = result->row_packet;
+       MYSQLND_PACKET_ROW *row_packet = result->row_packet;
 
        DBG_ENTER("mysqlnd_stmt_fetch_row_unbuffered");
 
@@ -770,7 +770,7 @@ mysqlnd_stmt_fetch_row_unbuffered(MYSQLND_RES *result, void *param, unsigned int
                                                                  FALSE,
                                                                  result->conn->options.numeric_and_datetime_as_unicode,
                                                                  result->conn->options.int_and_float_native,
-                                                                 &result->conn->stats TSRMLS_CC);
+                                                                 result->conn->stats TSRMLS_CC);
 
                        for (i = 0; i < field_count; i++) {
                                if (stmt->result_bind[i].bound == TRUE) {
@@ -794,12 +794,12 @@ mysqlnd_stmt_fetch_row_unbuffered(MYSQLND_RES *result, void *param, unsigned int
                                                        result->meta->fields[i].max_length = Z_STRLEN_P(data);
                                                }
                                                stmt->result_bind[i].zv->value = data->value;
-                                               // copied data, thus also the ownership. Thus null data
+                                               /* copied data, thus also the ownership. Thus null data */
                                                ZVAL_NULL(data);
                                        }
                                }
                        }
-                       MYSQLND_INC_CONN_STATISTIC(&stmt->conn->stats, STAT_ROWS_FETCHED_FROM_CLIENT_PS_UNBUF);
+                       MYSQLND_INC_CONN_STATISTIC(stmt->conn->stats, STAT_ROWS_FETCHED_FROM_CLIENT_PS_UNBUF);
                } else {
                        DBG_INF("skipping extraction");
                        /*
@@ -866,7 +866,7 @@ MYSQLND_METHOD(mysqlnd_stmt, use_result)(MYSQLND_STMT *stmt TSRMLS_DC)
 
        SET_EMPTY_ERROR(stmt->error_info);
 
-       MYSQLND_INC_CONN_STATISTIC(&stmt->conn->stats, STAT_PS_UNBUFFERED_SETS);
+       MYSQLND_INC_CONN_STATISTIC(stmt->conn->stats, STAT_PS_UNBUFFERED_SETS);
        result = stmt->result;
 
        DBG_INF_FMT("%scursor exists", stmt->cursor_exists? "":"no ");
@@ -891,7 +891,7 @@ mysqlnd_fetch_stmt_row_cursor(MYSQLND_RES *result, void *param, unsigned int fla
        enum_func_status ret;
        MYSQLND_STMT *stmt = (MYSQLND_STMT *) param;
        zend_uchar buf[STMT_ID_LENGTH /* statement id */ + 4 /* number of rows to fetch */];
-       php_mysql_packet_row *row_packet = result->row_packet;
+       MYSQLND_PACKET_ROW *row_packet = result->row_packet;
 
        DBG_ENTER("mysqlnd_fetch_stmt_row_cursor");
 
@@ -947,7 +947,7 @@ mysqlnd_fetch_stmt_row_cursor(MYSQLND_RES *result, void *param, unsigned int fla
                                                                  FALSE,
                                                                  result->conn->options.numeric_and_datetime_as_unicode,
                                                                  result->conn->options.int_and_float_native,
-                                                                 &result->conn->stats TSRMLS_CC);
+                                                                 result->conn->stats TSRMLS_CC);
 
                        /* If no result bind, do nothing. We consumed the data */
                        for (i = 0; i < field_count; i++) {
@@ -973,7 +973,7 @@ mysqlnd_fetch_stmt_row_cursor(MYSQLND_RES *result, void *param, unsigned int fla
                                                        result->meta->fields[i].max_length = Z_STRLEN_P(data);
                                                }
                                                stmt->result_bind[i].zv->value = data->value;
-                                               // copied data, thus also the ownership. Thus null data
+                                               /* copied data, thus also the ownership. Thus null data */
                                                ZVAL_NULL(data);
                                        }
                                }
@@ -995,7 +995,7 @@ mysqlnd_fetch_stmt_row_cursor(MYSQLND_RES *result, void *param, unsigned int fla
                        row_packet->row_buffer->free_chunk(row_packet->row_buffer, TRUE TSRMLS_CC);
                        row_packet->row_buffer = NULL;
                }
-               MYSQLND_INC_CONN_STATISTIC(&stmt->conn->stats, STAT_ROWS_FETCHED_FROM_CLIENT_PS_CURSOR);
+               MYSQLND_INC_CONN_STATISTIC(stmt->conn->stats, STAT_ROWS_FETCHED_FROM_CLIENT_PS_CURSOR);
        } else {
                *fetched_anything = FALSE;
 
@@ -1987,7 +1987,7 @@ MYSQLND_METHOD_PRIVATE(mysqlnd_stmt, net_close)(MYSQLND_STMT * const stmt, zend_
                        break;
        }
        if (stat != STAT_LAST) {
-               MYSQLND_INC_CONN_STATISTIC(&conn->stats, stat);
+               MYSQLND_INC_CONN_STATISTIC(conn->stats, stat);
        }
 
        if (stmt->execute_cmd_buffer.buffer) {
index 22ea7d325dacf293bb55f0530b6335ea79932ddb..17f493a4744ed1054666e8f4bd6ca016dd932a9b 100644 (file)
@@ -59,7 +59,7 @@ MYSQLND_METHOD(mysqlnd_res, initialize_result_set_rest)(MYSQLND_RES * const resu
                                                result->stored_data->persistent,
                                                result->conn->options.numeric_and_datetime_as_unicode,
                                                result->conn->options.int_and_float_native,
-                                               &result->conn->stats TSRMLS_CC);
+                                               result->conn->stats TSRMLS_CC);
                        for (i = 0; i < result->field_count; i++) {
                                /*
                                  NULL fields are 0 length, 0 is not more than 0
@@ -144,7 +144,7 @@ MYSQLND_METHOD(mysqlnd_res, unbuffered_free_last_data)(MYSQLND_RES * result TSRM
        if (unbuf->last_row_data) {
                unsigned int i, ctor_called_count = 0;
                zend_bool copy_ctor_called;
-               MYSQLND_STATS *global_stats = result->conn? &result->conn->stats:NULL;
+               MYSQLND_STATS *global_stats = result->conn? result->conn->stats:NULL;
 
                DBG_INF_FMT("%u columns to free", result->field_count);
                for (i = 0; i < result->field_count; i++) {
@@ -354,21 +354,21 @@ enum_func_status
 mysqlnd_query_read_result_set_header(MYSQLND *conn, MYSQLND_STMT *stmt TSRMLS_DC)
 {
        enum_func_status ret;
-       php_mysql_packet_rset_header rset_header;
+       MYSQLND_PACKET_RSET_HEADER * rset_header;
 
        DBG_ENTER("mysqlnd_query_read_result_set_header");
        DBG_INF_FMT("stmt=%d", stmt? stmt->stmt_id:0);
 
        ret = FAIL;
-       PACKET_INIT_ALLOCA(rset_header, PROT_RSET_HEADER_PACKET);
+       rset_header = conn->protocol->m.get_rset_header_packet(conn->protocol, FALSE TSRMLS_CC);
        do {
                SET_ERROR_AFF_ROWS(conn);
-               if (FAIL == (ret = PACKET_READ_ALLOCA(rset_header, conn))) {
+               if (FAIL == (ret = PACKET_READ(rset_header, conn))) {
                        php_error_docref(NULL TSRMLS_CC, E_WARNING, "Error reading result set's header");
                        break;
                }
 
-               if (rset_header.error_info.error_no) {
+               if (rset_header->error_info.error_no) {
                        /*
                          Cover a protocol design error: error packet does not
                          contain the server status. Therefore, the client has no way
@@ -383,7 +383,7 @@ mysqlnd_query_read_result_set_header(MYSQLND *conn, MYSQLND_STMT *stmt TSRMLS_DC
                          This will copy the error code and the messages, as they
                          are buffers in the struct
                        */
-                       conn->error_info = rset_header.error_info;
+                       conn->error_info = rset_header->error_info;
                        ret = FAIL;
                        /* Return back from CONN_QUERY_SENT */
                        CONN_SET_STATE(conn, CONN_READY);
@@ -391,27 +391,27 @@ mysqlnd_query_read_result_set_header(MYSQLND *conn, MYSQLND_STMT *stmt TSRMLS_DC
                }
                conn->error_info.error_no = 0;
 
-               switch (rset_header.field_count) {
+               switch (rset_header->field_count) {
                        case MYSQLND_NULL_LENGTH: {     /* LOAD DATA LOCAL INFILE */
                                zend_bool is_warning;
                                DBG_INF("LOAD DATA");
                                conn->last_query_type = QUERY_LOAD_LOCAL;
                                CONN_SET_STATE(conn, CONN_SENDING_LOAD_DATA);
-                               ret = mysqlnd_handle_local_infile(conn, rset_header.info_or_local_file, &is_warning TSRMLS_CC);
+                               ret = mysqlnd_handle_local_infile(conn, rset_header->info_or_local_file, &is_warning TSRMLS_CC);
                                CONN_SET_STATE(conn,  (ret == PASS || is_warning == TRUE)? CONN_READY:CONN_QUIT_SENT);
-                               MYSQLND_INC_CONN_STATISTIC(&conn->stats, STAT_NON_RSET_QUERY);
+                               MYSQLND_INC_CONN_STATISTIC(conn->stats, STAT_NON_RSET_QUERY);
                                break;
                        }
                        case 0:                         /* UPSERT */
                                DBG_INF("UPSERT");
                                conn->last_query_type = QUERY_UPSERT;
-                               conn->field_count = rset_header.field_count;
-                               conn->upsert_status.warning_count = rset_header.warning_count;
-                               conn->upsert_status.server_status = rset_header.server_status;
-                               conn->upsert_status.affected_rows = rset_header.affected_rows;
-                               conn->upsert_status.last_insert_id = rset_header.last_insert_id;
+                               conn->field_count = rset_header->field_count;
+                               conn->upsert_status.warning_count = rset_header->warning_count;
+                               conn->upsert_status.server_status = rset_header->server_status;
+                               conn->upsert_status.affected_rows = rset_header->affected_rows;
+                               conn->upsert_status.last_insert_id = rset_header->last_insert_id;
                                SET_NEW_MESSAGE(conn->last_message, conn->last_message_len,
-                                                               rset_header.info_or_local_file, rset_header.info_or_local_file_len,
+                                                               rset_header->info_or_local_file, rset_header->info_or_local_file_len,
                                                                conn->persistent);
                                /* Result set can follow UPSERT statement, check server_status */
                                if (conn->upsert_status.server_status & SERVER_MORE_RESULTS_EXISTS) {
@@ -420,17 +420,17 @@ mysqlnd_query_read_result_set_header(MYSQLND *conn, MYSQLND_STMT *stmt TSRMLS_DC
                                        CONN_SET_STATE(conn, CONN_READY);
                                }
                                ret = PASS;
-                               MYSQLND_INC_CONN_STATISTIC(&conn->stats, STAT_NON_RSET_QUERY);
+                               MYSQLND_INC_CONN_STATISTIC(conn->stats, STAT_NON_RSET_QUERY);
                                break;
                        default:{                       /* Result set   */
-                               php_mysql_packet_eof fields_eof;
+                               MYSQLND_PACKET_EOF * fields_eof;
                                MYSQLND_RES *result;
                                enum_mysqlnd_collected_stats stat = STAT_LAST;
 
                                DBG_INF("Result set pending");
                                SET_EMPTY_MESSAGE(conn->last_message, conn->last_message_len, conn->persistent);
 
-                               MYSQLND_INC_CONN_STATISTIC(&conn->stats, STAT_RSET_QUERY);
+                               MYSQLND_INC_CONN_STATISTIC(conn->stats, STAT_RSET_QUERY);
                                memset(&conn->upsert_status, 0, sizeof(conn->upsert_status));
                                /* restore after zeroing */
                                SET_ERROR_AFF_ROWS(conn);
@@ -438,9 +438,9 @@ mysqlnd_query_read_result_set_header(MYSQLND *conn, MYSQLND_STMT *stmt TSRMLS_DC
                                conn->last_query_type = QUERY_SELECT;
                                CONN_SET_STATE(conn, CONN_FETCHING_DATA);
                                /* PS has already allocated it */
-                               conn->field_count = rset_header.field_count;
+                               conn->field_count = rset_header->field_count;
                                if (!stmt) {
-                                       result = conn->current_result = mysqlnd_result_init(rset_header.field_count TSRMLS_CC);
+                                       result = conn->current_result = mysqlnd_result_init(rset_header->field_count TSRMLS_CC);
                                } else {
                                        if (!stmt->result) {
                                                DBG_INF("This is 'SHOW'/'EXPLAIN'-like query.");
@@ -449,7 +449,7 @@ mysqlnd_query_read_result_set_header(MYSQLND *conn, MYSQLND_STMT *stmt TSRMLS_DC
                                                  prepared statements can't send result set metadata for these queries
                                                  on prepare stage. Read it now.
                                                */
-                                               result = stmt->result = mysqlnd_result_init(rset_header.field_count TSRMLS_CC);
+                                               result = stmt->result = mysqlnd_result_init(rset_header->field_count TSRMLS_CC);
                                        } else {
                                                /*
                                                  Update result set metadata if it for some reason changed between
@@ -478,8 +478,8 @@ mysqlnd_query_read_result_set_header(MYSQLND *conn, MYSQLND_STMT *stmt TSRMLS_DC
                                }
 
                                /* Check for SERVER_STATUS_MORE_RESULTS if needed */
-                               PACKET_INIT_ALLOCA(fields_eof, PROT_EOF_PACKET);
-                               if (FAIL == (ret = PACKET_READ_ALLOCA(fields_eof, conn))) {
+                               fields_eof = conn->protocol->m.get_eof_packet(conn->protocol, FALSE TSRMLS_CC);
+                               if (FAIL == (ret = PACKET_READ(fields_eof, conn))) {
                                        DBG_ERR("Error ocurred while reading the EOF packet");
                                        result->m.free_result_contents(result TSRMLS_CC);
                                        mnd_efree(result);
@@ -492,9 +492,9 @@ mysqlnd_query_read_result_set_header(MYSQLND *conn, MYSQLND_STMT *stmt TSRMLS_DC
                                        }
                                } else {
                                        unsigned int to_log = MYSQLND_G(log_mask);
-                                       to_log &= fields_eof.server_status;
-                                       DBG_INF_FMT("warnings=%u server_status=%u", fields_eof.warning_count, fields_eof.server_status);
-                                       conn->upsert_status.warning_count = fields_eof.warning_count;
+                                       to_log &= fields_eof->server_status;
+                                       DBG_INF_FMT("warnings=%u server_status=%u", fields_eof->warning_count, fields_eof->server_status);
+                                       conn->upsert_status.warning_count = fields_eof->warning_count;
                                        /*
                                          If SERVER_MORE_RESULTS_EXISTS is set then this is either MULTI_QUERY or a CALL()
                                          The first packet after sending the query/com_execute has the bit set only
@@ -502,12 +502,12 @@ mysqlnd_query_read_result_set_header(MYSQLND *conn, MYSQLND_STMT *stmt TSRMLS_DC
                                          will include many result sets. What actually matters are the bits set at the end
                                          of every result set (the EOF packet).
                                        */
-                                       conn->upsert_status.server_status = fields_eof.server_status;
-                                       if (fields_eof.server_status & SERVER_QUERY_NO_GOOD_INDEX_USED) {
+                                       conn->upsert_status.server_status = fields_eof->server_status;
+                                       if (fields_eof->server_status & SERVER_QUERY_NO_GOOD_INDEX_USED) {
                                                stat = STAT_BAD_INDEX_USED;
-                                       } else if (fields_eof.server_status & SERVER_QUERY_NO_INDEX_USED) {
+                                       } else if (fields_eof->server_status & SERVER_QUERY_NO_INDEX_USED) {
                                                stat = STAT_NO_INDEX_USED;
-                                       } else if (fields_eof.server_status & SERVER_QUERY_WAS_SLOW) {
+                                       } else if (fields_eof->server_status & SERVER_QUERY_WAS_SLOW) {
                                                stat = STAT_QUERY_WAS_SLOW;
                                        }
                                        if (to_log) {
@@ -517,16 +517,16 @@ mysqlnd_query_read_result_set_header(MYSQLND *conn, MYSQLND_STMT *stmt TSRMLS_DC
                                                efree(backtrace);
 #endif
                                        }
-                                       MYSQLND_INC_CONN_STATISTIC(&conn->stats, stat);
+                                       MYSQLND_INC_CONN_STATISTIC(conn->stats, stat);
                                }
 
-                               PACKET_FREE_ALLOCA(fields_eof);
+                               PACKET_FREE(fields_eof);
 
                                break;
                        }
                }
        } while (0);
-       PACKET_FREE_ALLOCA(rset_header);
+       PACKET_FREE(rset_header);
 
        DBG_INF(ret == PASS? "PASS":"FAIL");
        DBG_RETURN(ret);
@@ -596,7 +596,7 @@ mysqlnd_fetch_row_unbuffered_c(MYSQLND_RES *result TSRMLS_DC)
        MYSQLND_ROW_C                   retrow = NULL;
        unsigned int                    i,
                                                        field_count = result->field_count;
-       php_mysql_packet_row    *row_packet = result->row_packet;
+       MYSQLND_PACKET_ROW      *row_packet = result->row_packet;
        unsigned long                   *lengths = result->lengths;
 
        DBG_ENTER("mysqlnd_fetch_row_unbuffered_c");
@@ -627,7 +627,7 @@ mysqlnd_fetch_row_unbuffered_c(MYSQLND_RES *result TSRMLS_DC)
                row_packet->fields = NULL;
                row_packet->row_buffer = NULL;
 
-               MYSQLND_INC_CONN_STATISTIC(&result->conn->stats, STAT_ROWS_FETCHED_FROM_CLIENT_NORMAL_UNBUF);
+               MYSQLND_INC_CONN_STATISTIC(result->conn->stats, STAT_ROWS_FETCHED_FROM_CLIENT_NORMAL_UNBUF);
 
                if (!row_packet->skip_extraction) {
                        MYSQLND_FIELD *field = result->meta->fields;
@@ -640,7 +640,7 @@ mysqlnd_fetch_row_unbuffered_c(MYSQLND_RES *result TSRMLS_DC)
                                                                  FALSE,
                                                                  result->conn->options.numeric_and_datetime_as_unicode,
                                                                  result->conn->options.int_and_float_native,
-                                                                 &result->conn->stats TSRMLS_CC);
+                                                                 result->conn->stats TSRMLS_CC);
 
                        retrow = mnd_malloc(result->field_count * sizeof(char *));
 
@@ -703,7 +703,7 @@ mysqlnd_fetch_row_unbuffered(MYSQLND_RES *result, void *param, unsigned int flag
 {
        enum_func_status                ret;
        zval                                    *row = (zval *) param;
-       php_mysql_packet_row    *row_packet = result->row_packet;
+       MYSQLND_PACKET_ROW      *row_packet = result->row_packet;
 
        DBG_ENTER("mysqlnd_fetch_row_unbuffered");
        DBG_INF_FMT("flags=%d", flags);
@@ -737,7 +737,7 @@ mysqlnd_fetch_row_unbuffered(MYSQLND_RES *result, void *param, unsigned int flag
                row_packet->row_buffer = NULL;
 
 
-               MYSQLND_INC_CONN_STATISTIC(&result->conn->stats, STAT_ROWS_FETCHED_FROM_CLIENT_NORMAL_UNBUF);
+               MYSQLND_INC_CONN_STATISTIC(result->conn->stats, STAT_ROWS_FETCHED_FROM_CLIENT_NORMAL_UNBUF);
 
                if (!row_packet->skip_extraction) {
                        HashTable *row_ht = Z_ARRVAL_P(row);
@@ -753,7 +753,7 @@ mysqlnd_fetch_row_unbuffered(MYSQLND_RES *result, void *param, unsigned int flag
                                                                  FALSE,
                                                                  result->conn->options.numeric_and_datetime_as_unicode,
                                                                  result->conn->options.int_and_float_native,
-                                                                 &result->conn->stats TSRMLS_CC);
+                                                                 result->conn->stats TSRMLS_CC);
 
                        for (i = 0; i < field_count; i++, field++, zend_hash_key++) {
                                zval *data = result->unbuf->last_row_data[i];
@@ -866,7 +866,7 @@ MYSQLND_METHOD(mysqlnd_res, use_result)(MYSQLND_RES * const result, zend_bool ps
          this to be not NULL.
        */
        /* FALSE = non-persistent */
-       PACKET_INIT(result->row_packet, PROT_ROW_PACKET, php_mysql_packet_row *, FALSE);
+       result->row_packet = result->conn->protocol->m.get_row_packet(result->conn->protocol, FALSE TSRMLS_CC);
        result->row_packet->result_set_memory_pool = result->result_set_memory_pool;
        result->row_packet->field_count = result->field_count;
        result->row_packet->binary_protocol = ps;
@@ -907,7 +907,7 @@ mysqlnd_fetch_row_buffered_c(MYSQLND_RES *result TSRMLS_DC)
                                                                  FALSE,
                                                                  result->conn->options.numeric_and_datetime_as_unicode,
                                                                  result->conn->options.int_and_float_native,
-                                                                 &result->conn->stats TSRMLS_CC);
+                                                                 result->conn->stats TSRMLS_CC);
                        for (i = 0; i < result->field_count; i++) {
                                /*
                                  NULL fields are 0 length, 0 is not more than 0
@@ -976,7 +976,7 @@ mysqlnd_fetch_row_buffered(MYSQLND_RES *result, void *param, unsigned int flags,
                                                                  result->stored_data->persistent,
                                                                  result->conn->options.numeric_and_datetime_as_unicode,
                                                                  result->conn->options.int_and_float_native,
-                                                                 &result->conn->stats TSRMLS_CC);
+                                                                 result->conn->stats TSRMLS_CC);
                        for (i = 0; i < result->field_count; i++) {
                                /*
                                  NULL fields are 0 length, 0 is not more than 0
@@ -1053,7 +1053,7 @@ MYSQLND_METHOD(mysqlnd_res, store_result_fetch_data)(MYSQLND * const conn, MYSQL
                                                                                                        zend_bool to_cache TSRMLS_DC)
 {
        enum_func_status ret;
-       php_mysql_packet_row *row_packet;
+       MYSQLND_PACKET_ROW *row_packet;
        unsigned int next_extend = STORE_RESULT_PREALLOCATED_SET_IF_NOT_EMPTY, free_rows = 1;
        MYSQLND_RES_BUFFERED *set;
 
@@ -1072,7 +1072,7 @@ MYSQLND_METHOD(mysqlnd_res, store_result_fetch_data)(MYSQLND * const conn, MYSQL
                                                                                         php_mysqlnd_rowp_read_text_protocol;
 
        /* non-persistent */
-       PACKET_INIT(row_packet, PROT_ROW_PACKET, php_mysql_packet_row *, FALSE);
+       row_packet = conn->protocol->m.get_row_packet(conn->protocol, FALSE TSRMLS_CC);
        row_packet->result_set_memory_pool = result->result_set_memory_pool;
        row_packet->field_count = meta->field_count;
        row_packet->binary_protocol = binary_protocol;
@@ -1113,7 +1113,7 @@ MYSQLND_METHOD(mysqlnd_res, store_result_fetch_data)(MYSQLND * const conn, MYSQL
                memset(set->data, 0, set->row_count * meta->field_count * sizeof(zval *));
        }
 
-       MYSQLND_INC_CONN_STATISTIC_W_VALUE(&conn->stats,
+       MYSQLND_INC_CONN_STATISTIC_W_VALUE(conn->stats,
                                                                           binary_protocol? STAT_ROWS_BUFFERED_FROM_CLIENT_PS:
                                                                                                                STAT_ROWS_BUFFERED_FROM_CLIENT_NORMAL,
                                                                           set->row_count);
@@ -1209,7 +1209,7 @@ MYSQLND_METHOD(mysqlnd_res, skip_result)(MYSQLND_RES * const result TSRMLS_DC)
        {
                DBG_INF("skipping result");
                /* We have to fetch all data to clean the line */
-               MYSQLND_INC_CONN_STATISTIC(&result->conn->stats,
+               MYSQLND_INC_CONN_STATISTIC(result->conn->stats,
                                                                        result->type == MYSQLND_RES_NORMAL? STAT_FLUSHED_NORMAL_SETS:
                                                                                                                                                STAT_FLUSHED_PS_SETS);
 
@@ -1232,7 +1232,7 @@ MYSQLND_METHOD(mysqlnd_res, free_result)(MYSQLND_RES *result, zend_bool implicit
        DBG_INF_FMT("implicit=%d", implicit);
 
        result->m.skip_result(result TSRMLS_CC);
-       MYSQLND_INC_CONN_STATISTIC(result->conn? &result->conn->stats : NULL,
+       MYSQLND_INC_CONN_STATISTIC(result->conn? result->conn->stats : NULL,
                                                           implicit == TRUE?    STAT_FREE_RESULT_IMPLICIT:
                                                                                                        STAT_FREE_RESULT_EXPLICIT);
 
@@ -1531,7 +1531,8 @@ MYSQLND_METHOD(mysqlnd_res, fetch_field_data)(MYSQLND_RES *result, unsigned int
 
 
 /* {{{ mysqlnd_result_init */
-MYSQLND_RES *mysqlnd_result_init(unsigned int field_count TSRMLS_DC)
+PHPAPI MYSQLND_RES *
+mysqlnd_result_init(unsigned int field_count TSRMLS_DC)
 {
        size_t alloc_size = sizeof(MYSQLND_RES) + mysqlnd_plugin_count() * sizeof(void *);
        MYSQLND_RES *ret = mnd_ecalloc(1, alloc_size);
index 9d41c54f5a7db3316bee68edca35e245cd7c201e..1e9494419be3e8bc6eab73ee9807f88f27b38fd0 100644 (file)
@@ -23,7 +23,7 @@
 #ifndef MYSQLND_RESULT_H
 #define MYSQLND_RESULT_H
 
-MYSQLND_RES *mysqlnd_result_init(unsigned int field_count TSRMLS_DC);
+PHPAPI MYSQLND_RES * mysqlnd_result_init(unsigned int field_count TSRMLS_DC);
 
 enum_func_status mysqlnd_query_read_result_set_header(MYSQLND *conn, MYSQLND_STMT *stmt TSRMLS_DC);
 
index 95ef93a65b7ea6d4ccea468780d7a9267e038464..cfb0fbc957d6aefa4c675c4b643088230e1f7aaf 100644 (file)
@@ -142,7 +142,7 @@ MYSQLND_METHOD(mysqlnd_res_meta, read_metadata)(MYSQLND_RES_METADATA * const met
                                                                                                MYSQLND *conn TSRMLS_DC)
 {
        unsigned int i = 0;
-       php_mysql_packet_res_field field_packet;
+       MYSQLND_PACKET_RES_FIELD * field_packet;
 #if PHP_MAJOR_VERSION >= 6
        UChar *ustr;
        int ulen;
@@ -150,7 +150,7 @@ MYSQLND_METHOD(mysqlnd_res_meta, read_metadata)(MYSQLND_RES_METADATA * const met
 
        DBG_ENTER("mysqlnd_res_meta::read_metadata");
 
-       PACKET_INIT_ALLOCA(field_packet, PROT_RSET_FLD_PACKET);
+       field_packet = conn->protocol->m.get_result_field_packet(conn->protocol, FALSE TSRMLS_CC);
        for (;i < meta->field_count; i++) {
                long idx;
 
@@ -160,19 +160,19 @@ MYSQLND_METHOD(mysqlnd_res_meta, read_metadata)(MYSQLND_RES_METADATA * const met
                        meta->fields[i].root = NULL;
                }
 
-               field_packet.metadata = &(meta->fields[i]);
-               if (FAIL == PACKET_READ_ALLOCA(field_packet, conn)) {
-                       PACKET_FREE_ALLOCA(field_packet);
+               field_packet->metadata = &(meta->fields[i]);
+               if (FAIL == PACKET_READ(field_packet, conn)) {
+                       PACKET_FREE(field_packet);
                        DBG_RETURN(FAIL);
                }
-               if (field_packet.error_info.error_no) {
-                       conn->error_info = field_packet.error_info;
+               if (field_packet->error_info.error_no) {
+                       conn->error_info = field_packet->error_info;
                        /* Return back from CONN_QUERY_SENT */
-                       PACKET_FREE_ALLOCA(field_packet);
+                       PACKET_FREE(field_packet);
                        DBG_RETURN(FAIL);
                }
                
-               if (field_packet.stupid_list_fields_eof == TRUE) {
+               if (field_packet->stupid_list_fields_eof == TRUE) {
                        meta->field_count = i;
                        break;
                }
@@ -184,7 +184,7 @@ MYSQLND_METHOD(mysqlnd_res_meta, read_metadata)(MYSQLND_RES_METADATA * const met
                                                         "Unknown type %d sent by the server. "
                                                         "Please send a report to the developers",
                                                         meta->fields[i].type);
-                       PACKET_FREE_ALLOCA(field_packet);
+                       PACKET_FREE(field_packet);
                        DBG_RETURN(FAIL);
                }
                if (meta->fields[i].type == MYSQL_TYPE_BIT) {
@@ -240,19 +240,19 @@ MYSQLND_METHOD(mysqlnd_res_meta, read_metadata)(MYSQLND_RES_METADATA * const met
 #else
                /* For BC we have to check whether the key is numeric and use it like this */
                if ((meta->zend_hash_keys[i].is_numeric =
-                                       mysqlnd_is_key_numeric(field_packet.metadata->name,
-                                                                                  field_packet.metadata->name_length + 1,
+                                       mysqlnd_is_key_numeric(field_packet->metadata->name,
+                                                                                  field_packet->metadata->name_length + 1,
                                                                                   &idx)))
                {
                        meta->zend_hash_keys[i].key = idx;
                } else {
                        meta->zend_hash_keys[i].key =
-                                       zend_get_hash_value(field_packet.metadata->name,
-                                                                               field_packet.metadata->name_length + 1);
+                                       zend_get_hash_value(field_packet->metadata->name,
+                                                                               field_packet->metadata->name_length + 1);
                }
 #endif
        }
-       PACKET_FREE_ALLOCA(field_packet);
+       PACKET_FREE(field_packet);
 
        DBG_RETURN(PASS);
 }
@@ -437,7 +437,7 @@ MYSQLND_CLASS_METHODS_END;
 
 
 /* {{{ mysqlnd_result_meta_init */
-MYSQLND_RES_METADATA *
+PHPAPI MYSQLND_RES_METADATA *
 mysqlnd_result_meta_init(unsigned int field_count TSRMLS_DC)
 {
        MYSQLND_RES_METADATA *ret;
index 0fd8299dcc0c21d4d75b52b5d70b4682851a1dfb..84e495d4c4949e6e1098183e8b88eedc922e65b8 100644 (file)
@@ -24,7 +24,7 @@
 #define MYSQLND_RESULT_META_H
 
 
-MYSQLND_RES_METADATA *mysqlnd_result_meta_init(unsigned int field_count TSRMLS_DC);
+PHPAPI MYSQLND_RES_METADATA * mysqlnd_result_meta_init(unsigned int field_count TSRMLS_DC);
 
 
 
index ca3967e2155e56788efe9fda4c5c857b7c1f2e4c..e52414b3e8c66ce183c9ce97e725befa928c7256 100644 (file)
@@ -190,13 +190,13 @@ const MYSQLND_STRING mysqlnd_stats_values_names[STAT_LAST] =
 
 
 /* {{{ mysqlnd_fill_stats_hash */
-void
-mysqlnd_fill_stats_hash(const MYSQLND_STATS * const stats, zval *return_value TSRMLS_DC ZEND_FILE_LINE_DC)
+PHPAPI void
+mysqlnd_fill_stats_hash(const MYSQLND_STATS * const stats, const MYSQLND_STRING * names, zval *return_value TSRMLS_DC ZEND_FILE_LINE_DC)
 {
        unsigned int i;
 
-       mysqlnd_array_init(return_value, STAT_LAST);
-       for (i = 0; i < STAT_LAST; i++) {
+       mysqlnd_array_init(return_value, stats->count);
+       for (i = 0; i < stats->count; i++) {
 #if PHP_MAJOR_VERSION >= 6
                UChar *ustr, *tstr;
                int ulen, tlen;
@@ -205,15 +205,13 @@ mysqlnd_fill_stats_hash(const MYSQLND_STATS * const stats, zval *return_value TS
                
                sprintf((char *)&tmp, MYSQLND_LLU_SPEC, stats->values[i]);
 #if PHP_MAJOR_VERSION >= 6
-               zend_string_to_unicode(UG(utf8_conv), &ustr, &ulen, mysqlnd_stats_values_names[i].s,
-                                                               mysqlnd_stats_values_names[i].l + 1 TSRMLS_CC);
+               zend_string_to_unicode(UG(utf8_conv), &ustr, &ulen, names[i].s, names[i].l + 1 TSRMLS_CC);
                zend_string_to_unicode(UG(utf8_conv), &tstr, &tlen, tmp, strlen(tmp) + 1 TSRMLS_CC);
                add_u_assoc_unicode_ex(return_value, IS_UNICODE, ZSTR(ustr), ulen, tstr, 1);
                efree(ustr);
                efree(tstr);
 #else
-               add_assoc_string_ex(return_value, mysqlnd_stats_values_names[i].s,
-                                                       mysqlnd_stats_values_names[i].l + 1, tmp, 1);
+               add_assoc_string_ex(return_value, names[i].s, names[i].l + 1, tmp, 1);
 #endif
        }
 }
@@ -229,17 +227,21 @@ PHPAPI void _mysqlnd_get_client_stats(zval *return_value TSRMLS_DC ZEND_FILE_LIN
                memset(&stats, 0, sizeof(stats));
                stats_ptr = &stats;
        }
-       mysqlnd_fill_stats_hash(stats_ptr, return_value TSRMLS_CC ZEND_FILE_LINE_CC);
+       mysqlnd_fill_stats_hash(stats_ptr, mysqlnd_stats_values_names, return_value TSRMLS_CC ZEND_FILE_LINE_CC);
        DBG_VOID_RETURN;
 }
 /* }}} */
 
 
 /* {{{ mysqlnd_stats_init */
-void
-mysqlnd_stats_init(MYSQLND_STATS ** stats)
+PHPAPI void
+mysqlnd_stats_init(MYSQLND_STATS ** stats, size_t statistic_count)
 {
        *stats = calloc(1, sizeof(MYSQLND_STATS));
+       (*stats)->values = calloc(statistic_count, sizeof(uint64_t));
+       (*stats)->triggers = calloc(statistic_count, sizeof(mysqlnd_stat_trigger));
+       (*stats)->in_trigger = FALSE;
+       (*stats)->count = statistic_count;
 #ifdef ZTS
        (*stats)->LOCK_access = tsrm_mutex_alloc();
 #endif
@@ -249,18 +251,53 @@ mysqlnd_stats_init(MYSQLND_STATS ** stats)
 
 
 /* {{{ mysqlnd_stats_end */
-void
+PHPAPI void
 mysqlnd_stats_end(MYSQLND_STATS * stats)
 {
 #ifdef ZTS
        tsrm_mutex_free(stats->LOCK_access);
 #endif
+       free(stats->triggers);
+       free(stats->values);
        /* mnd_free will reference LOCK_access and crash...*/
        free(stats);
 }
 /* }}} */
 
 
+/* {{{ mysqlnd_stats_set_trigger */
+PHPAPI mysqlnd_stat_trigger
+mysqlnd_stats_set_trigger(MYSQLND_STATS * const stats, enum_mysqlnd_collected_stats stat, mysqlnd_stat_trigger trigger TSRMLS_DC)
+{
+       mysqlnd_stat_trigger ret = NULL;
+       DBG_ENTER("mysqlnd_stats_set_trigger");
+       if (stats) {
+               MYSQLND_STATS_LOCK(stats);
+               ret = stats->triggers[stat];
+               stats->triggers[stat] = trigger;
+               MYSQLND_STATS_UNLOCK(stats);
+       }
+       DBG_RETURN(ret);
+}
+/* }}} */
+
+
+/* {{{ mysqlnd_stats_set_handler */
+PHPAPI mysqlnd_stat_trigger
+mysqlnd_stats_reset_triggers(MYSQLND_STATS * const stats TSRMLS_DC)
+{
+       mysqlnd_stat_trigger ret = NULL;
+       DBG_ENTER("mysqlnd_stats_reset_trigger");
+       if (stats) {
+               MYSQLND_STATS_LOCK(stats);
+               memset(stats->triggers, 0, stats->count * sizeof(mysqlnd_stat_trigger));
+               MYSQLND_STATS_UNLOCK(stats);
+       }
+       DBG_RETURN(ret);
+}
+/* }}} */
+
+
 /*
  * Local variables:
  * tab-width: 4
index eb9bdb31906a595559dc629fb3e5c861ffcbfdc9..b2b5adab963eb02f7a646de740fa575637bf0dba 100644 (file)
@@ -24,7 +24,7 @@
 #define MYSQLND_STATISTICS_H
 
 
-extern MYSQLND_STATS *mysqlnd_global_stats;
+PHPAPI extern MYSQLND_STATS * mysqlnd_global_stats;
 
 typedef struct st_mysqlnd_string
 {
@@ -35,243 +35,142 @@ typedef struct st_mysqlnd_string
 extern const MYSQLND_STRING mysqlnd_stats_values_names[];
 
 #ifdef ZTS
+#define MYSQLND_STATS_LOCK(stats) tsrm_mutex_lock((stats)->LOCK_access)
+#define MYSQLND_STATS_UNLOCK(stats) tsrm_mutex_unlock((stats)->LOCK_access)
+#else
+#define MYSQLND_STATS_LOCK(stats)
+#define MYSQLND_STATS_UNLOCK(stats)
+#endif
 
-#define MYSQLND_INC_GLOBAL_STATISTIC(statistic) \
- { \
-       if (MYSQLND_G(collect_statistics) && (statistic) != STAT_LAST) { \
-               DBG_INF_FMT("Global stat increase [%s]", mysqlnd_stats_values_names[(statistic)].s); \
-                       \
-               tsrm_mutex_lock(mysqlnd_global_stats->LOCK_access); \
-               mysqlnd_global_stats->values[(statistic)]++; \
-               tsrm_mutex_unlock(mysqlnd_global_stats->LOCK_access); \
-       }\
- }
-
-#define MYSQLND_DEC_CONN_STATISTIC(conn_stats, statistic) \
- { \
-       if (MYSQLND_G(collect_statistics) && (statistic) != STAT_LAST) { \
-               DBG_INF_FMT("Global&conn stat decrease [%s]", mysqlnd_stats_values_names[(statistic)].s); \
-                       \
-               tsrm_mutex_lock(mysqlnd_global_stats->LOCK_access); \
-               mysqlnd_global_stats->values[(statistic)]--; \
-               tsrm_mutex_unlock(mysqlnd_global_stats->LOCK_access); \
-               if ((conn_stats)) { \
-                       ((MYSQLND_STATS *) conn_stats)->values[(statistic)]--; \
-               } \
-       }\
- }
-
-#define MYSQLND_INC_GLOBAL_STATISTIC_W_VALUE2(statistic1, value1, statistic2, value2) \
+#define MYSQLND_CHECK_AND_CALL_HANDLER(stats, statistic, value) \
+       { \
+                       if ((stats)->triggers[(statistic)] && (stats)->in_trigger == FALSE) { \
+                               (stats)->in_trigger = TRUE; \
+                               (stats)->triggers[(statistic)]((stats), (statistic), (value) TSRMLS_CC); \
+                               (stats)->in_trigger = FALSE; \
+                       } \
+       } \
+       
+#define MYSQLND_DEC_STATISTIC(enabler, stats, statistic) \
  { \
-       if (MYSQLND_G(collect_statistics)) { \
-               uint64_t v1 = (uint64_t) (value1); \
-               uint64_t v2 = (uint64_t) (value2); \
-               enum_mysqlnd_collected_stats _s1 = (statistic1);\
-               enum_mysqlnd_collected_stats _s2 = (statistic2);\
-                                                                \
-               if (_s1 != STAT_LAST) DBG_INF_FMT("Global stat increase1 [%s]", mysqlnd_stats_values_names[_s1].s); \
-               if (_s2 != STAT_LAST) DBG_INF_FMT("Global stat increase2 [%s]", mysqlnd_stats_values_names[_s2].s); \
-                                                                               \
-               tsrm_mutex_lock(mysqlnd_global_stats->LOCK_access); \
-               if (_s1 != STAT_LAST) mysqlnd_global_stats->values[_s1]+= v1; \
-               if (_s2 != STAT_LAST) mysqlnd_global_stats->values[_s2]+= v2; \
-               tsrm_mutex_unlock(mysqlnd_global_stats->LOCK_access); \
+       enum_mysqlnd_collected_stats _s = (statistic);\
+       MYSQLND_STATS * _p_s = (MYSQLND_STATS *) (stats); \
+       if ((enabler) && _p_s && _s != _p_s->count) { \
+               MYSQLND_STATS_LOCK(_p_s); \
+               MYSQLND_CHECK_AND_CALL_HANDLER(_p_s, _s, -1); \
+               _p_s->values[_s]--; \
+               MYSQLND_STATS_UNLOCK(_p_s); \
        }\
  }
 
-#define MYSQLND_INC_CONN_STATISTIC(conn_stats, statistic) \
+#define MYSQLND_INC_STATISTIC(enabler, stats, statistic) \
  { \
-       if (MYSQLND_G(collect_statistics) && (statistic) != STAT_LAST) { \
-               DBG_INF_FMT("Global&Conn stat increase [%s]", mysqlnd_stats_values_names[(statistic)].s); \
-                       \
-               tsrm_mutex_lock(mysqlnd_global_stats->LOCK_access); \
-               mysqlnd_global_stats->values[(statistic)]++; \
-               tsrm_mutex_unlock(mysqlnd_global_stats->LOCK_access); \
-               if ((conn_stats)) { \
-                       ((MYSQLND_STATS *) conn_stats)->values[(statistic)]++; \
-               } \
+       enum_mysqlnd_collected_stats _s = (statistic);\
+       MYSQLND_STATS * _p_s = (MYSQLND_STATS *) (stats); \
+       if ((enabler) && _p_s && _s != _p_s->count) { \
+               MYSQLND_STATS_LOCK(_p_s); \
+               MYSQLND_CHECK_AND_CALL_HANDLER(_p_s, _s, 1); \
+               _p_s->values[_s]++; \
+               MYSQLND_STATS_UNLOCK(_p_s); \
        }\
  }
 
-#define MYSQLND_INC_CONN_STATISTIC_W_VALUE(conn_stats, statistic, value) \
+#define MYSQLND_INC_STATISTIC_W_VALUE(enabler, stats, statistic, value) \
  { \
-       if (MYSQLND_G(collect_statistics) && (statistic) != STAT_LAST) { \
+       enum_mysqlnd_collected_stats _s = (statistic);\
+       MYSQLND_STATS * _p_s = (MYSQLND_STATS *) (stats); \
+       if ((enabler) && _p_s && _s != _p_s->count) { \
                uint64_t v = (uint64_t) (value); \
-               DBG_INF_FMT("Global&Conn stat increase w value [%s]", mysqlnd_stats_values_names[(statistic)].s); \
-                       \
-               tsrm_mutex_lock(mysqlnd_global_stats->LOCK_access); \
-               mysqlnd_global_stats->values[(statistic)] += v; \
-               tsrm_mutex_unlock(mysqlnd_global_stats->LOCK_access); \
-               if ((conn_stats)) { \
-                       ((MYSQLND_STATS *) conn_stats)->values[(statistic)]+= v; \
-               } \
+               MYSQLND_STATS_LOCK(_p_s); \
+               MYSQLND_CHECK_AND_CALL_HANDLER(_p_s, _s, v); \
+               _p_s->values[_s] += v; \
+               MYSQLND_STATS_UNLOCK(_p_s); \
        }\
  }
 
-#define MYSQLND_INC_CONN_STATISTIC_W_VALUE2(conn_stats, statistic1, value1, statistic2, value2) \
+#define MYSQLND_INC_STATISTIC_W_VALUE2(enabler, stats, statistic1, value1, statistic2, value2) \
  { \
-       if (MYSQLND_G(collect_statistics)) { \
+       MYSQLND_STATS * _p_s = (MYSQLND_STATS *) (stats); \
+       if ((enabler) && _p_s) { \
                uint64_t v1 = (uint64_t) (value1); \
                uint64_t v2 = (uint64_t) (value2); \
                enum_mysqlnd_collected_stats _s1 = (statistic1);\
                enum_mysqlnd_collected_stats _s2 = (statistic2);\
-                                                                \
-               if (_s1 != STAT_LAST) DBG_INF_FMT("Global stat increase1 [%s]", mysqlnd_stats_values_names[_s1].s); \
-               if (_s2 != STAT_LAST) DBG_INF_FMT("Global stat increase2 [%s]", mysqlnd_stats_values_names[_s2].s); \
-                                       \
-               tsrm_mutex_lock(mysqlnd_global_stats->LOCK_access); \
-               if (_s1 != STAT_LAST) mysqlnd_global_stats->values[_s1]+= v1; \
-               if (_s2 != STAT_LAST) mysqlnd_global_stats->values[_s2]+= v2; \
-               tsrm_mutex_unlock(mysqlnd_global_stats->LOCK_access); \
-               if ((conn_stats)) { \
-                       if (_s1 != STAT_LAST) ((MYSQLND_STATS *) conn_stats)->values[_s1]+= v1; \
-                       if (_s2 != STAT_LAST) ((MYSQLND_STATS *) conn_stats)->values[_s2]+= v2; \
+               MYSQLND_STATS_LOCK(_p_s); \
+               if (_s1 != _p_s->count) { \
+                       MYSQLND_CHECK_AND_CALL_HANDLER(_p_s, _s1, v1); \
+                       _p_s->values[_s1]+= v1; \
                } \
-       } \
+               if (_s2 != _p_s->count) { \
+                       MYSQLND_CHECK_AND_CALL_HANDLER(_p_s, _s2, v2); \
+                       _p_s->values[_s2]+= v2; \
+               } \
+               MYSQLND_STATS_UNLOCK(_p_s); \
+       }\
  }
 
-
-#define MYSQLND_INC_CONN_STATISTIC_W_VALUE3(conn_stats, statistic1, value1, statistic2, value2, statistic3, value3) \
+#define MYSQLND_INC_STATISTIC_W_VALUE3(enabler, stats, statistic1, value1, statistic2, value2, statistic3, value3) \
  { \
-       if (MYSQLND_G(collect_statistics)) { \
+       MYSQLND_STATS * _p_s = (MYSQLND_STATS *) (stats); \
+       if ((enabler) && _p_s) { \
                uint64_t v1 = (uint64_t) (value1); \
                uint64_t v2 = (uint64_t) (value2); \
                uint64_t v3 = (uint64_t) (value3); \
-               enum_mysqlnd_collected_stats _s1 = (statistic1); \
-               enum_mysqlnd_collected_stats _s2 = (statistic2); \
-               enum_mysqlnd_collected_stats _s3 = (statistic3); \
-                                                                \
-               if (_s1 != STAT_LAST) DBG_INF_FMT("Global stat increase1 [%s]", mysqlnd_stats_values_names[_s1].s); \
-               if (_s2 != STAT_LAST) DBG_INF_FMT("Global stat increase2 [%s]", mysqlnd_stats_values_names[_s2].s); \
-               if (_s3 != STAT_LAST) DBG_INF_FMT("Global stat increase3 [%s]", mysqlnd_stats_values_names[_s3].s); \
-                                                                               \
-               tsrm_mutex_lock(mysqlnd_global_stats->LOCK_access); \
-               if (_s1 != STAT_LAST) mysqlnd_global_stats->values[_s1]+= v1; \
-               if (_s2 != STAT_LAST) mysqlnd_global_stats->values[_s2]+= v2; \
-               if (_s3 != STAT_LAST) mysqlnd_global_stats->values[_s3]+= v3; \
-               tsrm_mutex_unlock(mysqlnd_global_stats->LOCK_access); \
-               if ((conn_stats)) { \
-                       if (_s1 != STAT_LAST) ((MYSQLND_STATS *) conn_stats)->values[_s1]+= v1; \
-                       if (_s2 != STAT_LAST) ((MYSQLND_STATS *) conn_stats)->values[_s2]+= v2; \
-                       if (_s3 != STAT_LAST) ((MYSQLND_STATS *) conn_stats)->values[_s3]+= v3; \
+               enum_mysqlnd_collected_stats _s1 = (statistic1);\
+               enum_mysqlnd_collected_stats _s2 = (statistic2);\
+               enum_mysqlnd_collected_stats _s3 = (statistic3);\
+               MYSQLND_STATS_LOCK(_p_s); \
+               if (_s1 != _p_s->count) { \
+                       MYSQLND_CHECK_AND_CALL_HANDLER(_p_s, _s1, v1); \
+                       _p_s->values[_s1]+= v1; \
                } \
-       } \
+               if (_s2 != _p_s->count) { \
+                       MYSQLND_CHECK_AND_CALL_HANDLER(_p_s, _s2, v2); \
+                       _p_s->values[_s2]+= v2; \
+               } \
+               if (_s3 != _p_s->count) { \
+                       MYSQLND_CHECK_AND_CALL_HANDLER(_p_s, _s3, v3); \
+                       _p_s->values[_s3]+= v3; \
+               } \
+               MYSQLND_STATS_UNLOCK(_p_s); \
+       }\
  }
 
 
-#else /* NON-ZTS */
-
 #define MYSQLND_INC_GLOBAL_STATISTIC(statistic) \
- { \
-       if (MYSQLND_G(collect_statistics) && (statistic) != STAT_LAST) { \
-               DBG_INF_FMT("Global stat increase [%s]", mysqlnd_stats_values_names[(statistic)].s); \
-               mysqlnd_global_stats->values[(statistic)]++; \
-       } \
- }
-
+        MYSQLND_INC_STATISTIC(MYSQLND_G(collect_statistics), mysqlnd_global_stats, (statistic))
 
 #define MYSQLND_DEC_CONN_STATISTIC(conn_stats, statistic) \
- { \
-       if (MYSQLND_G(collect_statistics) && (statistic) != STAT_LAST) { \
-               DBG_INF_FMT("Global&Conn stat decrease [%s]", mysqlnd_stats_values_names[(statistic)].s); \
-               mysqlnd_global_stats->values[(statistic)]--; \
-               if ((conn_stats)) { \
-                       ((MYSQLND_STATS *) conn_stats)->values[(statistic)]--; \
-               } \
-       } \
- }
+        MYSQLND_DEC_STATISTIC(MYSQLND_G(collect_statistics), mysqlnd_global_stats, (statistic))
 
 #define MYSQLND_INC_GLOBAL_STATISTIC_W_VALUE2(statistic1, value1, statistic2, value2) \
- { \
-       if (MYSQLND_G(collect_statistics)) { \
-               uint64_t v1 = (uint64_t) (value1); \
-               uint64_t v2 = (uint64_t) (value2); \
-               enum_mysqlnd_collected_stats _s1 = (statistic1);\
-               enum_mysqlnd_collected_stats _s2 = (statistic2);\
-                                                                \
-               if (_s1 != STAT_LAST) DBG_INF_FMT("Global stat increase1 [%s]", mysqlnd_stats_values_names[_s1].s); \
-               if (_s2 != STAT_LAST) DBG_INF_FMT("Global stat increase2 [%s]", mysqlnd_stats_values_names[_s2].s); \
-                       \
-               if (_s1 != STAT_LAST) mysqlnd_global_stats->values[_s1]+= v1; \
-               if (_s2 != STAT_LAST) mysqlnd_global_stats->values[_s2]+= v2; \
-       }\
- }
+       MYSQLND_INC_STATISTIC_W_VALUE2(MYSQLND_G(collect_statistics), mysqlnd_global_stats, (statistic1), (value1), (statistic2), (value2))
 
 #define MYSQLND_INC_CONN_STATISTIC(conn_stats, statistic) \
- { \
-       if (MYSQLND_G(collect_statistics) && (statistic) != STAT_LAST) { \
-               DBG_INF_FMT("Global&Conn stat increase [%s]", mysqlnd_stats_values_names[(statistic)].s); \
-               mysqlnd_global_stats->values[(statistic)]++; \
-               if ((conn_stats)) { \
-                       ((MYSQLND_STATS *) conn_stats)->values[(statistic)]++; \
-               } \
-       } \
- }
+        MYSQLND_INC_STATISTIC(MYSQLND_G(collect_statistics), mysqlnd_global_stats, (statistic)); \
+        MYSQLND_INC_STATISTIC(MYSQLND_G(collect_statistics), (conn_stats), (statistic));
 
 #define MYSQLND_INC_CONN_STATISTIC_W_VALUE(conn_stats, statistic, value) \
- { \
-       if (MYSQLND_G(collect_statistics) && (statistic) != STAT_LAST) { \
-               uint64_t v = (uint64_t) (value); \
-               DBG_INF_FMT("Global&Conn stats increase w value [%s]", mysqlnd_stats_values_names[(statistic)].s); \
-               mysqlnd_global_stats->values[(statistic)] += v; \
-               if ((conn_stats)) { \
-                       ((MYSQLND_STATS *) conn_stats)->values[(statistic)] += v; \
-               } \
-       } \
- } 
+        MYSQLND_INC_STATISTIC_W_VALUE(MYSQLND_G(collect_statistics), mysqlnd_global_stats, (statistic), (value)); \
+        MYSQLND_INC_STATISTIC_W_VALUE(MYSQLND_G(collect_statistics), (conn_stats), (statistic), (value));
 
 #define MYSQLND_INC_CONN_STATISTIC_W_VALUE2(conn_stats, statistic1, value1, statistic2, value2) \
- { \
-       if (MYSQLND_G(collect_statistics)) { \
-               uint64_t v1 = (uint64_t) (value1); \
-               uint64_t v2 = (uint64_t) (value2); \
-               enum_mysqlnd_collected_stats _s1 = (statistic1);\
-               enum_mysqlnd_collected_stats _s2 = (statistic2);\
-               if (_s1 != STAT_LAST) DBG_INF_FMT("Global stat increase1 [%s]", mysqlnd_stats_values_names[_s1].s); \
-               if (_s2 != STAT_LAST) DBG_INF_FMT("Global stat increase2 [%s]", mysqlnd_stats_values_names[_s2].s); \
-                                                                \
-               if (_s1 != STAT_LAST) mysqlnd_global_stats->values[_s1]+= v1; \
-               if (_s2 != STAT_LAST) mysqlnd_global_stats->values[_s2]+= v2; \
-               if ((conn_stats)) { \
-                       if (_s1 != STAT_LAST) ((MYSQLND_STATS *) conn_stats)->values[_s1]+= v1; \
-                       if (_s2 != STAT_LAST) ((MYSQLND_STATS *) conn_stats)->values[_s2]+= v2; \
-               } \
-       } \
- }
+        MYSQLND_INC_STATISTIC_W_VALUE2(MYSQLND_G(collect_statistics), mysqlnd_global_stats, (statistic1), (value1), (statistic2), (value2)); \
+        MYSQLND_INC_STATISTIC_W_VALUE2(MYSQLND_G(collect_statistics), (conn_stats), (statistic1), (value1), (statistic2), (value2));
 
 #define MYSQLND_INC_CONN_STATISTIC_W_VALUE3(conn_stats, statistic1, value1, statistic2, value2, statistic3, value3) \
- { \
-       if (MYSQLND_G(collect_statistics)) { \
-               uint64_t v1 = (uint64_t) (value1); \
-               uint64_t v2 = (uint64_t) (value2); \
-               uint64_t v3 = (uint64_t) (value3); \
-               enum_mysqlnd_collected_stats _s1 = (statistic1); \
-               enum_mysqlnd_collected_stats _s2 = (statistic2); \
-               enum_mysqlnd_collected_stats _s3 = (statistic3); \
-                                                                \
-               if (_s1 != STAT_LAST) DBG_INF_FMT("Global stat increase1 [%s]", mysqlnd_stats_values_names[_s1].s); \
-               if (_s2 != STAT_LAST) DBG_INF_FMT("Global stat increase2 [%s]", mysqlnd_stats_values_names[_s2].s); \
-               if (_s3 != STAT_LAST) DBG_INF_FMT("Global stat increase3 [%s]", mysqlnd_stats_values_names[_s3].s); \
-                                                               \
-               if (_s1 != STAT_LAST) mysqlnd_global_stats->values[_s1]+= v1; \
-               if (_s2 != STAT_LAST) mysqlnd_global_stats->values[_s2]+= v2; \
-               if (_s3 != STAT_LAST) mysqlnd_global_stats->values[_s3]+= v3; \
-               if ((conn_stats)) { \
-                       if (_s1 != STAT_LAST) ((MYSQLND_STATS *) conn_stats)->values[_s1]+= v1; \
-                       if (_s2 != STAT_LAST) ((MYSQLND_STATS *) conn_stats)->values[_s2]+= v2; \
-                       if (_s3 != STAT_LAST) ((MYSQLND_STATS *) conn_stats)->values[_s3]+= v3; \
-               } \
-       } \
- }
+        MYSQLND_INC_STATISTIC_W_VALUE3(MYSQLND_G(collect_statistics), mysqlnd_global_stats, (statistic1), (value1), (statistic2), (value2), (statistic3), (value3)); \
+        MYSQLND_INC_STATISTIC_W_VALUE3(MYSQLND_G(collect_statistics), (conn_stats), (statistic1), (value1), (statistic2), (value2), (statistic3), (value3));
 
-#endif
 
-void mysqlnd_fill_stats_hash(const MYSQLND_STATS * const stats, zval *return_value
-                                                        TSRMLS_DC ZEND_FILE_LINE_DC);
+PHPAPI void mysqlnd_fill_stats_hash(const MYSQLND_STATS * const stats, const MYSQLND_STRING * names, zval *return_value TSRMLS_DC ZEND_FILE_LINE_DC);
+
+PHPAPI void mysqlnd_stats_init(MYSQLND_STATS ** stats, size_t statistic_count);
+PHPAPI void mysqlnd_stats_end(MYSQLND_STATS * stats);
 
+PHPAPI mysqlnd_stat_trigger mysqlnd_stats_set_trigger(MYSQLND_STATS * const stats, enum_mysqlnd_collected_stats stat, mysqlnd_stat_trigger trigger TSRMLS_DC);
+PHPAPI mysqlnd_stat_trigger mysqlnd_stats_reset_triggers(MYSQLND_STATS * const stats TSRMLS_DC);
 
-void mysqlnd_stats_init(MYSQLND_STATS ** stats);
-void mysqlnd_stats_end(MYSQLND_STATS * stats);
 
 #endif /* MYSQLND_STATISTICS_H */
 
index 96f46324ea0716125702667176cf485e85cc4bdf..8af7ece8f1d650ffaedd4efaea2d89204982cf4e 100644 (file)
@@ -96,7 +96,7 @@ typedef struct st_mysqlnd_upsert_result
        unsigned int    server_status;
        uint64_t                affected_rows;
        uint64_t                last_insert_id;
-} mysqlnd_upsert_status;
+} MYSQLND_UPSERT_STATUS;
 
 
 typedef struct st_mysqlnd_error_info
@@ -104,7 +104,7 @@ typedef struct st_mysqlnd_error_info
        char error[MYSQLND_ERRMSG_SIZE+1];
        char sqlstate[MYSQLND_SQLSTATE_LENGTH + 1];
        unsigned int error_no;
-} mysqlnd_error_info;
+} MYSQLND_ERROR_INFO;
 
 
 typedef struct st_mysqlnd_infile_info
@@ -184,6 +184,7 @@ typedef struct st_mysqlnd_net_options
 
 typedef struct st_mysqlnd_connection MYSQLND;
 typedef struct st_mysqlnd_net  MYSQLND_NET;
+typedef struct st_mysqlnd_protocol     MYSQLND_PROTOCOL;
 typedef struct st_mysqlnd_res  MYSQLND_RES;
 typedef char**                                         MYSQLND_ROW_C;          /* return data as array of strings */
 typedef struct st_mysqlnd_stmt MYSQLND_STMT;
@@ -207,13 +208,20 @@ typedef enum_func_status  (*mysqlnd_fetch_row_func)(MYSQLND_RES *result,
                                                                                                        zend_bool *fetched_anything
                                                                                                        TSRMLS_DC);
 
-typedef struct st_mysqlnd_stats
+typedef struct st_mysqlnd_stats MYSQLND_STATS;
+
+typedef void (*mysqlnd_stat_trigger)(MYSQLND_STATS * stats, enum_mysqlnd_collected_stats stat, int64_t change TSRMLS_DC);
+
+struct st_mysqlnd_stats
 {
-       uint64_t        values[STAT_LAST];
+       uint64_t                                *values;
+       mysqlnd_stat_trigger    *triggers;
+       size_t                                  count;
+       zend_bool                               in_trigger;
 #ifdef ZTS
        MUTEX_T LOCK_access;
 #endif
-} MYSQLND_STATS;
+};
 
 
 typedef struct st_mysqlnd_read_buffer {
@@ -243,6 +251,35 @@ struct st_mysqlnd_net_methods
 };
 
 
+struct st_mysqlnd_packet_greet;
+struct st_mysqlnd_packet_greet;
+struct st_mysqlnd_packet_auth;
+struct st_mysqlnd_packet_ok;
+struct st_mysqlnd_packet_command;
+struct st_mysqlnd_packet_eof;
+struct st_mysqlnd_packet_rset_header;
+struct st_mysqlnd_packet_res_field;
+struct st_mysqlnd_packet_row;
+struct st_mysqlnd_packet_stats;
+struct st_mysqlnd_packet_prepare_response;
+struct st_mysqlnd_packet_chg_user_resp;
+
+struct st_mysqlnd_protocol_methods
+{
+       struct st_mysqlnd_packet_greet *                (*get_greet_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent TSRMLS_DC);
+       struct st_mysqlnd_packet_auth *         (*get_auth_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent TSRMLS_DC);
+       struct st_mysqlnd_packet_ok *                   (*get_ok_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent TSRMLS_DC);
+       struct st_mysqlnd_packet_command *      (*get_command_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent TSRMLS_DC);
+       struct st_mysqlnd_packet_eof *          (*get_eof_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent TSRMLS_DC);
+       struct st_mysqlnd_packet_rset_header *(*get_rset_header_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent TSRMLS_DC);
+       struct st_mysqlnd_packet_res_field *    (*get_result_field_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent TSRMLS_DC);
+       struct st_mysqlnd_packet_row *          (*get_row_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent TSRMLS_DC);
+       struct st_mysqlnd_packet_stats *                (*get_stats_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent TSRMLS_DC);
+       struct st_mysqlnd_packet_prepare_response *(*get_prepare_response_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent TSRMLS_DC);
+       struct st_mysqlnd_packet_chg_user_resp*(*get_change_user_response_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent TSRMLS_DC);
+};
+
+
 struct st_mysqlnd_conn_methods
 {
        enum_func_status        (*connect)(MYSQLND *conn, const char *host, const char * user, const char * passwd, unsigned int passwd_len, const char * db, unsigned int db_len, unsigned int port, const char * socket, unsigned int mysql_flags TSRMLS_DC);
@@ -303,8 +340,11 @@ struct st_mysqlnd_conn_methods
        enum mysqlnd_connection_state (*get_state)(MYSQLND * const conn TSRMLS_DC);
        void                            (*set_state)(MYSQLND * const conn, enum mysqlnd_connection_state new_state TSRMLS_DC);
 
-       enum_func_status        (*simple_command)(MYSQLND *conn, enum php_mysqlnd_server_command command, const char * const arg, size_t arg_len, enum php_mysql_packet_type ok_packet, zend_bool silent, zend_bool ignore_upsert_status TSRMLS_DC);
-       enum_func_status        (*simple_command_handle_response)(MYSQLND *conn, enum php_mysql_packet_type ok_packet, zend_bool silent, enum php_mysqlnd_server_command command, zend_bool ignore_upsert_status TSRMLS_DC);
+       enum_func_status        (*simple_command)(MYSQLND *conn, enum php_mysqlnd_server_command command, const char * const arg, size_t arg_len, enum mysqlnd_packet_type ok_packet, zend_bool silent, zend_bool ignore_upsert_status TSRMLS_DC);
+       enum_func_status        (*simple_command_handle_response)(MYSQLND *conn, enum mysqlnd_packet_type ok_packet, zend_bool silent, enum php_mysqlnd_server_command command, zend_bool ignore_upsert_status TSRMLS_DC);
+
+       enum_func_status        (*restart_psession)(MYSQLND *conn TSRMLS_DC);
+       enum_func_status        (*end_psession)(MYSQLND *conn TSRMLS_DC);
 };
 
 
@@ -433,10 +473,18 @@ struct st_mysqlnd_net
 };
 
 
+struct st_mysqlnd_protocol
+{
+       struct st_mysqlnd_protocol_methods m;
+       zend_bool persistent;
+};
+
+
 struct st_mysqlnd_connection
 {
 /* Operation related */
        MYSQLND_NET             * net;
+       MYSQLND_PROTOCOL * protocol;
 
 /* Information related */
        char                    *host;
@@ -465,12 +513,12 @@ struct st_mysqlnd_connection
        unsigned long   server_capabilities;
 
        /* For UPSERT queries */
-       mysqlnd_upsert_status upsert_status;
+       MYSQLND_UPSERT_STATUS upsert_status;
        char                    *last_message;
        unsigned int    last_message_len;
 
        /* If error packet, we use these */
-       mysqlnd_error_info      error_info;
+       MYSQLND_ERROR_INFO      error_info;
 
        /*
          To prevent queries during unbuffered fetches. Also to
@@ -500,13 +548,11 @@ struct st_mysqlnd_connection
        MYSQLND_OPTIONS options;
 
        /* stats */
-       MYSQLND_STATS   stats;
+       MYSQLND_STATS   stats;
 
        struct st_mysqlnd_conn_methods *m;
 };
 
-typedef struct st_php_mysql_packet_row php_mysql_packet_row;
-
 
 struct mysqlnd_field_hash_key
 {
@@ -544,7 +590,7 @@ struct st_mysqlnd_buffered_result
 
        unsigned int            references;
 
-       mysqlnd_error_info      error_info;
+       MYSQLND_ERROR_INFO      error_info;
 };
 
 
@@ -580,7 +626,7 @@ struct st_mysqlnd_res
        */
        unsigned long                   *lengths;
 
-       php_mysql_packet_row    *row_packet;
+       struct st_mysqlnd_packet_row * row_packet;
 
        MYSQLND_MEMORY_POOL * result_set_memory_pool;
 };
@@ -615,9 +661,9 @@ struct st_mysqlnd_stmt
        MYSQLND_RESULT_BIND                     *result_bind;
        zend_bool                                       result_zvals_separated_once;
 
-       mysqlnd_upsert_status           upsert_status;
+       MYSQLND_UPSERT_STATUS           upsert_status;
 
-       mysqlnd_error_info                      error_info;
+       MYSQLND_ERROR_INFO                      error_info;
 
        zend_bool                                       update_max_length;
        unsigned long                           prefetch_rows;
index af597d35172185c8a5940f4f88dda5a223ab1eaa..c2ceec6bb515934d87ff676cff57eb457cd74447 100644 (file)
                        DBG_ERR_FMT("Empty '%s' packet body", (packet_type_as_text)); \
                        DBG_RETURN(FAIL);\
                } \
-               MYSQLND_INC_CONN_STATISTIC_W_VALUE2(&conn->stats, packet_type_to_statistic_byte_count[packet_type], \
+               MYSQLND_INC_CONN_STATISTIC_W_VALUE2(conn->stats, packet_type_to_statistic_byte_count[packet_type], \
                                                                                        MYSQLND_HEADER_SIZE + (packet)->header.size, \
                                                                                        packet_type_to_statistic_packet_count[packet_type], \
                                                                                        1); \
        }
 
 
-extern mysqlnd_packet_methods packet_methods[];
-
 static const char *unknown_sqlstate= "HY000";
 
 char * const mysqlnd_empty_string = "";
 
 /* Used in mysqlnd_debug.c */
-char * mysqlnd_read_header_name        = "mysqlnd_read_header";
-char * mysqlnd_read_body_name  = "mysqlnd_read_body";
+const char mysqlnd_read_header_name[]  = "mysqlnd_read_header";
+const char mysqlnd_read_body_name[]            = "mysqlnd_read_body";
 
 
 #define ERROR_MARKER 0xFF
@@ -240,7 +238,7 @@ php_mysqlnd_read_error_from_line(zend_uchar *buf, size_t buf_len,
 
 /* {{{ mysqlnd_read_header */
 static enum_func_status
-mysqlnd_read_header(MYSQLND * conn, mysqlnd_packet_header * header TSRMLS_DC)
+mysqlnd_read_header(MYSQLND * conn, MYSQLND_PACKET_HEADER * header TSRMLS_DC)
 {
        MYSQLND_NET * net = conn->net;
        zend_uchar buffer[MYSQLND_HEADER_SIZE];
@@ -257,7 +255,7 @@ mysqlnd_read_header(MYSQLND * conn, mysqlnd_packet_header * header TSRMLS_DC)
 #ifdef MYSQLND_DUMP_HEADER_N_BODY
        DBG_INF_FMT("HEADER: prot_packet_no=%d size=%3d", header->packet_no, header->size);
 #endif
-       MYSQLND_INC_CONN_STATISTIC_W_VALUE2(&conn->stats,
+       MYSQLND_INC_CONN_STATISTIC_W_VALUE2(conn->stats,
                                                        STAT_PROTOCOL_OVERHEAD_IN, MYSQLND_HEADER_SIZE,
                                                        STAT_PACKETS_RECEIVED, 1);
 
@@ -288,7 +286,7 @@ php_mysqlnd_greet_read(void *_packet, MYSQLND *conn TSRMLS_DC)
        zend_uchar buf[2048];
        zend_uchar *p = buf;
        zend_uchar *begin = buf;
-       php_mysql_packet_greet *packet= (php_mysql_packet_greet *) _packet;
+       MYSQLND_PACKET_GREET *packet= (MYSQLND_PACKET_GREET *) _packet;
 
        DBG_ENTER("php_mysqlnd_greet_read");
 
@@ -366,7 +364,7 @@ php_mysqlnd_greet_read(void *_packet, MYSQLND *conn TSRMLS_DC)
 static
 void php_mysqlnd_greet_free_mem(void *_packet, zend_bool alloca TSRMLS_DC)
 {
-       php_mysql_packet_greet *p= (php_mysql_packet_greet *) _packet;
+       MYSQLND_PACKET_GREET *p= (MYSQLND_PACKET_GREET *) _packet;
        if (p->server_version) {
                mnd_efree(p->server_version);
                p->server_version = NULL;
@@ -433,7 +431,7 @@ size_t php_mysqlnd_auth_write(void *_packet, MYSQLND *conn TSRMLS_DC)
        char buffer[1024];
        register char *p= buffer + MYSQLND_HEADER_SIZE; /* start after the header */
        int len;
-       register php_mysql_packet_auth *packet= (php_mysql_packet_auth *) _packet;
+       register MYSQLND_PACKET_AUTH *packet= (MYSQLND_PACKET_AUTH *) _packet;
 
        DBG_ENTER("php_mysqlnd_auth_write");
 
@@ -495,7 +493,7 @@ static
 void php_mysqlnd_auth_free_mem(void *_packet, zend_bool alloca TSRMLS_DC)
 {
        if (!alloca) {
-               mnd_pefree((php_mysql_packet_auth *) _packet, ((php_mysql_packet_auth *)_packet)->header.persistent);
+               mnd_pefree((MYSQLND_PACKET_AUTH *) _packet, ((MYSQLND_PACKET_AUTH *)_packet)->header.persistent);
        }
 }
 /* }}} */
@@ -513,7 +511,7 @@ php_mysqlnd_ok_read(void *_packet, MYSQLND *conn TSRMLS_DC)
        zend_uchar *p = buf;
        zend_uchar *begin = buf;
        unsigned long i;
-       register php_mysql_packet_ok *packet= (php_mysql_packet_ok *) _packet;
+       register MYSQLND_PACKET_OK *packet= (MYSQLND_PACKET_OK *) _packet;
 
        DBG_ENTER("php_mysqlnd_ok_read");
 
@@ -567,7 +565,7 @@ php_mysqlnd_ok_read(void *_packet, MYSQLND *conn TSRMLS_DC)
 static
 void php_mysqlnd_ok_free_mem(void *_packet, zend_bool alloca TSRMLS_DC)
 {
-       php_mysql_packet_ok *p= (php_mysql_packet_ok *) _packet;
+       MYSQLND_PACKET_OK *p= (MYSQLND_PACKET_OK *) _packet;
        if (p->message) {
                mnd_efree(p->message);
                p->message = NULL;
@@ -589,7 +587,7 @@ php_mysqlnd_eof_read(void *_packet, MYSQLND *conn TSRMLS_DC)
 
          Error : error_code + '#' + sqlstate + MYSQLND_ERRMSG_SIZE
        */
-       php_mysql_packet_eof *packet= (php_mysql_packet_eof *) _packet;
+       MYSQLND_PACKET_EOF *packet= (MYSQLND_PACKET_EOF *) _packet;
        size_t buf_len = conn->net->cmd_buffer.length;
        zend_uchar *buf = (zend_uchar *) conn->net->cmd_buffer.buffer;
        zend_uchar *p = buf;
@@ -645,7 +643,7 @@ static
 void php_mysqlnd_eof_free_mem(void *_packet, zend_bool alloca TSRMLS_DC)
 {
        if (!alloca) {
-               mnd_pefree(_packet, ((php_mysql_packet_eof *)_packet)->header.persistent);
+               mnd_pefree(_packet, ((MYSQLND_PACKET_EOF *)_packet)->header.persistent);
        }
 }
 /* }}} */
@@ -655,7 +653,7 @@ void php_mysqlnd_eof_free_mem(void *_packet, zend_bool alloca TSRMLS_DC)
 size_t php_mysqlnd_cmd_write(void *_packet, MYSQLND *conn TSRMLS_DC)
 {
        /* Let's have some space, which we can use, if not enough, we will allocate new buffer */
-       php_mysql_packet_command *packet= (php_mysql_packet_command *) _packet;
+       MYSQLND_PACKET_COMMAND *packet= (MYSQLND_PACKET_COMMAND *) _packet;
        MYSQLND_NET *net = conn->net;
        unsigned int error_reporting = EG(error_reporting);
        size_t written;
@@ -672,7 +670,7 @@ size_t php_mysqlnd_cmd_write(void *_packet, MYSQLND *conn TSRMLS_DC)
                EG(error_reporting) = 0;
        }
 
-       MYSQLND_INC_CONN_STATISTIC(&conn->stats, STAT_PACKETS_SENT_CMD);
+       MYSQLND_INC_CONN_STATISTIC(conn->stats, STAT_PACKETS_SENT_CMD);
 
 #ifdef MYSQLND_DO_WIRE_CHECK_BEFORE_COMMAND
        net->m.consume_uneaten_data(net, packet->command TSRMLS_CC);
@@ -696,7 +694,7 @@ size_t php_mysqlnd_cmd_write(void *_packet, MYSQLND *conn TSRMLS_DC)
 
                ret = conn->net->m.send(conn, (char *)tmp, tmp_len - MYSQLND_HEADER_SIZE TSRMLS_CC);
                if (tmp != net->cmd_buffer.buffer) {
-                       MYSQLND_INC_CONN_STATISTIC(&conn->stats, STAT_CMD_BUFFER_TOO_SMALL);
+                       MYSQLND_INC_CONN_STATISTIC(conn->stats, STAT_CMD_BUFFER_TOO_SMALL);
                        mnd_efree(tmp);
                }
                written = ret;
@@ -715,7 +713,7 @@ static
 void php_mysqlnd_cmd_free_mem(void *_packet, zend_bool alloca TSRMLS_DC)
 {
        if (!alloca) {
-               mnd_pefree(_packet, ((php_mysql_packet_command *)_packet)->header.persistent);
+               mnd_pefree(_packet, ((MYSQLND_PACKET_COMMAND *)_packet)->header.persistent);
        }
 }
 /* }}} */
@@ -730,7 +728,7 @@ php_mysqlnd_rset_header_read(void *_packet, MYSQLND *conn TSRMLS_DC)
        zend_uchar *p = buf;
        zend_uchar *begin = buf;
        size_t len;
-       php_mysql_packet_rset_header *packet= (php_mysql_packet_rset_header *) _packet;
+       MYSQLND_PACKET_RSET_HEADER *packet= (MYSQLND_PACKET_RSET_HEADER *) _packet;
 
        DBG_ENTER("php_mysqlnd_rset_header_read");
 
@@ -803,7 +801,7 @@ php_mysqlnd_rset_header_read(void *_packet, MYSQLND *conn TSRMLS_DC)
 static
 void php_mysqlnd_rset_header_free_mem(void *_packet, zend_bool alloca TSRMLS_DC)
 {
-       php_mysql_packet_rset_header *p= (php_mysql_packet_rset_header *) _packet;
+       MYSQLND_PACKET_RSET_HEADER *p= (MYSQLND_PACKET_RSET_HEADER *) _packet;
        DBG_ENTER("php_mysqlnd_rset_header_free_mem");
        if (p->info_or_local_file) {
                mnd_efree(p->info_or_local_file);
@@ -838,7 +836,7 @@ static enum_func_status
 php_mysqlnd_rset_field_read(void *_packet, MYSQLND *conn TSRMLS_DC)
 {
        /* Should be enough for the metadata of a single row */
-       php_mysql_packet_res_field *packet= (php_mysql_packet_res_field *) _packet;
+       MYSQLND_PACKET_RES_FIELD *packet= (MYSQLND_PACKET_RES_FIELD *) _packet;
        size_t buf_len = conn->net->cmd_buffer.length, total_len = 0;
        zend_uchar *buf = (zend_uchar *) conn->net->cmd_buffer.buffer;
        zend_uchar *p = buf;
@@ -1007,7 +1005,7 @@ faulty_or_fake:
 static
 void php_mysqlnd_rset_field_free_mem(void *_packet, zend_bool alloca TSRMLS_DC)
 {
-       php_mysql_packet_res_field *p= (php_mysql_packet_res_field *) _packet;
+       MYSQLND_PACKET_RES_FIELD *p= (MYSQLND_PACKET_RES_FIELD *) _packet;
 
        /* p->metadata was passed to us as temporal buffer */
        if (!alloca) {
@@ -1025,7 +1023,7 @@ php_mysqlnd_read_row_ex(MYSQLND *conn, MYSQLND_MEMORY_POOL * result_set_memory_p
                                                unsigned int prealloc_more_bytes TSRMLS_DC)
 {
        enum_func_status ret = PASS;
-       mysqlnd_packet_header header;
+       MYSQLND_PACKET_HEADER header;
        zend_uchar *p = NULL;
        zend_bool first_iteration = TRUE;
 
@@ -1413,7 +1411,7 @@ php_mysqlnd_rowp_read(void *_packet, MYSQLND *conn TSRMLS_DC)
        zend_uchar *p;
        enum_func_status ret = PASS;
        size_t old_chunk_size = net->stream->chunk_size;
-       php_mysql_packet_row *packet= (php_mysql_packet_row *) _packet;
+       MYSQLND_PACKET_ROW *packet= (MYSQLND_PACKET_ROW *) _packet;
        size_t post_alloc_for_bit_fields = 0;
        uint64_t data_size = 0;
 
@@ -1431,7 +1429,7 @@ php_mysqlnd_rowp_read(void *_packet, MYSQLND *conn TSRMLS_DC)
        if (FAIL == ret) {
                goto end;
        }
-       MYSQLND_INC_CONN_STATISTIC_W_VALUE2(&conn->stats, packet_type_to_statistic_byte_count[PROT_ROW_PACKET],
+       MYSQLND_INC_CONN_STATISTIC_W_VALUE2(conn->stats, packet_type_to_statistic_byte_count[PROT_ROW_PACKET],
                                                                                MYSQLND_HEADER_SIZE + packet->header.size,
                                                                                packet_type_to_statistic_packet_count[PROT_ROW_PACKET],
                                                                                1);
@@ -1465,7 +1463,7 @@ php_mysqlnd_rowp_read(void *_packet, MYSQLND *conn TSRMLS_DC)
                                                packet->server_status, packet->warning_count);
                }
        } else {
-               MYSQLND_INC_CONN_STATISTIC(&conn->stats,
+               MYSQLND_INC_CONN_STATISTIC(conn->stats,
                                                                        packet->binary_protocol? STAT_ROWS_FETCHED_FROM_SERVER_PS:
                                                                                                                         STAT_ROWS_FETCHED_FROM_SERVER_NORMAL);
 
@@ -1489,7 +1487,7 @@ php_mysqlnd_rowp_read(void *_packet, MYSQLND *conn TSRMLS_DC)
                                                                                                                packet->persistent_alloc);
                        }
                } else {
-                       MYSQLND_INC_CONN_STATISTIC(&conn->stats,
+                       MYSQLND_INC_CONN_STATISTIC(conn->stats,
                                                                                packet->binary_protocol? STAT_ROWS_SKIPPED_PS:
                                                                                                                                 STAT_ROWS_SKIPPED_NORMAL);
                }
@@ -1506,10 +1504,10 @@ end:
 static
 void php_mysqlnd_rowp_free_mem(void *_packet, zend_bool alloca TSRMLS_DC)
 {
-       php_mysql_packet_row *p;
+       MYSQLND_PACKET_ROW *p;
 
        DBG_ENTER("php_mysqlnd_rowp_free_mem");
-       p = (php_mysql_packet_row *) _packet;
+       p = (MYSQLND_PACKET_ROW *) _packet;
        if (p->row_buffer) {
                p->row_buffer->free_chunk(p->row_buffer, TRUE TSRMLS_CC);
                p->row_buffer = NULL;
@@ -1534,7 +1532,7 @@ void php_mysqlnd_rowp_free_mem(void *_packet, zend_bool alloca TSRMLS_DC)
 static enum_func_status
 php_mysqlnd_stats_read(void *_packet, MYSQLND *conn TSRMLS_DC)
 {
-       php_mysql_packet_stats *packet= (php_mysql_packet_stats *) _packet;
+       MYSQLND_PACKET_STATS *packet= (MYSQLND_PACKET_STATS *) _packet;
        size_t buf_len = conn->net->cmd_buffer.length;
        zend_uchar *buf = (zend_uchar *) conn->net->cmd_buffer.buffer;
 
@@ -1556,7 +1554,7 @@ php_mysqlnd_stats_read(void *_packet, MYSQLND *conn TSRMLS_DC)
 static
 void php_mysqlnd_stats_free_mem(void *_packet, zend_bool alloca TSRMLS_DC)
 {
-       php_mysql_packet_stats *p= (php_mysql_packet_stats *) _packet;
+       MYSQLND_PACKET_STATS *p= (MYSQLND_PACKET_STATS *) _packet;
        if (p->message) {
                mnd_efree(p->message);
                p->message = NULL;
@@ -1582,7 +1580,7 @@ php_mysqlnd_prepare_read(void *_packet, MYSQLND *conn TSRMLS_DC)
        zend_uchar *p = buf;
        zend_uchar *begin = buf;
        unsigned int data_size;
-       php_mysql_packet_prepare_response *packet= (php_mysql_packet_prepare_response *) _packet;
+       MYSQLND_PACKET_PREPARE_RESPONSE *packet= (MYSQLND_PACKET_PREPARE_RESPONSE *) _packet;
 
        DBG_ENTER("php_mysqlnd_prepare_read");
 
@@ -1645,7 +1643,7 @@ php_mysqlnd_prepare_read(void *_packet, MYSQLND *conn TSRMLS_DC)
 static
 void php_mysqlnd_prepare_free_mem(void *_packet, zend_bool alloca TSRMLS_DC)
 {
-       php_mysql_packet_prepare_response *p= (php_mysql_packet_prepare_response *) _packet;
+       MYSQLND_PACKET_PREPARE_RESPONSE *p= (MYSQLND_PACKET_PREPARE_RESPONSE *) _packet;
        if (!alloca) {
                mnd_pefree(p, p->header.persistent);
        }
@@ -1662,11 +1660,11 @@ php_mysqlnd_chg_user_read(void *_packet, MYSQLND *conn TSRMLS_DC)
        zend_uchar *buf = (zend_uchar *) conn->net->cmd_buffer.buffer;
        zend_uchar *p = buf;
        zend_uchar *begin = buf;
-       php_mysql_packet_chg_user_resp *packet= (php_mysql_packet_chg_user_resp *) _packet;
+       MYSQLND_PACKET_CHG_USER_RESPONSE *packet= (MYSQLND_PACKET_CHG_USER_RESPONSE *) _packet;
 
        DBG_ENTER("php_mysqlnd_chg_user_read");
 
-       PACKET_READ_HEADER_AND_BODY(packet, conn, buf, buf_len, "change user response", PROT_CHG_USER_PACKET);
+       PACKET_READ_HEADER_AND_BODY(packet, conn, buf, buf_len, "change user response", PROT_CHG_USER_RESP_PACKET);
 
        /*
          Don't increment. First byte is ERROR_MARKER on error, but otherwise is starting byte
@@ -1706,7 +1704,7 @@ static
 void php_mysqlnd_chg_user_free_mem(void *_packet, zend_bool alloca TSRMLS_DC)
 {
        if (!alloca) {
-               mnd_pefree(_packet, ((php_mysql_packet_chg_user_resp *)_packet)->header.persistent);
+               mnd_pefree(_packet, ((MYSQLND_PACKET_CHG_USER_RESPONSE *)_packet)->header.persistent);
        }
 }
 /* }}} */
@@ -1714,78 +1712,280 @@ void php_mysqlnd_chg_user_free_mem(void *_packet, zend_bool alloca TSRMLS_DC)
 
 /* {{{ packet_methods
  */
+static
 mysqlnd_packet_methods packet_methods[PROT_LAST] =
 {
        {
-               sizeof(php_mysql_packet_greet),
+               sizeof(MYSQLND_PACKET_GREET),
                php_mysqlnd_greet_read,
                NULL, /* write */
                php_mysqlnd_greet_free_mem,
        }, /* PROT_GREET_PACKET */
        {
-               sizeof(php_mysql_packet_auth),
+               sizeof(MYSQLND_PACKET_AUTH),
                NULL, /* read */
                php_mysqlnd_auth_write,
                php_mysqlnd_auth_free_mem,
        }, /* PROT_AUTH_PACKET */
        {
-               sizeof(php_mysql_packet_ok),
+               sizeof(MYSQLND_PACKET_OK),
                php_mysqlnd_ok_read, /* read */
                NULL, /* write */
                php_mysqlnd_ok_free_mem,
        }, /* PROT_OK_PACKET */
        {
-               sizeof(php_mysql_packet_eof),
+               sizeof(MYSQLND_PACKET_EOF),
                php_mysqlnd_eof_read, /* read */
                NULL, /* write */
                php_mysqlnd_eof_free_mem,
        }, /* PROT_EOF_PACKET */
        {
-               sizeof(php_mysql_packet_command),
+               sizeof(MYSQLND_PACKET_COMMAND),
                NULL, /* read */
                php_mysqlnd_cmd_write, /* write */
                php_mysqlnd_cmd_free_mem,
        }, /* PROT_CMD_PACKET */
        {
-               sizeof(php_mysql_packet_rset_header),
+               sizeof(MYSQLND_PACKET_RSET_HEADER),
                php_mysqlnd_rset_header_read, /* read */
                NULL, /* write */
                php_mysqlnd_rset_header_free_mem,
        }, /* PROT_RSET_HEADER_PACKET */
        {
-               sizeof(php_mysql_packet_res_field),
+               sizeof(MYSQLND_PACKET_RES_FIELD),
                php_mysqlnd_rset_field_read, /* read */
                NULL, /* write */
                php_mysqlnd_rset_field_free_mem,
        }, /* PROT_RSET_FLD_PACKET */
        {
-               sizeof(php_mysql_packet_row),
+               sizeof(MYSQLND_PACKET_ROW),
                php_mysqlnd_rowp_read, /* read */
                NULL, /* write */
                php_mysqlnd_rowp_free_mem,
        }, /* PROT_ROW_PACKET */
        {
-               sizeof(php_mysql_packet_stats),
+               sizeof(MYSQLND_PACKET_STATS),
                php_mysqlnd_stats_read, /* read */
                NULL, /* write */
                php_mysqlnd_stats_free_mem,
        }, /* PROT_STATS_PACKET */
        {
-               sizeof(php_mysql_packet_prepare_response),
+               sizeof(MYSQLND_PACKET_PREPARE_RESPONSE),
                php_mysqlnd_prepare_read, /* read */
                NULL, /* write */
                php_mysqlnd_prepare_free_mem,
        }, /* PROT_PREPARE_RESP_PACKET */
        {
-               sizeof(php_mysql_packet_chg_user_resp),
+               sizeof(MYSQLND_PACKET_CHG_USER_RESPONSE),
                php_mysqlnd_chg_user_read, /* read */
                NULL, /* write */
                php_mysqlnd_chg_user_free_mem,
-       } /* PROT_CHG_USER_PACKET */
+       } /* PROT_CHG_USER_RESP_PACKET */
 };
 /* }}} */
 
 
+
+/* {{{ mysqlnd_protocol::get_greet_packet */
+static struct st_mysqlnd_packet_greet *
+MYSQLND_METHOD(mysqlnd_protocol, get_greet_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent TSRMLS_DC)
+{
+       struct st_mysqlnd_packet_greet * packet = pecalloc(1, packet_methods[PROT_GREET_PACKET].struct_size, persistent);
+       DBG_ENTER("mysqlnd_protocol::get_greet_packet");
+       packet->header.m = &packet_methods[PROT_GREET_PACKET];
+       packet->header.persistent = persistent;
+       DBG_RETURN(packet);
+}
+/* }}} */
+
+
+/* {{{ mysqlnd_protocol::get_auth_packet */
+static struct st_mysqlnd_packet_auth *
+MYSQLND_METHOD(mysqlnd_protocol, get_auth_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent TSRMLS_DC)
+{
+       struct st_mysqlnd_packet_auth * packet = pecalloc(1, packet_methods[PROT_AUTH_PACKET].struct_size, persistent);
+       DBG_ENTER("mysqlnd_protocol::get_auth_packet");
+       packet->header.m = &packet_methods[PROT_AUTH_PACKET];
+       packet->header.persistent = persistent;
+       DBG_RETURN(packet);
+}
+/* }}} */
+
+
+/* {{{ mysqlnd_protocol::get_ok_packet */
+static struct st_mysqlnd_packet_ok *
+MYSQLND_METHOD(mysqlnd_protocol, get_ok_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent TSRMLS_DC)
+{
+       struct st_mysqlnd_packet_ok * packet = pecalloc(1, packet_methods[PROT_OK_PACKET].struct_size, persistent);
+       DBG_ENTER("mysqlnd_protocol::get_ok_packet");
+       packet->header.m = &packet_methods[PROT_OK_PACKET];
+       packet->header.persistent = persistent;
+       DBG_RETURN(packet);
+}
+/* }}} */
+
+
+/* {{{ mysqlnd_protocol::get_eof_packet */
+static struct st_mysqlnd_packet_eof *
+MYSQLND_METHOD(mysqlnd_protocol, get_eof_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent TSRMLS_DC)
+{
+       struct st_mysqlnd_packet_eof * packet = pecalloc(1, packet_methods[PROT_EOF_PACKET].struct_size, persistent);
+       DBG_ENTER("mysqlnd_protocol::get_eof_packet");
+       packet->header.m = &packet_methods[PROT_EOF_PACKET];
+       packet->header.persistent = persistent;
+       DBG_RETURN(packet);
+}
+/* }}} */
+
+
+/* {{{ mysqlnd_protocol::get_command_packet */
+static struct st_mysqlnd_packet_command *
+MYSQLND_METHOD(mysqlnd_protocol, get_command_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent TSRMLS_DC)
+{
+       struct st_mysqlnd_packet_command * packet = pecalloc(1, packet_methods[PROT_CMD_PACKET].struct_size, persistent);
+       DBG_ENTER("mysqlnd_protocol::get_command_packet");
+       packet->header.m = &packet_methods[PROT_CMD_PACKET];
+       packet->header.persistent = persistent;
+       DBG_RETURN(packet);
+}
+/* }}} */
+
+
+/* {{{ mysqlnd_protocol::get_rset_packet */
+static struct st_mysqlnd_packet_rset_header *
+MYSQLND_METHOD(mysqlnd_protocol, get_rset_header_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent TSRMLS_DC)
+{
+       struct st_mysqlnd_packet_rset_header * packet = pecalloc(1, packet_methods[PROT_RSET_HEADER_PACKET].struct_size, persistent);
+       DBG_ENTER("mysqlnd_protocol::get_rset_header_packet");
+       packet->header.m = &packet_methods[PROT_RSET_HEADER_PACKET];
+       packet->header.persistent = persistent;
+       DBG_RETURN(packet);
+}
+/* }}} */
+
+
+/* {{{ mysqlnd_protocol::get_result_field_packet */
+static struct st_mysqlnd_packet_res_field *
+MYSQLND_METHOD(mysqlnd_protocol, get_result_field_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent TSRMLS_DC)
+{
+       struct st_mysqlnd_packet_res_field * packet = pecalloc(1, packet_methods[PROT_RSET_FLD_PACKET].struct_size, persistent);
+       DBG_ENTER("mysqlnd_protocol::get_result_field_packet");
+       packet->header.m = &packet_methods[PROT_RSET_FLD_PACKET];
+       packet->header.persistent = persistent;
+       DBG_RETURN(packet);
+}
+/* }}} */
+
+
+/* {{{ mysqlnd_protocol::get_row_packet */
+static struct st_mysqlnd_packet_row *
+MYSQLND_METHOD(mysqlnd_protocol, get_row_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent TSRMLS_DC)
+{
+       struct st_mysqlnd_packet_row * packet = pecalloc(1, packet_methods[PROT_ROW_PACKET].struct_size, persistent);
+       DBG_ENTER("mysqlnd_protocol::get_row_packet");
+       packet->header.m = &packet_methods[PROT_ROW_PACKET];
+       packet->header.persistent = persistent;
+       DBG_RETURN(packet);
+}
+/* }}} */
+
+
+/* {{{ mysqlnd_protocol::get_stats_packet */
+static struct st_mysqlnd_packet_stats *
+MYSQLND_METHOD(mysqlnd_protocol, get_stats_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent TSRMLS_DC)
+{
+       struct st_mysqlnd_packet_stats * packet = pecalloc(1, packet_methods[PROT_STATS_PACKET].struct_size, persistent);
+       DBG_ENTER("mysqlnd_protocol::get_stats_packet");
+       packet->header.m = &packet_methods[PROT_STATS_PACKET];
+       packet->header.persistent = persistent;
+       DBG_RETURN(packet);
+}
+/* }}} */
+
+
+/* {{{ mysqlnd_protocol::get_prepare_response_packet */
+static struct st_mysqlnd_packet_prepare_response *
+MYSQLND_METHOD(mysqlnd_protocol, get_prepare_response_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent TSRMLS_DC)
+{
+       struct st_mysqlnd_packet_prepare_response * packet = pecalloc(1, packet_methods[PROT_PREPARE_RESP_PACKET].struct_size, persistent);
+       DBG_ENTER("mysqlnd_protocol::get_prepare_response_packet");
+       packet->header.m = &packet_methods[PROT_PREPARE_RESP_PACKET];
+       packet->header.persistent = persistent;
+       DBG_RETURN(packet);
+}
+/* }}} */
+
+
+/* {{{ mysqlnd_protocol::get_change_user_response_packet */
+static struct st_mysqlnd_packet_chg_user_resp*
+MYSQLND_METHOD(mysqlnd_protocol, get_change_user_response_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent TSRMLS_DC)
+{
+       struct st_mysqlnd_packet_chg_user_resp * packet = pecalloc(1, packet_methods[PROT_CHG_USER_RESP_PACKET].struct_size, persistent);
+       DBG_ENTER("mysqlnd_protocol::get_change_user_response_packet");
+       packet->header.m = &packet_methods[PROT_CHG_USER_RESP_PACKET];
+       packet->header.persistent = persistent;
+       DBG_RETURN(packet);
+}
+/* }}} */
+
+
+/* {{{ mysqlnd_protocol_init */
+PHPAPI MYSQLND_PROTOCOL *
+mysqlnd_protocol_init(zend_bool persistent TSRMLS_DC)
+{
+       size_t alloc_size = sizeof(MYSQLND_PROTOCOL) + mysqlnd_plugin_count() * sizeof(void *);
+       MYSQLND_PROTOCOL *ret = mnd_pecalloc(1, alloc_size, persistent);
+
+       DBG_ENTER("mysqlnd_protocol_init");
+       DBG_INF_FMT("persistent=%d", persistent);
+       ret->persistent = persistent;
+
+       ret->m.get_greet_packet = MYSQLND_METHOD(mysqlnd_protocol, get_greet_packet);
+       ret->m.get_auth_packet = MYSQLND_METHOD(mysqlnd_protocol, get_auth_packet);
+       ret->m.get_ok_packet = MYSQLND_METHOD(mysqlnd_protocol, get_ok_packet);
+       ret->m.get_command_packet = MYSQLND_METHOD(mysqlnd_protocol, get_command_packet);
+       ret->m.get_eof_packet = MYSQLND_METHOD(mysqlnd_protocol, get_eof_packet);
+       ret->m.get_rset_header_packet = MYSQLND_METHOD(mysqlnd_protocol, get_rset_header_packet);
+       ret->m.get_result_field_packet = MYSQLND_METHOD(mysqlnd_protocol, get_result_field_packet);
+       ret->m.get_row_packet = MYSQLND_METHOD(mysqlnd_protocol, get_row_packet);
+       ret->m.get_stats_packet = MYSQLND_METHOD(mysqlnd_protocol, get_stats_packet);
+       ret->m.get_prepare_response_packet = MYSQLND_METHOD(mysqlnd_protocol, get_prepare_response_packet);
+       ret->m.get_change_user_response_packet = MYSQLND_METHOD(mysqlnd_protocol, get_change_user_response_packet);
+
+       DBG_RETURN(ret);
+}
+/* }}} */
+
+
+/* {{{ mysqlnd_protocol_free */
+PHPAPI void
+mysqlnd_protocol_free(MYSQLND_PROTOCOL * const protocol TSRMLS_DC)
+{
+       zend_bool pers = protocol->persistent;
+
+       DBG_ENTER("mysqlnd_protocol_free");
+
+       if (protocol) {
+               mnd_pefree(protocol, pers);
+       }
+       DBG_VOID_RETURN;
+}
+/* }}} */
+
+
+/* {{{ _mysqlnd_plugin_get_plugin_protocol_data */
+PHPAPI void ** _mysqlnd_plugin_get_plugin_protocol_data(const MYSQLND_PROTOCOL * protocol, unsigned int plugin_id TSRMLS_DC)
+{
+       DBG_ENTER("_mysqlnd_plugin_get_plugin_protocol_data");
+       DBG_INF_FMT("plugin_id=%u", plugin_id);
+       if (!protocol || plugin_id >= mysqlnd_plugin_count()) {
+               return NULL;
+       }
+       DBG_RETURN((void *)((char *)protocol + sizeof(MYSQLND_PROTOCOL) + plugin_id * sizeof(void *)));
+}
+/* }}} */
+
+
 /*
  * Local variables:
  * tab-width: 4
index b3f0ab63d87094619e81ba8c7d34d03c99c8d326..beb54845ed4881028d8d85ab7e165bbeeb9eacf6 100644 (file)
 #define MYSQLND_NULL_LENGTH    (unsigned long) ~0
 
 /* Used in mysqlnd_debug.c */
-extern char * mysqlnd_read_header_name;
-extern char * mysqlnd_read_body_name;
+PHPAPI extern const char mysqlnd_read_header_name[];
+PHPAPI extern const char mysqlnd_read_body_name[];
 
 
 /* Packet handling */
-#define PACKET_INIT(packet, enum_type, c_type, pers)  \
-       { \
-               packet = (c_type) pecalloc(1, packet_methods[(enum_type)].struct_size, (pers)); \
-               ((c_type) (packet))->header.m = &packet_methods[(enum_type)]; \
-               ((c_type) (packet))->header.persistent = (pers); \
-               DBG_INF_FMT("PACKET_INIT(%p, %d, %d)", packet, (int) enum_type, (int) pers); \
-       }
 #define PACKET_WRITE(packet, conn)     ((packet)->header.m->write_to_net((packet), (conn) TSRMLS_CC))
 #define PACKET_READ(packet, conn)      ((packet)->header.m->read_from_net((packet), (conn) TSRMLS_CC))
 #define PACKET_FREE(packet) \
@@ -51,16 +44,7 @@ extern char * mysqlnd_read_body_name;
                ((packet)->header.m->free_mem((packet), FALSE TSRMLS_CC)); \
        } while (0);
 
-#define PACKET_INIT_ALLOCA(packet, enum_type)  \
-       { \
-               memset(&(packet), 0, packet_methods[enum_type].struct_size); \
-               (packet).header.m = &packet_methods[enum_type]; \
-       }
-#define PACKET_WRITE_ALLOCA(packet, conn)      PACKET_WRITE(&(packet), (conn))
-#define PACKET_READ_ALLOCA(packet, conn)       PACKET_READ(&(packet), (conn))
-#define PACKET_FREE_ALLOCA(packet)                     (packet.header.m->free_mem(&(packet), TRUE TSRMLS_CC))
-
-extern const char * const mysqlnd_command_to_text[COM_END];
+PHPAPI extern const char * const mysqlnd_command_to_text[COM_END];
 
 /* Low-level extraction functionality */
 typedef struct st_mysqlnd_packet_methods {
@@ -70,19 +54,17 @@ typedef struct st_mysqlnd_packet_methods {
        void                            (*free_mem)(void *packet, zend_bool alloca TSRMLS_DC);
 } mysqlnd_packet_methods;
 
-extern mysqlnd_packet_methods packet_methods[];
-
 
 typedef struct st_mysqlnd_packet_header {
        size_t          size;
        mysqlnd_packet_methods *m;
        zend_uchar      packet_no;
        zend_bool       persistent;
-} mysqlnd_packet_header;
+} MYSQLND_PACKET_HEADER;
 
 /* Server greets the client */
-typedef struct st_php_mysql_packet_greet {
-       mysqlnd_packet_header           header;
+typedef struct st_mysqlnd_packet_greet {
+       MYSQLND_PACKET_HEADER           header;
        uint8_t         protocol_version;
        char            *server_version;
        uint32_t        thread_id;
@@ -97,12 +79,12 @@ typedef struct st_php_mysql_packet_greet {
        char            error[MYSQLND_ERRMSG_SIZE+1];
        char            sqlstate[MYSQLND_SQLSTATE_LENGTH + 1];
        unsigned int    error_no;
-} php_mysql_packet_greet;
+} MYSQLND_PACKET_GREET;
 
 
 /* Client authenticates */
-typedef struct st_php_mysql_packet_auth {
-       mysqlnd_packet_header           header;
+typedef struct st_mysqlnd_packet_auth {
+       MYSQLND_PACKET_HEADER           header;
        uint32_t        client_flags;
        uint32_t        max_packet_size;
        uint8_t charset_no;
@@ -117,11 +99,11 @@ typedef struct st_php_mysql_packet_auth {
        /* +1 for \0 because of scramble() */
        unsigned char   *server_scramble_buf;
        size_t                  db_len;
-} php_mysql_packet_auth;
+} MYSQLND_PACKET_AUTH;
 
 /* OK packet */
-typedef struct st_php_mysql_packet_ok {
-       mysqlnd_packet_header           header;
+typedef struct st_mysqlnd_packet_ok {
+       MYSQLND_PACKET_HEADER           header;
        uint8_t         field_count; /* always 0x0 */
        uint64_t        affected_rows;
        uint64_t        last_insert_id;
@@ -133,21 +115,21 @@ typedef struct st_php_mysql_packet_ok {
        char            error[MYSQLND_ERRMSG_SIZE+1];
        char            sqlstate[MYSQLND_SQLSTATE_LENGTH + 1];
        unsigned int    error_no;
-} php_mysql_packet_ok;
+} MYSQLND_PACKET_OK;
 
 
 /* Command packet */
-typedef struct st_php_mysql_packet_command {
-       mysqlnd_packet_header                   header;
+typedef struct st_mysqlnd_packet_command {
+       MYSQLND_PACKET_HEADER                   header;
        enum php_mysqlnd_server_command command;
        const char                                              *argument;
        size_t                                                  arg_len;
-} php_mysql_packet_command;
+} MYSQLND_PACKET_COMMAND;
 
 
 /* EOF packet */
-typedef struct st_php_mysql_packet_eof {
-       mysqlnd_packet_header           header;
+typedef struct st_mysqlnd_packet_eof {
+       MYSQLND_PACKET_HEADER           header;
        uint8_t         field_count; /* 0xFE */
        uint16_t        warning_count;
        uint16_t        server_status;
@@ -155,13 +137,13 @@ typedef struct st_php_mysql_packet_eof {
        char            error[MYSQLND_ERRMSG_SIZE+1];
        char            sqlstate[MYSQLND_SQLSTATE_LENGTH + 1];
        unsigned int    error_no;
-} php_mysql_packet_eof;
+} MYSQLND_PACKET_EOF;
 /* EOF packet */
 
 
 /* Result Set header*/
-typedef struct st_php_mysql_packet_rset_header {
-       mysqlnd_packet_header           header;
+typedef struct st_mysqlnd_packet_rset_header {
+       MYSQLND_PACKET_HEADER           header;
        /*
          0x00 => ok
          ~0   => LOAD DATA LOCAL
@@ -181,25 +163,25 @@ typedef struct st_php_mysql_packet_rset_header {
        char            *info_or_local_file;
        size_t          info_or_local_file_len;
        /* If error packet, we use these */
-       mysqlnd_error_info      error_info;
-} php_mysql_packet_rset_header;
+       MYSQLND_ERROR_INFO      error_info;
+} MYSQLND_PACKET_RSET_HEADER;
 
 
 /* Result set field packet */
-typedef struct st_php_mysql_packet_res_field {
-       mysqlnd_packet_header   header;
+typedef struct st_mysqlnd_packet_res_field {
+       MYSQLND_PACKET_HEADER   header;
        MYSQLND_FIELD                   *metadata;
        /* For table definitions, empty for result sets */
        zend_bool                               skip_parsing;
        zend_bool                               stupid_list_fields_eof;
 
-       mysqlnd_error_info              error_info;
-} php_mysql_packet_res_field;
+       MYSQLND_ERROR_INFO              error_info;
+} MYSQLND_PACKET_RES_FIELD;
 
 
 /* Row packet */
-struct st_php_mysql_packet_row {
-       mysqlnd_packet_header   header;
+typedef struct st_mysqlnd_packet_row {
+       MYSQLND_PACKET_HEADER   header;
        zval            **fields;
        uint32_t        field_count;
        zend_bool       eof;
@@ -222,22 +204,22 @@ struct st_php_mysql_packet_row {
        size_t                  bit_fields_total_len; /* trailing \0 not counted */
 
        /* If error packet, we use these */
-       mysqlnd_error_info      error_info;
-};
+       MYSQLND_ERROR_INFO      error_info;
+} MYSQLND_PACKET_ROW;
 
 
 /* Statistics packet */
-typedef struct st_php_mysql_packet_stats {
-       mysqlnd_packet_header   header;
+typedef struct st_mysqlnd_packet_stats {
+       MYSQLND_PACKET_HEADER   header;
        char *message;
        /* message_len is not part of the packet*/
        size_t message_len;
-} php_mysql_packet_stats;
+} MYSQLND_PACKET_STATS;
 
 
 /* COM_PREPARE response packet */
-typedef struct st_php_mysql_packet_prepare_response {
-       mysqlnd_packet_header   header;
+typedef struct st_mysqlnd_packet_prepare_response {
+       MYSQLND_PACKET_HEADER   header;
        /* also known as field_count 0x00=OK , 0xFF=error */
        unsigned char   error_code;
        unsigned long   stmt_id;
@@ -246,30 +228,28 @@ typedef struct st_php_mysql_packet_prepare_response {
        unsigned int    warning_count;
 
        /* present in case of error */
-       mysqlnd_error_info      error_info;
-} php_mysql_packet_prepare_response;
+       MYSQLND_ERROR_INFO      error_info;
+} MYSQLND_PACKET_PREPARE_RESPONSE;
 
 
 /* Statistics packet */
-typedef struct st_php_mysql_packet_chg_user_resp {
-       mysqlnd_packet_header   header;
+typedef struct st_mysqlnd_packet_chg_user_resp {
+       MYSQLND_PACKET_HEADER   header;
        uint32_t                        field_count;
 
        /* message_len is not part of the packet*/
        uint16_t                        server_capabilities;
        /* If error packet, we use these */
-       mysqlnd_error_info      error_info;
-} php_mysql_packet_chg_user_resp;
-
+       MYSQLND_ERROR_INFO      error_info;
+} MYSQLND_PACKET_CHG_USER_RESPONSE;
 
-size_t mysqlnd_stream_write_w_header(MYSQLND * const conn, char * const buf, size_t count TSRMLS_DC);
 
-void php_mysqlnd_scramble(zend_uchar * const buffer, const zend_uchar * const scramble, const zend_uchar * const pass);
+PHPAPI void php_mysqlnd_scramble(zend_uchar * const buffer, const zend_uchar * const scramble, const zend_uchar * const pass);
 
 unsigned long  php_mysqlnd_net_field_length(zend_uchar **packet);
 zend_uchar *   php_mysqlnd_net_store_length(zend_uchar *packet, uint64_t length);
 
-extern char * const mysqlnd_empty_string;
+PHPAPI extern char * const mysqlnd_empty_string;
 
 
 void php_mysqlnd_rowp_read_binary_protocol(MYSQLND_MEMORY_POOL_CHUNK * row_buffer, zval ** fields,
@@ -285,6 +265,11 @@ void php_mysqlnd_rowp_read_text_protocol(MYSQLND_MEMORY_POOL_CHUNK * row_buffer,
                                                                                 zend_bool as_unicode, zend_bool as_int_or_float,
                                                                                 MYSQLND_STATS * stats TSRMLS_DC);
 
+
+PHPAPI MYSQLND_PROTOCOL * mysqlnd_protocol_init(zend_bool persistent TSRMLS_DC);
+PHPAPI void mysqlnd_protocol_free(MYSQLND_PROTOCOL * net TSRMLS_DC);
+
+
 #endif /* MYSQLND_WIREPROTOCOL_H */
 
 /*
index a8d427ee4e140f2b0e95c95e5c26aef5a6440584..1ad5b4e25322a2f2285971f8e49b5149c7052c54 100644 (file)
@@ -69,7 +69,7 @@ PHPAPI void mysqlnd_minfo_print_hash(zval *values)
        }
 }
 #else
-void mysqlnd_minfo_print_hash(zval *values)
+PHPAPI void mysqlnd_minfo_print_hash(zval *values)
 {
        zval **values_entry;
        HashPosition pos_values;
@@ -205,7 +205,7 @@ static PHP_RINIT_FUNCTION(mysqlnd)
 {
 #if defined(PHP_DEBUG)
        if (MYSQLND_G(debug)) {
-               MYSQLND_DEBUG *dbg = mysqlnd_debug_init(TSRMLS_C);
+               MYSQLND_DEBUG *dbg = mysqlnd_debug_init(mysqlnd_debug_std_no_trace_funcs TSRMLS_CC);
                if (!dbg) {
                        return FAILURE;
                }
index 315c74d6ae538ec8c8fb059db26404b023b80c8d..501071dca16cc3039652b48433e622f1ff01773c 100755 (executable)
@@ -126,7 +126,7 @@ static PHP_RINIT_FUNCTION(pdo_mysql)
 {      
 #if PDO_DBG_ENABLED
        if (PDO_MYSQL_G(debug)) {
-               MYSQLND_DEBUG *dbg = mysqlnd_debug_init(TSRMLS_C);
+               MYSQLND_DEBUG *dbg = mysqlnd_debug_init(mysqlnd_debug_std_no_trace_funcs TSRMLS_CC);
                if (!dbg) {
                        return FAILURE;
                }