📄 php_fbsql.c
字号:
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 + -