wez             Sun Jul 13 05:38:33 2003 EDT

  Added files:                 
    /php-src/ext/sqlite/tests   sqlite_023.phpt 

  Modified files:              
    /php-src/ext/sqlite php_sqlite.h sqlite.c 
  Log:
  Add sqlite_has_prev, and sqlite_prev.
  Patch by Jan Lehnardt <[EMAIL PROTECTED]>
  
  
Index: php-src/ext/sqlite/php_sqlite.h
diff -u php-src/ext/sqlite/php_sqlite.h:1.24 php-src/ext/sqlite/php_sqlite.h:1.25
--- php-src/ext/sqlite/php_sqlite.h:1.24        Thu Jun 26 15:26:26 2003
+++ php-src/ext/sqlite/php_sqlite.h     Sun Jul 13 05:38:33 2003
@@ -17,7 +17,7 @@
    |          Marcus Boerger <[EMAIL PROTECTED]>                              |
    +----------------------------------------------------------------------+
 
-   $Id: php_sqlite.h,v 1.24 2003/06/26 19:26:26 helly Exp $ 
+   $Id: php_sqlite.h,v 1.25 2003/07/13 09:38:33 wez Exp $ 
 */
 
 #ifndef PHP_SQLITE_H
@@ -62,7 +62,10 @@
 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: php-src/ext/sqlite/sqlite.c
diff -u php-src/ext/sqlite/sqlite.c:1.74 php-src/ext/sqlite/sqlite.c:1.75
--- php-src/ext/sqlite/sqlite.c:1.74    Sun Jul 13 05:20:40 2003
+++ php-src/ext/sqlite/sqlite.c Sun Jul 13 05:38:33 2003
@@ -17,7 +17,7 @@
    |          Marcus Boerger <[EMAIL PROTECTED]>                              |
    +----------------------------------------------------------------------+
 
-   $Id: sqlite.c,v 1.74 2003/07/13 09:20:40 wez Exp $ 
+   $Id: sqlite.c,v 1.75 2003/07/13 09:38:33 wez Exp $ 
 */
 
 #ifdef HAVE_CONFIG_H
@@ -187,7 +187,9 @@
        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 @@
        /* 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 */
@@ -949,7 +953,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.74 2003/07/13 09:20:40 wez Exp $");
+       php_info_print_table_row(2, "PECL Module version", PHP_SQLITE_MODULE_VERSION " 
$Id: sqlite.c,v 1.75 2003/07/13 09:38:33 wez 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();
@@ -2056,6 +2060,35 @@
 }
 /* }}} */
 
+/* {{{ 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 @@
        }
 
        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;
        }
        
@@ -2211,6 +2244,42 @@
        }
 
        res->curr_row++;
+
+       RETURN_TRUE;
+}
+/* }}} */
+
+/* {{{ 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;
 }

Index: php-src/ext/sqlite/tests/sqlite_023.phpt
+++ php-src/ext/sqlite/tests/sqlite_023.phpt
--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!====



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

Reply via email to