Skip to content

Commit 6f9ebe6

Browse files
bohwazadambaratz
authored andcommitted
Add \PDO::SQLITE_ATTR_READONLY_STATEMENT
This attribute is a boolean value. It is taken from the return value of sqlite3_stmt_readonly(), indicating if and only if the prepared statement makes no direct changes to the content of the database.
1 parent 1a303f1 commit 6f9ebe6

File tree

4 files changed

+45
-1
lines changed

4 files changed

+45
-1
lines changed

ext/pdo_sqlite/pdo_sqlite.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ PHP_MINIT_FUNCTION(pdo_sqlite)
7575
REGISTER_PDO_CLASS_CONST_LONG("SQLITE_OPEN_READONLY", (zend_long)SQLITE_OPEN_READONLY);
7676
REGISTER_PDO_CLASS_CONST_LONG("SQLITE_OPEN_READWRITE", (zend_long)SQLITE_OPEN_READWRITE);
7777
REGISTER_PDO_CLASS_CONST_LONG("SQLITE_OPEN_CREATE", (zend_long)SQLITE_OPEN_CREATE);
78+
REGISTER_PDO_CLASS_CONST_LONG("SQLITE_ATTR_READONLY_STATEMENT", (zend_long)PDO_SQLITE_ATTR_READONLY_STATEMENT);
7879

7980
return php_pdo_register_driver(&pdo_sqlite_driver);
8081
}

ext/pdo_sqlite/php_pdo_sqlite_int.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ extern const struct pdo_stmt_methods sqlite_stmt_methods;
7676

7777
enum {
7878
PDO_SQLITE_ATTR_OPEN_FLAGS = PDO_ATTR_DRIVER_SPECIFIC,
79+
PDO_SQLITE_ATTR_READONLY_STATEMENT
7980
};
8081

8182
#endif

ext/pdo_sqlite/sqlite_statement.c

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -350,6 +350,28 @@ static int pdo_sqlite_stmt_cursor_closer(pdo_stmt_t *stmt)
350350
return 1;
351351
}
352352

353+
static int pdo_sqlite_stmt_get_attribute(pdo_stmt_t *stmt, zend_long attr, zval *val)
354+
{
355+
pdo_sqlite_stmt *S = (pdo_sqlite_stmt*)stmt->driver_data;
356+
357+
switch (attr) {
358+
case PDO_SQLITE_ATTR_READONLY_STATEMENT:
359+
ZVAL_FALSE(val);
360+
361+
#if SQLITE_VERSION_NUMBER >= 3007004
362+
if (sqlite3_stmt_readonly(S->stmt)) {
363+
ZVAL_TRUE(val);
364+
}
365+
#endif
366+
break;
367+
368+
default:
369+
return 0;
370+
}
371+
372+
return 1;
373+
}
374+
353375
const struct pdo_stmt_methods sqlite_stmt_methods = {
354376
pdo_sqlite_stmt_dtor,
355377
pdo_sqlite_stmt_execute,
@@ -358,7 +380,7 @@ const struct pdo_stmt_methods sqlite_stmt_methods = {
358380
pdo_sqlite_stmt_get_col,
359381
pdo_sqlite_stmt_param_hook,
360382
NULL, /* set_attr */
361-
NULL, /* get_attr */
383+
pdo_sqlite_stmt_get_attribute, /* get_attr */
362384
pdo_sqlite_stmt_col_meta,
363385
NULL, /* next_rowset */
364386
pdo_sqlite_stmt_cursor_closer
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
--TEST--
2+
PDO_sqlite: Testing PDOStatement::getAttribute()
3+
--SKIPIF--
4+
<?php if (!extension_loaded('pdo_sqlite')) print 'skip not loaded'; ?>
5+
--FILE--
6+
<?php
7+
8+
$db = new PDO('sqlite::memory:');
9+
10+
$st = $db->prepare('SELECT 1;');
11+
12+
var_dump($st->getAttribute(PDO::SQLITE_ATTR_READONLY_STATEMENT));
13+
14+
$st = $db->prepare('CREATE TABLE test (a TEXT);');
15+
16+
var_dump($st->getAttribute(PDO::SQLITE_ATTR_READONLY_STATEMENT));
17+
?>
18+
--EXPECTF--
19+
bool(true)
20+
bool(false)

0 commit comments

Comments
 (0)