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:
3
NEWS
3
NEWS
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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])
|
||||
])
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
8
ext/pdo_sqlite/pdo_sqlite_arginfo.h
generated
8
ext/pdo_sqlite/pdo_sqlite_arginfo.h
generated
@@ -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);
|
||||
|
||||
@@ -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*);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
19
ext/pdo_sqlite/tests/subclasses/pdo_sqlite_getattr_busy.phpt
Normal file
19
ext/pdo_sqlite/tests/subclasses/pdo_sqlite_getattr_busy.phpt
Normal 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)
|
||||
Reference in New Issue
Block a user