fmk Tue Dec 3 13:57:05 2002 EDT
Modified files:
/php4/ext/mssql php_mssql.c php_mssql.h
Log:
Bug #19370
Allow stored procedures to return multiple results.
Index: php4/ext/mssql/php_mssql.c
diff -u php4/ext/mssql/php_mssql.c:1.88 php4/ext/mssql/php_mssql.c:1.89
--- php4/ext/mssql/php_mssql.c:1.88 Tue Dec 3 13:04:35 2002
+++ php4/ext/mssql/php_mssql.c Tue Dec 3 13:57:04 2002
@@ -16,7 +16,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: php_mssql.c,v 1.88 2002/12/03 18:04:35 fmk Exp $ */
+/* $Id: php_mssql.c,v 1.89 2002/12/03 18:57:04 fmk Exp $ */
#ifdef COMPILE_DL_MSSQL
#define HAVE_MSSQL 1
@@ -838,7 +838,7 @@
}
}
-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 _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 @@
}
result = (mssql_result *) emalloc(sizeof(mssql_result));
+ result->statement = NULL;
result->num_fields = num_fields;
result->blocks_initialized = 1;
@@ -1673,7 +1733,13 @@
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 @@
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 @@
}
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 @@
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 ...*/
}
Index: php4/ext/mssql/php_mssql.h
diff -u php4/ext/mssql/php_mssql.h:1.23 php4/ext/mssql/php_mssql.h:1.24
--- php4/ext/mssql/php_mssql.h:1.23 Mon Jun 10 15:31:29 2002
+++ php4/ext/mssql/php_mssql.h Tue Dec 3 13:57:04 2002
@@ -17,7 +17,7 @@
*/
-/* $Id: php_mssql.h,v 1.23 2002/06/10 19:31:29 fmk Exp $ */
+/* $Id: php_mssql.h,v 1.24 2002/12/03 18:57:04 fmk Exp $ */
#ifndef PHP_MSSQL_H
#define PHP_MSSQL_H
@@ -137,6 +137,7 @@
pval **data;
mssql_field *fields;
mssql_link *mssql_ptr;
+ mssql_statement * statement;
int batchsize;
int lastresult;
int blocks_initialized;
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php