mirror of
https://github.com/php/php-src.git
synced 2025-08-15 21:48:51 +02:00
api_ext to reverse_api
This commit is contained in:
parent
b6921369b5
commit
efb68d9399
11 changed files with 178 additions and 64 deletions
|
@ -530,7 +530,7 @@ static PHP_GINIT_FUNCTION(mysql)
|
|||
/* }}} */
|
||||
|
||||
#ifdef MYSQL_USE_MYSQLND
|
||||
static MYSQLND *mysql_convert_zv_to_mysqlnd(zval *zv TSRMLS_DC)
|
||||
static MYSQLND * mysql_convert_zv_to_mysqlnd(zval * zv TSRMLS_DC)
|
||||
{
|
||||
php_mysql_conn *mysql;
|
||||
|
||||
|
@ -548,7 +548,7 @@ static MYSQLND *mysql_convert_zv_to_mysqlnd(zval *zv TSRMLS_DC)
|
|||
return mysql->conn;
|
||||
}
|
||||
|
||||
static mysqlnd_api_extension_t mysqlnd_api_ext = {
|
||||
static MYSQLND_REVERSE_API mysql_reverse_api = {
|
||||
&mysql_module_entry,
|
||||
mysql_convert_zv_to_mysqlnd
|
||||
};
|
||||
|
@ -583,7 +583,7 @@ ZEND_MODULE_STARTUP_D(mysql)
|
|||
#endif
|
||||
|
||||
#ifdef MYSQL_USE_MYSQLND
|
||||
mysqlnd_register_api_extension(&mysqlnd_api_ext);
|
||||
mysqlnd_reverse_api_register_api(&mysql_reverse_api TSRMLS_CC);
|
||||
#endif
|
||||
|
||||
return SUCCESS;
|
||||
|
|
|
@ -528,12 +528,12 @@ PHP_MYSQLI_EXPORT(zend_object_value) mysqli_objects_new(zend_class_entry *class_
|
|||
/* }}} */
|
||||
|
||||
#ifdef MYSQLI_USE_MYSQLND
|
||||
static MYSQLND *mysqli_convert_zv_to_mysqlnd(zval *zv TSRMLS_DC)
|
||||
static MYSQLND *mysqli_convert_zv_to_mysqlnd(zval * zv TSRMLS_DC)
|
||||
{
|
||||
if (Z_TYPE_P(zv) == IS_OBJECT && Z_OBJCE_P(zv) == mysqli_link_class_entry) {
|
||||
MY_MYSQL *mysql;
|
||||
MYSQLI_RESOURCE *my_res;
|
||||
mysqli_object *intern = (mysqli_object *)zend_object_store_get_object(zv TSRMLS_CC);
|
||||
MY_MYSQL * mysql;
|
||||
MYSQLI_RESOURCE * my_res;
|
||||
mysqli_object * intern = (mysqli_object *)zend_object_store_get_object(zv TSRMLS_CC);
|
||||
if (!(my_res = (MYSQLI_RESOURCE *)intern->ptr)) {
|
||||
/* We know that we have a mysqli object, so this failure should be emitted */
|
||||
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Couldn't fetch %s", intern->zo.ce->name);
|
||||
|
@ -545,7 +545,7 @@ static MYSQLND *mysqli_convert_zv_to_mysqlnd(zval *zv TSRMLS_DC)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
static mysqlnd_api_extension_t mysqli_api_ext = {
|
||||
static MYSQLND_REVERSE_API mysqli_reverse_api = {
|
||||
&mysqli_module_entry,
|
||||
mysqli_convert_zv_to_mysqlnd
|
||||
};
|
||||
|
@ -839,7 +839,7 @@ PHP_MINIT_FUNCTION(mysqli)
|
|||
|
||||
|
||||
#ifdef MYSQLI_USE_MYSQLND
|
||||
mysqlnd_register_api_extension(&mysqli_api_ext);
|
||||
mysqlnd_reverse_api_register_api(&mysqli_reverse_api TSRMLS_CC);
|
||||
#endif
|
||||
|
||||
return SUCCESS;
|
||||
|
|
|
@ -14,6 +14,7 @@ if (PHP_MYSQLND != "no") {
|
|||
"mysqlnd_charset.c " +
|
||||
"mysqlnd_debug.c " +
|
||||
"mysqlnd_loaddata.c " +
|
||||
"mysqlnd_reverse_api.c " +
|
||||
"mysqlnd_net.c " +
|
||||
"mysqlnd_plugin.c " +
|
||||
"mysqlnd_ps.c " +
|
||||
|
|
|
@ -19,7 +19,7 @@ dnl If some extension uses mysqlnd it will get compiled in PHP core
|
|||
if test "$PHP_MYSQLND" != "no" || test "$PHP_MYSQLND_ENABLED" = "yes"; then
|
||||
mysqlnd_ps_sources="mysqlnd_ps.c mysqlnd_ps_codec.c"
|
||||
mysqlnd_base_sources="mysqlnd.c mysqlnd_alloc.c mysqlnd_bt.c mysqlnd_charset.c mysqlnd_wireprotocol.c \
|
||||
mysqlnd_loaddata.c mysqlnd_net.c \
|
||||
mysqlnd_loaddata.c mysqlnd_reverse_api.c mysqlnd_net.c \
|
||||
mysqlnd_statistics.c mysqlnd_auth.c \
|
||||
mysqlnd_result.c mysqlnd_result_meta.c mysqlnd_debug.c\
|
||||
mysqlnd_block_alloc.c mysqlnd_plugin.c php_mysqlnd.c"
|
||||
|
|
|
@ -27,6 +27,7 @@
|
|||
#include "mysqlnd_statistics.h"
|
||||
#include "mysqlnd_charset.h"
|
||||
#include "mysqlnd_debug.h"
|
||||
#include "mysqlnd_reverse_api.h"
|
||||
|
||||
/*
|
||||
TODO :
|
||||
|
@ -68,8 +69,6 @@ static struct st_mysqlnd_conn_methods *mysqlnd_conn_methods;
|
|||
|
||||
static struct st_mysqlnd_plugin_core mysqlnd_plugin_core;
|
||||
|
||||
static HashTable mysqlnd_api_ext_ht;
|
||||
|
||||
/* {{{ mysqlnd_error_list_pdtor */
|
||||
static void
|
||||
mysqlnd_error_list_pdtor(void * pDest)
|
||||
|
@ -93,7 +92,7 @@ PHPAPI void mysqlnd_library_end(TSRMLS_D)
|
|||
mysqlnd_stats_end(mysqlnd_global_stats);
|
||||
mysqlnd_global_stats = NULL;
|
||||
mysqlnd_library_initted = FALSE;
|
||||
zend_hash_destroy(&mysqlnd_api_ext_ht);
|
||||
mysqlnd_reverse_api_end(TSRMLS_C);
|
||||
}
|
||||
}
|
||||
/* }}} */
|
||||
|
@ -2547,45 +2546,11 @@ PHPAPI void mysqlnd_library_init(TSRMLS_D)
|
|||
mysqlnd_debug_trace_plugin_register(TSRMLS_C);
|
||||
mysqlnd_register_builtin_authentication_plugins(TSRMLS_C);
|
||||
|
||||
zend_hash_init(&mysqlnd_api_ext_ht, 3, NULL, NULL, 1);
|
||||
mysqlnd_reverse_api_init(TSRMLS_C);
|
||||
}
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ myslqnd_get_api_extensions */
|
||||
PHPAPI HashTable *mysqlnd_get_api_extensions()
|
||||
{
|
||||
return &mysqlnd_api_ext_ht;
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ mysqlnd_register_api_extension */
|
||||
PHPAPI void mysqlnd_register_api_extension(mysqlnd_api_extension_t *apiext)
|
||||
{
|
||||
zend_hash_add(&mysqlnd_api_ext_ht, apiext->module->name, strlen(apiext->module->name)+1, &apiext, sizeof(mysqlnd_api_extension_t), NULL);
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ zval_to_mysqlnd */
|
||||
PHPAPI MYSQLND* zval_to_mysqlnd(zval *zv TSRMLS_DC)
|
||||
{
|
||||
MYSQLND* retval;
|
||||
mysqlnd_api_extension_t **elem;
|
||||
|
||||
for (zend_hash_internal_pointer_reset(&mysqlnd_api_ext_ht);
|
||||
zend_hash_get_current_data(&mysqlnd_api_ext_ht, (void **)&elem) == SUCCESS;
|
||||
zend_hash_move_forward(&mysqlnd_api_ext_ht)) {
|
||||
if ((*elem)->conversion_cb) {
|
||||
retval = (*elem)->conversion_cb(zv TSRMLS_CC);
|
||||
if (retval) {
|
||||
return retval;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ mysqlnd_conn_get_methods */
|
||||
PHPAPI struct st_mysqlnd_conn_methods * mysqlnd_conn_get_methods()
|
||||
|
|
|
@ -313,15 +313,6 @@ PHPAPI ZEND_EXTERN_MODULE_GLOBALS(mysqlnd)
|
|||
|
||||
PHPAPI void mysqlnd_minfo_print_hash(zval *values);
|
||||
|
||||
typedef struct {
|
||||
zend_module_entry *module;
|
||||
MYSQLND *(*conversion_cb)(zval *zv TSRMLS_DC);
|
||||
} mysqlnd_api_extension_t;
|
||||
|
||||
PHPAPI HashTable *mysqlnd_get_api_extensions();
|
||||
PHPAPI void mysqlnd_register_api_extension(mysqlnd_api_extension_t *apiext);
|
||||
PHPAPI MYSQLND* zval_to_mysqlnd(zval *zv TSRMLS_DC);
|
||||
|
||||
#endif /* MYSQLND_H */
|
||||
|
||||
|
||||
|
|
103
ext/mysqlnd/mysqlnd_reverse_api.c
Normal file
103
ext/mysqlnd/mysqlnd_reverse_api.c
Normal file
|
@ -0,0 +1,103 @@
|
|||
/*
|
||||
+----------------------------------------------------------------------+
|
||||
| PHP Version 5 |
|
||||
+----------------------------------------------------------------------+
|
||||
| Copyright (c) 2006-2011 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: |
|
||||
| http://www.php.net/license/3_01.txt |
|
||||
| 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: Andrey Hristov <andrey@mysql.com> |
|
||||
| Georg Richter <georg@mysql.com> |
|
||||
| Ulf Wendel <uwendel@mysql.com> |
|
||||
+----------------------------------------------------------------------+
|
||||
*/
|
||||
|
||||
/* $Id: mysqlnd.c 317989 2011-10-10 20:49:28Z andrey $ */
|
||||
#include "php.h"
|
||||
#include "mysqlnd.h"
|
||||
#include "mysqlnd_wireprotocol.h"
|
||||
#include "mysqlnd_priv.h"
|
||||
#include "mysqlnd_result.h"
|
||||
#include "mysqlnd_statistics.h"
|
||||
#include "mysqlnd_charset.h"
|
||||
#include "mysqlnd_debug.h"
|
||||
|
||||
|
||||
static HashTable mysqlnd_api_ext_ht;
|
||||
|
||||
|
||||
/* {{{ mysqlnd_reverse_api_init */
|
||||
PHPAPI void
|
||||
mysqlnd_reverse_api_init(TSRMLS_D)
|
||||
{
|
||||
zend_hash_init(&mysqlnd_api_ext_ht, 3, NULL, NULL, 1);
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
|
||||
/* {{{ mysqlnd_reverse_api_end */
|
||||
PHPAPI void
|
||||
mysqlnd_reverse_api_end(TSRMLS_D)
|
||||
{
|
||||
zend_hash_destroy(&mysqlnd_api_ext_ht);
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
|
||||
/* {{{ myslqnd_get_api_extensions */
|
||||
PHPAPI HashTable *
|
||||
mysqlnd_reverse_api_get_api_list(TSRLMLS_D)
|
||||
{
|
||||
return &mysqlnd_api_ext_ht;
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
|
||||
/* {{{ mysqlnd_reverse_api_register_api */
|
||||
PHPAPI void
|
||||
mysqlnd_reverse_api_register_api(MYSQLND_REVERSE_API * apiext TSRMLS_DC)
|
||||
{
|
||||
zend_hash_add(&mysqlnd_api_ext_ht, apiext->module->name, strlen(apiext->module->name) + 1, &apiext,
|
||||
sizeof(MYSQLND_REVERSE_API), NULL);
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
|
||||
/* {{{ zval_to_mysqlnd */
|
||||
PHPAPI MYSQLND *
|
||||
zval_to_mysqlnd(zval * zv TSRMLS_DC)
|
||||
{
|
||||
MYSQLND * retval;
|
||||
MYSQLND_REVERSE_API ** elem;
|
||||
|
||||
for (zend_hash_internal_pointer_reset(&mysqlnd_api_ext_ht);
|
||||
zend_hash_get_current_data(&mysqlnd_api_ext_ht, (void **)&elem) == SUCCESS;
|
||||
zend_hash_move_forward(&mysqlnd_api_ext_ht))
|
||||
{
|
||||
if ((*elem)->conversion_cb) {
|
||||
retval = (*elem)->conversion_cb(zv TSRMLS_CC);
|
||||
if (retval) {
|
||||
return retval;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
|
||||
/*
|
||||
* Local variables:
|
||||
* tab-width: 4
|
||||
* c-basic-offset: 4
|
||||
* End:
|
||||
* vim600: noet sw=4 ts=4 fdm=marker
|
||||
* vim<600: noet sw=4 ts=4
|
||||
*/
|
45
ext/mysqlnd/mysqlnd_reverse_api.h
Normal file
45
ext/mysqlnd/mysqlnd_reverse_api.h
Normal file
|
@ -0,0 +1,45 @@
|
|||
/*
|
||||
+----------------------------------------------------------------------+
|
||||
| PHP Version 5 |
|
||||
+----------------------------------------------------------------------+
|
||||
| Copyright (c) 2006-2011 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: |
|
||||
| http://www.php.net/license/3_01.txt |
|
||||
| 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: Andrey Hristov <andrey@mysql.com> |
|
||||
| Georg Richter <georg@mysql.com> |
|
||||
| Ulf Wendel <uwendel@mysql.com> |
|
||||
+----------------------------------------------------------------------+
|
||||
*/
|
||||
/* $Id: mysqlnd.h 318051 2011-10-12 16:18:02Z andrey $ */
|
||||
|
||||
#ifndef MYSQLND_REVERSE_API_H
|
||||
#define MYSQLND_REVERSE_API_H
|
||||
struct st_mysqlnd_api_extension;
|
||||
|
||||
PHPAPI void mysqlnd_reverse_api_init(TSRMLS_D);
|
||||
PHPAPI void mysqlnd_reverse_api_end(TSRMLS_D);
|
||||
|
||||
PHPAPI HashTable * mysqlnd_reverse_api_get_api_list(TSRMLS_D);
|
||||
|
||||
PHPAPI void mysqlnd_reverse_api_register_api(struct st_mysqlnd_api_extension * apiext TSRMLS_DC);
|
||||
|
||||
PHPAPI MYSQLND * zval_to_mysqlnd(zval * zv TSRMLS_DC);
|
||||
|
||||
#endif /* MYSQLND_REVERSE_API_H */
|
||||
|
||||
/*
|
||||
* Local variables:
|
||||
* tab-width: 4
|
||||
* c-basic-offset: 4
|
||||
* End:
|
||||
* vim600: noet sw=4 ts=4 fdm=marker
|
||||
* vim<600: noet sw=4 ts=4
|
||||
*/
|
||||
|
|
@ -1023,4 +1023,11 @@ struct st_mysqlnd_authentication_plugin
|
|||
};
|
||||
|
||||
|
||||
typedef struct st_mysqlnd_reverse_api
|
||||
{
|
||||
zend_module_entry * module;
|
||||
MYSQLND *(*conversion_cb)(zval * zv TSRMLS_DC);
|
||||
} MYSQLND_REVERSE_API;
|
||||
|
||||
|
||||
#endif /* MYSQLND_STRUCTS_H */
|
||||
|
|
|
@ -25,6 +25,7 @@
|
|||
#include "mysqlnd_priv.h"
|
||||
#include "mysqlnd_debug.h"
|
||||
#include "mysqlnd_statistics.h"
|
||||
#include "mysqlnd_reverse_api.h"
|
||||
#include "ext/standard/info.h"
|
||||
#include "ext/standard/php_smart_str.h"
|
||||
|
||||
|
@ -135,10 +136,10 @@ mysqlnd_minfo_dump_loaded_plugins(void *pDest, void * buf TSRMLS_DC)
|
|||
|
||||
/* {{{ mysqlnd_minfo_dump_api_plugins */
|
||||
static int
|
||||
mysqlnd_minfo_dump_api_plugins(void *pDest, void * buf TSRMLS_DC)
|
||||
mysqlnd_minfo_dump_api_plugins(void * pDest, void * buf TSRMLS_DC)
|
||||
{
|
||||
smart_str * buffer = (smart_str *) buf;
|
||||
mysqlnd_api_extension_t *ext = *(mysqlnd_api_extension_t **) pDest;
|
||||
MYSQLND_REVERSE_API * ext = *(MYSQLND_REVERSE_API **) pDest;
|
||||
if (buffer->len) {
|
||||
smart_str_appendc(buffer, ',');
|
||||
}
|
||||
|
@ -188,7 +189,7 @@ PHP_MINFO_FUNCTION(mysqlnd)
|
|||
php_info_print_table_row(2, "Loaded plugins", tmp_str.c);
|
||||
smart_str_free(&tmp_str);
|
||||
|
||||
zend_hash_apply_with_argument(mysqlnd_get_api_extensions(), mysqlnd_minfo_dump_api_plugins, &tmp_str TSRMLS_CC);
|
||||
zend_hash_apply_with_argument(mysqlnd_reverse_api_get_api_list(TSRMLS_C), mysqlnd_minfo_dump_api_plugins, &tmp_str TSRMLS_CC);
|
||||
smart_str_0(&tmp_str);
|
||||
php_info_print_table_row(2, "API Extensions", tmp_str.c);
|
||||
smart_str_free(&tmp_str);
|
||||
|
|
|
@ -48,10 +48,11 @@ ZEND_DECLARE_MODULE_GLOBALS(pdo_mysql);
|
|||
#endif
|
||||
|
||||
#ifdef PDO_USE_MYSQLND
|
||||
static MYSQLND *pdo_mysql_convert_zv_to_mysqlnd(zval *zv TSRMLS_DC)
|
||||
#include "ext/mysqlnd/mysqlnd_reverse_api.h"
|
||||
static MYSQLND * pdo_mysql_convert_zv_to_mysqlnd(zval * zv TSRMLS_DC)
|
||||
{
|
||||
if (Z_TYPE_P(zv) == IS_OBJECT && Z_OBJCE_P(zv) == php_pdo_get_dbh_ce()) {
|
||||
pdo_dbh_t *dbh = zend_object_store_get_object(zv TSRMLS_CC);
|
||||
pdo_dbh_t * dbh = zend_object_store_get_object(zv TSRMLS_CC);
|
||||
|
||||
if (!dbh || dbh->driver != &pdo_mysql_driver) {
|
||||
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Provided PDO instance is not using MySQL but %s", dbh->driver->driver_name);
|
||||
|
@ -63,7 +64,7 @@ static MYSQLND *pdo_mysql_convert_zv_to_mysqlnd(zval *zv TSRMLS_DC)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
static mysqlnd_api_extension_t pdo_mysql_api_ext = {
|
||||
static MYSQLND_REVERSE_API pdo_mysql_reverse_api = {
|
||||
&pdo_mysql_module_entry,
|
||||
pdo_mysql_convert_zv_to_mysqlnd
|
||||
};
|
||||
|
@ -109,7 +110,7 @@ static PHP_MINIT_FUNCTION(pdo_mysql)
|
|||
REGISTER_PDO_CLASS_CONST_LONG("MYSQL_ATTR_SSL_CIPHER", (long)PDO_MYSQL_ATTR_SSL_CIPHER);
|
||||
|
||||
#ifdef PDO_USE_MYSQLND
|
||||
mysqlnd_register_api_extension(&pdo_mysql_api_ext);
|
||||
mysqlnd_reverse_api_register_api(&pdo_mysql_reverse_api TSRMLS_CC);
|
||||
#endif
|
||||
|
||||
return php_pdo_register_driver(&pdo_mysql_driver);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue