]> granicus.if.org Git - php/commitdiff
Adding new functions, mssql_affected_rows and mssql_fetch_batch.
authorFrank M. Kromann <fmk@php.net>
Tue, 21 Nov 2000 03:09:16 +0000 (03:09 +0000)
committerFrank M. Kromann <fmk@php.net>
Tue, 21 Nov 2000 03:09:16 +0000 (03:09 +0000)
Added optional paramter to mssql_query, batchsize used minimize the memery usage during select of large datasats.

ext/mssql/php_mssql.c
ext/mssql/php_mssql.h

index dc97b5a34b330e22f443086675226a8aa06f7ac6..10bde67f04780b72a34e878e326acf83d83141a5 100644 (file)
@@ -43,6 +43,8 @@ function_entry mssql_functions[] = {
        PHP_FE(mssql_close,                                     NULL)
        PHP_FE(mssql_select_db,                         NULL)
        PHP_FE(mssql_query,                                     NULL)
+       PHP_FE(mssql_fetch_batch,                       NULL)
+       PHP_FE(mssql_rows_affected,                     NULL)
        PHP_FE(mssql_free_result,                       NULL)
        PHP_FE(mssql_get_last_message,          NULL)
        PHP_FE(mssql_num_rows,                          NULL)
@@ -96,6 +98,7 @@ PHP_INI_BEGIN()
        STD_PHP_INI_ENTRY_EX("mssql.connect_timeout",           "5",    PHP_INI_ALL,    OnUpdateInt,    connect_timeout,                        php_mssql_globals,              mssql_globals,  display_link_numbers)
        STD_PHP_INI_ENTRY_EX("mssql.textsize",                          "-1",   PHP_INI_ALL,    OnUpdateInt,    textsize,                                       php_mssql_globals,              mssql_globals,  display_link_numbers)
        STD_PHP_INI_ENTRY_EX("mssql.textlimit",                         "-1",   PHP_INI_ALL,    OnUpdateInt,    textlimit,                                      php_mssql_globals,              mssql_globals,  display_link_numbers)
+       STD_PHP_INI_ENTRY_EX("mssql.batchsize",                         "0",    PHP_INI_ALL,    OnUpdateInt,    batchsize,                                      php_mssql_globals,              mssql_globals,  display_link_numbers)
 PHP_INI_END()
 
 /* error handler */
@@ -140,10 +143,12 @@ static void _free_mssql_result(zend_rsrc_list_entry *rsrc)
 
        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]);
+                       if (result->data[i]) {
+                               for (j=0; j<result->num_fields; j++) {
+                                       zval_dtor(&result->data[i][j]);
+                               }
+                               efree(result->data[i]);
                        }
-                       efree(result->data[i]);
                }
                efree(result->data);
        }
@@ -758,22 +763,91 @@ static void php_mssql_get_column_content_without_type(mssql_link *mssql_ptr,int
        }
 }
 
-/* {{{ proto int mssql_query(string query [, int conn_id])
+int _mssql_fetch_batch(mssql_link *mssql_ptr, mssql_result *result, int retvalue, int *column_types) {
+       int i, j;
+       int blocks_initialized=1;
+       MSSQLLS_FETCH();
+
+       i=0;
+       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));
+               }
+               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]));
+               }
+               if (i<result->batchsize || result->batchsize==0) {
+                       i++;
+                       retvalue=dbnextrow(mssql_ptr->link);
+                       dbclrbuf(mssql_ptr->link,DBLASTROW(mssql_ptr->link)-1); 
+               }
+               else
+                       break;
+               result->lastresult = retvalue;
+       }
+       return i;
+}
+
+/* {{{ proto int mssql_fetch_batch(string result_index)
+       returns the next batch of records*/
+PHP_FUNCTION(mssql_fetch_batch) {
+       zval **mssql_result_index;
+       mssql_result *result;
+       mssql_link *mssql_ptr;
+       int i,j;
+       int *column_types;
+       MSSQLLS_FETCH();
+
+       
+       if (ZEND_NUM_ARGS()!=1 || zend_get_parameters_ex(1, &mssql_result_index)==FAILURE) {
+               WRONG_PARAM_COUNT;
+       }
+       
+       if ((*mssql_result_index)->type==IS_RESOURCE && (*mssql_result_index)->value.lval==0) {
+               RETURN_FALSE;
+       }
+
+       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);
+       }
+       result->cur_row=result->num_rows=0;
+       result->num_rows = _mssql_fetch_batch(mssql_ptr, result, result->lastresult, column_types);
+       efree(column_types);
+       RETURN_LONG(result->num_rows);
+}
+/* }}} */
+
+/* {{{ proto int mssql_query(string query [, int conn_id [, int batch_size = 0]])
    Perform an SQL query on a MS-SQL server database */
 PHP_FUNCTION(mssql_query)
 {
-       zval **query, **mssql_link_index;
+       zval **query, **mssql_link_index, **zbatchsize;
        int retvalue;
        mssql_link *mssql_ptr;
        mssql_result *result;
        int id;
        int num_fields;
-       int blocks_initialized=1;
        int i,j;
        int *column_types;
+       int batchsize;
        MSSQLLS_FETCH();
 
-
+       batchsize = MS_SQL_G(batchsize);
        switch(ZEND_NUM_ARGS()) {
                case 1:
                        if (zend_get_parameters_ex(1, &query)==FAILURE) {
@@ -788,6 +862,14 @@ PHP_FUNCTION(mssql_query)
                        }
                        id = -1;
                        break;
+               case 3:
+                       if (zend_get_parameters_ex(3, &query, &mssql_link_index, &zbatchsize)==FAILURE) {
+                               RETURN_FALSE;
+                       }
+                       id = -1;
+                       convert_to_long_ex(zbatchsize);
+                       batchsize = (*zbatchsize)->value.lval;
+                       break;
                default:
                        WRONG_PARAM_COUNT;
                        break;
@@ -817,38 +899,24 @@ PHP_FUNCTION(mssql_query)
                RETURN_FALSE;
        }
 
+       result = (mssql_result *) emalloc(sizeof(mssql_result));
        num_fields = dbnumcols(mssql_ptr->link);
        if (num_fields <= 0) {
                RETURN_TRUE;
        }
-       
+
        column_types = (int *) emalloc(sizeof(int) * num_fields);
        for (i=0; i<num_fields; i++) {
                column_types[i] = coltype(i+1);
        }
        
-       result = (mssql_result *) emalloc(sizeof(mssql_result));
+       result->batchsize = batchsize;
        result->data = (zval **) emalloc(sizeof(zval *)*MSSQL_ROWS_BLOCK);
        result->mssql_ptr = mssql_ptr;
        result->cur_field=result->cur_row=result->num_rows=0;
        result->num_fields = num_fields;
 
-       i=0;
-       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));
-               }
-               result->data[i] = (zval *) emalloc(sizeof(zval)*num_fields);
-               for (j=1; j<=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]));
-               }
-               retvalue=dbnextrow(mssql_ptr->link);
-               dbclrbuf(mssql_ptr->link,DBLASTROW(mssql_ptr->link)-1); 
-               i++;
-       }
-       result->num_rows = DBCOUNT(mssql_ptr->link);
+       result->num_rows = _mssql_fetch_batch(mssql_ptr, result, retvalue, column_types);
        
        result->fields = (mssql_field *) emalloc(sizeof(mssql_field)*num_fields);
        j=0;
@@ -892,12 +960,28 @@ PHP_FUNCTION(mssql_query)
                }
        }
        efree(column_types);
-
        ZEND_REGISTER_RESOURCE(return_value, result, le_result);
+       RETURN_TRUE;
 }
+/* }}} */
+
+/* {{{ proto int mssql_rows_affected(int conn_id)
+       returns the number of records affected by the query*/
+PHP_FUNCTION(mssql_rows_affected) {
+       zval **mssql_link_index;
+       mssql_link *mssql_ptr;
+       MSSQLLS_FETCH();
 
+       if (ZEND_NUM_ARGS()!=1 || zend_get_parameters_ex(1, &mssql_link_index)==FAILURE) {
+               WRONG_PARAM_COUNT;
+       }
+       
+       ZEND_FETCH_RESOURCE2(mssql_ptr, mssql_link *, mssql_link_index, -1, "MS SQL-Link", le_link, le_plink);
+       RETURN_LONG(DBCOUNT(mssql_ptr->link));
+}
 /* }}} */
 
+
 /* {{{ proto int mssql_free_result(string result_index)
    Free a MS-SQL result index */
 PHP_FUNCTION(mssql_free_result)
index 46db2d9845e7d1c7113cc1771e2a916877857a44..4a5a1057039e96cdc691cfb8c2e4b84f39cd76d0 100644 (file)
 #include "../../../php_build/mssql-65/include/sqldb.h"
 #elif MSSQL70
 #define MSSQL_VERSION "7.0"
-#include "../../../php_build/mssql-70/include/sqlfront.h"
-#include "../../../php_build/mssql-70/include/sqldb.h"
+//#include "../../../php_build/mssql-70/include/sqlfront.h"
+//#include "../../../php_build/mssql-70/include/sqldb.h"
+#include "sqlfront.h"
+#include "sqldb.h"
 #else
 #define MSSQL_VERSION "Unknown"
 #endif
@@ -73,6 +75,8 @@ PHP_FUNCTION(mssql_pconnect);
 PHP_FUNCTION(mssql_close);
 PHP_FUNCTION(mssql_select_db);
 PHP_FUNCTION(mssql_query);
+PHP_FUNCTION(mssql_fetch_batch);
+PHP_FUNCTION(mssql_rows_affected);
 PHP_FUNCTION(mssql_free_result);
 PHP_FUNCTION(mssql_get_last_message);
 PHP_FUNCTION(mssql_num_rows);
@@ -107,7 +111,7 @@ typedef struct {
        long cfg_min_error_severity, cfg_min_message_severity;
        long compatability_mode, connect_timeout;
        void (*get_column_content)(mssql_link *mssql_ptr,int offset,pval *result,int column_type);
-       long textsize, textlimit
+       long textsize, textlimit, batchsize;
        HashTable *resource_list, *resource_plist;
 } php_mssql_globals;
 
@@ -124,6 +128,8 @@ typedef struct mssql_result {
        pval **data;
        mssql_field *fields;
        mssql_link *mssql_ptr;
+       int batchsize;
+       int lastresult;
        int cur_row,cur_field;
        int num_rows,num_fields;
 } mssql_result;