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

📄 php_fbsql.c

📁 php-4.4.7学习linux时下载的源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
	php_info_print_table_start();	php_info_print_table_header(2, "FrontBase support", "enabled");	php_info_print_table_row(2, "Client API version", "2.24");	if (FB_SQL_G(allowPersistent))	{		snprintf(buf, sizeof(buf), "%ld", FB_SQL_G(persistentCount));		php_info_print_table_row(2, "Active Persistent Links", buf);	}	snprintf(buf, sizeof(buf), "%ld", FB_SQL_G(linkCount));	php_info_print_table_row(2, "Active Links", buf);/*	sprintf(buf, "%ld", FB_SQL_G(resultCount));	php_info_print_table_row(2, "Active Results", buf);*/	php_info_print_table_end();	DISPLAY_INI_ENTRIES();}static void php_fbsql_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent){	PHPFBLink* phpLink;	list_entry *lep;	char name[1024];	char *hostName = NULL, *userName = NULL, *userPassword = NULL;	int argc = ZEND_NUM_ARGS(), create_new = 0;	zval **argv[3];	if ((argc < 0) || (argc > 3)) WRONG_PARAM_COUNT;	if (zend_get_parameters_ex(argc, &argv[0], &argv[1], &argv[2])==FAILURE) RETURN_FALSE;	if (argc >= 1)	{		convert_to_string_ex(argv[0]);		hostName = Z_STRVAL_PP(argv[0]);	}	if (argc >= 2)	{		convert_to_string_ex(argv[1]);		userName = Z_STRVAL_PP(argv[1]);	}	if (argc == 3)	{		convert_to_string_ex(argv[2]);		userPassword = Z_STRVAL_PP(argv[2]);	}	if (hostName     == NULL) hostName     = FB_SQL_G(hostName);	if (userName     == NULL) userName     = FB_SQL_G(userName);	if (userPassword == NULL) userPassword = FB_SQL_G(userPassword);	if (snprintf(name, sizeof(name), "fbsql_%s_%s_%s", hostName, userName, userPassword) < 0) {		RETURN_FALSE;	}	if (!FB_SQL_G(allowPersistent)) {		persistent=0;	}	if (persistent) {		if (zend_hash_find(&EG(persistent_list), name, strlen(name) + 1, (void **)&lep) == SUCCESS)		{			phpLink = (PHPFBLink*)lep->ptr;		}		else {			list_entry le;			if ((FB_SQL_G(maxLinks) != -1 && FB_SQL_G(linkCount) == FB_SQL_G(maxLinks)))			{				if (FB_SQL_G(generateWarnings))					php_error_docref(NULL TSRMLS_CC, E_WARNING, "FrontBase link limit %d exceeded", FB_SQL_G(maxLinks));				RETURN_FALSE;			}			if ((FB_SQL_G(maxPersistent) != -1 && FB_SQL_G(persistentCount) == FB_SQL_G(maxPersistent)))			{				if (FB_SQL_G(generateWarnings))					php_error_docref(NULL TSRMLS_CC, E_WARNING, "FrontBase persistent link limit %d exceeded", FB_SQL_G(maxPersistent));				RETURN_FALSE;			}			phpLink = malloc(sizeof(PHPFBLink));			phpLink->persistent       = persistent;			phpLink->hostName         = strdup(hostName);			phpLink->userName         = strdup(userName);			phpLink->userPassword     = strdup(userPassword);			phpLink->databasePassword = strdup(FB_SQL_G(databasePassword));			phpLink->databaseName	  = NULL;			phpLink->execHandler      = NULL;			phpLink->affectedRows     = 0;			phpLink->autoCommit	 	  = FB_SQL_G(autoCommit);			phpLink->errorNo          = 0;			phpLink->errorText        = NULL;			phpLink->connection		  = NULL;			le.ptr  = phpLink;			Z_TYPE(le) = le_plink;			if (zend_hash_update(&EG(persistent_list), name, strlen(name) + 1, &le, sizeof(le), NULL)==FAILURE)			{				free(phpLink->hostName);				free(phpLink->userName);				free(phpLink->userPassword);				free(phpLink->databasePassword);				free(phpLink);				RETURN_FALSE;			}			FB_SQL_G(linkCount)++;			FB_SQL_G(persistentCount)++;		}		ZEND_REGISTER_RESOURCE(return_value, phpLink, le_plink);	}	else	{		list_entry le;		if ((FB_SQL_G(maxLinks) != -1 && FB_SQL_G(linkCount) == FB_SQL_G(maxLinks)))		{			if (FB_SQL_G(generateWarnings))				php_error_docref(NULL TSRMLS_CC, E_WARNING, "FrontBase link limit %d exceeded", FB_SQL_G(maxLinks));			RETURN_FALSE;		}		if (zend_hash_find(&EG(regular_list), name, strlen(name) + 1, (void **)&lep) == SUCCESS)		{			int type, link;			void *ptr;			link = (int) lep->ptr;			ptr = zend_list_find(link, &type);   /* check if the link is still there */			if (ptr && (type==le_link || type==le_plink)) {				zend_list_addref(link);				Z_LVAL_P(return_value) = link;				php_fbsql_set_default_link(link TSRMLS_CC);				Z_TYPE_P(return_value) = IS_RESOURCE;				return;			} else {				zend_hash_del(&EG(regular_list), name, strlen(name) + 1);			}			phpLink = (PHPFBLink*)lep->ptr;		}		phpLink = emalloc(sizeof(PHPFBLink));		phpLink->persistent       = persistent;		phpLink->hostName         = strdup(hostName);		phpLink->userName         = strdup(userName);		phpLink->userPassword     = strdup(userPassword);		phpLink->databasePassword = strdup(FB_SQL_G(databasePassword));		phpLink->databaseName	  = NULL;		phpLink->execHandler      = NULL;		phpLink->affectedRows     = 0;		phpLink->autoCommit	 	  = FB_SQL_G(autoCommit);		phpLink->errorNo          = 0;		phpLink->errorText        = NULL;		phpLink->connection		  = NULL;		ZEND_REGISTER_RESOURCE(return_value, phpLink, le_link);		le.ptr = (void *)Z_LVAL_P(return_value);		Z_TYPE(le) = le_index_ptr;		if (zend_hash_update(&EG(regular_list), name, strlen(name) + 1, &le, sizeof(le), NULL)==FAILURE)		{			free(phpLink->hostName);			free(phpLink->userName);			free(phpLink->userPassword);			free(phpLink->databasePassword);			efree(phpLink);			RETURN_FALSE;		}		FB_SQL_G(linkCount)++;	}	php_fbsql_set_default_link(Z_LVAL_P(return_value) TSRMLS_CC);}int phpfbFetchRow(PHPFBResult* result, unsigned int row){	if (result->rowHandler == NULL)	{		void *rawData = fbcdcFetch(result->link->connection, result->batchSize, result->fetchHandle);		if (rawData == NULL)			result->rowCount = 0;		else			result->rowHandler = fbcrhInitWith(rawData, result->metaData);	}	for (;;)	{		void *rawData; 		if (row >= result->rowCount && result->rowCount != 0x7fffffff) return 0;		if (fbcrhRowCount(result->rowHandler) > (unsigned int)row) return 1;		rawData = fbcdcFetch(result->link->connection, result->batchSize, result->fetchHandle);		if (!fbcrhAddBatch(result->rowHandler, rawData)) result->rowCount = fbcrhRowCount(result->rowHandler);	}}/* {{{ proto resource fbsql_connect([string hostname [, string username [, string password]]])   Create a connection to a database server */PHP_FUNCTION(fbsql_connect){	php_fbsql_do_connect(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0);}/* }}} *//* {{{ proto resource fbsql_pconnect([string hostname [, string username [, string password]]])   Create a persistant connection to a database server */PHP_FUNCTION(fbsql_pconnect){	php_fbsql_do_connect(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1);}/* }}} *//* {{{ proto int fbsql_close([resource link_identifier])   Close a connection to a database server */PHP_FUNCTION(fbsql_close){	PHPFBLink* phpLink = NULL;	zval	**fbsql_link_index = NULL;	int id, i, nument, type;	void *ptr;	switch (ZEND_NUM_ARGS()) {		case 0:			id = php_fbsql_get_default_link(INTERNAL_FUNCTION_PARAM_PASSTHRU);			CHECK_LINK(id);			break;		case 1:			if (zend_get_parameters_ex(1, &fbsql_link_index)==FAILURE) {				RETURN_FALSE;			}			id = -1;			break;		default:			WRONG_PARAM_COUNT;			break;	}	ZEND_FETCH_RESOURCE2(phpLink, PHPFBLink *, fbsql_link_index, id, "FrontBase-Link", le_link, le_plink);	nument = zend_hash_next_free_element(&EG(regular_list));	for (i = 1; i < nument; i++) {		ptr = zend_list_find(i, &type);		if (ptr && (type == le_result)) {			PHPFBResult *result;			result = (PHPFBResult *)ptr;			if (result->link == phpLink) {				zend_list_delete(i);			}		}	}	if (id==-1) { /* explicit resource number */		zend_list_delete(Z_RESVAL_PP(fbsql_link_index));	}	if (id!=-1 		|| (fbsql_link_index && Z_RESVAL_PP(fbsql_link_index)==FB_SQL_G(linkIndex))) {		zend_list_delete(FB_SQL_G(linkIndex));		FB_SQL_G(linkIndex) = -1;	}	RETURN_TRUE;}/* }}} */static int php_fbsql_select_db(char *databaseName, PHPFBLink *link TSRMLS_DC){	unsigned port;	FBCDatabaseConnection* c;	FBCMetaData*           md;	if (!link->databaseName || strcmp(link->databaseName, databaseName)) 	{		port = atoi(databaseName);		if (port>0 && port<65535)			c = fbcdcConnectToDatabaseUsingPort(link->hostName, port, link->databasePassword);		else			c = fbcdcConnectToDatabase(databaseName, link->hostName, link->databasePassword);		if (c == NULL)		{			if (FB_SQL_G(generateWarnings))				php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", fbcdcClassErrorMessage());			return 0;		}		md = fbcdcCreateSession(c, "PHP", link->userName, link->userPassword, link->userName);		if (fbcmdErrorsFound(md))		{			FBCErrorMetaData* emd = fbcdcErrorMetaData(c, md);			char*             emg = fbcemdAllErrorMessages(emd);			if (FB_SQL_G(generateWarnings))			{				if (emg)					php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", emg);				else					php_error_docref(NULL TSRMLS_CC, E_WARNING, "No message");			}			link->errorText = strdup(emg);			link->errorNo = fbcemdErrorCodeAtIndex(emd, 0);;			free(emg);			fbcemdRelease(emd);			fbcmdRelease(md);			fbcdcClose(c);			fbcdcRelease(c);			return 0;		}		fbcmdRelease(md);		if (c)		{			if (link->autoCommit)				md = fbcdcExecuteDirectSQL(c, "SET COMMIT TRUE;");			else				md = fbcdcExecuteDirectSQL(c, "SET COMMIT FALSE;");			fbcmdRelease(md);		}		fbcdcSetOutputCharacterSet(c, FBC_ISO8859_1);		fbcdcSetInputCharacterSet(c, FBC_ISO8859_1);		if (link->connection)		{			fbcdcClose(link->connection);			fbcdcRelease(link->connection);		}		link->connection = c;		if (link->databaseName) free(link->databaseName);		link->databaseName = strdup(databaseName);	}	return 1;}void phpfbestrdup(const char * s, int* length, char** value){	int l = s?strlen(s):0;	if (value)	{		char* r = emalloc(l+1);		if (s)			strcpy(r, s);		else			r[0] = 0;		*value = r;	}	*length = l;}/* {{{ proto void fbsql_set_transaction(resource link_identifier, int locking, int isolation)   Sets the transaction locking and isolation */PHP_FUNCTION(fbsql_set_transaction){	PHPFBLink* phpLink = NULL;	FBCMetaData* md;	zval **fbsql_link_index = NULL, **Locking = NULL, **Isolation = NULL;	char strSQL[1024];	char *strLocking[] = {"DEFERRED", "OPTIMISTIC", "PESSIMISTIC"};	char *strIsolation[] = {"READ UNCOMMITTED", "READ NCOMMITTED", "REPEATABLE READ", "SERIALIZABLE", "VERSIONED"};	switch (ZEND_NUM_ARGS()) {		case 3:			if (zend_get_parameters_ex(3, &fbsql_link_index, &Locking, &Isolation)==FAILURE) {				RETURN_FALSE;			}			break;		default:			WRONG_PARAM_COUNT;			break;	}	if (Z_LVAL_PP(Locking) < 0 || Z_LVAL_PP(Locking) > 2) {		php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid locking type.");		RETURN_FALSE;	}	if (Z_LVAL_PP(Isolation) < 0 || Z_LVAL_PP(Isolation) > 4) {		php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid isolation type.");		RETURN_FALSE;	}	ZEND_FETCH_RESOURCE2(phpLink, PHPFBLink *, fbsql_link_index, -1, "FrontBase-Link", le_link, le_plink);	if (snprintf(strSQL, sizeof(strSQL) , "SET TRANSACTION LOCKING %s, ISOLATION %s;", strLocking[Z_LVAL_PP(Locking)], strIsolation[Z_LVAL_PP(Isolation)]) < 0) {		RETURN_FALSE;	}	md = fbcdcExecuteDirectSQL(phpLink->connection, strSQL);	fbcmdRelease(md);}/* }}} *//* {{{ proto bool fbsql_autocommit(resource link_identifier [, bool OnOff])   Turns on auto-commit */PHP_FUNCTION(fbsql_autocommit){	PHPFBLink* phpLink = NULL;	FBCMetaData* md;	zval **fbsql_link_index = NULL, **onoff = NULL;	zend_bool OnOff;	switch (ZEND_NUM_ARGS()) {		case 1:			if (zend_get_parameters_ex(1, &fbsql_link_index)==FAILURE) {				RETURN_FALSE;			}			break;		case 2:			if (zend_get_parameters_ex(2, &fbsql_link_index, &onoff)==FAILURE) {				RETURN_FALSE;			}			break;		default:			WRONG_PARAM_COUNT;			break;	}	ZEND_FETCH_RESOURCE2(phpLink, PHPFBLink *, fbsql_link_index, -1, "FrontBase-Link", le_link, le_plink);	if (onoff)	{		convert_to_boolean_ex(onoff);		OnOff = Z_BVAL_PP(onoff);		phpLink->autoCommit = OnOff;		if (OnOff)			md = fbcdcExecuteDirectSQL(phpLink->connection, "SET COMMIT TRUE;");		else			md = fbcdcExecuteDirectSQL(phpLink->connection, "SET COMMIT FALSE;");		fbcmdRelease(md);	}	RETURN_BOOL(phpLink->autoCommit);}/* }}} *//* {{{ proto bool fbsql_commit([resource link_identifier])   Commit the transaction */PHP_FUNCTION(fbsql_commit){	PHPFBLink* phpLink = NULL;	FBCMetaData* md;	zval	**fbsql_link_index = NULL;	int id;	switch (ZEND_NUM_ARGS()) {		case 0:			id = php_fbsql_get_default_link(INTERNAL_FUNCTION_PARAM_PASSTHRU);			CHECK_LINK(id);			break;		case 1:			if (zend_get_parameters_ex(1, &fbsql_link_index)==FAILURE) {				RETURN_FALSE;			}			id = -1;			break;		default:			WRONG_PARAM_COUNT;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -