abies           Sun Aug 10 12:21:27 2003 EDT

  Modified files:              
    /php-src/ext/interbase      interbase.c php_interbase.h 
  Log:
  Added ibase_affected_rows() and ibase_num_rows()
  Fix for ibase_fetch_*() error after exhaustion of result 
  @- Added ibase_affected_row() (Ard)
  @- Added ibase_num_rows() (Ard) 
  
  
Index: php-src/ext/interbase/interbase.c
diff -u php-src/ext/interbase/interbase.c:1.124 php-src/ext/interbase/interbase.c:1.125
--- php-src/ext/interbase/interbase.c:1.124     Sun Aug 10 09:20:38 2003
+++ php-src/ext/interbase/interbase.c   Sun Aug 10 12:21:26 2003
@@ -17,7 +17,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: interbase.c,v 1.124 2003/08/10 13:20:38 abies Exp $ */
+/* $Id: interbase.c,v 1.125 2003/08/10 16:21:26 abies Exp $ */
 
 
 /* TODO: Arrays, roles?
@@ -105,6 +105,8 @@
 #endif
 
        PHP_FE(ibase_num_fields, NULL)
+       PHP_FE(ibase_num_rows, NULL)
+       PHP_FE(ibase_affected_rows, NULL)
        PHP_FE(ibase_field_info, NULL)
 
        PHP_FE(ibase_trans, NULL)
@@ -681,7 +683,7 @@
 
        php_info_print_table_start();
        php_info_print_table_row(2, "Interbase Support", "enabled");
-       php_info_print_table_row(2, "Revision", "$Revision: 1.124 $");
+       php_info_print_table_row(2, "Revision", "$Revision: 1.125 $");
 #ifdef COMPILE_DL_INTERBASE
        php_info_print_table_row(2, "Dynamic Module", "Yes");
 #endif
@@ -1717,6 +1719,7 @@
        ib_trans = (ibase_trans *) emalloc(sizeof(ibase_trans) + 
(link_cnt-1)*sizeof(ibase_db_link *));
        ib_trans->handle = tr_handle;
        ib_trans->link_cnt = link_cnt;
+       ib_trans->affected_rows = 0;
        for (i = 0; i < link_cnt; ++i) {
                ibase_tr_list **l;
                ib_trans->db_link[i] = ib_link[i];
@@ -1762,6 +1765,7 @@
                        tr = (ibase_trans *) emalloc(sizeof(ibase_trans));
                        tr->handle = NULL;
                        tr->link_cnt = 1;
+                       tr->affected_rows = 0;
                        tr->db_link[0] = ib_link;
                        ib_link->tr_list->trans = tr;
                }
@@ -1893,13 +1897,30 @@
 }
 /* }}} */
 
+/* {{{ _php_ibase_do_fetch() */
+
+static void _php_ibase_do_fetch(ibase_result *ib_result)
+{
+       if (ib_result->has_more_rows) {
+               if (isc_dsql_fetch(IB_STATUS, &ib_result->stmt, 1, 
ib_result->out_sqlda) == 100L) {
+                       ib_result->has_more_rows = 0;
+               }
+       
+               if (IB_STATUS[0] && IB_STATUS[1]) { /* error in fetch */
+                       _php_ibase_error(TSRMLS_C);
+               }
+       }
+}      
+       
+/* }}} */
+
 /* {{{ proto resource ibase_query([resource link_identifier [, resource 
link_identifier ] ,] string query [, int bind_args])
    Execute a query */
 PHP_FUNCTION(ibase_query)
 {
        zval ***args, **bind_args = NULL;
        int i, bind_n = 0, trans_id = 0;
-       char *query, item_type[] = {isc_info_sql_stmt_type}, result[8];
+       char *query, info_type[] = {isc_info_sql_stmt_type}, info_count[] = {'\0'}, 
result[64];
        ibase_db_link *ib_link = NULL;
        ibase_trans *trans = NULL;
        ibase_query *ib_query;
@@ -2028,8 +2049,9 @@
        }
        
        /* find out if what kind of statement was prepared */
-       if (isc_dsql_sql_info(IB_STATUS, &ib_query->stmt, sizeof(item_type), 
item_type, sizeof(result), result)) {
+       if (isc_dsql_sql_info(IB_STATUS, &ib_query->stmt, sizeof(info_type), 
info_type, sizeof(result), result)) {
                _php_ibase_error(TSRMLS_C);
+               free_alloca(args);
                RETURN_FALSE;
        }
 
@@ -2052,6 +2074,7 @@
                        trans = (ibase_trans *) emalloc(sizeof(ibase_trans));
                        trans->handle = tr;
                        trans->link_cnt = 1;
+                       trans->affected_rows = 0;
                        trans->db_link[0] = ib_link;
        
                        if (ib_link->tr_list == NULL) {
@@ -2088,6 +2111,12 @@
                        }
                        break;
 
+               case isc_info_sql_stmt_insert:
+               case isc_info_sql_stmt_update:
+               case isc_info_sql_stmt_delete:
+                       /* in these cases, we will want to know the number of affected 
rows */
+                       info_count[0] = isc_info_sql_records;
+
                default:
 
                        if (_php_ibase_exec(&ib_result, ib_query, bind_n, bind_args 
TSRMLS_CC) == FAILURE) {
@@ -2095,14 +2124,40 @@
                                free_alloca(args);
                                RETURN_FALSE;
                        }
+                       
+                       trans->affected_rows = 0;
+                       
+                       if (info_count[0]) {
+                               
+                               if (isc_dsql_sql_info(IB_STATUS, &ib_query->stmt, 
sizeof(info_count), info_count, sizeof(result), result)) {
+                                       _php_ibase_error(TSRMLS_C);
+                                       _php_ibase_free_query(ib_query TSRMLS_CC);
+                                       free_alloca(args);
+                                       RETURN_FALSE;
+                               }
+                               
+                               if (result[0] == isc_info_sql_records) {
+                                       unsigned i = 3, result_size = 
isc_vax_integer(&result[1],2);
+
+                                       while (result[i] != isc_info_end && i < 
result_size) {
+                                               short len = 
isc_vax_integer(&result[i+1],2);
+                                               if (result[i] != 
isc_info_req_select_count) {
+                                                       trans->affected_rows += 
isc_vax_integer(&result[i+3],len);
+                                               }
+                                               i += len+3;
+                                       }
+                               }                                       
+                       }
        }
 
        free_alloca(args);
-
+       
        if (ib_result) { /* select statement */
                ib_result->drop_stmt = 1; /* drop stmt when free result */
                ib_query->stmt = NULL; /* keep stmt when free query */
                _php_ibase_free_query(ib_query TSRMLS_CC);
+               ib_result->has_more_rows = 1;
+               _php_ibase_do_fetch(ib_result);
                ZEND_REGISTER_RESOURCE(return_value, ib_result, le_result);
        } else {
                _php_ibase_free_query(ib_query TSRMLS_CC);
@@ -2111,6 +2166,85 @@
 }
 /* }}} */
 
+/* {{{ proto ibase_affected_rows( [ resource link_identifier ] )
+   Returns the number of rows affected by the previous INSERT, UPDATE or DELETE 
statement */
+PHP_FUNCTION(ibase_affected_rows)
+{
+       ibase_trans *trans = NULL;
+
+       RESET_ERRMSG;
+
+       switch (ZEND_NUM_ARGS()) {
+
+               ibase_db_link *ib_link;
+               zval **arg;
+
+               case 0:
+                       ZEND_FETCH_RESOURCE2(ib_link, ibase_db_link *, NULL, 
IBG(default_link), "InterBase link", le_link, le_plink);
+                       if (ib_link->tr_list == NULL || ib_link->tr_list->trans == 
NULL) {
+                               RETURN_FALSE;
+                       }
+                       trans = ib_link->tr_list->trans;
+                       break;
+
+               case 1: 
+                       if (zend_get_parameters_ex(1, &arg) == FAILURE) {
+                               RETURN_FALSE;
+                       }
+                       /* one id was passed, could be db or trans id */
+                       _php_ibase_get_link_trans(INTERNAL_FUNCTION_PARAM_PASSTHRU, 
arg, &ib_link, &trans);
+                       if (trans == NULL) {                    
+                               ZEND_FETCH_RESOURCE2(ib_link, ibase_db_link *, arg, 
-1, "InterBase link", le_link, le_plink);
+
+                               if (ib_link->tr_list == NULL || 
ib_link->tr_list->trans == NULL) {
+                                       RETURN_FALSE;
+                               }
+                               trans = ib_link->tr_list->trans;
+                       }
+                       break;
+
+               default:
+                       WRONG_PARAM_COUNT;
+                       break;
+       }
+       RETURN_LONG(trans->affected_rows);
+}
+/* }}} */
+
+/* {{{ proto ibase_num_rows( resource result_identifier )
+   Returns the number of records in the result */
+PHP_FUNCTION(ibase_num_rows) 
+{
+       zval **result_arg;
+       ibase_result *ib_result;
+       char info_count[] = {isc_info_sql_records}, result[64];
+
+       RESET_ERRMSG;
+
+       if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &result_arg) == FAILURE) 
{
+               WRONG_PARAM_COUNT;
+       }
+
+       ZEND_FETCH_RESOURCE(ib_result, ibase_result *, result_arg, -1, "InterBase 
result", le_result);
+       
+       if (isc_dsql_sql_info(IB_STATUS, &ib_result->stmt, sizeof(info_count), 
info_count, sizeof(result), result)) {
+               _php_ibase_error(TSRMLS_C);
+               RETURN_FALSE;
+       }
+       
+       if (result[0] == isc_info_sql_records) {
+               unsigned i = 3, result_size = isc_vax_integer(&result[1],2);
+
+               while (result[i] != isc_info_end && i < result_size) {
+                       short len = isc_vax_integer(&result[i+1],2);
+                       if (result[i] == isc_info_req_select_count) {
+                               RETURN_LONG(isc_vax_integer(&result[i+3],len));
+                       }
+                       i += len+3;
+               }
+       }                                       
+}
+
 /* {{{ _php_ibase_var_zval() */
 static int _php_ibase_var_zval(zval *val, void *data, int type, int len, int scale, 
int flag TSRMLS_DC)
 {
@@ -2356,12 +2490,7 @@
                RETURN_FALSE;
        }
        
-       if (isc_dsql_fetch(IB_STATUS, &ib_result->stmt, 1, ib_result->out_sqlda) == 
100L) {
-               RETURN_FALSE;  /* end of cursor */
-       }
-       
-       if (IB_STATUS[0] && IB_STATUS[1]) { /* error in fetch */
-               _php_ibase_error(TSRMLS_C);
+       if (!ib_result->has_more_rows) {
                RETURN_FALSE;
        }
        
@@ -2534,6 +2663,7 @@
                        arr_cnt++;
                }
        } /* for field */
+       _php_ibase_do_fetch(ib_result);
 }
 /* }}} */
 
@@ -2710,6 +2840,8 @@
        
        if (ib_result) { /* select statement */
                ib_query->cursor_open = 1;
+               ib_result->has_more_rows = 1;
+               _php_ibase_do_fetch(ib_result);
                ZEND_REGISTER_RESOURCE(return_value, ib_result, le_result);
        } else {
                ib_query->cursor_open = 0;
Index: php-src/ext/interbase/php_interbase.h
diff -u php-src/ext/interbase/php_interbase.h:1.40 
php-src/ext/interbase/php_interbase.h:1.41
--- php-src/ext/interbase/php_interbase.h:1.40  Fri Aug  8 07:04:12 2003
+++ php-src/ext/interbase/php_interbase.h       Sun Aug 10 12:21:26 2003
@@ -17,7 +17,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: php_interbase.h,v 1.40 2003/08/08 11:04:12 abies Exp $ */
+/* $Id: php_interbase.h,v 1.41 2003/08/10 16:21:26 abies Exp $ */
 
 #ifndef PHP_INTERBASE_H
 #define PHP_INTERBASE_H
@@ -61,6 +61,8 @@
 #endif
 
 PHP_FUNCTION(ibase_num_fields);
+PHP_FUNCTION(ibase_num_rows);
+PHP_FUNCTION(ibase_affected_rows);
 PHP_FUNCTION(ibase_field_info);
 
 PHP_FUNCTION(ibase_trans);
@@ -115,7 +117,8 @@
 
 typedef struct {
        isc_tr_handle handle;
-       int link_cnt;
+       unsigned short link_cnt;
+       unsigned long affected_rows;
        ibase_db_link *db_link[1];
 } ibase_trans;
 
@@ -157,6 +160,7 @@
        int drop_stmt;
        XSQLDA *out_sqlda;
        ibase_array *out_array;
+       unsigned char has_more_rows;
 } ibase_result;
 
 typedef struct _php_ibase_varchar {

-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to