summaryrefslogtreecommitdiff
path: root/ext/sqlite/sqlite.c
diff options
context:
space:
mode:
authorMarcus Boerger <helly@php.net>2003-08-29 21:13:50 +0000
committerMarcus Boerger <helly@php.net>2003-08-29 21:13:50 +0000
commiteb8d89c363c6262434b43d02cbfcfb207810c882 (patch)
treed6a1995fd344c48c23fd402abf01f3e61053a0eb /ext/sqlite/sqlite.c
parentdce426828277213bc23b60df31f52fdeec0d3b32 (diff)
downloadphp-git-eb8d89c363c6262434b43d02cbfcfb207810c882.tar.gz
Allow to pass arguments to the constructor
Diffstat (limited to 'ext/sqlite/sqlite.c')
-rw-r--r--ext/sqlite/sqlite.c41
1 files changed, 35 insertions, 6 deletions
diff --git a/ext/sqlite/sqlite.c b/ext/sqlite/sqlite.c
index 379138d8f5..52a5ea8509 100644
--- a/ext/sqlite/sqlite.c
+++ b/ext/sqlite/sqlite.c
@@ -1663,8 +1663,9 @@ PHP_FUNCTION(sqlite_fetch_array)
}
/* }}} */
-/* {{{ 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 @@ PHP_FUNCTION(sqlite_fetch_object)
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 @@ PHP_FUNCTION(sqlite_fetch_object)
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 @@ PHP_FUNCTION(sqlite_fetch_object)
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;
@@ -1739,6 +1765,9 @@ PHP_FUNCTION(sqlite_fetch_object)
zval_ptr_dtor(&retval_ptr);
}
}
+ if (fci.params) {
+ efree(fci.params);
+ }
}
}
/* }}} */