Skip to content

Commit 6b7aa08

Browse files
committed
Reintroduce WP_SQLite_Driver as a temporary proxy exposing legacy API
1 parent c91b55b commit 6b7aa08

6 files changed

+275
-20
lines changed

tests/WP_SQLite_Information_Schema_Reconstructor_Tests.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ public function setUp(): void {
4949
);
5050

5151
$builder = new WP_SQLite_Information_Schema_Builder(
52-
WP_SQLite_Driver::RESERVED_PREFIX,
52+
WP_PDO_MySQL_On_SQLite::RESERVED_PREFIX,
5353
$this->engine->get_connection()
5454
);
5555

wp-includes/sqlite-ast/class-wp-sqlite-configurator.php

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ class WP_SQLite_Configurator {
1414
/**
1515
* The SQLite driver instance.
1616
*
17-
* @var WP_SQLite_Driver
17+
* @var WP_PDO_MySQL_On_SQLite
1818
*/
1919
private $driver;
2020

@@ -35,11 +35,11 @@ class WP_SQLite_Configurator {
3535
/**
3636
* Constructor.
3737
*
38-
* @param WP_SQLite_Driver $driver The SQLite driver instance.
38+
* @param WP_PDO_MySQL_On_SQLite $driver The SQLite driver instance.
3939
* @param WP_SQLite_Information_Schema_Builder $schema_builder The information schema builder instance.
4040
*/
4141
public function __construct(
42-
WP_SQLite_Driver $driver,
42+
WP_PDO_MySQL_On_SQLite $driver,
4343
WP_SQLite_Information_Schema_Builder $schema_builder
4444
) {
4545
$this->driver = $driver;
@@ -100,7 +100,7 @@ private function ensure_global_variables_table(): void {
100100
sprintf(
101101
'CREATE TABLE IF NOT EXISTS %s (name TEXT PRIMARY KEY, value TEXT)',
102102
$this->driver->get_connection()->quote_identifier(
103-
WP_SQLite_Driver::GLOBAL_VARIABLES_TABLE_NAME
103+
WP_PDO_MySQL_On_SQLite::GLOBAL_VARIABLES_TABLE_NAME
104104
)
105105
)
106106
);
@@ -260,11 +260,11 @@ private function save_current_driver_version(): void {
260260
sprintf(
261261
'INSERT INTO %s (name, value) VALUES (?, ?) ON CONFLICT(name) DO UPDATE SET value = ?',
262262
$this->driver->get_connection()->quote_identifier(
263-
WP_SQLite_Driver::GLOBAL_VARIABLES_TABLE_NAME
263+
WP_PDO_MySQL_On_SQLite::GLOBAL_VARIABLES_TABLE_NAME
264264
)
265265
),
266266
array(
267-
WP_SQLite_Driver::DRIVER_VERSION_VARIABLE_NAME,
267+
WP_PDO_MySQL_On_SQLite::DRIVER_VERSION_VARIABLE_NAME,
268268
SQLITE_DRIVER_VERSION,
269269
SQLITE_DRIVER_VERSION,
270270
)

wp-includes/sqlite-ast/class-wp-sqlite-driver-exception.php

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,20 +4,20 @@ class WP_SQLite_Driver_Exception extends PDOException {
44
/**
55
* The SQLite driver that originated the exception.
66
*
7-
* @var WP_SQLite_Driver
7+
* @var WP_PDO_MySQL_On_SQLite
88
*/
99
private $driver;
1010

1111
/**
1212
* Constructor.
1313
*
14-
* @param WP_SQLite_Driver $driver The SQLite driver that originated the exception.
15-
* @param string $message The exception message.
16-
* @param int|string $code The exception code. In PDO, it can be a string with value of SQLSTATE.
17-
* @param Throwable|null $previous The previous throwable used for the exception chaining.
14+
* @param WP_PDO_MySQL_On_SQLite $driver The SQLite driver that originated the exception.
15+
* @param string $message The exception message.
16+
* @param int|string $code The exception code. In PDO, it can be a string with value of SQLSTATE.
17+
* @param Throwable|null $previous The previous throwable used for the exception chaining.
1818
*/
1919
public function __construct(
20-
WP_SQLite_Driver $driver,
20+
WP_PDO_MySQL_On_SQLite $driver,
2121
string $message,
2222
$code = 0,
2323
?Throwable $previous = null
@@ -27,7 +27,7 @@ public function __construct(
2727
$this->driver = $driver;
2828
}
2929

30-
public function getDriver(): WP_SQLite_Driver {
30+
public function getDriver(): WP_PDO_MySQL_On_SQLite {
3131
return $this->driver;
3232
}
3333
}
Lines changed: 254 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,254 @@
1+
<?php
2+
3+
/*
4+
* The SQLite driver uses PDO. Enable PDO function calls:
5+
* phpcs:disable WordPress.DB.RestrictedClasses.mysql__PDO
6+
*/
7+
8+
/**
9+
* For back compatibility with dependencies that use their own loader scripts
10+
* (e.g., WP CLI SQLite Command), ensure the new PDO-based classes are loaded.
11+
*/
12+
require_once __DIR__ . '/class-wp-pdo-mysql-on-sqlite.php';
13+
14+
/**
15+
* Deprecated: A proxy of the WP_PDO_MySQL_On_SQLite class preserving legacy API.
16+
*
17+
* This is a temporary class to preserve the legacy API for easier transition
18+
* to the new PDO-based API, developed in the "WP_PDO_MySQL_On_SQLite" class.
19+
*/
20+
class WP_SQLite_Driver {
21+
/**
22+
* The SQLite engine version.
23+
*
24+
* This is a mysqli-like property that is needed to avoid a PHP warning in
25+
* the WordPress health info. The "WP_Debug_Data::get_wp_database()" method
26+
* calls "$wpdb->dbh->client_info" - a mysqli-specific abstraction leak.
27+
*
28+
* @TODO: This should be fixed in WordPress core.
29+
*
30+
* See:
31+
* https://github.com/WordPress/wordpress-develop/blob/bcdca3f9925f1d3eca7b78d231837c0caf0c8c24/src/wp-admin/includes/class-wp-debug-data.php#L1579
32+
*
33+
* @var string
34+
*/
35+
public $client_info;
36+
37+
/**
38+
* The MySQL-on-SQLite driver instance.
39+
*
40+
* @var WP_PDO_MySQL_On_SQLite
41+
*/
42+
private $mysql_on_sqlite_driver;
43+
44+
/**
45+
* Constructor.
46+
*
47+
* Set up an SQLite connection and the MySQL-on-SQLite driver.
48+
*
49+
* @param WP_SQLite_Connection $connection A SQLite database connection.
50+
* @param string $database The database name.
51+
*
52+
* @throws WP_SQLite_Driver_Exception When the driver initialization fails.
53+
*/
54+
public function __construct(
55+
WP_SQLite_Connection $connection,
56+
string $database,
57+
int $mysql_version = 80038
58+
) {
59+
$this->mysql_on_sqlite_driver = new WP_PDO_MySQL_On_SQLite( $connection, $database, $mysql_version );
60+
$this->main_db_name = $database;
61+
$this->client_info = $this->mysql_on_sqlite_driver->client_info;
62+
}
63+
64+
/**
65+
* Get the SQLite connection instance.
66+
*
67+
* @return WP_SQLite_Connection
68+
*/
69+
public function get_connection(): WP_SQLite_Connection {
70+
return $this->mysql_on_sqlite_driver->get_connection();
71+
}
72+
73+
/**
74+
* Get the version of the SQLite engine.
75+
*
76+
* @return string SQLite engine version as a string.
77+
*/
78+
public function get_sqlite_version(): string {
79+
return $this->mysql_on_sqlite_driver->get_sqlite_version();
80+
}
81+
82+
/**
83+
* Get the SQLite driver version saved in the database.
84+
*
85+
* The saved driver version corresponds to the latest version of the SQLite
86+
* driver that was used to initialize and configure the SQLite database.
87+
*
88+
* @return string SQLite driver version as a string.
89+
* @throws PDOException When the query execution fails.
90+
*/
91+
public function get_saved_driver_version(): string {
92+
return $this->mysql_on_sqlite_driver->get_saved_driver_version();
93+
}
94+
95+
/**
96+
* Check if a specific SQL mode is active.
97+
*
98+
* @param string $mode The SQL mode to check.
99+
* @return bool True if the SQL mode is active, false otherwise.
100+
*/
101+
public function is_sql_mode_active( string $mode ): bool {
102+
return $this->mysql_on_sqlite_driver->is_sql_mode_active( $mode );
103+
}
104+
105+
/**
106+
* Get the last executed MySQL query.
107+
*
108+
* @return string|null
109+
*/
110+
public function get_last_mysql_query(): ?string {
111+
return $this->mysql_on_sqlite_driver->get_last_mysql_query();
112+
}
113+
114+
/**
115+
* Get SQLite queries executed for the last MySQL query.
116+
*
117+
* @return array{ sql: string, params: array }[]
118+
*/
119+
public function get_last_sqlite_queries(): array {
120+
return $this->mysql_on_sqlite_driver->get_last_sqlite_queries();
121+
}
122+
123+
/**
124+
* Get the auto-increment value generated for the last query.
125+
*
126+
* @return int|string
127+
*/
128+
public function get_insert_id() {
129+
return $this->mysql_on_sqlite_driver->get_insert_id();
130+
}
131+
132+
/**
133+
* @param string $query Full SQL statement string.
134+
* @param int $fetch_mode PDO fetch mode. Default is PDO::FETCH_OBJ.
135+
* @param array ...$fetch_mode_args Additional fetch mode arguments.
136+
*
137+
* @return mixed Return value, depending on the query type.
138+
*
139+
* @throws WP_SQLite_Driver_Exception When the query execution fails.
140+
*/
141+
public function query( string $query, $fetch_mode = PDO::FETCH_OBJ, ...$fetch_mode_args ) {
142+
return $this->mysql_on_sqlite_driver->query( $query, $fetch_mode, ...$fetch_mode_args );
143+
}
144+
145+
/**
146+
* Tokenize a MySQL query and initialize a parser.
147+
*
148+
* @param string $query The MySQL query to parse.
149+
* @return WP_MySQL_Parser A parser initialized for the MySQL query.
150+
*/
151+
public function create_parser( string $query ): WP_MySQL_Parser {
152+
return $this->mysql_on_sqlite_driver->create_parser( $query );
153+
}
154+
155+
/**
156+
* Get results of the last query.
157+
*
158+
* @return mixed
159+
*/
160+
public function get_query_results() {
161+
return $this->mysql_on_sqlite_driver->get_query_results();
162+
}
163+
164+
/**
165+
* Get return value of the last query() function call.
166+
*
167+
* @return mixed
168+
*/
169+
public function get_last_return_value() {
170+
return $this->mysql_on_sqlite_driver->get_last_return_value();
171+
}
172+
173+
/**
174+
* Get the number of columns returned by the last emulated query.
175+
*
176+
* @return int
177+
*/
178+
public function get_last_column_count(): int {
179+
return $this->mysql_on_sqlite_driver->get_last_column_count();
180+
}
181+
182+
/**
183+
* Get column metadata for results of the last emulated query.
184+
*
185+
* @return array
186+
*/
187+
public function get_last_column_meta(): array {
188+
return $this->mysql_on_sqlite_driver->get_last_column_meta();
189+
}
190+
191+
/**
192+
* Execute a query in SQLite.
193+
*
194+
* @param string $sql The query to execute.
195+
* @param array $params The query parameters.
196+
* @throws PDOException When the query execution fails.
197+
* @return PDOStatement The PDO statement object.
198+
*/
199+
public function execute_sqlite_query( string $sql, array $params = array() ): PDOStatement {
200+
return $this->mysql_on_sqlite_driver->execute_sqlite_query( $sql, $params );
201+
}
202+
203+
/**
204+
* Begin a new transaction or nested transaction.
205+
*/
206+
public function beginTransaction(): void { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName.MethodNameInvalid
207+
$this->mysql_on_sqlite_driver->begin_transaction();
208+
}
209+
210+
/**
211+
* A temporary alias for back compatibility.
212+
*
213+
* @see self::beginTransaction()
214+
*/
215+
public function begin_transaction(): void {
216+
$this->beginTransaction();
217+
}
218+
219+
/**
220+
* Commit the current transaction or nested transaction.
221+
*/
222+
public function commit(): void {
223+
$this->mysql_on_sqlite_driver->commit();
224+
}
225+
226+
/**
227+
* Rollback the current transaction or nested transaction.
228+
*/
229+
public function rollback(): void {
230+
$this->mysql_on_sqlite_driver->rollback();
231+
}
232+
233+
/**
234+
* Proxy also the private property "$main_db_name", as it is used in tests.
235+
*/
236+
public function __set( string $name, $value ): void {
237+
if ( 'main_db_name' === $name ) {
238+
$closure = function ( string $value ) {
239+
$this->main_db_name = $value;
240+
};
241+
$closure->call( $this->mysql_on_sqlite_driver, $value );
242+
}
243+
}
244+
245+
/**
246+
* Proxy also this private method, as it is used in tests.
247+
*/
248+
private function quote_mysql_utf8_string_literal( string $utf8_literal ): string {
249+
$closure = function ( string $utf8_literal ) {
250+
return $this->quote_mysql_utf8_string_literal( $utf8_literal );
251+
};
252+
return $closure->call( $this->mysql_on_sqlite_driver, $utf8_literal );
253+
}
254+
}

wp-includes/sqlite-ast/class-wp-sqlite-information-schema-reconstructor.php

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ class WP_SQLite_Information_Schema_Reconstructor {
1919
/**
2020
* The SQLite driver instance.
2121
*
22-
* @var WP_SQLite_Driver
22+
* @var WP_PDO_MySQL_On_SQLite
2323
*/
2424
private $driver;
2525

@@ -40,11 +40,11 @@ class WP_SQLite_Information_Schema_Reconstructor {
4040
/**
4141
* Constructor.
4242
*
43-
* @param WP_SQLite_Driver $driver The SQLite driver instance.
43+
* @param WP_PDO_MySQL_On_SQLite $driver The SQLite driver instance.
4444
* @param WP_SQLite_Information_Schema_Builder $schema_builder The information schema builder instance.
4545
*/
4646
public function __construct(
47-
WP_SQLite_Driver $driver,
47+
$driver,
4848
WP_SQLite_Information_Schema_Builder $schema_builder
4949
) {
5050
$this->driver = $driver;
@@ -137,7 +137,7 @@ private function get_sqlite_table_names(): array {
137137
array(
138138
'_mysql_data_types_cache',
139139
'sqlite\_%',
140-
str_replace( '_', '\_', WP_SQLite_Driver::RESERVED_PREFIX ) . '%',
140+
str_replace( '_', '\_', WP_PDO_MySQL_On_SQLite::RESERVED_PREFIX ) . '%',
141141
)
142142
)->fetchAll( PDO::FETCH_COLUMN );
143143
}
@@ -692,9 +692,9 @@ private function get_mysql_column_type( string $column_type ): string {
692692
/**
693693
* Format a MySQL UTF-8 string literal for output in a CREATE TABLE statement.
694694
*
695-
* See WP_SQLite_Driver::quote_mysql_utf8_string_literal().
695+
* See WP_PDO_MySQL_On_SQLite::quote_mysql_utf8_string_literal().
696696
*
697-
* TODO: This is a copy of WP_SQLite_Driver::quote_mysql_utf8_string_literal().
697+
* TODO: This is a copy of WP_PDO_MySQL_On_SQLite::quote_mysql_utf8_string_literal().
698698
* We may consider extracing it to reusable MySQL helpers.
699699
*
700700
* @param string $utf8_literal The UTF-8 string literal to escape.

wp-pdo-mysql-on-sqlite.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,3 +19,4 @@
1919
require_once __DIR__ . '/wp-includes/sqlite-ast/class-wp-sqlite-information-schema-builder.php';
2020
require_once __DIR__ . '/wp-includes/sqlite-ast/class-wp-sqlite-information-schema-exception.php';
2121
require_once __DIR__ . '/wp-includes/sqlite-ast/class-wp-sqlite-information-schema-reconstructor.php';
22+
require_once __DIR__ . '/wp-includes/sqlite-ast/class-wp-pdo-mysql-on-sqlite.php';

0 commit comments

Comments
 (0)