📄 interbase.c
字号:
IBDEBUG("Freeing query by dtor..."); if (ib_query) { if (ib_query->in_sqlda) { efree(ib_query->in_sqlda); } if (ib_query->out_sqlda) { efree(ib_query->out_sqlda); } if (ib_query->stmt) { IBDEBUG("Dropping statement handle (free_query dtor)..."); isc_dsql_free_statement(IB_STATUS, &ib_query->stmt, DSQL_drop); } if (ib_query->in_array) { efree(ib_query->in_array); } if (ib_query->out_array) { efree(ib_query->out_array); } efree(ib_query); }}/* }}} *//* {{{ _php_ibase_free_blob() */static void _php_ibase_free_blob(zend_rsrc_list_entry *rsrc TSRMLS_DC){ ibase_blob_handle *ib_blob = (ibase_blob_handle *)rsrc->ptr; if (ib_blob->bl_handle != NULL) { /* blob open*/ if (isc_cancel_blob(IB_STATUS, &ib_blob->bl_handle)) { php_error_docref(NULL TSRMLS_CC, E_ERROR, "You can lose data. Close any blob after reading of writing it. Use ibase_blob_close() before calling ibase_close()"); } } efree(ib_blob);}/* }}} *//* {{{ _php_ibase_free_trans() */static void _php_ibase_free_trans(zend_rsrc_list_entry *rsrc TSRMLS_DC){ ibase_tr_link *ib_trans = (ibase_tr_link *)rsrc->ptr; ibase_db_link *ib_link; int type; void *ptr; ptr = zend_list_find(ib_trans->link_rsrc, &type); /* check if the link is still there */ if (ptr && (type == le_link || type == le_plink)) { ib_link = (ibase_db_link *) zend_fetch_resource(NULL TSRMLS_CC, ib_trans->link_rsrc, "InterBase link", NULL, 2, le_link, le_plink); if (ib_link) { if (ib_link->trans[ib_trans->trans_num] != NULL) { IBDEBUG("Rolling back unhandled transaction..."); if (isc_rollback_transaction(IB_STATUS, &ib_link->trans[ib_trans->trans_num])) { _php_ibase_error(TSRMLS_C); } ib_link->trans[ib_trans->trans_num] = NULL; } } } efree(ib_trans);}/* }}} *//* {{{ startup, shutdown and info functions */PHP_INI_BEGIN() STD_PHP_INI_BOOLEAN("ibase.allow_persistent", "1", PHP_INI_SYSTEM, OnUpdateInt, allow_persistent, zend_ibase_globals, ibase_globals) STD_PHP_INI_ENTRY_EX("ibase.max_persistent", "-1", PHP_INI_SYSTEM, OnUpdateInt, max_persistent, zend_ibase_globals, ibase_globals, display_link_numbers) STD_PHP_INI_ENTRY_EX("ibase.max_links", "-1", PHP_INI_SYSTEM, OnUpdateInt, max_links, zend_ibase_globals, ibase_globals, display_link_numbers) STD_PHP_INI_ENTRY("ibase.default_user", NULL, PHP_INI_ALL, OnUpdateString, default_user, zend_ibase_globals, ibase_globals) STD_PHP_INI_ENTRY("ibase.default_password", NULL, PHP_INI_ALL, OnUpdateString, default_password, zend_ibase_globals, ibase_globals) STD_PHP_INI_ENTRY("ibase.timestampformat", "%m/%d/%Y %H:%M:%S", PHP_INI_ALL, OnUpdateString, cfg_timestampformat, zend_ibase_globals, ibase_globals) STD_PHP_INI_ENTRY("ibase.dateformat", "%m/%d/%Y", PHP_INI_ALL, OnUpdateString, cfg_dateformat, zend_ibase_globals, ibase_globals) STD_PHP_INI_ENTRY("ibase.timeformat", "%H:%M:%S", PHP_INI_ALL, OnUpdateString, cfg_timeformat, zend_ibase_globals, ibase_globals)PHP_INI_END()static void php_ibase_init_globals(zend_ibase_globals *ibase_globals){ ibase_globals->timestampformat = NULL; ibase_globals->dateformat = NULL; ibase_globals->timeformat = NULL; ibase_globals->num_persistent = 0;}PHP_MINIT_FUNCTION(ibase){ ZEND_INIT_MODULE_GLOBALS(ibase, php_ibase_init_globals, NULL); REGISTER_INI_ENTRIES(); le_result = zend_register_list_destructors_ex(_php_ibase_free_result, NULL, "interbase result", module_number); le_query = zend_register_list_destructors_ex(php_ibase_free_query_rsrc, NULL, "interbase query", module_number); le_blob = zend_register_list_destructors_ex(_php_ibase_free_blob, NULL, "interbase blob", module_number); le_link = zend_register_list_destructors_ex(_php_ibase_close_link, NULL, "interbase link", module_number); le_plink = zend_register_list_destructors_ex(php_ibase_commit_link_rsrc, _php_ibase_close_plink, "interbase link persistent", module_number); le_trans = zend_register_list_destructors_ex(_php_ibase_free_trans, NULL, "interbase transaction", module_number); REGISTER_LONG_CONSTANT("IBASE_DEFAULT", PHP_IBASE_DEFAULT, CONST_PERSISTENT); REGISTER_LONG_CONSTANT("IBASE_TEXT", PHP_IBASE_TEXT, CONST_PERSISTENT); REGISTER_LONG_CONSTANT("IBASE_UNIXTIME", PHP_IBASE_UNIXTIME, CONST_PERSISTENT); REGISTER_LONG_CONSTANT("IBASE_TIMESTAMP", PHP_IBASE_TIMESTAMP, CONST_PERSISTENT); REGISTER_LONG_CONSTANT("IBASE_DATE", PHP_IBASE_DATE, CONST_PERSISTENT); REGISTER_LONG_CONSTANT("IBASE_TIME", PHP_IBASE_TIME, CONST_PERSISTENT); /* transactions */ REGISTER_LONG_CONSTANT("IBASE_WRITE", PHP_IBASE_WRITE, CONST_PERSISTENT); REGISTER_LONG_CONSTANT("IBASE_READ", PHP_IBASE_READ, CONST_PERSISTENT); REGISTER_LONG_CONSTANT("IBASE_COMMITTED", PHP_IBASE_COMMITTED, CONST_PERSISTENT); REGISTER_LONG_CONSTANT("IBASE_CONSISTENCY", PHP_IBASE_CONSISTENCY, CONST_PERSISTENT); REGISTER_LONG_CONSTANT("IBASE_CONCURRENCY", PHP_IBASE_CONCURRENCY, CONST_PERSISTENT); REGISTER_LONG_CONSTANT("IBASE_REC_VERSION", PHP_IBASE_REC_VERSION, CONST_PERSISTENT); REGISTER_LONG_CONSTANT("IBASE_REC_NO_VERSION", PHP_IBASE_REC_NO_VERSION, CONST_PERSISTENT); REGISTER_LONG_CONSTANT("IBASE_NOWAIT", PHP_IBASE_NOWAIT, CONST_PERSISTENT); REGISTER_LONG_CONSTANT("IBASE_WAIT", PHP_IBASE_WAIT, CONST_PERSISTENT); return SUCCESS;}PHP_RINIT_FUNCTION(ibase){ IBG(default_link)= -1; IBG(num_links) = IBG(num_persistent); if (IBG(timestampformat)) { DL_FREE(IBG(timestampformat)); } IBG(timestampformat) = DL_STRDUP(IBG(cfg_timestampformat)); if (IBG(dateformat)) { DL_FREE(IBG(dateformat)); } IBG(dateformat) = DL_STRDUP(IBG(cfg_dateformat)); if (IBG(timeformat)) { DL_FREE(IBG(timeformat)); } IBG(timeformat) = DL_STRDUP(IBG(cfg_timeformat)); RESET_ERRMSG; return SUCCESS;}PHP_MSHUTDOWN_FUNCTION(ibase){#ifndef PHP_WIN32 /** * When the Interbase client API library libgds.so is first loaded, it registers a call to * gds__cleanup() with atexit(), in order to clean up after itself when the process exits. * This means that the library is called at process shutdown, and cannot be unloaded beforehand. * PHP tries to unload modules after every request [dl()'ed modules], and right before the * process shuts down [modules loaded from php.ini]. This results in a segfault for this module. * By NULLing the dlopen() handle in the module entry, Zend omits the call to dlclose(), * ensuring that the module will remain present until the process exits. However, the functions * and classes exported by the module will not be available until the module is 'reloaded'. * When reloaded, dlopen() will return the handle of the already loaded module. The module will * be unloaded automatically when the process exits. */ zend_module_entry *ibase_entry; if (SUCCESS == zend_hash_find(&module_registry, ibase_module_entry.name, strlen(ibase_module_entry.name) +1, (void*) &ibase_entry)) { ibase_entry->handle = NULL; }#endif UNREGISTER_INI_ENTRIES(); return SUCCESS;}PHP_RSHUTDOWN_FUNCTION(ibase){ if (IBG(timestampformat)) { DL_FREE(IBG(timestampformat)); } IBG(timestampformat) = NULL; if (IBG(dateformat)) { DL_FREE(IBG(dateformat)); } IBG(dateformat) = NULL; if (IBG(timeformat)) { DL_FREE(IBG(timeformat)); } IBG(timeformat) = NULL; return SUCCESS;} PHP_MINFO_FUNCTION(ibase){ char tmp[32]; php_info_print_table_start(); php_info_print_table_row(2, "Interbase Support", "enabled"); php_info_print_table_row(2, "Revision", "$Revision: 1.91.2.34.2.5 $");#ifdef COMPILE_DL_INTERBASE php_info_print_table_row(2, "Dynamic Module", "yes");#endif php_info_print_table_row(2, "Allow Persistent Links", (IBG(allow_persistent) ? "Yes" : "No")); if (IBG(max_persistent) == -1) { snprintf(tmp, 31, "%ld/unlimited", IBG(num_persistent)); } else { snprintf(tmp, 31, "%ld/%ld", IBG(num_persistent), IBG(max_persistent)); } tmp[31] = 0; php_info_print_table_row(2, "Persistent Links", tmp); if (IBG(max_links) == -1) { snprintf(tmp, 31, "%ld/unlimited", IBG(num_links)); } else { snprintf(tmp, 31, "%ld/%ld", IBG(num_links), IBG(max_links)); } tmp[31] = 0; php_info_print_table_row(2, "Total Links", tmp); php_info_print_table_row(2, "Timestamp Format", IBG(timestampformat)); php_info_print_table_row(2, "Date Format", IBG(dateformat)); php_info_print_table_row(2, "Time Format", IBG(timeformat)); php_info_print_table_end();}/* }}} *//* {{{ _php_ibase_attach_db() */static int _php_ibase_attach_db(char *server, char *uname, char *passwd, char *charset, int buffers, char *role, isc_db_handle *db TSRMLS_DC){ char dpb_buffer[256], *dpb, *p; int dpb_length, len; dpb = dpb_buffer; *dpb++ = isc_dpb_version1; if (uname != NULL && (len = strlen(uname))) { *dpb++ = isc_dpb_user_name; *dpb++ = len; for (p = uname; *p;) { *dpb++ = *p++; } } if (passwd != NULL && (len = strlen(passwd))) { *dpb++ = isc_dpb_password; *dpb++ = strlen(passwd); for (p = passwd; *p;) { *dpb++ = *p++; } } if (charset != NULL && (len = strlen(charset))) { *dpb++ = isc_dpb_lc_ctype; *dpb++ = strlen(charset); for (p = charset; *p;) { *dpb++ = *p++; } } if (buffers) { *dpb++ = isc_dpb_num_buffers; *dpb++ = 1; *dpb++ = buffers; }#ifdef isc_dpb_sql_role_name if (role != NULL && (len = strlen(role))) { *dpb++ = isc_dpb_sql_role_name; *dpb++ = strlen(role); for (p = role; *p;) { *dpb++ = *p++; } }#endif dpb_length = dpb - dpb_buffer; if (isc_attach_database(IB_STATUS, (short) strlen(server), server, db, (short) dpb_length, dpb_buffer)) { _php_ibase_error(TSRMLS_C); return FAILURE; } return SUCCESS;}/* }}} *//* {{{ _php_ibase_connect() */static void _php_ibase_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent){ zval ***args; char *ib_server = NULL, *ib_uname, *ib_passwd, *ib_charset = NULL, *ib_buffers = NULL, *ib_dialect = NULL, *ib_role = NULL; int i, ib_uname_len, ib_passwd_len; isc_db_handle db_handle = NULL; char *hashed_details; int hashed_details_length = 0; ibase_db_link *ib_link = NULL; RESET_ERRMSG; ib_uname = IBG(default_user); ib_passwd = IBG(default_password); ib_uname_len = ib_uname ? strlen(ib_uname) : 0; ib_passwd_len = ib_passwd ? strlen(ib_passwd) : 0; if (ZEND_NUM_ARGS() < 1 || ZEND_NUM_ARGS() > 7) { WRONG_PARAM_COUNT; } args = (zval ***) emalloc(sizeof(zval **) * ZEND_NUM_ARGS()); if (zend_get_parameters_array_ex(ZEND_NUM_ARGS(), args) == FAILURE) { efree(args); RETURN_FALSE; } switch (ZEND_NUM_ARGS()) { case 7: convert_to_string_ex(args[6]); ib_role = Z_STRVAL_PP(args[6]); hashed_details_length += Z_STRLEN_PP(args[6]); /* fallout */ case 6: convert_to_string_ex(args[5]); ib_dialect = Z_STRVAL_PP(args[5]); hashed_details_length += Z_STRLEN_PP(args[5]); /* fallout */ case 5: convert_to_string_ex(args[4]); ib_buffers = Z_STRVAL_PP(args[4]); hashed_details_length += Z_STRLEN_PP(args[4]); /* fallout */ case 4: convert_to_string_ex(args[3]); ib_charset = Z_STRVAL_PP(args[3]); hashed_details_length += Z_STRLEN_PP(args[3]); /* fallout */ case 3: convert_to_string_ex(args[2]); ib_passwd = Z_STRVAL_PP(args[2]); hashed_details_length += Z_STRLEN_PP(args[2]); /* fallout */ case 2: convert_to_string_ex(args[1]); ib_uname = Z_STRVAL_PP(args[1]); hashed_details_length += Z_STRLEN_PP(args[1]); /* fallout */ case 1: convert_to_string_ex(args[0]); ib_server = Z_STRVAL_PP(args[0]); hashed_details_length += Z_STRLEN_PP(args[0]); } /* case */ efree(args); hashed_details = (char *) emalloc(hashed_details_length + strlen("ibase_%s_%s_%s_%s_%s_%s_%s") + 1); sprintf(hashed_details, "ibase_%s_%s_%s_%s_%s_%s_%s", SAFE_STRING(ib_server), SAFE_STRING(ib_uname), SAFE_STRING(ib_passwd), SAFE_STRING(ib_charset), SAFE_STRING(ib_buffers), SAFE_STRING(ib_dialect), SAFE_STRING(ib_role)); if (persistent) { list_entry *le; int open_new_connection = 1; if (zend_hash_find(&EG(persistent_list), hashed_details, hashed_details_length + 1, (void **) &le) != FAILURE) { char tmp_1[] = {isc_info_base_level, isc_info_end}; char tmp_2[8]; /* Enough? Hope so... */ if (Z_TYPE_P(le) != le_plink) { RETURN_FALSE; } /* Check if connection has timed out */ ib_link = (ibase_db_link *) le->ptr; if (!isc_database_info(IB_STATUS, &ib_link->link, sizeof(tmp_1), tmp_1, sizeof(tmp_2), tmp_2)) { open_new_connection = 0; } } /* There was no previous connection to use or it has timed out */ if (open_new_connection) { list_entry new_le; if ((IBG(max_links) != -1) && (IBG(num_links) >= IBG(max_links))) { _php_ibase_module_error("Too many open links (%d)", IBG(num_links)); efree(hashed_details); RETURN_FALSE; } if ((IBG(max_persistent) != -1) && (IBG(num_persistent) >= IBG(max_persistent))) { _php_ibase_module_error("Too many open persistent links (%d)", IBG(num_persistent)); efree(hashed_details); RETURN_FALSE; } /* create the ib_link */ if (_php_ibase_attach_db(ib_server, ib_uname, ib_passwd, ib_charset, (ib_buffers ? strtoul(ib_buffers, NULL, 0) : 0), ib_role, &db_handle TSRMLS_CC) == FAILURE) { efree(hashed_details); RETURN_FALSE; } ib_link = (ibase_db_link *) malloc(sizeof(ibase_db_link)); ib_link->link = db_handle; ib_link->dialect = (ib_dialect ? (unsigned short) strtoul(ib_dialect, NULL, 10) : SQL_DIALECT_CURRENT); for (i = 0; i < IBASE_TRANS_ON_LINK; i++) { ib_link->trans[i] = NULL; } /* hash it up */ Z_TYPE(new_le) = le_plink; new_le.ptr = ib_link; if (zend_hash_update(&EG(persistent_list), hashed_details, hashed_details_length + 1, (void *) &new_le, sizeof(list_entry), NULL) == FAILURE) { efree(hashed_details); free(ib_link); RETURN_FALSE; } IBG(num_links)++; IBG(num_persistent)++; } ZEND_REGISTER_RESOURCE(return_value, ib_link, le_plink); } else { list_entry *index_ptr, new_index_ptr; /* first we check the hash for the hashed_details key. if it exists, * it should point us to the right offset where the actual ib_link sits. * if it doesn't, open a new ib_link, add it to the resource list, * and add a pointer to it with hashed_details as the key. */ if (zend_hash_find(&EG(regular_list), hashed_details, hashed_details_length + 1, (void **) &index_ptr) == SUCCESS) { int type, xlink; void *ptr; if (Z_TYPE_P(index_ptr) != le_index_ptr) { RETURN_FALSE; } xlink = (int) index_ptr->ptr; ptr = zend_list_find(xlink, &type); /* check if the xlink is still there */ if (ptr && (type == le_link || type == le_plink)) { zend_list_addref(xlink); Z_LVAL_P(return_value) = xlink; Z_TYPE_P(return_value) = IS_RESOURCE; IBG(default_link) = Z_LVAL_P(return_value); efree(hashed_details); return; } else { zend_hash_del(&EG(regular_list), hashed_details, hashed_details_length + 1); } } if ((IBG(max_links) != -1) && (IBG(num_links) >= IBG(max_links))) { _php_ibase_module_error("Too many open links (%d)", IBG(num_links)); efree(hashed_details); RETURN_FALSE; } /* create the ib_link */ if (_php_ibase_attach_db(ib_server, ib_uname, ib_passwd, ib_charset, (ib_buffers ? strtoul(ib_buffers, NULL, 0) : 0), ib_role, &db_handle TSRMLS_CC) == FAILURE) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -