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>