mirror of
https://github.com/php/php-src.git
synced 2024-11-24 10:24:11 +08:00
Add SQLite3_Stmt::readOnly for checking if a statement is read only
This commit is contained in:
parent
5eb264677c
commit
3870e58759
5
NEWS
5
NEWS
@ -1,6 +1,6 @@
|
||||
PHP NEWS
|
||||
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||
?? ??? 20??, PHP 5.3.5
|
||||
?? ??? 2011, PHP 5.3.5
|
||||
- Upgraded bundled Sqlite3 to version 3.7.4. (Ilia)
|
||||
- Upgraded bundled PCRE to version 8.11. (Ilia)
|
||||
|
||||
@ -79,8 +79,9 @@
|
||||
. Fixed bug #53515 (property_exists incorrect on ArrayObject null and 0
|
||||
values). (Felipe)
|
||||
|
||||
- SQLite extension:
|
||||
- SQLite3 extension:
|
||||
. Fixed memory leaked introduced by the NULL poisoning patch (Mateusz Kocielski, Pierre)
|
||||
. Add SQlite3_Stmt::readonly() for checking if a statement is read only. (Scott)
|
||||
|
||||
- Streams:
|
||||
. Implemented FR #26158 (open arbitrary file descriptor with fopen). (Gustavo)
|
||||
|
@ -1081,10 +1081,9 @@ static int php_sqlite3_stream_cast(php_stream *stream, int castas, void **ret TS
|
||||
|
||||
static int php_sqlite3_stream_stat(php_stream *stream, php_stream_statbuf *ssb TSRMLS_DC)
|
||||
{
|
||||
/* TODO: fill in details based on Data: and Content-Length: headers, and/or data
|
||||
* from curl_easy_getinfo().
|
||||
* For now, return -1 to indicate that it doesn't make sense to stat this stream */
|
||||
return -1;
|
||||
php_stream_sqlite3_data *sqlite3_stream = (php_stream_sqlite3_data *) stream->abstract;
|
||||
ssb->sb.st_size = sqlite3_stream->size;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static php_stream_ops php_stream_sqlite3_ops = {
|
||||
@ -1234,6 +1233,27 @@ PHP_METHOD(sqlite3stmt, clear)
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ proto bool SQLite3Stmt::readOnly()
|
||||
Returns true if a statement is definitely read only */
|
||||
PHP_METHOD(sqlite3stmt, readOnly)
|
||||
{
|
||||
php_sqlite3_stmt *stmt_obj;
|
||||
zval *object = getThis();
|
||||
stmt_obj = (php_sqlite3_stmt *)zend_object_store_get_object(object TSRMLS_CC);
|
||||
|
||||
if (zend_parse_parameters_none() == FAILURE) {
|
||||
return;
|
||||
}
|
||||
|
||||
#if SQLITE_VERSION_NUMBER >= 3007004
|
||||
if (sqlite3_stmt_readonly(stmt_obj->stmt)) {
|
||||
RETURN_TRUE;
|
||||
}
|
||||
#endif
|
||||
RETURN_FALSE;
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
static int register_bound_parameter_to_sqlite(struct php_sqlite3_bound_param *param, php_sqlite3_stmt *stmt TSRMLS_DC) /* {{{ */
|
||||
{
|
||||
HashTable *hash;
|
||||
@ -1804,6 +1824,7 @@ static zend_function_entry php_sqlite3_stmt_class_methods[] = {
|
||||
PHP_ME(sqlite3stmt, execute, arginfo_sqlite3_void, ZEND_ACC_PUBLIC)
|
||||
PHP_ME(sqlite3stmt, bindParam, arginfo_sqlite3stmt_bindparam, ZEND_ACC_PUBLIC)
|
||||
PHP_ME(sqlite3stmt, bindValue, arginfo_sqlite3stmt_bindvalue, ZEND_ACC_PUBLIC)
|
||||
PHP_ME(sqlite3stmt, readOnly, arginfo_sqlite3_void, ZEND_ACC_PUBLIC)
|
||||
PHP_ME(sqlite3stmt, __construct, arginfo_sqlite3stmt_construct, ZEND_ACC_PRIVATE|ZEND_ACC_CTOR)
|
||||
{NULL, NULL, NULL}
|
||||
};
|
||||
|
53
ext/sqlite3/tests/sqlite3_35_stmt_readonly.phpt
Normal file
53
ext/sqlite3/tests/sqlite3_35_stmt_readonly.phpt
Normal file
@ -0,0 +1,53 @@
|
||||
--TEST--
|
||||
SQLite3_stmt::readOnly check
|
||||
--SKIPIF--
|
||||
<?php require_once(dirname(__FILE__) . '/skipif.inc');
|
||||
$version = SQLite3::version();
|
||||
if ($version['versionNumber'] < 3007004) {
|
||||
die("skip");
|
||||
}
|
||||
?>
|
||||
--FILE--
|
||||
<?php
|
||||
|
||||
require_once(dirname(__FILE__) . '/new_db.inc');
|
||||
define('TIMENOW', time());
|
||||
|
||||
echo "Creating Table\n";
|
||||
var_dump($db->exec('CREATE TABLE test (time INTEGER, id STRING)'));
|
||||
|
||||
echo "INSERT into table\n";
|
||||
var_dump($db->exec("INSERT INTO test (time, id) VALUES (" . TIMENOW . ", 'a')"));
|
||||
var_dump($db->exec("INSERT INTO test (time, id) VALUES (" . TIMENOW . ", 'b')"));
|
||||
|
||||
echo "Checking select statement\n";
|
||||
$stmt = $db->prepare("SELECT * FROM test WHERE id = ? ORDER BY id ASC");
|
||||
var_dump($stmt->readOnly());
|
||||
|
||||
echo "Checking update statement\n";
|
||||
$stmt = $db->prepare("UPDATE test SET id = 'c' WHERE id = ?");
|
||||
var_dump($stmt->readOnly());
|
||||
|
||||
echo "Checking delete statement\n";
|
||||
$stmt = $db->prepare("DELETE FROM test");
|
||||
var_dump($stmt->readOnly());
|
||||
|
||||
echo "Closing database\n";
|
||||
var_dump($db->close());
|
||||
echo "Done\n";
|
||||
?>
|
||||
--EXPECTF--
|
||||
Creating Table
|
||||
bool(true)
|
||||
INSERT into table
|
||||
bool(true)
|
||||
bool(true)
|
||||
Checking select statement
|
||||
bool(true)
|
||||
Checking update statement
|
||||
bool(false)
|
||||
Checking delete statement
|
||||
bool(false)
|
||||
Closing database
|
||||
bool(true)
|
||||
Done
|
Loading…
Reference in New Issue
Block a user