Annotation of embedaddon/php/ext/mysqlnd/mysqlnd_plugin.c, revision 1.1
1.1 ! misho 1: /*
! 2: +----------------------------------------------------------------------+
! 3: | PHP Version 5 |
! 4: +----------------------------------------------------------------------+
! 5: | Copyright (c) 2006-2012 The PHP Group |
! 6: +----------------------------------------------------------------------+
! 7: | This source file is subject to version 3.01 of the PHP license, |
! 8: | that is bundled with this package in the file LICENSE, and is |
! 9: | available through the world-wide-web at the following url: |
! 10: | http://www.php.net/license/3_01.txt |
! 11: | If you did not receive a copy of the PHP license and are unable to |
! 12: | obtain it through the world-wide-web, please send a note to |
! 13: | license@php.net so we can mail you a copy immediately. |
! 14: +----------------------------------------------------------------------+
! 15: | Authors: Andrey Hristov <andrey@mysql.com> |
! 16: | Ulf Wendel <uwendel@mysql.com> |
! 17: | Georg Richter <georg@mysql.com> |
! 18: +----------------------------------------------------------------------+
! 19: */
! 20:
! 21: /* $Id: mysqlnd.c 306407 2010-12-16 12:56:19Z andrey $ */
! 22: #include "php.h"
! 23: #include "mysqlnd.h"
! 24: #include "mysqlnd_priv.h"
! 25: #include "mysqlnd_statistics.h"
! 26: #include "mysqlnd_debug.h"
! 27:
! 28: /*--------------------------------------------------------------------*/
! 29:
! 30: static enum_func_status mysqlnd_example_plugin_end(void * p TSRMLS_DC);
! 31:
! 32: static MYSQLND_STATS * mysqlnd_plugin_example_stats = NULL;
! 33:
! 34: enum mysqlnd_plugin_example_collected_stats
! 35: {
! 36: EXAMPLE_STAT1,
! 37: EXAMPLE_STAT2,
! 38: EXAMPLE_STAT_LAST
! 39: };
! 40:
! 41: static const MYSQLND_STRING mysqlnd_plugin_example_stats_values_names[EXAMPLE_STAT_LAST] =
! 42: {
! 43: { MYSQLND_STR_W_LEN("stat1") },
! 44: { MYSQLND_STR_W_LEN("stat2") }
! 45: };
! 46:
! 47: static struct st_mysqlnd_typeii_plugin_example mysqlnd_example_plugin =
! 48: {
! 49: {
! 50: MYSQLND_PLUGIN_API_VERSION,
! 51: "example",
! 52: 10001L,
! 53: "1.00.01",
! 54: "PHP License",
! 55: "Andrey Hristov <andrey@php.net>",
! 56: {
! 57: NULL, /* will be filled later */
! 58: mysqlnd_plugin_example_stats_values_names,
! 59: },
! 60: {
! 61: mysqlnd_example_plugin_end
! 62: }
! 63: },
! 64: NULL, /* methods */
! 65: };
! 66:
! 67:
! 68: /* {{{ mysqlnd_plugin_subsystem_init */
! 69: static
! 70: enum_func_status mysqlnd_example_plugin_end(void * p TSRMLS_DC)
! 71: {
! 72: struct st_mysqlnd_typeii_plugin_example * plugin = (struct st_mysqlnd_typeii_plugin_example *) p;
! 73: DBG_ENTER("mysqlnd_example_plugin_end");
! 74: mysqlnd_stats_end(plugin->plugin_header.plugin_stats.values);
! 75: plugin->plugin_header.plugin_stats.values = NULL;
! 76: DBG_RETURN(PASS);
! 77: }
! 78: /* }}} */
! 79:
! 80:
! 81: /* {{{ mysqlnd_plugin_subsystem_init */
! 82: void
! 83: mysqlnd_example_plugin_register(TSRMLS_D)
! 84: {
! 85: mysqlnd_stats_init(&mysqlnd_plugin_example_stats, EXAMPLE_STAT_LAST);
! 86: mysqlnd_example_plugin.plugin_header.plugin_stats.values = mysqlnd_plugin_example_stats;
! 87: mysqlnd_plugin_register_ex((struct st_mysqlnd_plugin_header *) &mysqlnd_example_plugin TSRMLS_CC);
! 88: }
! 89: /* }}} */
! 90:
! 91: /*--------------------------------------------------------------------*/
! 92:
! 93: static HashTable mysqlnd_registered_plugins;
! 94:
! 95: static unsigned int mysqlnd_plugins_counter = 0;
! 96:
! 97:
! 98: /* {{{ mysqlnd_plugin_subsystem_init */
! 99: void
! 100: mysqlnd_plugin_subsystem_init(TSRMLS_D)
! 101: {
! 102: zend_hash_init(&mysqlnd_registered_plugins, 4 /* initial hash size */, NULL /* hash_func */, NULL /* dtor */, TRUE /* pers */);
! 103: }
! 104: /* }}} */
! 105:
! 106:
! 107: /* {{{ mysqlnd_plugin_subsystem_init */
! 108: int
! 109: mysqlnd_plugin_end_apply_func(void *pDest TSRMLS_DC)
! 110: {
! 111: struct st_mysqlnd_plugin_header * plugin_header = *(struct st_mysqlnd_plugin_header **) pDest;
! 112: if (plugin_header->m.plugin_shutdown) {
! 113: plugin_header->m.plugin_shutdown(plugin_header TSRMLS_CC);
! 114: }
! 115: return ZEND_HASH_APPLY_REMOVE;
! 116: }
! 117: /* }}} */
! 118:
! 119:
! 120: /* {{{ mysqlnd_plugin_subsystem_end */
! 121: void
! 122: mysqlnd_plugin_subsystem_end(TSRMLS_D)
! 123: {
! 124: zend_hash_apply(&mysqlnd_registered_plugins, mysqlnd_plugin_end_apply_func TSRMLS_CC);
! 125: zend_hash_destroy(&mysqlnd_registered_plugins);
! 126: }
! 127: /* }}} */
! 128:
! 129:
! 130: /* {{{ mysqlnd_plugin_register */
! 131: PHPAPI unsigned int mysqlnd_plugin_register()
! 132: {
! 133: TSRMLS_FETCH();
! 134: return mysqlnd_plugin_register_ex(NULL TSRMLS_CC);
! 135: }
! 136: /* }}} */
! 137:
! 138:
! 139: /* {{{ mysqlnd_plugin_register */
! 140: PHPAPI unsigned int mysqlnd_plugin_register_ex(struct st_mysqlnd_plugin_header * plugin TSRMLS_DC)
! 141: {
! 142: if (plugin) {
! 143: if (plugin->plugin_api_version == MYSQLND_PLUGIN_API_VERSION) {
! 144: zend_hash_update(&mysqlnd_registered_plugins, plugin->plugin_name, strlen(plugin->plugin_name) + 1, &plugin, sizeof(void *), NULL);
! 145: } else {
! 146: php_error_docref(NULL TSRMLS_CC, E_WARNING, "Plugin API version mismatch while loading plugin %s. Expected %d, got %d",
! 147: plugin->plugin_name, MYSQLND_PLUGIN_API_VERSION, plugin->plugin_api_version);
! 148: return 0xCAFE;
! 149: }
! 150: }
! 151: return mysqlnd_plugins_counter++;
! 152: }
! 153: /* }}} */
! 154:
! 155:
! 156: /* {{{ mysqlnd_plugin_find */
! 157: PHPAPI void * _mysqlnd_plugin_find(const char * const name TSRMLS_DC)
! 158: {
! 159: void * plugin;
! 160: if (SUCCESS == zend_hash_find(&mysqlnd_registered_plugins, name, strlen(name) + 1, (void **) &plugin)) {
! 161: return (void *)*(char **) plugin;
! 162: }
! 163: return NULL;
! 164:
! 165: }
! 166: /* }}} */
! 167:
! 168:
! 169: /* {{{ _mysqlnd_plugin_apply_with_argument */
! 170: PHPAPI void _mysqlnd_plugin_apply_with_argument(apply_func_arg_t apply_func, void * argument TSRMLS_DC)
! 171: {
! 172: zend_hash_apply_with_argument(&mysqlnd_registered_plugins, apply_func, argument TSRMLS_CC);
! 173: }
! 174: /* }}} */
! 175:
! 176:
! 177: /* {{{ mysqlnd_plugin_count */
! 178: PHPAPI unsigned int mysqlnd_plugin_count()
! 179: {
! 180: return mysqlnd_plugins_counter;
! 181: }
! 182: /* }}} */
! 183:
! 184:
! 185: /*
! 186: * Local variables:
! 187: * tab-width: 4
! 188: * c-basic-offset: 4
! 189: * End:
! 190: * vim600: noet sw=4 ts=4 fdm=marker
! 191: * vim<600: noet sw=4 ts=4
! 192: */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>