fmk             Tue Dec  3 13:59:38 2002 EDT

  Modified files:              (Branch: PHP_4_3)
    /php4/ext/mssql     php_mssql.c php_mssql.h 
  Log:
  MFH
  # 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.86.2.2 php4/ext/mssql/php_mssql.c:1.86.2.3
--- php4/ext/mssql/php_mssql.c:1.86.2.2 Tue Dec  3 13:07:57 2002
+++ php4/ext/mssql/php_mssql.c  Tue Dec  3 13:59:38 2002
@@ -16,7 +16,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: php_mssql.c,v 1.86.2.2 2002/12/03 18:07:57 fmk Exp $ */
+/* $Id: php_mssql.c,v 1.86.2.3 2002/12/03 18:59:38 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.23.4.1
--- 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:59:38 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.23.4.1 2002/12/03 18:59:38 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

Reply via email to