diff options
Diffstat (limited to 'ext/mysqlnd/mysqlnd.c')
-rw-r--r-- | ext/mysqlnd/mysqlnd.c | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/ext/mysqlnd/mysqlnd.c b/ext/mysqlnd/mysqlnd.c index 7f04d35517..5db03278dc 100644 --- a/ext/mysqlnd/mysqlnd.c +++ b/ext/mysqlnd/mysqlnd.c @@ -68,6 +68,7 @@ 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 @@ -92,6 +93,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); } } /* }}} */ @@ -2542,10 +2544,46 @@ PHPAPI void mysqlnd_library_init(TSRMLS_D) mysqlnd_example_plugin_register(TSRMLS_C); 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); } } /* }}} */ +/* {{{ 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) +{ + 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); + if (retval) { + return retval; + } + } + } + + return NULL; +} +/* }}} */ /* {{{ mysqlnd_conn_get_methods */ PHPAPI struct st_mysqlnd_conn_methods * mysqlnd_conn_get_methods() |