Annotation of embedaddon/php/ext/mysqlnd/mysqlnd_plugin.c, revision 1.1.1.2
1.1 misho 1: /*
2: +----------------------------------------------------------------------+
3: | PHP Version 5 |
4: +----------------------------------------------------------------------+
1.1.1.2 ! misho 5: | Copyright (c) 2006-2013 The PHP Group |
1.1 misho 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:
1.1.1.2 ! misho 68: /* {{{ mysqlnd_example_plugin_end */
1.1 misho 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:
1.1.1.2 ! misho 81: /* {{{ mysqlnd_example_plugin_register */
1.1 misho 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:
1.1.1.2 ! misho 107: /* {{{ mysqlnd_plugin_end_apply_func */
1.1 misho 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:
1.1.1.2 ! misho 139: /* {{{ mysqlnd_plugin_register_ex */
1.1 misho 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: {
1.1.1.2 ! misho 172: /* Note: We want to be thread-safe (read-only), so we can use neither
! 173: * zend_hash_apply_with_argument nor zend_hash_internal_pointer_reset and
! 174: * friends
! 175: */
! 176: Bucket *p;
! 177:
! 178: p = mysqlnd_registered_plugins.pListHead;
! 179: while (p != NULL) {
! 180: int result = apply_func(p->pData, argument TSRMLS_CC);
! 181:
! 182: if (result & ZEND_HASH_APPLY_REMOVE) {
! 183: php_error_docref(NULL TSRMLS_CC, E_WARNING, "mysqlnd_plugin_apply_with_argument must not remove table entries");
! 184: }
! 185: p = p->pListNext;
! 186: if (result & ZEND_HASH_APPLY_STOP) {
! 187: break;
! 188: }
! 189: }
1.1 misho 190: }
191: /* }}} */
192:
193:
194: /* {{{ mysqlnd_plugin_count */
195: PHPAPI unsigned int mysqlnd_plugin_count()
196: {
197: return mysqlnd_plugins_counter;
198: }
199: /* }}} */
200:
201:
202: /*
203: * Local variables:
204: * tab-width: 4
205: * c-basic-offset: 4
206: * End:
207: * vim600: noet sw=4 ts=4 fdm=marker
208: * vim<600: noet sw=4 ts=4
209: */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>