fmk             Fri Mar  9 15:37:56 2001 EDT

  Modified files:              
    /php4/ext/mssql     php_mssql.h php_mssql.c 
  Log:
  Adding a new function mssql_next_result() allowing the query to return more than one 
result.
  This can be done with a stored procedure or by sending more than one select to the 
server.
  
Index: php4/ext/mssql/php_mssql.h
diff -u php4/ext/mssql/php_mssql.h:1.10 php4/ext/mssql/php_mssql.h:1.11
--- php4/ext/mssql/php_mssql.h:1.10     Sun Feb 25 22:07:03 2001
+++ php4/ext/mssql/php_mssql.h  Fri Mar  9 15:37:56 2001
@@ -17,7 +17,7 @@
  */
 
 
-/* $Id: php_mssql.h,v 1.10 2001/02/26 06:07:03 andi Exp $ */
+/* $Id: php_mssql.h,v 1.11 2001/03/09 23:37:56 fmk Exp $ */
 
 #ifndef PHP_MSSQL_H
 #define PHP_MSSQL_H
@@ -77,6 +77,7 @@
 PHP_FUNCTION(mssql_data_seek);
 PHP_FUNCTION(mssql_field_seek);
 PHP_FUNCTION(mssql_result);
+PHP_FUNCTION(mssql_next_result);
 PHP_FUNCTION(mssql_min_error_severity);
 PHP_FUNCTION(mssql_min_message_severity);
 
@@ -116,6 +117,7 @@
        mssql_link *mssql_ptr;
        int batchsize;
        int lastresult;
+       int blocks_initialized;
        int cur_row,cur_field;
        int num_rows,num_fields;
 } mssql_result;
Index: php4/ext/mssql/php_mssql.c
diff -u php4/ext/mssql/php_mssql.c:1.38 php4/ext/mssql/php_mssql.c:1.39
--- php4/ext/mssql/php_mssql.c:1.38     Sun Feb 25 22:07:03 2001
+++ php4/ext/mssql/php_mssql.c  Fri Mar  9 15:37:56 2001
@@ -16,7 +16,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: php_mssql.c,v 1.38 2001/02/26 06:07:03 andi Exp $ */
+/* $Id: php_mssql.c,v 1.39 2001/03/09 23:37:56 fmk Exp $ */
 
 #ifdef COMPILE_DL_MSSQL
 #define HAVE_MSSQL 1
@@ -59,12 +59,14 @@
        PHP_FE(mssql_data_seek,                         NULL)
        PHP_FE(mssql_field_seek,                        NULL)
        PHP_FE(mssql_result,                            NULL)
+       PHP_FE(mssql_next_result,                       NULL)
        PHP_FE(mssql_min_error_severity,        NULL)
        PHP_FE(mssql_min_message_severity,      NULL)
        {NULL, NULL, NULL}
 };
 
-zend_module_entry mssql_module_entry = {
+zend_module_entry mssql_module_entry = 
+{
        "mssql", 
        mssql_functions, 
        PHP_MINIT(mssql), 
@@ -150,9 +152,8 @@
        return 0;
 }
 
-static void _free_mssql_result(zend_rsrc_list_entry *rsrc)
+static void _free_result(mssql_result *result, int free_fields) 
 {
-       mssql_result *result = (mssql_result *)rsrc->ptr;
        int i,j;
 
        if (result->data) {
@@ -165,15 +166,23 @@
                        }
                }
                efree(result->data);
+               result->data = NULL;
+               result->blocks_initialized = 0;
        }
        
-       if (result->fields) {
+       if (free_fields && result->fields) {
                for (i=0; i<result->num_fields; i++) {
                        STR_FREE(result->fields[i].name);
                        STR_FREE(result->fields[i].column_source);
                }
                efree(result->fields);
        }
+}
+
+static void _free_mssql_result(zend_rsrc_list_entry *rsrc)
+{
+       mssql_result *result = (mssql_result *)rsrc->ptr;
+       _free_result(result, 1);
        efree(result);
 }
 
@@ -767,31 +776,80 @@
        }
 }
 
-int _mssql_fetch_batch(mssql_link *mssql_ptr, mssql_result *result, int retvalue, int 
*column_types) {
-       int i, j;
-       int blocks_initialized=1;
+int _mssql_fetch_batch(mssql_link *mssql_ptr, mssql_result *result, int retvalue) 
+{
+       int i, j = 0;
+       int *column_types;
+       char computed_buf[16];
        MSSQLLS_FETCH();
 
+       column_types = (int *) emalloc(sizeof(int) * result->num_fields);
+       for (i=0; i<result->num_fields; i++) {
+               char *fname = (char *)dbcolname(mssql_ptr->link,i+1);
+
+               if (*fname) {
+                       result->fields[i].name = estrdup(fname);
+               } else {
+                       if (j>0) {
+                               snprintf(computed_buf,16,"computed%d",j);
+                       } else {
+                               strcpy(computed_buf,"computed");
+                       }
+                       result->fields[i].name = estrdup(computed_buf);
+                       j++;
+               }
+               result->fields[i].max_length = dbcollen(mssql_ptr->link,i+1);
+               result->fields[i].column_source = 
+estrdup(dbcolsource(mssql_ptr->link,i+1));
+               if (!result->fields[i].column_source) {
+                       result->fields[i].column_source = empty_string;
+               }
+
+               column_types[i] = coltype(i+1);
+
+               result->fields[i].type = column_types[i];
+               /* set numeric flag */
+               switch (column_types[i]) {
+                       case SQLINT1:
+                       case SQLINT2:
+                       case SQLINT4:
+                       case SQLFLT8:
+                       case SQLNUMERIC:
+                       case SQLDECIMAL:
+                               result->fields[i].numeric = 1;
+                               break;
+                       case SQLCHAR:
+                       case SQLVARCHAR:
+                       case SQLTEXT:
+                       default:
+                               result->fields[i].numeric = 0;
+                               break;
+               }
+       }
+
        i=0;
+       if (!result->data) {
+               result->data = (zval **) emalloc(sizeof(zval 
+*)*MSSQL_ROWS_BLOCK*(++result->blocks_initialized));
+       }
        while (retvalue!=FAIL && retvalue!=NO_MORE_ROWS) {
                result->num_rows++;
-               if (result->num_rows > blocks_initialized*MSSQL_ROWS_BLOCK) {
-                       result->data = (zval **) erealloc(result->data,sizeof(zval 
*)*MSSQL_ROWS_BLOCK*(++blocks_initialized));
+               if (result->num_rows > result->blocks_initialized*MSSQL_ROWS_BLOCK) {
+                       result->data = (zval **) erealloc(result->data,sizeof(zval 
+*)*MSSQL_ROWS_BLOCK*(++result->blocks_initialized));
                }
                result->data[i] = (zval *) emalloc(sizeof(zval)*result->num_fields);
-               for (j=1; j<=result->num_fields; j++) {
-                       INIT_PZVAL(&result->data[i][j-1]);
-                       MS_SQL_G(get_column_content(mssql_ptr, j, 
&result->data[i][j-1], column_types[j-1]));
+               for (j=0; j<result->num_fields; j++) {
+                       INIT_ZVAL(result->data[i][j]);
+                       MS_SQL_G(get_column_content(mssql_ptr, j+1, 
+&result->data[i][j], column_types[j]));
                }
                if (i<result->batchsize || result->batchsize==0) {
                        i++;
+                       dbclrbuf(mssql_ptr->link,DBLASTROW(mssql_ptr->link)); 
                        retvalue=dbnextrow(mssql_ptr->link);
-                       dbclrbuf(mssql_ptr->link,DBLASTROW(mssql_ptr->link)-1); 
                }
                else
                        break;
                result->lastresult = retvalue;
        }
+       efree(column_types);
        return i;
 }
 
@@ -801,8 +859,6 @@
        zval **mssql_result_index;
        mssql_result *result;
        mssql_link *mssql_ptr;
-       int i,j;
-       int *column_types;
        MSSQLLS_FETCH();
 
        
@@ -816,22 +872,9 @@
 
        ZEND_FETCH_RESOURCE(result, mssql_result *, mssql_result_index, -1, "MS 
SQL-result", le_result);
        mssql_ptr = result->mssql_ptr;
-       if (result->data) {
-               for (i=0; i<result->num_rows; i++) {
-                       for (j=0; j<result->num_fields; j++) {
-                               zval_dtor(&result->data[i][j]);
-                       }
-                       efree(result->data[i]);
-                       result->data[i] = NULL;
-               }
-       }
-       column_types = (int *) emalloc(sizeof(int) * result->num_fields);
-       for (i=0; i<result->num_fields; i++) {
-               column_types[i] = coltype(i+1);
-       }
+       _free_result(result, 0);
        result->cur_row=result->num_rows=0;
-       result->num_rows = _mssql_fetch_batch(mssql_ptr, result, result->lastresult, 
column_types);
-       efree(column_types);
+       result->num_rows = _mssql_fetch_batch(mssql_ptr, result, result->lastresult);
        RETURN_LONG(result->num_rows);
 }
 /* }}} */
@@ -844,10 +887,7 @@
        int retvalue;
        mssql_link *mssql_ptr;
        mssql_result *result;
-       int id;
-       int num_fields;
-       int i,j;
-       int *column_types;
+       int id, num_fields;
        int batchsize;
        MSSQLLS_FETCH();
 
@@ -903,67 +943,23 @@
                RETURN_FALSE;
        }
 
-       num_fields = dbnumcols(mssql_ptr->link);
-       if (num_fields <= 0) {
+       if ((num_fields = dbnumcols(mssql_ptr->link)) <= 0) {
                RETURN_TRUE;
        }
 
        result = (mssql_result *) emalloc(sizeof(mssql_result));
-       column_types = (int *) emalloc(sizeof(int) * num_fields);
-       for (i=0; i<num_fields; i++) {
-               column_types[i] = coltype(i+1);
-       }
+       result->num_fields = num_fields;
+       result->blocks_initialized = 1;
        
        result->batchsize = batchsize;
-       result->data = (zval **) emalloc(sizeof(zval *)*MSSQL_ROWS_BLOCK);
+       result->data = NULL;
+       result->blocks_initialized = 0;
        result->mssql_ptr = mssql_ptr;
        result->cur_field=result->cur_row=result->num_rows=0;
-       result->num_fields = num_fields;
 
-       result->num_rows = _mssql_fetch_batch(mssql_ptr, result, retvalue, 
column_types);
+       result->fields = (mssql_field *) 
+emalloc(sizeof(mssql_field)*result->num_fields);
+       result->num_rows = _mssql_fetch_batch(mssql_ptr, result, retvalue);
        
-       result->fields = (mssql_field *) emalloc(sizeof(mssql_field)*num_fields);
-       j=0;
-       for (i=0; i<num_fields; i++) {
-               char *fname = (char *)dbcolname(mssql_ptr->link,i+1);
-               char computed_buf[16];
-               
-               if (*fname) {
-                       result->fields[i].name = estrdup(fname);
-               } else {
-                       if (j>0) {
-                               snprintf(computed_buf,16,"computed%d",j);
-                       } else {
-                               strcpy(computed_buf,"computed");
-                       }
-                       result->fields[i].name = estrdup(computed_buf);
-                       j++;
-               }
-               result->fields[i].max_length = dbcollen(mssql_ptr->link,i+1);
-               result->fields[i].column_source = 
estrdup(dbcolsource(mssql_ptr->link,i+1));
-               if (!result->fields[i].column_source) {
-                       result->fields[i].column_source = empty_string;
-               }
-               result->fields[i].type = column_types[i];
-               /* set numeric flag */
-               switch (column_types[i]) {
-                       case SQLINT1:
-                       case SQLINT2:
-                       case SQLINT4:
-                       case SQLFLT8:
-                       case SQLNUMERIC:
-                       case SQLDECIMAL:
-                               result->fields[i].numeric = 1;
-                               break;
-                       case SQLCHAR:
-                       case SQLVARCHAR:
-                       case SQLTEXT:
-                       default:
-                               result->fields[i].numeric = 0;
-                               break;
-               }
-       }
-       efree(column_types);
        ZEND_REGISTER_RESOURCE(return_value, result, le_result);
 }
 /* }}} */
@@ -1163,7 +1159,6 @@
 PHP_FUNCTION(mssql_data_seek)
 {
        zval **mssql_result_index, **offset;
-       int type,id;
        mssql_result *result;
        MSSQLLS_FETCH();
 
@@ -1171,15 +1166,8 @@
        if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &mssql_result_index, 
&offset)==FAILURE) {
                WRONG_PARAM_COUNT;
        }
-       
-       convert_to_long_ex(mssql_result_index);
-       id = (*mssql_result_index)->value.lval;
        
-       result = (mssql_result *) zend_list_find(id,&type);
-       if (type!=le_result) {
-               php_error(E_WARNING,"%d is not a MS SQL result index",id);
-               RETURN_FALSE;
-       }
+       ZEND_FETCH_RESOURCE(result, mssql_result *, mssql_result_index, -1, "MS 
+SQL-result", le_result);        
 
        convert_to_long_ex(offset);
        if ((*offset)->value.lval<0 || (*offset)->value.lval>=result->num_rows) {
@@ -1248,7 +1236,7 @@
 PHP_FUNCTION(mssql_fetch_field)
 {
        zval **mssql_result_index, **offset;
-       int type,id,field_offset;
+       int field_offset;
        mssql_result *result;
        MSSQLLS_FETCH();
 
@@ -1272,14 +1260,7 @@
                        break;
        }
        
-       convert_to_long_ex(mssql_result_index);
-       id = (*mssql_result_index)->value.lval;
-       
-       result = (mssql_result *) zend_list_find(id,&type);
-       if (type!=le_result) {
-               php_error(E_WARNING,"%d is not a MS SQL result index",id);
-               RETURN_FALSE;
-       }
+       ZEND_FETCH_RESOURCE(result, mssql_result *, mssql_result_index, -1, "MS 
+SQL-result", le_result);        
        
        if (field_offset==-1) {
                field_offset = result->cur_field;
@@ -1310,7 +1291,7 @@
 PHP_FUNCTION(mssql_field_length)
 {
        zval **mssql_result_index, **offset;
-       int type,id,field_offset;
+       int field_offset;
        mssql_result *result;
        MSSQLLS_FETCH();
 
@@ -1333,15 +1314,8 @@
                        WRONG_PARAM_COUNT;
                        break;
        }
-       
-       convert_to_long_ex(mssql_result_index);
-       id = (*mssql_result_index)->value.lval;
        
-       result = (mssql_result *) zend_list_find(id,&type);
-       if (type!=le_result) {
-               php_error(E_WARNING,"%d is not a MS SQL result index",id);
-               RETURN_FALSE;
-       }
+       ZEND_FETCH_RESOURCE(result, mssql_result *, mssql_result_index, -1, "MS 
+SQL-result", le_result);        
        
        if (field_offset==-1) {
                field_offset = result->cur_field;
@@ -1366,7 +1340,7 @@
 PHP_FUNCTION(mssql_field_name)
 {
        zval **mssql_result_index, **offset;
-       int type,id,field_offset;
+       int field_offset;
        mssql_result *result;
        MSSQLLS_FETCH();
 
@@ -1389,15 +1363,8 @@
                        WRONG_PARAM_COUNT;
                        break;
        }
-       
-       convert_to_long_ex(mssql_result_index);
-       id = (*mssql_result_index)->value.lval;
        
-       result = (mssql_result *) zend_list_find(id,&type);
-       if (type!=le_result) {
-               php_error(E_WARNING,"%d is not a MS SQL result index",id);
-               RETURN_FALSE;
-       }
+       ZEND_FETCH_RESOURCE(result, mssql_result *, mssql_result_index, -1, "MS 
+SQL-result", le_result);        
        
        if (field_offset==-1) {
                field_offset = result->cur_field;
@@ -1423,7 +1390,7 @@
 PHP_FUNCTION(mssql_field_type)
 {
        zval **mssql_result_index, **offset;
-       int type,id,field_offset;
+       int field_offset;
        mssql_result *result;
        MSSQLLS_FETCH();
 
@@ -1447,14 +1414,7 @@
                        break;
        }
        
-       convert_to_long_ex(mssql_result_index);
-       id = (*mssql_result_index)->value.lval;
-       
-       result = (mssql_result *) zend_list_find(id,&type);
-       if (type!=le_result) {
-               php_error(E_WARNING,"%d is not a MS SQL result index",id);
-               RETURN_FALSE;
-       }
+       ZEND_FETCH_RESOURCE(result, mssql_result *, mssql_result_index, -1, "MS 
+SQL-result", le_result);        
        
        if (field_offset==-1) {
                field_offset = result->cur_field;
@@ -1480,7 +1440,7 @@
 PHP_FUNCTION(mssql_field_seek)
 {
        zval **mssql_result_index, **offset;
-       int type,id,field_offset;
+       int field_offset;
        mssql_result *result;
        MSSQLLS_FETCH();
 
@@ -1488,15 +1448,8 @@
        if (ZEND_NUM_ARGS()!=2 || zend_get_parameters_ex(2, &mssql_result_index, 
&offset)==FAILURE) {
                WRONG_PARAM_COUNT;
        }
-       
-       convert_to_long_ex(mssql_result_index);
-       id = (*mssql_result_index)->value.lval;
        
-       result = (mssql_result *) zend_list_find(id,&type);
-       if (type!=le_result) {
-               php_error(E_WARNING,"%d is not a MS SQL result index",id);
-               RETURN_FALSE;
-       }
+       ZEND_FETCH_RESOURCE(result, mssql_result *, mssql_result_index, -1, "MS 
+SQL-result", le_result);        
        
        convert_to_long_ex(offset);
        field_offset = (*offset)->value.lval;
@@ -1517,7 +1470,7 @@
 PHP_FUNCTION(mssql_result)
 {
        zval **row, **field, **mssql_result_index;
-       int id,type,field_offset=0;
+       int field_offset=0;
        mssql_result *result;
        MSSQLLS_FETCH();
 
@@ -1526,14 +1479,7 @@
                WRONG_PARAM_COUNT;
        }
 
-       convert_to_long_ex(mssql_result_index);
-       id = (*mssql_result_index)->value.lval;
-       
-       result = (mssql_result *) zend_list_find(id,&type);
-       if (type!=le_result) {
-               php_error(E_WARNING,"%d is not a MS SQL result index",id);
-               RETURN_FALSE;
-       }
+       ZEND_FETCH_RESOURCE(result, mssql_result *, mssql_result_index, -1, "MS 
+SQL-result", le_result);        
        
        convert_to_long_ex(row);
        if ((*row)->value.lval < 0 || (*row)->value.lval >= result->num_rows) {
@@ -1570,8 +1516,45 @@
        *return_value = result->data[(*row)->value.lval][field_offset];
        ZVAL_COPY_CTOR(return_value);
 }
+/* }}} */
+
+/* {{{ proto string mssql_next_result(int result_id)
+   Move the internal result pointer to the next result */
+PHP_FUNCTION(mssql_next_result)
+{
+       zval **mssql_result_index;
+       int retvalue;
+       mssql_result *result;
+       mssql_link *mssql_ptr;
+       MSSQLLS_FETCH();
+
+
+       if (ZEND_NUM_ARGS()!=1 || zend_get_parameters_ex(1, 
+&mssql_result_index)==FAILURE) {
+               WRONG_PARAM_COUNT;
+       }
 
+       ZEND_FETCH_RESOURCE(result, mssql_result *, mssql_result_index, -1, "MS 
+SQL-result", le_result);        
+
+       mssql_ptr = result->mssql_ptr;
+       retvalue = dbresults(mssql_ptr->link);
+       if (retvalue == FAIL || retvalue == NO_MORE_RESULTS || retvalue == 
+NO_MORE_RPC_RESULTS) {
+               RETURN_FALSE;
+       }
+       else {
+               _free_result(result, 1);
+               result->cur_row=result->num_fields=result->num_rows=0;
+               dbclrbuf(mssql_ptr->link,DBLASTROW(mssql_ptr->link));
+               retvalue = dbnextrow(mssql_ptr->link);
+
+               result->num_fields = dbnumcols(mssql_ptr->link);
+               result->fields = (mssql_field *) 
+emalloc(sizeof(mssql_field)*result->num_fields);
+               result->num_rows = _mssql_fetch_batch(mssql_ptr, result, retvalue);
+               RETURN_TRUE;
+       }
+
+}
 /* }}} */
+
 
 /* {{{ proto void mssql_min_error_severity(int severity)
    Sets the lower error severity */

-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
To contact the list administrators, e-mail: [EMAIL PROTECTED]

Reply via email to