]> granicus.if.org Git - php/commitdiff
Add SQLite3_Stmt::readOnly for checking if a statement is read only
authorScott MacVicar <scottmac@php.net>
Fri, 31 Dec 2010 16:37:12 +0000 (16:37 +0000)
committerScott MacVicar <scottmac@php.net>
Fri, 31 Dec 2010 16:37:12 +0000 (16:37 +0000)
NEWS
ext/sqlite3/sqlite3.c
ext/sqlite3/tests/sqlite3_35_stmt_readonly.phpt [new file with mode: 0644]

diff --git a/NEWS b/NEWS
index c9dc8ff10f88fb0c137e504026e81f9d6a29872d..1e0e36a3473620fbfbefb6d1f394833503b0169b 100644 (file)
--- a/NEWS
+++ b/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)
index c1813673a8e4e7bd303cc93d335ab021ea588522..d97e0f014887b97217726951125f629dc862e4b5 100644 (file)
@@ -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}
 };
diff --git a/ext/sqlite3/tests/sqlite3_35_stmt_readonly.phpt b/ext/sqlite3/tests/sqlite3_35_stmt_readonly.phpt
new file mode 100644 (file)
index 0000000..0c542a1
--- /dev/null
@@ -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