Annotation of embedaddon/php/ext/mysqlnd/php_mysqlnd.c, revision 1.1.1.2

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:   +----------------------------------------------------------------------+
1.1.1.2 ! misho      15:   | Authors: Andrey Hristov <andrey@mysql.com>                           |
1.1       misho      16:   |          Ulf Wendel <uwendel@mysql.com>                              |
1.1.1.2 ! misho      17:   |          Georg Richter <georg@mysql.com>                             |
1.1       misho      18:   +----------------------------------------------------------------------+
                     19: */
                     20: 
1.1.1.2 ! misho      21: /* $Id$ */
1.1       misho      22: #include "php.h"
                     23: #include "php_ini.h"
                     24: #include "mysqlnd.h"
                     25: #include "mysqlnd_priv.h"
                     26: #include "mysqlnd_debug.h"
1.1.1.2 ! misho      27: #include "mysqlnd_statistics.h"
        !            28: #include "mysqlnd_reverse_api.h"
1.1       misho      29: #include "ext/standard/info.h"
1.1.1.2 ! misho      30: #include "ext/standard/php_smart_str.h"
1.1       misho      31: 
                     32: /* {{{ mysqlnd_functions[]
                     33:  *
                     34:  * Every user visible function must have an entry in mysqlnd_functions[].
                     35:  */
                     36: static zend_function_entry mysqlnd_functions[] = {
                     37:        PHP_FE_END
                     38: };
                     39: /* }}} */
                     40: 
                     41: 
                     42: /* {{{ mysqlnd_minfo_print_hash */
                     43: #if MYSQLND_UNICODE
                     44: PHPAPI void mysqlnd_minfo_print_hash(zval *values)
                     45: {
                     46:        zval **values_entry;
                     47:        HashPosition pos_values;
                     48: 
                     49:        zend_hash_internal_pointer_reset_ex(Z_ARRVAL_P(values), &pos_values);
                     50:        while (zend_hash_get_current_data_ex(Z_ARRVAL_P(values),
                     51:                (void **)&values_entry, &pos_values) == SUCCESS) {
                     52:                zstr    string_key;
                     53:                uint    string_key_len;
                     54:                ulong   num_key;
                     55:                int             s_len;
                     56:                char    *s = NULL;
                     57: 
                     58:                TSRMLS_FETCH();
                     59:                zend_hash_get_current_key_ex(Z_ARRVAL_P(values), &string_key, &string_key_len, &num_key, 0, &pos_values);
                     60: 
                     61:                convert_to_string(*values_entry);
                     62: 
                     63:                if (zend_unicode_to_string(ZEND_U_CONVERTER(UG(runtime_encoding_conv)),
                     64:                                                                   &s, &s_len, string_key.u, string_key_len TSRMLS_CC) == SUCCESS) {
                     65:                        php_info_print_table_row(2, s, Z_STRVAL_PP(values_entry));
                     66:                }
                     67:                if (s) {
                     68:                        mnd_efree(s);
                     69:                }
                     70: 
                     71:                zend_hash_move_forward_ex(Z_ARRVAL_P(values), &pos_values);
                     72:        }
                     73: }
                     74: #else
                     75: PHPAPI void mysqlnd_minfo_print_hash(zval *values)
                     76: {
                     77:        zval **values_entry;
                     78:        HashPosition pos_values;
                     79: 
                     80:        zend_hash_internal_pointer_reset_ex(Z_ARRVAL_P(values), &pos_values);
                     81:        while (zend_hash_get_current_data_ex(Z_ARRVAL_P(values), (void **)&values_entry, &pos_values) == SUCCESS) {
                     82:                char    *string_key;
                     83:                uint    string_key_len;
                     84:                ulong   num_key;
                     85: 
                     86:                zend_hash_get_current_key_ex(Z_ARRVAL_P(values), &string_key, &string_key_len, &num_key, 0, &pos_values);
                     87: 
                     88:                convert_to_string(*values_entry);
                     89:                php_info_print_table_row(2, string_key, Z_STRVAL_PP(values_entry));
                     90: 
                     91:                zend_hash_move_forward_ex(Z_ARRVAL_P(values), &pos_values);
                     92:        }
                     93: }
                     94: #endif
                     95: /* }}} */
                     96: 
                     97: 
1.1.1.2 ! misho      98: /* {{{ mysqlnd_minfo_dump_plugin_stats */
        !            99: static int
        !           100: mysqlnd_minfo_dump_plugin_stats(void *pDest, void * argument TSRMLS_DC)
        !           101: {
        !           102:        struct st_mysqlnd_plugin_header * plugin_header = *(struct st_mysqlnd_plugin_header **) pDest;
        !           103:        if (plugin_header->plugin_stats.values) {
        !           104:                char buf[64];
        !           105:                zval values;
        !           106:                snprintf(buf, sizeof(buf), "%s statistics", plugin_header->plugin_name);
        !           107: 
        !           108:                mysqlnd_fill_stats_hash(plugin_header->plugin_stats.values, plugin_header->plugin_stats.names, &values TSRMLS_CC ZEND_FILE_LINE_CC); 
        !           109: 
        !           110:                php_info_print_table_start();
        !           111:                php_info_print_table_header(2, buf, "");
        !           112:                mysqlnd_minfo_print_hash(&values);
        !           113:                php_info_print_table_end();
        !           114:                zval_dtor(&values);
        !           115:        }
        !           116:        return ZEND_HASH_APPLY_KEEP;
        !           117: }
        !           118: /* }}} */
        !           119: 
        !           120: 
        !           121: /* {{{ mysqlnd_minfo_dump_loaded_plugins */
        !           122: static int 
        !           123: mysqlnd_minfo_dump_loaded_plugins(void *pDest, void * buf TSRMLS_DC)
        !           124: {
        !           125:        smart_str * buffer = (smart_str *) buf;
        !           126:        struct st_mysqlnd_plugin_header * plugin_header = *(struct st_mysqlnd_plugin_header **) pDest;
        !           127:        if (plugin_header->plugin_name) {
        !           128:                if (buffer->len) {
        !           129:                        smart_str_appendc(buffer, ',');
        !           130:                }
        !           131:                smart_str_appends(buffer, plugin_header->plugin_name);
        !           132:        }
        !           133:        return ZEND_HASH_APPLY_KEEP;
        !           134: }
        !           135: /* }}} */
        !           136: 
        !           137: /* {{{ mysqlnd_minfo_dump_api_plugins */
        !           138: static int
        !           139: mysqlnd_minfo_dump_api_plugins(void * pDest, void * buf TSRMLS_DC)
        !           140: {
        !           141:        smart_str * buffer = (smart_str *) buf;
        !           142:        MYSQLND_REVERSE_API * ext = *(MYSQLND_REVERSE_API **) pDest;
        !           143:        if (buffer->len) {
        !           144:                smart_str_appendc(buffer, ',');
        !           145:        }
        !           146:        smart_str_appends(buffer, ext->module->name);
        !           147:        return ZEND_HASH_APPLY_KEEP;
        !           148: }
        !           149: /* }}} */
        !           150: 
        !           151: 
1.1       misho     152: /* {{{ PHP_MINFO_FUNCTION
                    153:  */
                    154: PHP_MINFO_FUNCTION(mysqlnd)
                    155: {
                    156:        char buf[32];
                    157: 
                    158:        php_info_print_table_start();
                    159:        php_info_print_table_header(2, "mysqlnd", "enabled");
                    160:        php_info_print_table_row(2, "Version", mysqlnd_get_client_info());
                    161:        php_info_print_table_row(2, "Compression",
                    162: #ifdef MYSQLND_COMPRESSION_ENABLED
                    163:                                                                "supported");
                    164: #else
                    165:                                                                "not supported");
                    166: #endif
                    167:        php_info_print_table_row(2, "SSL",
                    168: #ifdef MYSQLND_SSL_SUPPORTED
                    169:                                                                "supported");
                    170: #else
                    171:                                                                "not supported");
                    172: #endif
                    173:        snprintf(buf, sizeof(buf), "%ld", MYSQLND_G(net_cmd_buffer_size));
                    174:        php_info_print_table_row(2, "Command buffer size", buf);
                    175:        snprintf(buf, sizeof(buf), "%ld", MYSQLND_G(net_read_buffer_size));
                    176:        php_info_print_table_row(2, "Read buffer size", buf);
                    177:        snprintf(buf, sizeof(buf), "%ld", MYSQLND_G(net_read_timeout));
                    178:        php_info_print_table_row(2, "Read timeout", buf);
                    179:        php_info_print_table_row(2, "Collecting statistics", MYSQLND_G(collect_statistics)? "Yes":"No");
                    180:        php_info_print_table_row(2, "Collecting memory statistics", MYSQLND_G(collect_memory_statistics)? "Yes":"No");
                    181: 
                    182:        php_info_print_table_row(2, "Tracing", MYSQLND_G(debug)? MYSQLND_G(debug):"n/a");
                    183: 
1.1.1.2 ! misho     184:        /* loaded plugins */
        !           185:        {
        !           186:                smart_str tmp_str = {0, 0, 0};
        !           187:                mysqlnd_plugin_apply_with_argument(mysqlnd_minfo_dump_loaded_plugins, &tmp_str);
        !           188:                smart_str_0(&tmp_str);
        !           189:                php_info_print_table_row(2, "Loaded plugins", tmp_str.c);
        !           190:                smart_str_free(&tmp_str);
        !           191: 
        !           192:                zend_hash_apply_with_argument(mysqlnd_reverse_api_get_api_list(TSRMLS_C), mysqlnd_minfo_dump_api_plugins, &tmp_str TSRMLS_CC);
        !           193:                smart_str_0(&tmp_str);
        !           194:                php_info_print_table_row(2, "API Extensions", tmp_str.c);
        !           195:                smart_str_free(&tmp_str);
        !           196:        }
1.1       misho     197: 
                    198:        php_info_print_table_end();
1.1.1.2 ! misho     199: 
        !           200: 
        !           201:        /* Print client stats */
        !           202:        mysqlnd_plugin_apply_with_argument(mysqlnd_minfo_dump_plugin_stats, NULL);
1.1       misho     203: }
                    204: /* }}} */
                    205: 
                    206: 
                    207: PHPAPI ZEND_DECLARE_MODULE_GLOBALS(mysqlnd)
                    208: 
                    209: 
                    210: /* {{{ PHP_GINIT_FUNCTION
                    211:  */
                    212: static PHP_GINIT_FUNCTION(mysqlnd)
                    213: {
                    214:        mysqlnd_globals->collect_statistics = TRUE;
                    215:        mysqlnd_globals->collect_memory_statistics = FALSE;
                    216:        mysqlnd_globals->debug = NULL;  /* The actual string */
                    217:        mysqlnd_globals->dbg = NULL;    /* The DBG object*/
                    218:        mysqlnd_globals->net_cmd_buffer_size = MYSQLND_NET_CMD_BUFFER_MIN_SIZE;
                    219:        mysqlnd_globals->net_read_buffer_size = 32768;
                    220:        mysqlnd_globals->net_read_timeout = 31536000;
                    221:        mysqlnd_globals->log_mask = 0;
                    222:        mysqlnd_globals->mempool_default_size = 16000;
                    223:        mysqlnd_globals->debug_emalloc_fail_threshold = -1;
                    224:        mysqlnd_globals->debug_ecalloc_fail_threshold = -1;
                    225:        mysqlnd_globals->debug_erealloc_fail_threshold = -1;
                    226:        mysqlnd_globals->debug_malloc_fail_threshold = -1;
                    227:        mysqlnd_globals->debug_calloc_fail_threshold = -1;
                    228:        mysqlnd_globals->debug_realloc_fail_threshold = -1;
                    229: }
                    230: /* }}} */
                    231: 
                    232: 
                    233: static PHP_INI_MH(OnUpdateNetCmdBufferSize)
                    234: {
                    235:        long long_value = atol(new_value);
                    236:        if (long_value < MYSQLND_NET_CMD_BUFFER_MIN_SIZE) {
                    237:                return FAILURE;
                    238:        }
                    239:        MYSQLND_G(net_cmd_buffer_size) = long_value;
                    240: 
                    241:        return SUCCESS;
                    242: }
                    243: 
                    244: /* {{{ PHP_INI_BEGIN
                    245: */
                    246: PHP_INI_BEGIN()
                    247:        STD_PHP_INI_BOOLEAN("mysqlnd.collect_statistics",       "1",    PHP_INI_ALL, OnUpdateBool,      collect_statistics, zend_mysqlnd_globals, mysqlnd_globals)
                    248:        STD_PHP_INI_BOOLEAN("mysqlnd.collect_memory_statistics",        "0",    PHP_INI_SYSTEM, OnUpdateBool,   collect_memory_statistics, zend_mysqlnd_globals, mysqlnd_globals)
                    249:        STD_PHP_INI_ENTRY("mysqlnd.debug",                                      NULL,   PHP_INI_SYSTEM, OnUpdateString, debug, zend_mysqlnd_globals, mysqlnd_globals)
                    250:        STD_PHP_INI_ENTRY("mysqlnd.net_cmd_buffer_size",        MYSQLND_NET_CMD_BUFFER_MIN_SIZE_STR,    PHP_INI_ALL,    OnUpdateNetCmdBufferSize,       net_cmd_buffer_size,    zend_mysqlnd_globals,           mysqlnd_globals)
                    251:        STD_PHP_INI_ENTRY("mysqlnd.net_read_buffer_size",       "32768",PHP_INI_ALL,    OnUpdateLong,   net_read_buffer_size,   zend_mysqlnd_globals,           mysqlnd_globals)
                    252:        STD_PHP_INI_ENTRY("mysqlnd.net_read_timeout",   "31536000",     PHP_INI_SYSTEM, OnUpdateLong,   net_read_timeout, zend_mysqlnd_globals, mysqlnd_globals)
                    253:        STD_PHP_INI_ENTRY("mysqlnd.log_mask",                           "0",    PHP_INI_ALL,    OnUpdateLong,   log_mask, zend_mysqlnd_globals, mysqlnd_globals)
                    254:        STD_PHP_INI_ENTRY("mysqlnd.mempool_default_size","16000",   PHP_INI_ALL,        OnUpdateLong,   mempool_default_size,   zend_mysqlnd_globals,           mysqlnd_globals)
                    255: 
1.1.1.2 ! misho     256: #if PHP_DEBUG
1.1       misho     257:        STD_PHP_INI_ENTRY("mysqlnd.debug_emalloc_fail_threshold","-1",   PHP_INI_SYSTEM,        OnUpdateLong,   debug_emalloc_fail_threshold,   zend_mysqlnd_globals,           mysqlnd_globals)
                    258:        STD_PHP_INI_ENTRY("mysqlnd.debug_ecalloc_fail_threshold","-1",   PHP_INI_SYSTEM,        OnUpdateLong,   debug_ecalloc_fail_threshold,   zend_mysqlnd_globals,           mysqlnd_globals)
                    259:        STD_PHP_INI_ENTRY("mysqlnd.debug_erealloc_fail_threshold","-1",   PHP_INI_SYSTEM,       OnUpdateLong,   debug_erealloc_fail_threshold,  zend_mysqlnd_globals,           mysqlnd_globals)
                    260: 
                    261:        STD_PHP_INI_ENTRY("mysqlnd.debug_malloc_fail_threshold","-1",   PHP_INI_SYSTEM, OnUpdateLong,   debug_malloc_fail_threshold,    zend_mysqlnd_globals,           mysqlnd_globals)
                    262:        STD_PHP_INI_ENTRY("mysqlnd.debug_calloc_fail_threshold","-1",   PHP_INI_SYSTEM, OnUpdateLong,   debug_calloc_fail_threshold,    zend_mysqlnd_globals,           mysqlnd_globals)
                    263:        STD_PHP_INI_ENTRY("mysqlnd.debug_realloc_fail_threshold","-1",   PHP_INI_SYSTEM,        OnUpdateLong,   debug_realloc_fail_threshold,   zend_mysqlnd_globals,           mysqlnd_globals)
                    264: #endif
                    265: PHP_INI_END()
                    266: /* }}} */
                    267: 
                    268: 
                    269: /* {{{ PHP_MINIT_FUNCTION
                    270:  */
                    271: static PHP_MINIT_FUNCTION(mysqlnd)
                    272: {
                    273:        REGISTER_INI_ENTRIES();
                    274: 
                    275:        mysqlnd_library_init(TSRMLS_C);
                    276:        return SUCCESS;
                    277: }
                    278: /* }}} */
                    279: 
                    280: 
                    281: /* {{{ PHP_MSHUTDOWN_FUNCTION
                    282:  */
                    283: static PHP_MSHUTDOWN_FUNCTION(mysqlnd)
                    284: {
                    285:        mysqlnd_library_end(TSRMLS_C);
                    286: 
                    287:        UNREGISTER_INI_ENTRIES();
                    288:        return SUCCESS;
                    289: }
                    290: /* }}} */
                    291: 
                    292: 
1.1.1.2 ! misho     293: #if PHP_DEBUG
1.1       misho     294: /* {{{ PHP_RINIT_FUNCTION
                    295:  */
                    296: static PHP_RINIT_FUNCTION(mysqlnd)
                    297: {
                    298:        if (MYSQLND_G(debug)) {
1.1.1.2 ! misho     299:                struct st_mysqlnd_plugin_trace_log * trace_log_plugin = mysqlnd_plugin_find("debug_trace");
        !           300:                MYSQLND_G(dbg) = NULL;
        !           301:                if (trace_log_plugin) {
        !           302:                        MYSQLND_DEBUG * dbg = trace_log_plugin->methods.trace_instance_init(mysqlnd_debug_std_no_trace_funcs TSRMLS_CC);
        !           303:                        if (!dbg) {
        !           304:                                return FAILURE;
        !           305:                        }
        !           306:                        dbg->m->set_mode(dbg, MYSQLND_G(debug));
        !           307:                        MYSQLND_G(dbg) = dbg;
1.1       misho     308:                }
                    309:        }
                    310:        return SUCCESS;
                    311: }
                    312: /* }}} */
                    313: #endif
                    314: 
                    315: 
1.1.1.2 ! misho     316: #if PHP_DEBUG
1.1       misho     317: /* {{{ PHP_RSHUTDOWN_FUNCTION
                    318:  */
                    319: static PHP_RSHUTDOWN_FUNCTION(mysqlnd)
                    320: {
                    321:        MYSQLND_DEBUG *dbg = MYSQLND_G(dbg);
                    322:        DBG_ENTER("RSHUTDOWN");
                    323:        if (dbg) {
                    324:                dbg->m->close(dbg);
                    325:                dbg->m->free_handle(dbg);
                    326:                MYSQLND_G(dbg) = NULL;
                    327:        }
                    328:        return SUCCESS;
                    329: }
                    330: /* }}} */
                    331: #endif
                    332: 
                    333: 
                    334: 
                    335: static const zend_module_dep mysqlnd_deps[] = {
                    336:        ZEND_MOD_REQUIRED("standard")
                    337:        ZEND_MOD_END
                    338: };
                    339: 
                    340: /* {{{ mysqlnd_module_entry
                    341:  */
                    342: zend_module_entry mysqlnd_module_entry = {
                    343:        STANDARD_MODULE_HEADER_EX,
                    344:        NULL,
                    345:        mysqlnd_deps,
                    346:        "mysqlnd",
                    347:        mysqlnd_functions,
                    348:        PHP_MINIT(mysqlnd),
                    349:        PHP_MSHUTDOWN(mysqlnd),
1.1.1.2 ! misho     350: #if PHP_DEBUG
1.1       misho     351:        PHP_RINIT(mysqlnd),
                    352: #else
                    353:        NULL,
                    354: #endif
1.1.1.2 ! misho     355: #if PHP_DEBUG
1.1       misho     356:        PHP_RSHUTDOWN(mysqlnd),
                    357: #else
                    358:        NULL,
                    359: #endif
                    360:        PHP_MINFO(mysqlnd),
                    361:        MYSQLND_VERSION,
                    362:        PHP_MODULE_GLOBALS(mysqlnd),
                    363:        PHP_GINIT(mysqlnd),
                    364:        NULL,
                    365:        NULL,
                    366:        STANDARD_MODULE_PROPERTIES_EX
                    367: };
                    368: /* }}} */
                    369: 
                    370: /* {{{ COMPILE_DL_MYSQLND */
                    371: #ifdef COMPILE_DL_MYSQLND
                    372: ZEND_GET_MODULE(mysqlnd)
                    373: #endif
                    374: /* }}} */
                    375: 
                    376: /*
                    377:  * Local variables:
                    378:  * tab-width: 4
                    379:  * c-basic-offset: 4
                    380:  * End:
                    381:  * vim600: noet sw=4 ts=4 fdm=marker
                    382:  * vim<600: noet sw=4 ts=4
                    383:  */

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>