PluginProbe
SQLite Database Integration / 2.2.0
SQLite Database Integration v2.2.0
3.0.2 3.0.1 trunk 2.1.13 2.1.14 2.1.15 2.1.16 2.2.0 2.2.1 2.2.10 2.2.11 2.2.12 2.2.13 2.2.14 2.2.15 2.2.16 2.2.17 2.2.18 2.2.19 2.2.2 2.2.20 2.2.21 2.2.22 2.2.23 2.2.3 All 32 releases
← All changes | wp-includes/sqlite/install-functions.php +74 -18 trunk2.2.0 View file →
@@ -1,7 +1,10 @@
1 1 <?php
2 2 /**
3 3 * Main integration file.
4 + *
5 + * @package wp-sqlite-integration
6 + * @since 1.0.0
4 7 */
5 8
6 9 /**
7 10 * Function to create tables according to the schemas of WordPress.
@@ -7,8 +10,10 @@
7 10 * Function to create tables according to the schemas of WordPress.
8 11 *
9 12 * This is executed only once while installation.
10 13 *
14 + * @since 1.0.0
15 + *
11 16 * @return boolean
12 17 *
13 18 * @throws PDOException If the database connection fails.
14 19 */
@@ -19,32 +24,28 @@
19 24
20 25 $table_schemas = wp_get_db_schema();
21 26 $queries = explode( ';', $table_schemas );
22 27 try {
23 - $translator = new WP_MySQL_On_SQLite(
24 - sprintf(
25 - 'mysql-on-sqlite:path=%s;dbname=%s',
26 - str_replace( ';', ';;', FQDB ),
27 - str_replace( ';', ';;', $wpdb->dbname )
28 - ),
29 - null,
30 - null,
31 - array(
32 - 'sqlite_journal_mode' => defined( 'SQLITE_JOURNAL_MODE' ) ? SQLITE_JOURNAL_MODE : null,
33 - )
34 - );
35 - $translator->setAttribute( PDO::ATTR_STRINGIFY_FETCHES, true ); // phpcs:ignore WordPress.DB.RestrictedClasses.mysql__PDO
28 + $pdo = new PDO( 'sqlite:' . FQDB, null, null, array( PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION ) ); // phpcs:ignore WordPress.DB.RestrictedClasses
36 29 } catch ( PDOException $err ) {
37 30 $err_data = $err->errorInfo; // phpcs:ignore WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase
38 31 $message = 'Database connection error!<br />';
39 - $message .= sprintf( 'Error message is: %s', $err_data[2] ?? $err->getMessage() );
32 + $message .= sprintf( 'Error message is: %s', $err_data[2] );
40 33 wp_die( $message, 'Database Error!' );
41 34 }
42 35
36 + if ( defined( 'WP_SQLITE_AST_DRIVER' ) && WP_SQLITE_AST_DRIVER ) {
37 + $translator = new WP_SQLite_Driver(
38 + new WP_SQLite_Connection( array( 'pdo' => $pdo ) ),
39 + $wpdb->dbname
40 + );
41 + } else {
42 + $translator = new WP_SQLite_Translator( $pdo );
43 + }
43 44 $query = null;
44 45
45 46 try {
46 - $translator->beginTransaction();
47 + $translator->begin_transaction();
47 48 foreach ( $queries as $query ) {
48 49 $query = trim( $query );
49 50 if ( empty( $query ) ) {
50 51 continue;
@@ -49,21 +50,74 @@
49 50 if ( empty( $query ) ) {
50 51 continue;
51 52 }
52 53
53 - $translator->query( $query );
54 + $result = $translator->query( $query );
55 + if ( false === $result ) {
56 + throw new PDOException( $translator->get_error_message() );
57 + }
54 58 }
55 59 $translator->commit();
56 60 } catch ( PDOException $err ) {
57 - $translator->rollBack();
61 + $err_data = $err->errorInfo; // phpcs:ignore WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase
62 + $err_code = $err_data[1];
63 + $translator->rollback();
58 64 $message = sprintf(
59 65 'Error occurred while creating tables or indexes...<br />Query was: %s<br />',
60 66 var_export( $query, true )
61 67 );
62 - $message .= sprintf( 'Error message is: %s', $err->getMessage() );
68 + $message .= sprintf( 'Error message is: %s', $err_data[2] );
63 69 wp_die( $message, 'Database Error!' );
64 70 }
65 71
72 + /*
73 + * Debug: Cross-check with MySQL.
74 + * This is for debugging purpose only and requires files
75 + * that are present in the GitHub repository
76 + * but not the plugin published on WordPress.org.
77 + */
78 + if ( defined( 'SQLITE_DEBUG_CROSSCHECK' ) && SQLITE_DEBUG_CROSSCHECK ) {
79 + $host = DB_HOST;
80 + $port = 3306;
81 + if ( str_contains( $host, ':' ) ) {
82 + $host_parts = explode( ':', $host );
83 + $host = $host_parts[0];
84 + $port = $host_parts[1];
85 + }
86 + $dsn = 'mysql:host=' . $host . '; port=' . $port . '; dbname=' . DB_NAME;
87 + $pdo_mysql = new PDO( $dsn, DB_USER, DB_PASSWORD, array( PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION ) ); // phpcs:ignore WordPress.DB.RestrictedClasses.mysql__PDO
88 + $pdo_mysql->query( 'SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";' );
89 + $pdo_mysql->query( 'SET time_zone = "+00:00";' );
90 + foreach ( $queries as $query ) {
91 + $query = trim( $query );
92 + if ( empty( $query ) ) {
93 + continue;
94 + }
95 + try {
96 + $pdo_mysql->beginTransaction();
97 + $pdo_mysql->query( $query );
98 + } catch ( PDOException $err ) {
99 + $err_data = $err->errorInfo; // phpcs:ignore WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase
100 + $err_code = $err_data[1];
101 + // phpcs:ignore Universal.Operators.StrictComparisons.LooseEqual
102 + if ( 5 == $err_code || 6 == $err_code ) {
103 + // If the database is locked, commit again.
104 + $pdo_mysql->commit();
105 + } else {
106 + $pdo_mysql->rollBack();
107 + $message = sprintf(
108 + 'Error occurred while creating tables or indexes...<br />Query was: %s<br />',
109 + var_export( $query, true )
110 + );
111 + $message .= sprintf( 'Error message is: %s', $err_data[2] );
112 + wp_die( $message, 'Database Error!' );
113 + }
114 + }
115 + }
116 + }
117 +
118 + $pdo = null;
119 +
66 120 return true;
67 121 }
68 122
69 123 if ( ! function_exists( 'wp_install' ) ) {
@@ -71,8 +125,10 @@
71 125 * Installs the site.
72 126 *
73 127 * Runs the required functions to set up and populate the database,
74 128 * including primary admin user and initial options.
129 + *
130 + * @since 1.0.0
75 131 *
76 132 * @param string $blog_title Site title.
77 133 * @param string $user_name User's username.
78 134 * @param string $user_email User's email.