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>