From 2038ecca7477fd896ce5d7d420a6bb84af427876 Mon Sep 17 00:00:00 2001 From: Kateryna Kodonenko Date: Wed, 8 Apr 2026 15:18:03 +0200 Subject: [PATCH 01/12] Load polyfills correctly for the new sqlite version --- src/SQLiteDatabaseIntegrationLoader.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/SQLiteDatabaseIntegrationLoader.php b/src/SQLiteDatabaseIntegrationLoader.php index 30cda4a..1974cf4 100644 --- a/src/SQLiteDatabaseIntegrationLoader.php +++ b/src/SQLiteDatabaseIntegrationLoader.php @@ -83,7 +83,11 @@ public static function load_plugin() { } // We also need to selectively load the necessary classes from the plugin. - require_once $plugin_directory . '/php-polyfills.php'; + // In v2.2.22+, php-polyfills.php moved to wp-includes/database/php-polyfills.php. + $polyfills_path = file_exists( $plugin_directory . '/wp-includes/database/php-polyfills.php' ) + ? $plugin_directory . '/wp-includes/database/php-polyfills.php' + : $plugin_directory . '/php-polyfills.php'; + require_once $polyfills_path; require_once $plugin_directory . '/constants.php'; $new_driver_enabled = defined( 'WP_SQLITE_AST_DRIVER' ) && WP_SQLITE_AST_DRIVER; From 100d0a435c6dfd2fb5da4d9226bfa12f8fb822a5 Mon Sep 17 00:00:00 2001 From: Kateryna Kodonenko Date: Wed, 8 Apr 2026 15:52:00 +0200 Subject: [PATCH 02/12] Ensure we have the correct version --- src/SQLiteDatabaseIntegrationLoader.php | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/src/SQLiteDatabaseIntegrationLoader.php b/src/SQLiteDatabaseIntegrationLoader.php index 1974cf4..5e5f34b 100644 --- a/src/SQLiteDatabaseIntegrationLoader.php +++ b/src/SQLiteDatabaseIntegrationLoader.php @@ -83,17 +83,35 @@ public static function load_plugin() { } // We also need to selectively load the necessary classes from the plugin. - // In v2.2.22+, php-polyfills.php moved to wp-includes/database/php-polyfills.php. - $polyfills_path = file_exists( $plugin_directory . '/wp-includes/database/php-polyfills.php' ) + // In v2.2.22+, files moved into wp-includes/database/ subdirectories. + $new_structure = file_exists( $plugin_directory . '/wp-includes/database/php-polyfills.php' ); + + require_once $new_structure ? $plugin_directory . '/wp-includes/database/php-polyfills.php' : $plugin_directory . '/php-polyfills.php'; - require_once $polyfills_path; require_once $plugin_directory . '/constants.php'; $new_driver_enabled = defined( 'WP_SQLITE_AST_DRIVER' ) && WP_SQLITE_AST_DRIVER; if ( $new_driver_enabled && file_exists( $plugin_directory . '/wp-pdo-mysql-on-sqlite.php' ) ) { require_once $plugin_directory . '/wp-pdo-mysql-on-sqlite.php'; + } elseif ( $new_driver_enabled && $new_structure ) { + require_once $plugin_directory . '/wp-includes/database/version.php'; + require_once $plugin_directory . '/wp-includes/database/parser/class-wp-parser-grammar.php'; + require_once $plugin_directory . '/wp-includes/database/parser/class-wp-parser.php'; + require_once $plugin_directory . '/wp-includes/database/parser/class-wp-parser-node.php'; + require_once $plugin_directory . '/wp-includes/database/parser/class-wp-parser-token.php'; + require_once $plugin_directory . '/wp-includes/database/mysql/class-wp-mysql-token.php'; + require_once $plugin_directory . '/wp-includes/database/mysql/class-wp-mysql-lexer.php'; + require_once $plugin_directory . '/wp-includes/database/mysql/class-wp-mysql-parser.php'; + require_once $plugin_directory . '/wp-includes/database/sqlite/class-wp-sqlite-pdo-user-defined-functions.php'; + require_once $plugin_directory . '/wp-includes/database/sqlite/class-wp-sqlite-connection.php'; + require_once $plugin_directory . '/wp-includes/database/sqlite/class-wp-sqlite-configurator.php'; + require_once $plugin_directory . '/wp-includes/database/sqlite/class-wp-sqlite-driver.php'; + require_once $plugin_directory . '/wp-includes/database/sqlite/class-wp-sqlite-driver-exception.php'; + require_once $plugin_directory . '/wp-includes/database/sqlite/class-wp-sqlite-information-schema-builder.php'; + require_once $plugin_directory . '/wp-includes/database/sqlite/class-wp-sqlite-information-schema-exception.php'; + require_once $plugin_directory . '/wp-includes/database/sqlite/class-wp-sqlite-information-schema-reconstructor.php'; } elseif ( $new_driver_enabled ) { require_once $plugin_directory . '/version.php'; require_once $plugin_directory . '/wp-includes/parser/class-wp-parser-grammar.php'; From 316c5f417833a572e409508b1b6de6e84a2517e8 Mon Sep 17 00:00:00 2001 From: Kateryna Kodonenko Date: Wed, 8 Apr 2026 16:47:57 +0200 Subject: [PATCH 03/12] Optimize code --- src/SQLiteDatabaseIntegrationLoader.php | 133 ++++++++++++++++-------- 1 file changed, 88 insertions(+), 45 deletions(-) diff --git a/src/SQLiteDatabaseIntegrationLoader.php b/src/SQLiteDatabaseIntegrationLoader.php index 5e5f34b..15e82bf 100644 --- a/src/SQLiteDatabaseIntegrationLoader.php +++ b/src/SQLiteDatabaseIntegrationLoader.php @@ -76,65 +76,108 @@ public static function load_plugin() { if ( version_compare( $sqlite_plugin_version, '2.1.11', '<' ) ) { WP_CLI::error( 'The SQLite integration plugin must be version 2.1.11 or higher.' ); } - // Load the translator class from the plugin. if ( ! defined( 'SQLITE_DB_DROPIN_VERSION' ) ) { define( 'SQLITE_DB_DROPIN_VERSION', $sqlite_plugin_version ); // phpcs:ignore } - // We also need to selectively load the necessary classes from the plugin. // In v2.2.22+, files moved into wp-includes/database/ subdirectories. - $new_structure = file_exists( $plugin_directory . '/wp-includes/database/php-polyfills.php' ); + $new_structure = file_exists( $plugin_directory . '/wp-includes/database/php-polyfills.php' ); + $new_driver_enabled = defined( 'WP_SQLITE_AST_DRIVER' ) && WP_SQLITE_AST_DRIVER; require_once $new_structure ? $plugin_directory . '/wp-includes/database/php-polyfills.php' : $plugin_directory . '/php-polyfills.php'; require_once $plugin_directory . '/constants.php'; - $new_driver_enabled = defined( 'WP_SQLITE_AST_DRIVER' ) && WP_SQLITE_AST_DRIVER; + if ( $new_driver_enabled ) { + self::load_ast_driver( $plugin_directory, $new_structure ); + } else { + self::load_legacy_driver( $plugin_directory ); + } + } - if ( $new_driver_enabled && file_exists( $plugin_directory . '/wp-pdo-mysql-on-sqlite.php' ) ) { + /** + * Load the AST driver classes from the SQLite integration plugin. + * + * @param string $plugin_directory The plugin directory. + * @param bool $new_structure Whether the plugin uses the v2.2.22+ directory structure. + * @return void + */ + private static function load_ast_driver( string $plugin_directory, bool $new_structure ): void { + if ( file_exists( $plugin_directory . '/wp-pdo-mysql-on-sqlite.php' ) ) { require_once $plugin_directory . '/wp-pdo-mysql-on-sqlite.php'; - } elseif ( $new_driver_enabled && $new_structure ) { - require_once $plugin_directory . '/wp-includes/database/version.php'; - require_once $plugin_directory . '/wp-includes/database/parser/class-wp-parser-grammar.php'; - require_once $plugin_directory . '/wp-includes/database/parser/class-wp-parser.php'; - require_once $plugin_directory . '/wp-includes/database/parser/class-wp-parser-node.php'; - require_once $plugin_directory . '/wp-includes/database/parser/class-wp-parser-token.php'; - require_once $plugin_directory . '/wp-includes/database/mysql/class-wp-mysql-token.php'; - require_once $plugin_directory . '/wp-includes/database/mysql/class-wp-mysql-lexer.php'; - require_once $plugin_directory . '/wp-includes/database/mysql/class-wp-mysql-parser.php'; - require_once $plugin_directory . '/wp-includes/database/sqlite/class-wp-sqlite-pdo-user-defined-functions.php'; - require_once $plugin_directory . '/wp-includes/database/sqlite/class-wp-sqlite-connection.php'; - require_once $plugin_directory . '/wp-includes/database/sqlite/class-wp-sqlite-configurator.php'; - require_once $plugin_directory . '/wp-includes/database/sqlite/class-wp-sqlite-driver.php'; - require_once $plugin_directory . '/wp-includes/database/sqlite/class-wp-sqlite-driver-exception.php'; - require_once $plugin_directory . '/wp-includes/database/sqlite/class-wp-sqlite-information-schema-builder.php'; - require_once $plugin_directory . '/wp-includes/database/sqlite/class-wp-sqlite-information-schema-exception.php'; - require_once $plugin_directory . '/wp-includes/database/sqlite/class-wp-sqlite-information-schema-reconstructor.php'; - } elseif ( $new_driver_enabled ) { - require_once $plugin_directory . '/version.php'; - require_once $plugin_directory . '/wp-includes/parser/class-wp-parser-grammar.php'; - require_once $plugin_directory . '/wp-includes/parser/class-wp-parser.php'; - require_once $plugin_directory . '/wp-includes/parser/class-wp-parser-node.php'; - require_once $plugin_directory . '/wp-includes/parser/class-wp-parser-token.php'; - require_once $plugin_directory . '/wp-includes/mysql/class-wp-mysql-token.php'; - require_once $plugin_directory . '/wp-includes/mysql/class-wp-mysql-lexer.php'; - require_once $plugin_directory . '/wp-includes/mysql/class-wp-mysql-parser.php'; - require_once $plugin_directory . '/wp-includes/sqlite/class-wp-sqlite-pdo-user-defined-functions.php'; - require_once $plugin_directory . '/wp-includes/sqlite-ast/class-wp-sqlite-connection.php'; - require_once $plugin_directory . '/wp-includes/sqlite-ast/class-wp-sqlite-configurator.php'; - require_once $plugin_directory . '/wp-includes/sqlite-ast/class-wp-sqlite-driver.php'; - require_once $plugin_directory . '/wp-includes/sqlite-ast/class-wp-sqlite-driver-exception.php'; - require_once $plugin_directory . '/wp-includes/sqlite-ast/class-wp-sqlite-information-schema-builder.php'; - require_once $plugin_directory . '/wp-includes/sqlite-ast/class-wp-sqlite-information-schema-exception.php'; - require_once $plugin_directory . '/wp-includes/sqlite-ast/class-wp-sqlite-information-schema-reconstructor.php'; - } else { - require_once $plugin_directory . '/wp-includes/sqlite/class-wp-sqlite-lexer.php'; - require_once $plugin_directory . '/wp-includes/sqlite/class-wp-sqlite-query-rewriter.php'; - require_once $plugin_directory . '/wp-includes/sqlite/class-wp-sqlite-translator.php'; - require_once $plugin_directory . '/wp-includes/sqlite/class-wp-sqlite-token.php'; - require_once $plugin_directory . '/wp-includes/sqlite/class-wp-sqlite-pdo-user-defined-functions.php'; + return; } + + foreach ( self::get_ast_driver_files( $plugin_directory, $new_structure ) as $file ) { + require_once $file; + } + } + + /** + * Return the list of AST driver files to load based on the plugin directory structure. + * + * @param string $plugin_directory The plugin directory. + * @param bool $new_structure Whether the plugin uses the v2.2.22+ directory structure. + * @return string[] + */ + private static function get_ast_driver_files( string $plugin_directory, bool $new_structure ): array { + if ( $new_structure ) { + $db = $plugin_directory . '/wp-includes/database'; + return [ + "$db/version.php", + "$db/parser/class-wp-parser-grammar.php", + "$db/parser/class-wp-parser.php", + "$db/parser/class-wp-parser-node.php", + "$db/parser/class-wp-parser-token.php", + "$db/mysql/class-wp-mysql-token.php", + "$db/mysql/class-wp-mysql-lexer.php", + "$db/mysql/class-wp-mysql-parser.php", + "$db/sqlite/class-wp-sqlite-pdo-user-defined-functions.php", + "$db/sqlite/class-wp-sqlite-connection.php", + "$db/sqlite/class-wp-sqlite-configurator.php", + "$db/sqlite/class-wp-sqlite-driver.php", + "$db/sqlite/class-wp-sqlite-driver-exception.php", + "$db/sqlite/class-wp-sqlite-information-schema-builder.php", + "$db/sqlite/class-wp-sqlite-information-schema-exception.php", + "$db/sqlite/class-wp-sqlite-information-schema-reconstructor.php", + ]; + } + + $wp = $plugin_directory . '/wp-includes'; + return [ + $plugin_directory . '/version.php', + "$wp/parser/class-wp-parser-grammar.php", + "$wp/parser/class-wp-parser.php", + "$wp/parser/class-wp-parser-node.php", + "$wp/parser/class-wp-parser-token.php", + "$wp/mysql/class-wp-mysql-token.php", + "$wp/mysql/class-wp-mysql-lexer.php", + "$wp/mysql/class-wp-mysql-parser.php", + "$wp/sqlite/class-wp-sqlite-pdo-user-defined-functions.php", + "$wp/sqlite-ast/class-wp-sqlite-connection.php", + "$wp/sqlite-ast/class-wp-sqlite-configurator.php", + "$wp/sqlite-ast/class-wp-sqlite-driver.php", + "$wp/sqlite-ast/class-wp-sqlite-driver-exception.php", + "$wp/sqlite-ast/class-wp-sqlite-information-schema-builder.php", + "$wp/sqlite-ast/class-wp-sqlite-information-schema-exception.php", + "$wp/sqlite-ast/class-wp-sqlite-information-schema-reconstructor.php", + ]; + } + + /** + * Load the legacy driver classes from the SQLite integration plugin. + * + * @param string $plugin_directory The plugin directory. + * @return void + */ + private static function load_legacy_driver( string $plugin_directory ): void { + $sqlite = $plugin_directory . '/wp-includes/sqlite'; + require_once "$sqlite/class-wp-sqlite-lexer.php"; + require_once "$sqlite/class-wp-sqlite-query-rewriter.php"; + require_once "$sqlite/class-wp-sqlite-translator.php"; + require_once "$sqlite/class-wp-sqlite-token.php"; + require_once "$sqlite/class-wp-sqlite-pdo-user-defined-functions.php"; } } From 3fce6174010ef619fa810f19af7e62469bca5664 Mon Sep 17 00:00:00 2001 From: Kateryna Kodonenko Date: Wed, 8 Apr 2026 17:38:49 +0200 Subject: [PATCH 04/12] Fix code quality issues --- src/SQLiteDatabaseIntegrationLoader.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/SQLiteDatabaseIntegrationLoader.php b/src/SQLiteDatabaseIntegrationLoader.php index 15e82bf..02ae3b2 100644 --- a/src/SQLiteDatabaseIntegrationLoader.php +++ b/src/SQLiteDatabaseIntegrationLoader.php @@ -104,7 +104,7 @@ public static function load_plugin() { * @param bool $new_structure Whether the plugin uses the v2.2.22+ directory structure. * @return void */ - private static function load_ast_driver( string $plugin_directory, bool $new_structure ): void { + private static function load_ast_driver( $plugin_directory, $new_structure ) { if ( file_exists( $plugin_directory . '/wp-pdo-mysql-on-sqlite.php' ) ) { require_once $plugin_directory . '/wp-pdo-mysql-on-sqlite.php'; return; @@ -122,7 +122,7 @@ private static function load_ast_driver( string $plugin_directory, bool $new_str * @param bool $new_structure Whether the plugin uses the v2.2.22+ directory structure. * @return string[] */ - private static function get_ast_driver_files( string $plugin_directory, bool $new_structure ): array { + private static function get_ast_driver_files( $plugin_directory, $new_structure ) { if ( $new_structure ) { $db = $plugin_directory . '/wp-includes/database'; return [ @@ -172,7 +172,7 @@ private static function get_ast_driver_files( string $plugin_directory, bool $ne * @param string $plugin_directory The plugin directory. * @return void */ - private static function load_legacy_driver( string $plugin_directory ): void { + private static function load_legacy_driver( $plugin_directory ) { $sqlite = $plugin_directory . '/wp-includes/sqlite'; require_once "$sqlite/class-wp-sqlite-lexer.php"; require_once "$sqlite/class-wp-sqlite-query-rewriter.php"; From 7574650bc2350073d2b2de1d8c44fc6f6d1ba6c0 Mon Sep 17 00:00:00 2001 From: Kateryna Kodonenko Date: Wed, 8 Apr 2026 17:45:49 +0200 Subject: [PATCH 05/12] Remove unused import --- features/bootstrap/SQLiteFeatureContext.php | 1 - 1 file changed, 1 deletion(-) diff --git a/features/bootstrap/SQLiteFeatureContext.php b/features/bootstrap/SQLiteFeatureContext.php index 9a07975..b298fb2 100644 --- a/features/bootstrap/SQLiteFeatureContext.php +++ b/features/bootstrap/SQLiteFeatureContext.php @@ -3,7 +3,6 @@ namespace Automattic\WP_CLI\SQLite; use Behat\Behat\Context\Context; -use Behat\Behat\Hook\Scope\BeforeScenarioScope; use Behat\Gherkin\Node\PyStringNode; use WP_CLI\Tests\Context\FeatureContext as WPCLIFeatureContext; use SQLite3; From c7e8117a74099754724d807c48f6d1570dc39b7d Mon Sep 17 00:00:00 2001 From: Kateryna Kodonenko Date: Thu, 9 Apr 2026 14:02:36 +0200 Subject: [PATCH 06/12] Ensure we update the version --- src/SQLiteDatabaseIntegrationLoader.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/SQLiteDatabaseIntegrationLoader.php b/src/SQLiteDatabaseIntegrationLoader.php index 02ae3b2..1d069e8 100644 --- a/src/SQLiteDatabaseIntegrationLoader.php +++ b/src/SQLiteDatabaseIntegrationLoader.php @@ -81,7 +81,7 @@ public static function load_plugin() { define( 'SQLITE_DB_DROPIN_VERSION', $sqlite_plugin_version ); // phpcs:ignore } - // In v2.2.22+, files moved into wp-includes/database/ subdirectories. + // In v2.2.21+, files moved into wp-includes/database/ subdirectories. $new_structure = file_exists( $plugin_directory . '/wp-includes/database/php-polyfills.php' ); $new_driver_enabled = defined( 'WP_SQLITE_AST_DRIVER' ) && WP_SQLITE_AST_DRIVER; From 53897630824af190763032a28c7ab9dc64df9a64 Mon Sep 17 00:00:00 2001 From: Kateryna Kodonenko Date: Thu, 9 Apr 2026 14:13:54 +0200 Subject: [PATCH 07/12] Adjust loading function --- src/SQLiteDatabaseIntegrationLoader.php | 97 +++---------------------- 1 file changed, 11 insertions(+), 86 deletions(-) diff --git a/src/SQLiteDatabaseIntegrationLoader.php b/src/SQLiteDatabaseIntegrationLoader.php index 1d069e8..06ab3b1 100644 --- a/src/SQLiteDatabaseIntegrationLoader.php +++ b/src/SQLiteDatabaseIntegrationLoader.php @@ -91,93 +91,18 @@ public static function load_plugin() { require_once $plugin_directory . '/constants.php'; if ( $new_driver_enabled ) { - self::load_ast_driver( $plugin_directory, $new_structure ); + if ( file_exists( $plugin_directory . '/wp-pdo-mysql-on-sqlite.php' ) ) { + require_once $plugin_directory . '/wp-pdo-mysql-on-sqlite.php'; + } elseif ( file_exists( $plugin_directory . '/wp-includes/database/load.php' ) ) { + require_once $plugin_directory . '/wp-includes/database/load.php'; + } } else { - self::load_legacy_driver( $plugin_directory ); - } - } - - /** - * Load the AST driver classes from the SQLite integration plugin. - * - * @param string $plugin_directory The plugin directory. - * @param bool $new_structure Whether the plugin uses the v2.2.22+ directory structure. - * @return void - */ - private static function load_ast_driver( $plugin_directory, $new_structure ) { - if ( file_exists( $plugin_directory . '/wp-pdo-mysql-on-sqlite.php' ) ) { - require_once $plugin_directory . '/wp-pdo-mysql-on-sqlite.php'; - return; - } - - foreach ( self::get_ast_driver_files( $plugin_directory, $new_structure ) as $file ) { - require_once $file; - } - } - - /** - * Return the list of AST driver files to load based on the plugin directory structure. - * - * @param string $plugin_directory The plugin directory. - * @param bool $new_structure Whether the plugin uses the v2.2.22+ directory structure. - * @return string[] - */ - private static function get_ast_driver_files( $plugin_directory, $new_structure ) { - if ( $new_structure ) { - $db = $plugin_directory . '/wp-includes/database'; - return [ - "$db/version.php", - "$db/parser/class-wp-parser-grammar.php", - "$db/parser/class-wp-parser.php", - "$db/parser/class-wp-parser-node.php", - "$db/parser/class-wp-parser-token.php", - "$db/mysql/class-wp-mysql-token.php", - "$db/mysql/class-wp-mysql-lexer.php", - "$db/mysql/class-wp-mysql-parser.php", - "$db/sqlite/class-wp-sqlite-pdo-user-defined-functions.php", - "$db/sqlite/class-wp-sqlite-connection.php", - "$db/sqlite/class-wp-sqlite-configurator.php", - "$db/sqlite/class-wp-sqlite-driver.php", - "$db/sqlite/class-wp-sqlite-driver-exception.php", - "$db/sqlite/class-wp-sqlite-information-schema-builder.php", - "$db/sqlite/class-wp-sqlite-information-schema-exception.php", - "$db/sqlite/class-wp-sqlite-information-schema-reconstructor.php", - ]; + $sqlite = $plugin_directory . '/wp-includes/sqlite'; + require_once "$sqlite/class-wp-sqlite-lexer.php"; + require_once "$sqlite/class-wp-sqlite-query-rewriter.php"; + require_once "$sqlite/class-wp-sqlite-translator.php"; + require_once "$sqlite/class-wp-sqlite-token.php"; + require_once "$sqlite/class-wp-sqlite-pdo-user-defined-functions.php"; } - - $wp = $plugin_directory . '/wp-includes'; - return [ - $plugin_directory . '/version.php', - "$wp/parser/class-wp-parser-grammar.php", - "$wp/parser/class-wp-parser.php", - "$wp/parser/class-wp-parser-node.php", - "$wp/parser/class-wp-parser-token.php", - "$wp/mysql/class-wp-mysql-token.php", - "$wp/mysql/class-wp-mysql-lexer.php", - "$wp/mysql/class-wp-mysql-parser.php", - "$wp/sqlite/class-wp-sqlite-pdo-user-defined-functions.php", - "$wp/sqlite-ast/class-wp-sqlite-connection.php", - "$wp/sqlite-ast/class-wp-sqlite-configurator.php", - "$wp/sqlite-ast/class-wp-sqlite-driver.php", - "$wp/sqlite-ast/class-wp-sqlite-driver-exception.php", - "$wp/sqlite-ast/class-wp-sqlite-information-schema-builder.php", - "$wp/sqlite-ast/class-wp-sqlite-information-schema-exception.php", - "$wp/sqlite-ast/class-wp-sqlite-information-schema-reconstructor.php", - ]; - } - - /** - * Load the legacy driver classes from the SQLite integration plugin. - * - * @param string $plugin_directory The plugin directory. - * @return void - */ - private static function load_legacy_driver( $plugin_directory ) { - $sqlite = $plugin_directory . '/wp-includes/sqlite'; - require_once "$sqlite/class-wp-sqlite-lexer.php"; - require_once "$sqlite/class-wp-sqlite-query-rewriter.php"; - require_once "$sqlite/class-wp-sqlite-translator.php"; - require_once "$sqlite/class-wp-sqlite-token.php"; - require_once "$sqlite/class-wp-sqlite-pdo-user-defined-functions.php"; } } From 248c54419f84f8a94be8f624bf54a38d8413ae1a Mon Sep 17 00:00:00 2001 From: Kateryna Kodonenko Date: Thu, 9 Apr 2026 14:44:22 +0200 Subject: [PATCH 08/12] Remove new structure variable --- src/SQLiteDatabaseIntegrationLoader.php | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/SQLiteDatabaseIntegrationLoader.php b/src/SQLiteDatabaseIntegrationLoader.php index 06ab3b1..2690541 100644 --- a/src/SQLiteDatabaseIntegrationLoader.php +++ b/src/SQLiteDatabaseIntegrationLoader.php @@ -81,13 +81,12 @@ public static function load_plugin() { define( 'SQLITE_DB_DROPIN_VERSION', $sqlite_plugin_version ); // phpcs:ignore } - // In v2.2.21+, files moved into wp-includes/database/ subdirectories. - $new_structure = file_exists( $plugin_directory . '/wp-includes/database/php-polyfills.php' ); $new_driver_enabled = defined( 'WP_SQLITE_AST_DRIVER' ) && WP_SQLITE_AST_DRIVER; + $old_structure = file_exists( $plugin_directory . '/php-polyfills.php' ); - require_once $new_structure - ? $plugin_directory . '/wp-includes/database/php-polyfills.php' - : $plugin_directory . '/php-polyfills.php'; + if ( $old_structure ) { + require_once $plugin_directory . '/php-polyfills.php'; + } require_once $plugin_directory . '/constants.php'; if ( $new_driver_enabled ) { From 3b1aba5b6c06a9d37760cb5b1c687159469f9589 Mon Sep 17 00:00:00 2001 From: Kateryna Kodonenko Date: Thu, 9 Apr 2026 16:06:53 +0200 Subject: [PATCH 09/12] bRING BACK fallback --- src/SQLiteDatabaseIntegrationLoader.php | 27 +++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/src/SQLiteDatabaseIntegrationLoader.php b/src/SQLiteDatabaseIntegrationLoader.php index 2690541..24d28ae 100644 --- a/src/SQLiteDatabaseIntegrationLoader.php +++ b/src/SQLiteDatabaseIntegrationLoader.php @@ -89,12 +89,27 @@ public static function load_plugin() { } require_once $plugin_directory . '/constants.php'; - if ( $new_driver_enabled ) { - if ( file_exists( $plugin_directory . '/wp-pdo-mysql-on-sqlite.php' ) ) { - require_once $plugin_directory . '/wp-pdo-mysql-on-sqlite.php'; - } elseif ( file_exists( $plugin_directory . '/wp-includes/database/load.php' ) ) { - require_once $plugin_directory . '/wp-includes/database/load.php'; - } + if ( $new_driver_enabled && file_exists( $plugin_directory . '/wp-pdo-mysql-on-sqlite.php' ) ) { + require_once $plugin_directory . '/wp-pdo-mysql-on-sqlite.php'; + } elseif ( $new_driver_enabled && file_exists( $plugin_directory . '/wp-includes/database/load.php' ) ) { + require_once $plugin_directory . '/wp-includes/database/load.php'; + } elseif ( $new_driver_enabled ) { + require_once $plugin_directory . '/version.php'; + require_once $plugin_directory . '/wp-includes/parser/class-wp-parser-grammar.php'; + require_once $plugin_directory . '/wp-includes/parser/class-wp-parser.php'; + require_once $plugin_directory . '/wp-includes/parser/class-wp-parser-node.php'; + require_once $plugin_directory . '/wp-includes/parser/class-wp-parser-token.php'; + require_once $plugin_directory . '/wp-includes/mysql/class-wp-mysql-token.php'; + require_once $plugin_directory . '/wp-includes/mysql/class-wp-mysql-lexer.php'; + require_once $plugin_directory . '/wp-includes/mysql/class-wp-mysql-parser.php'; + require_once $plugin_directory . '/wp-includes/sqlite/class-wp-sqlite-pdo-user-defined-functions.php'; + require_once $plugin_directory . '/wp-includes/sqlite-ast/class-wp-sqlite-connection.php'; + require_once $plugin_directory . '/wp-includes/sqlite-ast/class-wp-sqlite-configurator.php'; + require_once $plugin_directory . '/wp-includes/sqlite-ast/class-wp-sqlite-driver.php'; + require_once $plugin_directory . '/wp-includes/sqlite-ast/class-wp-sqlite-driver-exception.php'; + require_once $plugin_directory . '/wp-includes/sqlite-ast/class-wp-sqlite-information-schema-builder.php'; + require_once $plugin_directory . '/wp-includes/sqlite-ast/class-wp-sqlite-information-schema-exception.php'; + require_once $plugin_directory . '/wp-includes/sqlite-ast/class-wp-sqlite-information-schema-reconstructor.php'; } else { $sqlite = $plugin_directory . '/wp-includes/sqlite'; require_once "$sqlite/class-wp-sqlite-lexer.php"; From 4b85b4fb0989a96fe6adecfd8a292669f5b6de50 Mon Sep 17 00:00:00 2001 From: Kateryna Kodonenko Date: Thu, 9 Apr 2026 16:52:44 +0200 Subject: [PATCH 10/12] Try updating composer --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index e7ec2bd..03d0b35 100644 --- a/composer.json +++ b/composer.json @@ -25,7 +25,7 @@ ], "require": { "php": ">=7.4", - "wp-cli/wp-cli": "^2.5" + "wp-cli/wp-cli": "^2.13" }, "require-dev": { "wp-cli/wp-cli-tests": "^5.0", From 5240b5f39c92af9793da4250b41f6badf6f3491b Mon Sep 17 00:00:00 2001 From: Kateryna Kodonenko Date: Thu, 9 Apr 2026 16:54:10 +0200 Subject: [PATCH 11/12] Add minumum stability --- composer.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/composer.json b/composer.json index 03d0b35..b447c20 100644 --- a/composer.json +++ b/composer.json @@ -23,6 +23,8 @@ "email": "jeroen.pfeil@automattic.com" } ], + "minimum-stability": "dev", + "prefer-stable": true, "require": { "php": ">=7.4", "wp-cli/wp-cli": "^2.13" From 6744ef7f88035ee1b8c48a2eac67cef01e4e1f32 Mon Sep 17 00:00:00 2001 From: Kateryna Kodonenko Date: Thu, 9 Apr 2026 19:39:03 +0200 Subject: [PATCH 12/12] Adjust test setup --- features/bootstrap/SQLiteFeatureContext.php | 92 ++++++++++----------- 1 file changed, 43 insertions(+), 49 deletions(-) diff --git a/features/bootstrap/SQLiteFeatureContext.php b/features/bootstrap/SQLiteFeatureContext.php index b298fb2..0d33a0c 100644 --- a/features/bootstrap/SQLiteFeatureContext.php +++ b/features/bootstrap/SQLiteFeatureContext.php @@ -5,7 +5,7 @@ use Behat\Behat\Context\Context; use Behat\Gherkin\Node\PyStringNode; use WP_CLI\Tests\Context\FeatureContext as WPCLIFeatureContext; -use SQLite3; +use PDO; use Exception; class SQLiteFeatureContext extends WPCLIFeatureContext implements Context { @@ -24,8 +24,9 @@ public function aSqlDumpFileNamedWithContent( $filename, PyStringNode $content ) */ public function theSqliteDatabaseShouldContainATableNamed( $table_name ) { $this->connectToDatabase(); - $result = $this->db->query( "SELECT name FROM sqlite_master WHERE type='table' AND name='" . $this->db->escapeString( $table_name ) . "'" ); - $row = $result->fetchArray(); + $stmt = $this->db->prepare( "SELECT name FROM sqlite_master WHERE type='table' AND name=?" ); + $stmt->execute( [ $table_name ] ); + $row = $stmt->fetch(); if ( ! $row ) { throw new Exception( "Table '$table_name' not found in the database." ); } @@ -37,8 +38,9 @@ public function theSqliteDatabaseShouldContainATableNamed( $table_name ) { */ public function theTableShouldContainARowWithName( $table_name, $name ) { $this->connectToDatabase(); - $result = $this->db->query( "SELECT * FROM $table_name WHERE name='" . $this->db->escapeString( $name ) . "'" ); - $row = $result->fetchArray(); + $stmt = $this->db->prepare( "SELECT * FROM $table_name WHERE name=?" ); + $stmt->execute( [ $name ] ); + $row = $stmt->fetch(); if ( ! $row ) { throw new Exception( "Row with name '$name' not found in table '$table_name'." ); } @@ -50,14 +52,7 @@ public function theTableShouldContainARowWithName( $table_name, $name ) { public function theSqliteDatabaseShouldContainTheImportedData() { $this->connectToDatabase(); $result = $this->db->query( "SELECT name FROM sqlite_master WHERE type='table'" ); - $tables = []; - while ( true ) { - $row = $result->fetchArray(); - if ( false === $row ) { - break; - } - $tables[] = $row['name']; - } + $tables = $result->fetchAll( PDO::FETCH_COLUMN ); if ( empty( $tables ) ) { throw new Exception( 'No tables found in the database after import.' ); } @@ -77,7 +72,8 @@ private function connectToDatabase() { if ( ! $this->db ) { $run_dir = $this->variables['RUN_DIR']; $db_file = $run_dir . '/wp-content/database/.ht.sqlite'; - $this->db = new SQLite3( $db_file ); + $this->db = new PDO( 'sqlite:' . $db_file ); + $this->db->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION ); } } @@ -104,45 +100,43 @@ protected function create_file( $filename, $content ) { file_put_contents( $full_path, $content ); } - - //// /** * @Given /^the SQLite database contains some sample data$/ */ public function theSqliteDatabaseContainsSomeSampleData() { - $this->connectToDatabase(); - $this->db->exec( - " - INSERT OR REPLACE INTO wp_posts (ID, post_title, post_content, post_type, post_status) - VALUES (1, 'Sample Post', 'This is a sample post content.', 'post', 'publish'); - " - ); - - // Insert or update sample data in wp_users - $this->db->exec( - " - INSERT OR REPLACE INTO wp_users (ID, user_login, user_pass, user_nicename, user_email) - VALUES (1, 'testuser', 'password_hash', 'Test User', 'testuser@example.com'); - " - ); - - // Insert or update sample data in wp_options - $this->db->exec( - " - INSERT OR REPLACE INTO wp_options (option_id, option_name, option_value, autoload) - VALUES - (1, 'siteurl', 'http://example.com', 'yes'), - (2, 'blogname', 'Test Blog', 'yes'), - (3, 'blogdescription', 'Just another WordPress site', 'yes'), - (4, 'users_can_register', '0', 'yes'), - (5, 'admin_email', 'admin@example.com', 'yes'), - (6, 'start_of_week', '1', 'yes'), - (7, 'use_balanceTags', '0', 'yes'), - (8, 'use_smilies', '1', 'yes'), - (9, 'require_name_email', '1', 'yes'), - (10, 'comments_notify', '1', 'yes'); - " - ); + $this->connectToDatabase(); + $this->db->exec( + " + INSERT OR REPLACE INTO wp_posts (ID, post_title, post_content, post_type, post_status) + VALUES (1, 'Sample Post', 'This is a sample post content.', 'post', 'publish'); + " + ); + + // Insert or update sample data in wp_users + $this->db->exec( + " + INSERT OR REPLACE INTO wp_users (ID, user_login, user_pass, user_nicename, user_email) + VALUES (1, 'testuser', 'password_hash', 'Test User', 'testuser@example.com'); + " + ); + + // Insert or update sample data in wp_options + $this->db->exec( + " + INSERT OR REPLACE INTO wp_options (option_id, option_name, option_value, autoload) + VALUES + (1, 'siteurl', 'http://example.com', 'yes'), + (2, 'blogname', 'Test Blog', 'yes'), + (3, 'blogdescription', 'Just another WordPress site', 'yes'), + (4, 'users_can_register', '0', 'yes'), + (5, 'admin_email', 'admin@example.com', 'yes'), + (6, 'start_of_week', '1', 'yes'), + (7, 'use_balanceTags', '0', 'yes'), + (8, 'use_smilies', '1', 'yes'), + (9, 'require_name_email', '1', 'yes'), + (10, 'comments_notify', '1', 'yes'); + " + ); } /**