helly Fri Oct 17 13:21:57 2003 EDT
Added files:
/php-src/ext/sqlite/tests sqlite_oo_025.phpt
Modified files:
/php-src/ext/sqlite sqlite.c
Log:
- Make use of engine iterators
Index: php-src/ext/sqlite/sqlite.c
diff -u php-src/ext/sqlite/sqlite.c:1.98 php-src/ext/sqlite/sqlite.c:1.99
--- php-src/ext/sqlite/sqlite.c:1.98 Fri Oct 17 04:17:09 2003
+++ php-src/ext/sqlite/sqlite.c Fri Oct 17 13:21:55 2003
@@ -17,7 +17,7 @@
| Marcus Boerger <[EMAIL PROTECTED]> |
+----------------------------------------------------------------------+
- $Id: sqlite.c,v 1.98 2003/10/17 08:17:09 helly Exp $
+ $Id: sqlite.c,v 1.99 2003/10/17 17:21:55 helly Exp $
*/
#ifdef HAVE_CONFIG_H
@@ -150,6 +150,8 @@
zval *fini;
};
+static void php_sqlite_fetch_array(struct php_sqlite_result *res, int mode, zend_bool
decode_binary, int move_next, zval *return_value TSRMLS_DC);
+static int php_sqlite_fetch(struct php_sqlite_result *rres TSRMLS_DC);
enum { PHPSQLITE_ASSOC = 1, PHPSQLITE_NUM = 2, PHPSQLITE_BOTH =
PHPSQLITE_ASSOC|PHPSQLITE_NUM };
@@ -860,6 +862,123 @@
object->is_ref = 1;
return object;
}
+
+typedef struct _sqlite_object_iterator {
+ zend_object_iterator it;
+ struct php_sqlite_result *res;
+ zval *value;
+} sqlite_object_iterator;
+
+void sqlite_iterator_dtor(zend_object_iterator *iter TSRMLS_DC)
+{
+ zval *object = (zval*)((sqlite_object_iterator*)iter)->it.data;
+
+ if (((sqlite_object_iterator*)iter)->value) {
+ zval_ptr_dtor(&((sqlite_object_iterator*)iter)->value);
+ ((sqlite_object_iterator*)iter)->value = NULL;
+ }
+ zval_ptr_dtor(&object);
+ efree(iter);
+}
+
+void sqlite_iterator_rewind(zend_object_iterator *iter TSRMLS_DC)
+{
+ struct php_sqlite_result *res = ((sqlite_object_iterator*)iter)->res;
+
+ if (((sqlite_object_iterator*)iter)->value) {
+ zval_ptr_dtor(&((sqlite_object_iterator*)iter)->value);
+ ((sqlite_object_iterator*)iter)->value = NULL;
+ }
+ if (res) {
+ res->curr_row = 0;
+ }
+}
+
+int sqlite_iterator_has_more(zend_object_iterator *iter TSRMLS_DC)
+{
+ struct php_sqlite_result *res = ((sqlite_object_iterator*)iter)->res;
+
+ if (res && res->curr_row < res->nrows && res->nrows) { /* curr_row may be -1 */
+ return SUCCESS;
+ } else {
+ return FAILURE;
+ }
+}
+
+void sqlite_iterator_get_current_data(zend_object_iterator *iter, zval ***data
TSRMLS_DC)
+{
+ struct php_sqlite_result *res = ((sqlite_object_iterator*)iter)->res;
+
+ *data = &((sqlite_object_iterator*)iter)->value;
+ if (res && !**data) {
+ MAKE_STD_ZVAL(**data);
+ php_sqlite_fetch_array(res, PHPSQLITE_NUM, 1, 0, **data TSRMLS_CC);
+ }
+
+}
+
+int sqlite_iterator_get_current_key(zend_object_iterator *iter, char **str_key, uint
*str_key_len, ulong *int_key TSRMLS_DC)
+{
+ struct php_sqlite_result *res = ((sqlite_object_iterator*)iter)->res;
+
+ *str_key = NULL;
+ *str_key_len = 0;
+ *int_key = res ? res->curr_row : 0;
+ return HASH_KEY_IS_LONG;
+}
+
+void sqlite_iterator_move_forward(zend_object_iterator *iter TSRMLS_DC)
+{
+ struct php_sqlite_result *res = ((sqlite_object_iterator*)iter)->res;
+
+ if (((sqlite_object_iterator*)iter)->value) {
+ zval_ptr_dtor(&((sqlite_object_iterator*)iter)->value);
+ ((sqlite_object_iterator*)iter)->value = NULL;
+ }
+ if (res) {
+ if (!res->buffered && res->vm) {
+ php_sqlite_fetch(res TSRMLS_CC);
+ }
+ if (res->curr_row >= res->nrows) {
+ /* php_error_docref(NULL TSRMLS_CC, E_WARNING, "no more rows
available"); */
+ return;
+ }
+
+ res->curr_row++;
+ }
+}
+
+zend_class_iterator_funcs sqlite_ub_query_iterator_funcs;
+
+zend_object_iterator *sqlite_ub_query_get_iterator(zend_class_entry *ce, zval *object
TSRMLS_DC)
+{
+ sqlite_object_iterator *iterator = emalloc(sizeof(sqlite_object_iterator));
+
+ sqlite_object *obj = (sqlite_object*) zend_object_store_get_object(object
TSRMLS_CC);
+
+ object->refcount++;
+ iterator->it.data = (void*)object;
+ iterator->it.funcs = &sqlite_ub_query_iterator_funcs.funcs;
+ iterator->res = obj->u.res;
+ iterator->value = NULL;
+ return (zend_object_iterator*)iterator;
+}
+
+zend_class_iterator_funcs sqlite_query_iterator_funcs;
+
+zend_object_iterator *sqlite_query_get_iterator(zend_class_entry *ce, zval *object
TSRMLS_DC)
+{
+ sqlite_object_iterator *iterator = emalloc(sizeof(sqlite_object_iterator));
+
+ sqlite_object *obj = (sqlite_object*) zend_object_store_get_object(object
TSRMLS_CC);
+
+ object->refcount++;
+ iterator->it.data = (void*)object;
+ iterator->it.funcs = &sqlite_query_iterator_funcs.funcs;
+ iterator->res = obj->u.res;
+ iterator->value = NULL;
+ return (zend_object_iterator*)iterator;
+}
/* }}} */
static int init_sqlite_globals(zend_sqlite_globals *g)
@@ -876,6 +995,21 @@
REGISTER_SQLITE_CLASS(exception, zend_exception_get_default());
sqlite_object_handlers_query.get_class_entry = sqlite_get_ce_query;
sqlite_object_handlers_ub_query.get_class_entry = sqlite_get_ce_ub_query;
+
+ sqlite_ce_ub_query->get_iterator = sqlite_ub_query_get_iterator;
+ sqlite_ce_ub_query->iterator_funcs = &sqlite_ub_query_iterator_funcs;
+ memset(&sqlite_ub_query_iterator_funcs, 0, sizeof(zend_class_iterator_funcs));
+ sqlite_ub_query_iterator_funcs.funcs.dtor = sqlite_iterator_dtor;
+ sqlite_ub_query_iterator_funcs.funcs.rewind = NULL;
+ sqlite_ub_query_iterator_funcs.funcs.has_more = sqlite_iterator_has_more;
+ sqlite_ub_query_iterator_funcs.funcs.get_current_data =
sqlite_iterator_get_current_data;
+ sqlite_ub_query_iterator_funcs.funcs.get_current_key =
sqlite_iterator_get_current_key;
+ sqlite_ub_query_iterator_funcs.funcs.move_forward =
sqlite_iterator_move_forward;
+
+ sqlite_ce_query->get_iterator = sqlite_query_get_iterator;
+ sqlite_ce_query->iterator_funcs = &sqlite_query_iterator_funcs;
+ memcpy(&sqlite_query_iterator_funcs, &sqlite_ub_query_iterator_funcs,
sizeof(zend_class_iterator_funcs));
+ sqlite_query_iterator_funcs.funcs.rewind = sqlite_iterator_rewind;
ZEND_INIT_MODULE_GLOBALS(sqlite, init_sqlite_globals, NULL);
@@ -928,7 +1062,7 @@
PHP_RINIT_FUNCTION(sqlite)
{
-#ifdef HAVE_SPL
+#if 0 && HAVE_SPL
if (!sqlite_ce_query->num_interfaces) {
spl_register_implement(sqlite_ce_query, spl_ce_forward TSRMLS_CC);
spl_register_implement(sqlite_ce_query, spl_ce_sequence TSRMLS_CC);
@@ -945,7 +1079,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.98 2003/10/17 08:17:09 helly Exp $");
+ php_info_print_table_row(2, "PECL Module version", PHP_SQLITE_MODULE_VERSION "
$Id: sqlite.c,v 1.99 2003/10/17 17:21:55 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();
@@ -1238,7 +1372,7 @@
/* }}} */
/* {{{ php_sqlite_fetch */
-int php_sqlite_fetch(struct php_sqlite_result *rres TSRMLS_DC)
+static int php_sqlite_fetch(struct php_sqlite_result *rres TSRMLS_DC)
{
const char **rowdata, **colnames;
int ret, i, base;
Index: php-src/ext/sqlite/tests/sqlite_oo_025.phpt
+++ php-src/ext/sqlite/tests/sqlite_oo_025.phpt
--TEST--
sqlite-spl: sqlite / spl integration
--INI--
sqlite.assoc_case=0
--SKIPIF--
<?php # vim:ft=php
if (!extension_loaded("sqlite")) print "skip";
?>
--FILE--
<?php
include "blankdb_oo.inc";
$data = array(
"one",
"two",
"three"
);
$db->query("CREATE TABLE strings(a VARCHAR)");
foreach ($data as $str) {
$db->query("INSERT INTO strings VALUES('$str')");
}
echo "====UNBUFFERED====\n";
$r = $db->unbuffered_query("SELECT a from strings", SQLITE_NUM);
//var_dump(class_implements($r));
foreach($r as $row) {
var_dump($row);
}
echo "====NO-MORE====\n";
foreach($r as $row) {
var_dump($row);
}
echo "====DIRECT====\n";
foreach($db->unbuffered_query("SELECT a from strings", SQLITE_NUM) as $row) {
var_dump($row);
}
echo "====BUFFERED====\n";
$r = $db->query("SELECT a from strings", SQLITE_NUM);
//var_dump(class_implements($r));
foreach($r as $row) {
var_dump($row);
}
foreach($r as $row) {
var_dump($row);
}
echo "DONE!\n";
?>
--EXPECT--
====UNBUFFERED====
array(1) {
[0]=>
string(3) "one"
}
array(1) {
[0]=>
string(3) "two"
}
array(1) {
[0]=>
string(5) "three"
}
====NO-MORE====
====DIRECT====
array(1) {
[0]=>
string(3) "one"
}
array(1) {
[0]=>
string(3) "two"
}
array(1) {
[0]=>
string(5) "three"
}
====BUFFERED====
array(1) {
[0]=>
string(3) "one"
}
array(1) {
[0]=>
string(3) "two"
}
array(1) {
[0]=>
string(5) "three"
}
array(1) {
[0]=>
string(3) "one"
}
array(1) {
[0]=>
string(3) "two"
}
array(1) {
[0]=>
string(5) "three"
}
DONE!
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php