mirror of
https://github.com/php/php-src.git
synced 2024-09-22 10:27:25 +00:00
Add sqlite_has_prev, and sqlite_prev.
Patch by Jan Lehnardt <jan@php.net>
This commit is contained in:
parent
80ee75f11e
commit
78e236da26
@ -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);
|
||||
|
@ -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)
|
||||
|
103
ext/sqlite/tests/sqlite_023.phpt
Normal file
103
ext/sqlite/tests/sqlite_023.phpt
Normal file
@ -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!====
|
Loading…
Reference in New Issue
Block a user