summaryrefslogtreecommitdiff
path: root/ext/mssql/php_mssql.c
diff options
context:
space:
mode:
authorFrank M. Kromann <fmk@php.net>2002-12-03 18:57:04 +0000
committerFrank M. Kromann <fmk@php.net>2002-12-03 18:57:04 +0000
commit13b6390df7955fac3340864abb2d63a7321a24d1 (patch)
tree0b036c4a2f811cfb93a90bd5a134d25ed53ca270 /ext/mssql/php_mssql.c
parent5eaf2d10e7ef238e9a7904a36ccf2b241dca5faa (diff)
downloadphp-git-13b6390df7955fac3340864abb2d63a7321a24d1.tar.gz
Bug #19370
Allow stored procedures to return multiple results.
Diffstat (limited to 'ext/mssql/php_mssql.c')
-rw-r--r--ext/mssql/php_mssql.c145
1 files changed, 73 insertions, 72 deletions
diff --git a/ext/mssql/php_mssql.c b/ext/mssql/php_mssql.c
index 3522f4d287..4ec89a0c85 100644
--- a/ext/mssql/php_mssql.c
+++ b/ext/mssql/php_mssql.c
@@ -838,7 +838,7 @@ static void php_mssql_get_column_content_with_type(mssql_link *mssql_ptr,int off
}
}
-static void php_mssql_get_column_content_without_type(mssql_link *mssql_ptr,int offset,zval *result, int column_type TSRMLS_DC)
+static void php_mssql_get_column_content_without_type(mssql_link *mssql_ptr,int offset,zval *result, int column_type TSRMLS_DC)
{
if (dbdatlen(mssql_ptr->link,offset) == 0) {
ZVAL_NULL(result);
@@ -890,6 +890,65 @@ static void php_mssql_get_column_content_without_type(mssql_link *mssql_ptr,int
}
}
+static void _mssql_get_sp_result(mssql_link *mssql_ptr, mssql_statement *statement TSRMLS_DC)
+{
+ int i, num_rets, type;
+ char *parameter;
+ mssql_bind *bind;
+
+ /* Now to fetch RETVAL and OUTPUT values*/
+ num_rets = dbnumrets(mssql_ptr->link);
+
+ if (num_rets!=0) {
+ for (i = 1; i <= num_rets; i++) {
+ parameter = (char*)dbretname(mssql_ptr->link, i);
+ type = dbrettype(mssql_ptr->link, i);
+
+ if (statement->binds!=NULL ) { /* Maybe a non-parameter sp */
+ if (zend_hash_find(statement->binds, parameter, strlen(parameter), (void**)&bind)==SUCCESS) {
+ switch (type) {
+ case SQLBIT:
+ case SQLINT1:
+ case SQLINT2:
+ case SQLINT4:
+ convert_to_long_ex(&bind->zval);
+ Z_LVAL_P(bind->zval) = *((int *)(dbretdata(mssql_ptr->link,i)));
+ break;
+
+ case SQLFLT8:
+ case SQLFLTN:
+ convert_to_double_ex(&bind->zval);
+ Z_DVAL_P(bind->zval) = *((double *)(dbretdata(mssql_ptr->link,i)));
+ break;
+
+ case SQLCHAR:
+ case SQLVARCHAR:
+ case SQLTEXT:
+ convert_to_string_ex(&bind->zval);
+ Z_STRLEN_P(bind->zval) = dbretlen(mssql_ptr->link,i);
+ Z_STRVAL_P(bind->zval) = estrndup(dbretdata(mssql_ptr->link,i),Z_STRLEN_P(bind->zval));
+ break;
+ }
+ }
+ else {
+ php_error(E_WARNING, "%s(): an output parameter variable was not provided", get_active_function_name(TSRMLS_C));
+ }
+ }
+ }
+ }
+ if (statement->binds!=NULL ) { /* Maybe a non-parameter sp */
+ if (zend_hash_find(statement->binds, "RETVAL", 6, (void**)&bind)==SUCCESS) {
+ if (dbhasretstat(mssql_ptr->link)) {
+ convert_to_long_ex(&bind->zval);
+ Z_LVAL_P(bind->zval)=dbretstatus(mssql_ptr->link);
+ }
+ else {
+ php_error(E_WARNING, "%s(): stored procedure has no return value. Nothing was returned into RETVAL", get_active_function_name(TSRMLS_C));
+ }
+ }
+ }
+}
+
static int _mssql_fetch_batch(mssql_link *mssql_ptr, mssql_result *result, int retvalue TSRMLS_DC)
{
int i, j = 0;
@@ -1059,6 +1118,7 @@ PHP_FUNCTION(mssql_query)
}
result = (mssql_result *) emalloc(sizeof(mssql_result));
+ result->statement = NULL;
result->num_fields = num_fields;
result->blocks_initialized = 1;
@@ -1673,7 +1733,13 @@ PHP_FUNCTION(mssql_next_result)
mssql_ptr = result->mssql_ptr;
retvalue = dbresults(mssql_ptr->link);
- if (retvalue == FAIL || retvalue == NO_MORE_RESULTS || retvalue == NO_MORE_RPC_RESULTS) {
+ if (retvalue == FAIL) {
+ RETURN_FALSE;
+ }
+ else if (retvalue == NO_MORE_RESULTS || retvalue == NO_MORE_RPC_RESULTS) {
+ if (result->statement) {
+ _mssql_get_sp_result(result->mssql_ptr, result->statement TSRMLS_CC);
+ }
RETURN_FALSE;
}
else {
@@ -1948,14 +2014,11 @@ PHP_FUNCTION(mssql_execute)
int retvalue,retval_results;
mssql_link *mssql_ptr;
mssql_statement *statement;
- mssql_bind *bind;
mssql_result *result;
- int num_fields,num_rets,type;
+ int num_fields;
int blocks_initialized=1;
- int i;
int batchsize;
int ac = ZEND_NUM_ARGS();
- char *parameter;
batchsize = MS_SQL_G(batchsize);
if (ac !=1 || zend_get_parameters_ex(1, &stmt)==FAILURE) {
@@ -1992,7 +2055,6 @@ PHP_FUNCTION(mssql_execute)
}
result = (mssql_result *) emalloc(sizeof(mssql_result));
-
result->batchsize = batchsize;
result->blocks_initialized = 1;
result->data = (zval **) emalloc(sizeof(zval *)*MSSQL_ROWS_BLOCK);
@@ -2002,74 +2064,13 @@ PHP_FUNCTION(mssql_execute)
result->fields = (mssql_field *) emalloc(sizeof(mssql_field)*num_fields);
result->num_rows = _mssql_fetch_batch(mssql_ptr, result, retvalue TSRMLS_CC);
- }
- retval_results=dbresults(mssql_ptr->link);
- }
-
- if (retval_results==SUCCEED) {
- php_error(E_WARNING, "%s(): multiple recordsets from a stored procedure not supported yet! (Skipping...)", get_active_function_name(TSRMLS_C));
- retval_results=dbresults(mssql_ptr->link);
-
- while (retval_results==SUCCEED) {
- retval_results=dbresults(mssql_ptr->link);
+ result->statement = statement;
}
}
-
- if (retval_results==NO_MORE_RESULTS) {
- /* Now to fetch RETVAL and OUTPUT values*/
- num_rets = dbnumrets(mssql_ptr->link);
-
- if (num_rets!=0) {
- for (i = 1; i <= num_rets; i++) {
- parameter=(char*)dbretname(mssql_ptr->link, i);
- type=dbrettype(mssql_ptr->link, i);
-
- if (statement->binds!=NULL ) { /* Maybe a non-parameter sp */
- if (zend_hash_find(statement->binds, parameter, strlen(parameter), (void**)&bind)==SUCCESS) {
- switch (type) {
- case SQLBIT:
- case SQLINT1:
- case SQLINT2:
- case SQLINT4:
- convert_to_long_ex(&bind->zval);
- Z_LVAL_P(bind->zval)=*((int *)(dbretdata(mssql_ptr->link,i)));
- break;
-
- case SQLFLT8:
- case SQLFLTN:
- convert_to_double_ex(&bind->zval);
- Z_DVAL_P(bind->zval)=*((double *)(dbretdata(mssql_ptr->link,i)));
- break;
-
- case SQLCHAR:
- case SQLVARCHAR:
- case SQLTEXT:
- convert_to_string_ex(&bind->zval);
- Z_STRLEN_P(bind->zval)=dbretlen(mssql_ptr->link,i);
- Z_STRVAL_P(bind->zval) = estrndup(dbretdata(mssql_ptr->link,i),Z_STRLEN_P(bind->zval));
- break;
- }
- }
- else {
- php_error(E_WARNING, "%s(): an output parameter variable was not provided", get_active_function_name(TSRMLS_C));
- }
- }
- }
- }
-
- if (statement->binds!=NULL ) { /* Maybe a non-parameter sp */
- if (zend_hash_find(statement->binds, "RETVAL", 6, (void**)&bind)==SUCCESS) {
- if (dbhasretstat(mssql_ptr->link)) {
- convert_to_long_ex(&bind->zval);
- Z_LVAL_P(bind->zval)=dbretstatus(mssql_ptr->link);
- }
- else {
- php_error(E_WARNING, "%s(): stored procedure has no return value. Nothing was returned into RETVAL", get_active_function_name(TSRMLS_C));
- }
- }
- }
+ else if (retval_results==NO_MORE_RESULTS) {
+ _mssql_get_sp_result(mssql_ptr, statement TSRMLS_CC);
}
-
+
if (result==NULL) {
RETURN_TRUE; /* no recordset returned ...*/
}