]> granicus.if.org Git - php/commitdiff
Add sqlite_has_prev, and sqlite_prev.
authorWez Furlong <wez@php.net>
Sun, 13 Jul 2003 09:38:33 +0000 (09:38 +0000)
committerWez Furlong <wez@php.net>
Sun, 13 Jul 2003 09:38:33 +0000 (09:38 +0000)
Patch by Jan Lehnardt <jan@php.net>

ext/sqlite/php_sqlite.h
ext/sqlite/sqlite.c
ext/sqlite/tests/sqlite_023.phpt [new file with mode: 0644]

index 3c13f87898f9e06fff875e4c4a468471475dcfb9..69bbeb0efc22c62e8555e6f0939cbb9ebd4b5a89 100644 (file)
@@ -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);
index 405e9d569db59baf95fb8fd09c127f67bfcca70c..9b654a7214c099182fa5eecbe1e2316c48f9d271 100644 (file)
@@ -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 (file)
index 0000000..ca1bee6
--- /dev/null
@@ -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!====