diff options
author | Frank M. Kromann <fmk@php.net> | 2004-08-24 17:59:01 +0000 |
---|---|---|
committer | Frank M. Kromann <fmk@php.net> | 2004-08-24 17:59:01 +0000 |
commit | 381d3f8e62e6b9c9dcd6845a4a79d6a11d47d7c4 (patch) | |
tree | d26aea5aaa84a8b1b7634619fca915f54d06177a | |
parent | f95c1df583490814b0501c56f59671193a57507b (diff) | |
download | php-git-381d3f8e62e6b9c9dcd6845a4a79d6a11d47d7c4.tar.gz |
Add fbsql_rows_fetched() - returns the total number of rows fetched.
Fix a possible crash in fbsql_database() if the function was called before a connection was made.
-rw-r--r-- | ext/fbsql/php_fbsql.c | 116 | ||||
-rw-r--r-- | ext/fbsql/php_fbsql.h | 1 |
2 files changed, 89 insertions, 28 deletions
diff --git a/ext/fbsql/php_fbsql.c b/ext/fbsql/php_fbsql.c index 18c00ddc1e..59a69beaf7 100644 --- a/ext/fbsql/php_fbsql.c +++ b/ext/fbsql/php_fbsql.c @@ -201,6 +201,7 @@ function_entry fbsql_functions[] = { PHP_FE(fbsql_error, NULL) PHP_FE(fbsql_errno, NULL) PHP_FE(fbsql_affected_rows, NULL) + PHP_FE(fbsql_rows_fetched, NULL) PHP_FE(fbsql_insert_id, NULL) PHP_FE(fbsql_result, NULL) PHP_FE(fbsql_next_result, NULL) @@ -297,9 +298,9 @@ static void phpfbReleaseResult(zend_rsrc_list_entry *rsrc TSRMLS_DC) fbcmdRelease(md); } if (result->rowHandler) fbcrhRelease(result->rowHandler); - if (result->ResultmetaData) fbcmdRelease(result->ResultmetaData); if (result->list) fbcplRelease(result->list); if (result->array) fbaRelease(result->array); + if (result->ResultmetaData) fbcmdRelease(result->ResultmetaData); efree(result); } } @@ -369,7 +370,7 @@ static int php_fbsql_get_default_link(INTERNAL_FUNCTION_PARAMETERS) } -static void phpfbQuery(INTERNAL_FUNCTION_PARAMETERS, char* sql, PHPFBLink* link); +static void phpfbQuery(INTERNAL_FUNCTION_PARAMETERS, char* sql, PHPFBLink* link, long batch_size); /* {{{ PHP_INI */ @@ -381,7 +382,7 @@ PHP_INI_BEGIN() STD_PHP_INI_ENTRY_EX ("fbsql.max_links", "128", PHP_INI_SYSTEM, OnUpdateLong, maxLinks, zend_fbsql_globals, fbsql_globals, display_link_numbers) STD_PHP_INI_ENTRY_EX ("fbsql.max_connections", "128", PHP_INI_SYSTEM, OnUpdateLong, maxConnections, zend_fbsql_globals, fbsql_globals, display_link_numbers) STD_PHP_INI_ENTRY_EX ("fbsql.max_results", "128", PHP_INI_SYSTEM, OnUpdateLong, maxResults, zend_fbsql_globals, fbsql_globals, display_link_numbers) - STD_PHP_INI_ENTRY_EX ("fbsql.batchSize", "1000", PHP_INI_SYSTEM, OnUpdateLong, batchSize, zend_fbsql_globals, fbsql_globals, display_link_numbers) + STD_PHP_INI_ENTRY_EX ("fbsql.batchsize", "1000", PHP_INI_USER, OnUpdateLong, batchSize, zend_fbsql_globals, fbsql_globals, display_link_numbers) STD_PHP_INI_ENTRY ("fbsql.default_host", NULL, PHP_INI_SYSTEM, OnUpdateString, hostName, zend_fbsql_globals, fbsql_globals) STD_PHP_INI_ENTRY ("fbsql.default_user", "_SYSTEM", PHP_INI_SYSTEM, OnUpdateString, userName, zend_fbsql_globals, fbsql_globals) STD_PHP_INI_ENTRY ("fbsql.default_password", "", PHP_INI_SYSTEM, OnUpdateString, userPassword, zend_fbsql_globals, fbsql_globals) @@ -650,8 +651,9 @@ int phpfbFetchRow(PHPFBResult* result, unsigned int row) if (result->rowHandler == NULL) { void *rawData = fbcdcFetch(result->link->connection, result->batchSize, result->fetchHandle); - if (rawData == NULL) + if (rawData == NULL) { result->rowCount = 0; + } else result->rowHandler = fbcrhInitWith(rawData, result->metaData); } @@ -767,7 +769,7 @@ static int php_fbsql_select_db(char *databaseName, PHPFBLink *link TSRMLS_DC) php_error_docref(NULL TSRMLS_CC, E_WARNING, "No message"); } link->errorText = strdup(emg); - link->errorNo = fbcemdErrorCodeAtIndex(emd, 0);; + link->errorNo = fbcemdErrorCodeAtIndex(emd, 0); free(emg); fbcemdRelease(emd); fbcmdRelease(md); @@ -1231,7 +1233,12 @@ PHP_FUNCTION(fbsql_database) if (phpLink->databaseName) free(phpLink->databaseName); phpLink->databaseName = strdup(Z_STRVAL_PP(dbname)); } - RETURN_STRING(phpLink->databaseName, 1); + if (phpLink->databaseName) { + RETURN_STRING(phpLink->databaseName, 1); + } + else { + RETURN_FALSE; + } } /* }}} */ @@ -1474,7 +1481,7 @@ PHP_FUNCTION(fbsql_change_user) sprintf(buffer, "SET AUTHORIZATION %s;", userName); - phpfbQuery(INTERNAL_FUNCTION_PARAM_PASSTHRU, buffer, phpLink); + phpfbQuery(INTERNAL_FUNCTION_PARAM_PASSTHRU, buffer, phpLink, 0); if (Z_LVAL_P(return_value)) { free(phpLink->userName); @@ -1488,10 +1495,10 @@ PHP_FUNCTION(fbsql_change_user) PHP_FUNCTION(fbsql_create_db) { PHPFBLink* phpLink = NULL; - zval **fbsql_link_index = NULL, **database_name; + zval **fbsql_link_index = NULL, **database_name, **database_options = NULL; int id; int i, status; - char *databaseName; + char *databaseName, *databaseOptions; switch (ZEND_NUM_ARGS()) { case 1: @@ -1507,6 +1514,14 @@ PHP_FUNCTION(fbsql_create_db) } id = -1; break; + case 3: + if (zend_get_parameters_ex(3, &database_name, &fbsql_link_index, &database_options)==FAILURE) { + RETURN_FALSE; + } + id = -1; + convert_to_string_ex(database_options); + databaseOptions = Z_STRVAL_PP(database_options); + break; default: WRONG_PARAM_COUNT; break; @@ -1530,7 +1545,7 @@ PHP_FUNCTION(fbsql_create_db) php_error_docref(NULL TSRMLS_CC, E_WARNING, "Could not create %s@%s, database is %s", databaseName, phpLink->hostName, txt); RETURN_FALSE; } - if (!fbcehCreateDatabaseNamedWithOptions(phpLink->execHandler, databaseName, "")) + if (!fbcehCreateDatabaseNamedWithOptions(phpLink->execHandler, databaseName, databaseOptions)) { char* error = fbechErrorMessage(phpLink->execHandler); if (FB_SQL_G(generateWarnings)) @@ -1632,15 +1647,15 @@ PHP_FUNCTION(fbsql_drop_db) } /* }}} */ -/* {{{ proto bool fbsql_start_db(string database_name [, resource link_identifier]) +/* {{{ proto bool fbsql_start_db(string database_name [, resource link_identifier [, string database_options]]) Start a database on the server */ PHP_FUNCTION(fbsql_start_db) { PHPFBLink* phpLink = NULL; - zval **fbsql_link_index = NULL, **database_name; + zval **fbsql_link_index = NULL, **database_name, **database_options; int id; int i, status; - char *databaseName; + char *databaseName, *databaseOptions = NULL; switch (ZEND_NUM_ARGS()) { case 1: @@ -1656,6 +1671,14 @@ PHP_FUNCTION(fbsql_start_db) } id = -1; break; + case 3: + if (zend_get_parameters_ex(3, &database_name, &fbsql_link_index, &database_options)==FAILURE) { + RETURN_FALSE; + } + id = -1; + convert_to_string_ex(database_options); + databaseOptions = Z_STRVAL_PP(database_options); + break; default: WRONG_PARAM_COUNT; break; @@ -1682,7 +1705,7 @@ PHP_FUNCTION(fbsql_start_db) if (status == FBStopped) { - if (!fbcehStartDatabaseNamed (phpLink->execHandler, databaseName)) + if (!fbcehStartDatabaseNamedWithOptions(phpLink->execHandler, databaseName, databaseOptions)) { char* error = fbechErrorMessage(phpLink->execHandler); if (FB_SQL_G(generateWarnings)) @@ -1855,12 +1878,12 @@ int mdOk(PHPFBLink* link, FBCMetaData* md, char* sql) } /* }}} */ -static void phpfbQuery(INTERNAL_FUNCTION_PARAMETERS, char* sql, PHPFBLink* link) +static void phpfbQuery(INTERNAL_FUNCTION_PARAMETERS, char* sql, PHPFBLink* link, long batch_size) { PHPFBResult* result = NULL; FBCMetaData* md, *meta; char* tp; - char* fh; + char* fh = NULL; unsigned int sR = 1, cR = 0; meta = fbcdcExecuteDirectSQL(link->connection, sql); @@ -1887,13 +1910,13 @@ static void phpfbQuery(INTERNAL_FUNCTION_PARAMETERS, char* sql, PHPFBLink* link) } else if ((fh = fbcmdFetchHandle(md)) || tp[0] == 'E' || (tp[0] == 'U' && fh)) { - result = emalloc(sizeof(PHPFBResult)); + result = (PHPFBResult *)emalloc(sizeof(PHPFBResult)); result->link = link; - result->fetchHandle = fh; + result->rowHandler = NULL; + result->fetchHandle = NULL; result->ResultmetaData = meta; result->metaData = md; - result->rowHandler = NULL; - result->batchSize = FB_SQL_G(batchSize); + result->batchSize = batch_size > 0 ? batch_size : FB_SQL_G(batchSize); result->rowCount = 0x7fffffff; result->columnCount = 0; result->rowIndex = 0; @@ -1909,7 +1932,6 @@ static void phpfbQuery(INTERNAL_FUNCTION_PARAMETERS, char* sql, PHPFBLink* link) { result->columnCount = fbcmdColumnCount(md); result->fetchHandle = fh; - result->batchSize = FB_SQL_G(batchSize); } else { @@ -1938,13 +1960,13 @@ static void phpfbQuery(INTERNAL_FUNCTION_PARAMETERS, char* sql, PHPFBLink* link) } } -/* {{{ proto resource fbsql_query(string query [, resource link_identifier]) +/* {{{ proto resource fbsql_query(string query [, resource link_identifier [, long batch_size]]) Send one or more SQL statements to the server and execute them */ PHP_FUNCTION(fbsql_query) { PHPFBLink* phpLink = NULL; - zval **fbsql_link_index = NULL, **query; - int id; + zval **fbsql_link_index = NULL, **query, **batch_size; + int id, bs = 0; switch (ZEND_NUM_ARGS()) { case 1: @@ -1960,6 +1982,14 @@ PHP_FUNCTION(fbsql_query) } id = -1; break; + case 3: + if (zend_get_parameters_ex(3, &query, &fbsql_link_index, &batch_size)==FAILURE) { + RETURN_FALSE; + } + id = -1; + convert_to_long_ex(batch_size); + bs = Z_LVAL_PP(batch_size); + break; default: WRONG_PARAM_COUNT; break; @@ -1968,7 +1998,7 @@ PHP_FUNCTION(fbsql_query) convert_to_string_ex(query); - phpfbQuery(INTERNAL_FUNCTION_PARAM_PASSTHRU, Z_STRVAL_PP(query), phpLink); + phpfbQuery(INTERNAL_FUNCTION_PARAM_PASSTHRU, Z_STRVAL_PP(query), phpLink, bs); } /* }}} */ @@ -2004,7 +2034,7 @@ PHP_FUNCTION(fbsql_db_query) convert_to_string_ex(dbname); if (php_fbsql_select_db(Z_STRVAL_PP(dbname), phpLink TSRMLS_CC)) { - phpfbQuery(INTERNAL_FUNCTION_PARAM_PASSTHRU, Z_STRVAL_PP(query), phpLink); + phpfbQuery(INTERNAL_FUNCTION_PARAM_PASSTHRU, Z_STRVAL_PP(query), phpLink, 0); } else { RETURN_FALSE; } @@ -2096,7 +2126,7 @@ PHP_FUNCTION(fbsql_list_tables) php_fbsql_select_db(databaseName, phpLink TSRMLS_CC); } - phpfbQuery(INTERNAL_FUNCTION_PARAM_PASSTHRU, sql, phpLink); + phpfbQuery(INTERNAL_FUNCTION_PARAM_PASSTHRU, sql, phpLink, 0); } /* }}} */ @@ -2141,7 +2171,7 @@ PHP_FUNCTION(fbsql_list_fields) sprintf(sql, "SELECT * FROM %s WHERE 1=0;", tableName); - phpfbQuery(INTERNAL_FUNCTION_PARAM_PASSTHRU, sql, phpLink); + phpfbQuery(INTERNAL_FUNCTION_PARAM_PASSTHRU, sql, phpLink, 0); } /* }}} */ @@ -2255,6 +2285,36 @@ PHP_FUNCTION(fbsql_affected_rows) } /* }}} */ +/* {{{ proto int fbsql_affected_rows([resource link_identifier]) + Get the number of rows affected by the last statement */ +PHP_FUNCTION(fbsql_rows_fetched) +{ + PHPFBResult* phpResult = NULL; + zval **result = NULL; + int id; + + switch (ZEND_NUM_ARGS()) { + case 1: + if (zend_get_parameters_ex(1, &result)==FAILURE) { + RETURN_FALSE; + } + id = -1; + break; + default: + WRONG_PARAM_COUNT; + break; + } + ZEND_FETCH_RESOURCE(phpResult, PHPFBResult *, result, id, "FrontBase-Result", le_result); + + if (!phpResult->rowHandler) { + RETURN_FALSE; + } + else { + RETURN_LONG(fbcrhRowCount(phpResult->rowHandler)); + } +} +/* }}} */ + /* {{{ proto int fbsql_insert_id([resource link_identifier]) Get the internal index for the last insert statement */ PHP_FUNCTION(fbsql_insert_id) diff --git a/ext/fbsql/php_fbsql.h b/ext/fbsql/php_fbsql.h index cf3d99f1f0..7c23727c5b 100644 --- a/ext/fbsql/php_fbsql.h +++ b/ext/fbsql/php_fbsql.h @@ -57,6 +57,7 @@ PHP_FUNCTION(fbsql_list_fields); PHP_FUNCTION(fbsql_error); PHP_FUNCTION(fbsql_errno); PHP_FUNCTION(fbsql_affected_rows); +PHP_FUNCTION(fbsql_rows_fetched); PHP_FUNCTION(fbsql_insert_id); PHP_FUNCTION(fbsql_result); PHP_FUNCTION(fbsql_next_result); |