⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 interbase.c

📁 php-4.4.7学习linux时下载的源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
	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 + -