diff options
-rw-r--r-- | ext/sqlite3/sqlite3.c | 29 | ||||
-rw-r--r-- | ext/sqlite3/tests/sqlite3_35_stmt_readonly.phpt | 53 |
2 files changed, 78 insertions, 4 deletions
diff --git a/ext/sqlite3/sqlite3.c b/ext/sqlite3/sqlite3.c index 2937fc792a..649586ac6b 100644 --- a/ext/sqlite3/sqlite3.c +++ b/ext/sqlite3/sqlite3.c @@ -1078,10 +1078,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 = { @@ -1231,6 +1230,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; @@ -1801,6 +1821,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 index 0000000000..0c542a1632 --- /dev/null +++ b/ext/sqlite3/tests/sqlite3_35_stmt_readonly.phpt @@ -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 |