1
0
mirror of https://github.com/php/php-src.git synced 2026-03-24 00:02:20 +01:00

ext/pdo_sqlite: adding Pdo_Sqlite::ATTR_BUSY_STATEMENT

allow to check if a statement is still running before reusage.

close GH-18804
This commit is contained in:
David Carlier
2025-06-08 14:07:47 +01:00
parent 8a3201d91e
commit 53231a81dd
11 changed files with 58 additions and 23 deletions

3
NEWS
View File

@@ -53,7 +53,6 @@ PHP NEWS
evaluation) and GH-18464 (Recursion protection for deprecation constants not
released on bailout). (DanielEScherzer and ilutov)
. Fixed AST printing for immediately invoked Closure. (Dmitrii Derepko)
. Properly handle __debugInfo() returning an array reference. (nielsdos)
- Curl:
. Added curl_multi_get_handles(). (timwolla)
@@ -144,6 +143,8 @@ PHP NEWS
. Implement GH-17321: Add setAuthorizer to Pdo\Sqlite. (nielsdos)
. PDO::sqliteCreateCollation now throws a TypeError if the callback
has a wrong return type. (David Carlier)
. Added Pdo_Sqlite::ATTR_BUSY_STATEMENT constant to check
if a statement is currently executing. (David Carlier)
- PGSQL:
. Added pg_close_stmt to close a prepared statement while allowing

View File

@@ -194,6 +194,9 @@ PHP 8.5 UPGRADE NOTES
IntlListFormatter::WIDTH_NARROW widths.
It is supported from icu 67.
- PDO_Sqlite:
. Added class constant Pdo_Sqlite::ATTR_BUSY_STATEMENT.
- SOAP:
. Enumeration cases are now dumped in __getTypes().
@@ -424,6 +427,9 @@ PHP 8.5 UPGRADE NOTES
- PCRE:
. Upgraded to pcre2lib from 10.44 to 10.45.
- PDO_Sqlite:
. Increased minimum release version support from 3.7.7 to 3.7.17.
- Readline:
. The return types of readline_add_history(), readline_clear_history(), and
readline_callback_handler_install() have been changed to true, rather

View File

@@ -1923,7 +1923,7 @@ dnl
dnl Common setup macro for SQLite library.
dnl
AC_DEFUN([PHP_SETUP_SQLITE], [
PKG_CHECK_MODULES([SQLITE], [sqlite3 >= 3.7.7], [
PKG_CHECK_MODULES([SQLITE], [sqlite3 >= 3.7.17], [
PHP_EVAL_INCLINE([$SQLITE_CFLAGS])
PHP_EVAL_LIBLINE([$SQLITE_LIBS], [$1])
])

View File

@@ -385,14 +385,10 @@ static int php_sqlite_collation_callback(void *context, int string1_len, const v
zend_type_error("%s(): Return value of the collation callback must be of type int, %s returned",
ZSTR_VAL(func_name), zend_zval_value_name(&retval));
zend_string_release(func_name);
ret = FAILURE;
zval_ptr_dtor(&retval);
return FAILURE;
}
if (Z_LVAL(retval) > 0) {
ret = 1;
} else if (Z_LVAL(retval) < 0) {
ret = -1;
}
zval_ptr_dtor(&retval);
ret = ZEND_NORMALIZE_BOOL(Z_LVAL(retval));
}
return ret;

View File

@@ -33,6 +33,9 @@ class Sqlite extends \PDO
/** @cvalue PDO_SQLITE_ATTR_EXTENDED_RESULT_CODES */
public const int ATTR_EXTENDED_RESULT_CODES = UNKNOWN;
/** @cvalue PDO_SQLITE_ATTR_BUSY_STATEMENT */
public const int ATTR_BUSY_STATEMENT = UNKNOWN;
/** @cvalue SQLITE_OK */
public const int OK = UNKNOWN;

View File

@@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
* Stub hash: f8cd6b3c6aa662d76dca3d0a28d61acfb5a611b5 */
* Stub hash: ae1e62d72c3c8290c9f39f21b583e980ea9b8eb2 */
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_Pdo_Sqlite_createAggregate, 0, 3, _IS_BOOL, 0)
ZEND_ARG_TYPE_INFO(0, name, IS_STRING, 0)
@@ -110,6 +110,12 @@ static zend_class_entry *register_class_Pdo_Sqlite(zend_class_entry *class_entry
zend_declare_typed_class_constant(class_entry, const_ATTR_EXTENDED_RESULT_CODES_name, &const_ATTR_EXTENDED_RESULT_CODES_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
zend_string_release(const_ATTR_EXTENDED_RESULT_CODES_name);
zval const_ATTR_BUSY_STATEMENT_value;
ZVAL_LONG(&const_ATTR_BUSY_STATEMENT_value, PDO_SQLITE_ATTR_BUSY_STATEMENT);
zend_string *const_ATTR_BUSY_STATEMENT_name = zend_string_init_interned("ATTR_BUSY_STATEMENT", sizeof("ATTR_BUSY_STATEMENT") - 1, 1);
zend_declare_typed_class_constant(class_entry, const_ATTR_BUSY_STATEMENT_name, &const_ATTR_BUSY_STATEMENT_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
zend_string_release(const_ATTR_BUSY_STATEMENT_name);
zval const_OK_value;
ZVAL_LONG(&const_OK_value, SQLITE_OK);
zend_string *const_OK_name = zend_string_init_interned("OK", sizeof("OK") - 1, 1);

View File

@@ -73,7 +73,8 @@ extern const struct pdo_stmt_methods sqlite_stmt_methods;
enum {
PDO_SQLITE_ATTR_OPEN_FLAGS = PDO_ATTR_DRIVER_SPECIFIC,
PDO_SQLITE_ATTR_READONLY_STATEMENT,
PDO_SQLITE_ATTR_EXTENDED_RESULT_CODES
PDO_SQLITE_ATTR_EXTENDED_RESULT_CODES,
PDO_SQLITE_ATTR_BUSY_STATEMENT
};
typedef int pdo_sqlite_create_collation_callback(void*, int, const void*, int, const void*);

View File

@@ -492,14 +492,10 @@ static int php_sqlite3_collation_callback(void *context, int string1_len, const
zend_type_error("%s(): Return value of the collation callback must be of type int, %s returned",
ZSTR_VAL(func_name), zend_zval_value_name(&retval));
zend_string_release(func_name);
ret = FAILURE;
zval_ptr_dtor(&retval);
return FAILURE;
}
if (Z_LVAL(retval) > 0) {
ret = 1;
} else if (Z_LVAL(retval) < 0) {
ret = -1;
}
zval_ptr_dtor(&retval);
ret = ZEND_NORMALIZE_BOOL(Z_LVAL(retval));
}
return ret;

View File

@@ -375,13 +375,18 @@ static int pdo_sqlite_stmt_get_attribute(pdo_stmt_t *stmt, zend_long attr, zval
case PDO_SQLITE_ATTR_READONLY_STATEMENT:
ZVAL_FALSE(val);
#if SQLITE_VERSION_NUMBER >= 3007004
if (sqlite3_stmt_readonly(S->stmt)) {
ZVAL_TRUE(val);
}
#endif
if (sqlite3_stmt_readonly(S->stmt)) {
ZVAL_TRUE(val);
}
break;
case PDO_SQLITE_ATTR_BUSY_STATEMENT:
ZVAL_FALSE(val);
if (sqlite3_stmt_busy(S->stmt)) {
ZVAL_TRUE(val);
}
break;
default:
return 0;
}

View File

@@ -13,6 +13,7 @@ var_dump(Pdo\Sqlite::OPEN_READWRITE);
var_dump(Pdo\Sqlite::OPEN_CREATE);
var_dump(Pdo\Sqlite::ATTR_READONLY_STATEMENT);
var_dump(Pdo\Sqlite::ATTR_EXTENDED_RESULT_CODES);
var_dump(Pdo\Sqlite::ATTR_BUSY_STATEMENT);
?>
--EXPECTF--
@@ -24,3 +25,4 @@ int(%d)
int(%d)
int(%d)
int(%d)
int(%d)

View File

@@ -0,0 +1,19 @@
--TEST--
Pdo\Sqlite::ATTR_BUSY_STATEMENT usage
--EXTENSIONS--
pdo_sqlite
--FILE--
<?php
$db = new Pdo\Sqlite('sqlite::memory:');
$db->query('CREATE TABLE test_busy (a string);');
$db->query('INSERT INTO test_busy VALUES ("interleaved"), ("statements")');
$st = $db->prepare('SELECT a FROM test_busy');
var_dump($st->getAttribute(Pdo\Sqlite::ATTR_BUSY_STATEMENT));
$st->execute();
var_dump($st->getAttribute(Pdo\Sqlite::ATTR_BUSY_STATEMENT));
?>
--EXPECTF--
bool(false)
bool(true)