helly           Fri Aug 29 17:13:50 2003 EDT

  Modified files:              
    /php-src/ext/sqlite sqlite.c 
  Log:
  Allow to pass arguments to the constructor
  
Index: php-src/ext/sqlite/sqlite.c
diff -u php-src/ext/sqlite/sqlite.c:1.86 php-src/ext/sqlite/sqlite.c:1.87
--- php-src/ext/sqlite/sqlite.c:1.86    Thu Aug 28 19:36:46 2003
+++ php-src/ext/sqlite/sqlite.c Fri Aug 29 17:13:50 2003
@@ -17,7 +17,7 @@
    |          Marcus Boerger <[EMAIL PROTECTED]>                              |
    +----------------------------------------------------------------------+
 
-   $Id: sqlite.c,v 1.86 2003/08/28 23:36:46 helly Exp $ 
+   $Id: sqlite.c,v 1.87 2003/08/29 21:13:50 helly Exp $ 
 */
 
 #ifdef HAVE_CONFIG_H
@@ -941,7 +941,7 @@
 {
        php_info_print_table_start();
        php_info_print_table_header(2, "SQLite support", "enabled");
-       php_info_print_table_row(2, "PECL Module version", PHP_SQLITE_MODULE_VERSION " 
$Id: sqlite.c,v 1.86 2003/08/28 23:36:46 helly Exp $");
+       php_info_print_table_row(2, "PECL Module version", PHP_SQLITE_MODULE_VERSION " 
$Id: sqlite.c,v 1.87 2003/08/29 21:13:50 helly Exp $");
        php_info_print_table_row(2, "SQLite Library", sqlite_libversion());
        php_info_print_table_row(2, "SQLite Encoding", sqlite_libencoding());
        php_info_print_table_end();
@@ -1663,8 +1663,9 @@
 }
 /* }}} */
 
-/* {{{ proto object sqlite_fetch_object(resource result [, string class_name [, bool 
decode_binary]])
+/* {{{ proto object sqlite_fetch_object(resource result [, string class_name [, array 
ctor_params [, bool decode_binary]]])
    Fetches the next row from a result set as an object. */
+   /* note that you can do array(&$val) for param ctor_params */
 PHP_FUNCTION(sqlite_fetch_object)
 {
        zval *zres;
@@ -1677,11 +1678,12 @@
        zval dataset;
        zend_fcall_info fci;
        zend_fcall_info_cache fcc;
-       zval *retval_ptr;
+       zval *retval_ptr; 
+       zval *ctor_params = NULL;
 
        php_set_error_handling(object ? EH_THROW : EH_NORMAL, sqlite_ce_exception 
TSRMLS_CC);
        if (object) {
-               if (FAILURE == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|sb", 
&class_name, &class_name_len, &decode_binary)) {
+               if (FAILURE == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, 
"|szb", &class_name, &class_name_len, &ctor_params, &decode_binary)) {
                        php_std_error_handling();
                        return;
                }
@@ -1692,7 +1694,7 @@
                        ce = zend_fetch_class(class_name, class_name_len, 
ZEND_FETCH_CLASS_AUTO TSRMLS_CC);
                }
        } else {
-               if (FAILURE == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, 
"r|sb", &zres, &class_name, &class_name_len, &decode_binary)) {
+               if (FAILURE == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, 
"r|szb", &zres, &class_name, &class_name_len, &ctor_params, &decode_binary)) {
                        php_std_error_handling();
                        return;
                }
@@ -1723,8 +1725,32 @@
                fci.symbol_table = NULL;
                fci.object_pp = &return_value;
                fci.retval_ptr_ptr = &retval_ptr;
-               fci.param_count = 0;
-               fci.params = NULL;
+               if (ctor_params) {
+                       if (Z_TYPE_P(ctor_params) == IS_ARRAY) {
+                               HashTable *ht = Z_ARRVAL_P(ctor_params);
+                               Bucket *p;
+
+                               fci.param_count = 0;
+                               fci.params = emalloc(sizeof(zval*) * 
ht->nNumOfElements);
+                               p = ht->pListHead;
+                               while (p != NULL) {
+                                       fci.params[fci.param_count++] = 
(zval**)p->pData;
+                                       p = p->pListNext;
+                               }
+                       } else {
+                               /* Two problems why we throw exceptions here: PHP is 
typeless
+                                * and hence passing one argument that's not an array 
could be
+                                * by mistake and the other way round is possible, 
too. The 
+                                * single value is an array. Also we'd have to make 
that one
+                                * argument passed by reference.
+                                */
+                               zend_throw_exception(sqlite_ce_exception, "Parameter 
ctor_params must be an array", 0 TSRMLS_CC);
+                               return;
+                       }
+               } else {
+                       fci.param_count = 0;
+                       fci.params = NULL;
+               }
                fci.no_separation = 1;
        
                fcc.initialized = 1;
@@ -1738,6 +1764,9 @@
                        if (retval_ptr) {
                                zval_ptr_dtor(&retval_ptr);
                        }
+               }
+               if (fci.params) {
+                       efree(fci.params);
                }
        }
 }

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

Reply via email to