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]