diff options
author | Wez Furlong <wez@php.net> | 2003-07-13 09:38:33 +0000 |
---|---|---|
committer | Wez Furlong <wez@php.net> | 2003-07-13 09:38:33 +0000 |
commit | 78e236da261c5894f2fcf5c4fe227681081aac72 (patch) | |
tree | fb0d2bce7f7f75698b5fc454ea8053e33d1be2e6 | |
parent | 80ee75f11ebef0a9c067bc6132c59ed32ad04129 (diff) | |
download | php-git-78e236da261c5894f2fcf5c4fe227681081aac72.tar.gz |
Add sqlite_has_prev, and sqlite_prev.
Patch by Jan Lehnardt <jan@php.net>
-rw-r--r-- | ext/sqlite/php_sqlite.h | 3 | ||||
-rw-r--r-- | ext/sqlite/sqlite.c | 71 | ||||
-rw-r--r-- | ext/sqlite/tests/sqlite_023.phpt | 103 |
3 files changed, 176 insertions, 1 deletions
diff --git a/ext/sqlite/php_sqlite.h b/ext/sqlite/php_sqlite.h index 3c13f87898..69bbeb0efc 100644 --- a/ext/sqlite/php_sqlite.h +++ b/ext/sqlite/php_sqlite.h @@ -62,7 +62,10 @@ PHP_FUNCTION(sqlite_field_name); PHP_FUNCTION(sqlite_seek); PHP_FUNCTION(sqlite_rewind); PHP_FUNCTION(sqlite_next); +PHP_FUNCTION(sqlite_prev); + PHP_FUNCTION(sqlite_has_more); +PHP_FUNCTION(sqlite_has_prev); PHP_FUNCTION(sqlite_libversion); PHP_FUNCTION(sqlite_libencoding); diff --git a/ext/sqlite/sqlite.c b/ext/sqlite/sqlite.c index 405e9d569d..9b654a7214 100644 --- a/ext/sqlite/sqlite.c +++ b/ext/sqlite/sqlite.c @@ -187,7 +187,9 @@ function_entry sqlite_functions[] = { PHP_FE(sqlite_seek, NULL) PHP_FE(sqlite_rewind, NULL) PHP_FE(sqlite_next, NULL) + PHP_FE(sqlite_prev, NULL) PHP_FE(sqlite_has_more, NULL) + PHP_FE(sqlite_has_prev, NULL) PHP_FE(sqlite_escape_string, NULL) PHP_FE(sqlite_busy_timeout, NULL) PHP_FE(sqlite_last_error, NULL) @@ -232,7 +234,9 @@ function_entry sqlite_funcs_query[] = { /* spl_forward */ PHP_ME_MAPPING(current, sqlite_current, NULL) PHP_ME_MAPPING(next, sqlite_next, NULL) + PHP_ME_MAPPING(prev, sqlite_prev, NULL) PHP_ME_MAPPING(has_more, sqlite_has_more, NULL) + PHP_ME_MAPPING(has_prev, sqlite_has_prev, NULL) /* spl_sequence */ PHP_ME_MAPPING(rewind, sqlite_rewind, NULL) /* additional */ @@ -2056,6 +2060,35 @@ PHP_FUNCTION(sqlite_has_more) } /* }}} */ +/* {{{ proto bool sqlite_has_prev(resource result) + * Returns whether a previous row is available. */ +PHP_FUNCTION(sqlite_has_prev) +{ + zval *zres; + struct php_sqlite_result *res; + zval *object = getThis(); + + if (object) { + if (ZEND_NUM_ARGS() != 0) { + WRONG_PARAM_COUNT + } + RES_FROM_OBJECT(res, object); + } else { + if (FAILURE == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &zres)) { + return; + } + ZEND_FETCH_RESOURCE(res, struct php_sqlite_result *, &zres, -1, "sqlite result", le_sqlite_result); + } + + if(!res->buffered) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "you cannot use sqlite_has_prev on unbuffered querys"); + RETURN_FALSE; + } + + RETURN_BOOL(res->curr_row); +} +/* }}} */ + /* {{{ proto int sqlite_num_fields(resource result) Returns the number of fields in a result set. */ PHP_FUNCTION(sqlite_num_fields) @@ -2167,7 +2200,7 @@ PHP_FUNCTION(sqlite_rewind) } if (!res->buffered) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot seek an unbuffered result set"); + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot rewind an unbuffered result set"); RETURN_FALSE; } @@ -2216,6 +2249,42 @@ PHP_FUNCTION(sqlite_next) } /* }}} */ +/* {{{ proto bool sqlite_prev(resource result) + * Seek to the previous row number of a result set. */ +PHP_FUNCTION(sqlite_prev) +{ + zval *zres; + struct php_sqlite_result *res; + zval *object = getThis(); + + if (object) { + if (ZEND_NUM_ARGS() != 0) { + WRONG_PARAM_COUNT + } + RES_FROM_OBJECT(res, object); + } else { + if (FAILURE == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &zres)) { + return; + } + ZEND_FETCH_RESOURCE(res, struct php_sqlite_result *, &zres, -1, "sqlite result", le_sqlite_result); + } + + if (!res->buffered) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "you cannot use sqlite_prev on unbuffered querys"); + RETURN_FALSE; + } + + if (res->curr_row <= 0) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "no previous row available"); + RETURN_FALSE; + } + + res->curr_row--; + + RETURN_TRUE; +} +/* }}} */ + /* {{{ proto string sqlite_escape_string(string item) Escapes a string for use as a query parameter. */ PHP_FUNCTION(sqlite_escape_string) diff --git a/ext/sqlite/tests/sqlite_023.phpt b/ext/sqlite/tests/sqlite_023.phpt new file mode 100644 index 0000000000..ca1bee6b18 --- /dev/null +++ b/ext/sqlite/tests/sqlite_023.phpt @@ -0,0 +1,103 @@ +--TEST-- +sqlite: sqlite_[has_]prev +--INI-- +sqlite.assoc_case=0 +--SKIPIF-- +<?php # vim:ft=php +if (!extension_loaded("sqlite")) print "skip"; ?> +--FILE-- +<?php +include "blankdb.inc"; + +$data = array( + "one", + "two", + "three" + ); + +sqlite_query("CREATE TABLE strings(a)", $db); + +foreach ($data as $str) { + sqlite_query("INSERT INTO strings VALUES('$str')", $db); +} + +$r = sqlite_query("SELECT a FROM strings", $db, SQLITE_NUM); + +echo "====TRAVERSE====\n"; +for(sqlite_rewind($r); sqlite_has_more($r); sqlite_next($r)) { + var_dump(sqlite_current($r)); + +} +echo "====REVERSE====\n"; +do { + sqlite_prev($r); + var_dump(sqlite_current($r)); +} while(sqlite_has_prev($r)); + +echo "====UNBUFFERED====\n"; + +$r = sqlite_unbuffered_query("SELECT a FROM strings", $db, SQLITE_NUM); + +echo "====TRAVERSE====\n"; +for(sqlite_rewind($r); sqlite_has_more($r); sqlite_next($r)) { + var_dump(sqlite_current($r)); + +} +echo "====REVERSE====\n"; +do { + sqlite_prev($r); + var_dump(sqlite_current($r)); +} while(sqlite_has_prev($r)); + +echo "====DONE!====\n"; +?> +--EXPECTF-- +====TRAVERSE==== +array(1) { + [0]=> + string(3) "one" +} +array(1) { + [0]=> + string(3) "two" +} +array(1) { + [0]=> + string(5) "three" +} +====REVERSE==== +array(1) { + [0]=> + string(5) "three" +} +array(1) { + [0]=> + string(3) "two" +} +array(1) { + [0]=> + string(3) "one" +} +====UNBUFFERED==== +====TRAVERSE==== + +Warning: sqlite_rewind(): Cannot rewind an unbuffered result set in %ssqlite_023.php on line %d +array(1) { + [0]=> + string(3) "one" +} +array(1) { + [0]=> + string(3) "two" +} +array(1) { + [0]=> + string(5) "three" +} +====REVERSE==== + +Warning: sqlite_prev(): you cannot use sqlite_prev on unbuffered querys in %ssqlite_023.php on line %d +bool(false) + +Warning: sqlite_has_prev(): you cannot use sqlite_has_prev on unbuffered querys in %ssqlite_023.php on line %d +====DONE!==== |