PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 16.1-beta
Jetpack – WP Security, Backup, Speed, & Growth v16.1-beta
16.1.2 16.2-a.1 16.1.1 16.1 16.1-beta 16.1-beta.2 16.1-beta.3 16.1-a.5 16.1-a.3 16.0.1 16.1-a.1 16.0 16.0-beta 16.0-a.7 16.0-a.5 15.9.1 16.0-a.3 16.0-a.1 15.9 15.9-beta 15.9-a.7 15.9-a.5 15.9-a.3 15.9-a.1 15.8 15.8-beta 15.8-a.7 15.8-a.5 5.2.5 5.3.4 5.4.4 5.5.5 5.6.5 5.7.5 5.8.4 5.9.4 6.0.4 6.1 6.1.1 6.1.2 6.1.3 6.1.4 6.1.5 6.2 6.2.1 6.2.2 6.2.3 6.2.4 6.2.5 6.3 6.3.1 6.3.2 6.3.3 6.3.4 6.3.5 6.3.6 6.3.7 6.4 6.4.1 6.4.2 6.4.3 6.4.4 6.4.5 6.4.6 6.5 6.5.1 6.5.2 6.5.3 6.5.4 6.6 6.6.1 6.6.2 6.6.3 6.6.4 6.6.5 6.7 6.7.1 6.7.2 6.7.3 6.7.4 6.8 6.8.1 6.8.2 6.8.3 6.8.4 6.8.5 6.9 6.9.1 6.9.2 6.9.3 6.9.4 7.0 7.0.1 7.0.2 7.0.3 7.0.4 7.0.5 7.1 7.1.1 7.1.2 7.1.3 7.1.4 7.1.5 7.2 7.2.1 7.2.1.1 7.2.2 7.2.3 7.2.4 7.2.5 7.3 7.3.0.1 7.3.1 7.3.1.1 7.3.2 7.3.3 7.3.4 7.3.5 7.4 7.4.1 7.4.2 7.4.3 7.4.4 7.4.5 7.5 7.5.0.1 7.5.1 7.5.2 7.5.3 7.5.4 7.5.5 7.5.6 7.5.7 7.6 7.6.1 7.6.2 7.6.3 7.6.4 7.7 7.7.1 7.7.2 7.7.3 7.7.4 7.7.5 7.7.6 7.8 7.8.1 7.8.2 7.8.3 7.8.4 7.9 7.9.1 7.9.2 7.9.3 7.9.4 8.0 8.0.1 8.0.2 8.0.3 8.1 8.1.1 8.1.2 8.1.3 8.1.4 8.2 8.2.0.1 8.2.1 8.2.2 8.2.3 8.2.4 8.2.5 8.2.6 8.3 8.3.1 8.3.2 8.3.3 8.4 8.4.1 8.4.2 8.4.3 8.4.4 8.4.5 8.5 8.5.1 8.5.2 8.5.3 8.6 8.6.1 8.6.2 8.6.3 8.6.4 8.7 8.7.0.1 8.7.1 8.7.2 8.7.3 8.7.4 8.8 8.8.1 8.8.2 8.8.3 8.8.4 8.8.5 8.9 8.9.1 8.9.2 8.9.3 8.9.4 9.0 9.0.1 9.0.2 9.0.3 9.0.4 9.0.5 9.1 9.1.1 9.1.2 9.1.3 9.2 9.2.1 9.2.2 9.2.3 9.2.4 9.3 9.3.1 9.3.2 9.3.3 9.3.4 9.3.5 9.4 9.4.1 9.4.2 9.4.3 9.4.4 9.5 9.5.1 9.5.2 9.5.3 9.5.4 9.5.5 9.6 9.6.1 9.6.2 9.6.3 9.6.4 9.7 9.7.1 9.7.2 15.7-beta.2 9.7.3 15.7.1 9.8 15.8-a.1 9.8.1 15.8-a.3 9.8.2 2.0.9 9.8.3 2.1.7 9.9 2.2.10 9.9.1 2.3.10 9.9.2 2.4.7 9.9.3 2.5.5 2.6.6 2.7.5 2.8.5 2.9.6 3.0.6 3.1.5 3.2.5 3.3.6 3.4.6 3.5.6 3.6.4 3.7.5 3.8.5 3.9.10 4.0.7 4.1.4 4.2.5 4.3.5 4.4.5 4.5.3 4.6.3 4.7.4 4.8.5 4.9.3 5.0.3 5.1.4 trunk 10.0 10.0.1 10.0.2 10.1 10.1.1 10.1.2 10.2 10.2.1 10.2.2 10.2.3 10.3 10.3.1 10.3.2 10.4 10.4.1 10.4.2 10.5 10.5.1 10.5.2 10.5.3 10.6 10.6.1 10.6.2 10.7 10.7.1 10.7.2 10.8 10.8.1 10.8.2 10.9 10.9.1 10.9.2 10.9.3 11.0 11.0.1 11.0.2 11.1 11.1.1 11.1.2 11.1.3 11.1.4 11.2 11.2.1 11.2.2 11.3 11.3.1 11.3.2 11.3.3 11.3.4 11.4 11.4.1 11.4.2 11.5 11.5.1 11.5.2 11.5.3 11.6 11.6.1 11.6.2 11.7 11.7.1 11.7.2 11.7.3 11.8 11.8.3 11.8.4 11.8.5 11.8.6 11.9 11.9.1 11.9.2 11.9.3 12.0 12.0.1 12.0.2 12.1 12.1.1 12.1.2 12.2 12.2.1 12.2.2 12.3 12.3.1 12.4 12.4.1 12.5 12.5.1 12.6 12.6.1 12.6.2 12.6.3 12.7 12.7.1 12.7.2 12.8 12.8.1 12.8.2 12.9 12.9.1 12.9.2 12.9.3 12.9.4 13.0 13.0.1 13.1 13.1.1 13.1.2 13.1.3 13.1.4 13.2 13.2.1 13.2.2 13.2.3 13.3 13.3.1 13.3.2 13.4 13.4.1 13.4.2 13.4.3 13.4.4 13.5 13.5.1 13.6 13.6.1 13.7 13.7.1 13.8 13.8.1 13.8.2 13.9 13.9.1 14.0 14.1 14.2 14.2.1 14.3 14.4 14.4.1 14.5 14.6 14.7 14.8 14.9 14.9.1 15.0 15.0.1 15.0.2 15.1 15.1.1 15.2 15.3 15.3.1 15.4 15.5 15.6 15.7 15.7-a.1 15.7-a.3 15.7-a.5 15.7-a.7 15.7-beta
jetpack / vendor / wp-php-toolkit / reprint-exporter / src / class-sqlite-driver-pdo.php
jetpack / vendor / wp-php-toolkit / reprint-exporter / src Last commit date
class-file-tree-producer.php 2 weeks ago class-hmac-client.php 2 weeks ago class-hmac-server.php 2 weeks ago class-http-server.php 2 weeks ago class-mysql-dump-producer.php 2 weeks ago class-pdo-polyfill.php 2 weeks ago class-sqlite-driver-pdo.php 2 weeks ago class-staged-artifacts.php 2 weeks ago class-staged-endpoints.php 2 weeks ago class-staged-push-stream-protocol.php 2 weeks ago class-wpdb-driver-pdo.php 2 weeks ago export.php 2 weeks ago utils.php 2 weeks ago
class-sqlite-driver-pdo.php
236 lines
1 <?php
2 /**
3 * PDO-compatible adapter for WP_SQLite_Driver.
4 *
5 * MySQLDumpProducer expects a PDO connection — prepare(), query(), quote(),
6 * and the statement methods fetch(), fetchAll(), fetchColumn(), execute().
7 * On SQLite sites, the WP_SQLite_Driver is already loaded by WordPress
8 * (via the sqlite-database-integration plugin's db.php drop-in) and is
9 * available at $wpdb->dbh. This adapter wraps that driver so the dump
10 * producer can use it without knowing it's talking to SQLite.
11 *
12 * Every MySQL query goes through the driver's AST-based translator, which
13 * converts it to SQLite on the fly. The result is transparent: the dump
14 * producer sends MySQL queries, gets rows back, and produces valid MySQL
15 * SQL output.
16 */
17
18 /**
19 * Wraps a WP_SQLite_Driver instance to look like a PDO connection.
20 *
21 * Only the methods that MySQLDumpProducer and the export endpoints actually
22 * use are implemented. Anything else will trigger a clear PHP error rather
23 * than silently misbehaving.
24 */
25 class SqliteDriverPDO
26 {
27 /** @var WP_SQLite_Driver */
28 private $driver;
29
30 /** @var PDO The raw SQLite PDO for quote() delegation. */
31 private $raw_pdo;
32
33 public function __construct(WP_SQLite_Driver $driver, PDO $raw_pdo)
34 {
35 $this->driver = $driver;
36 $this->raw_pdo = $raw_pdo;
37 }
38
39 /**
40 * Prepares a statement for execution.
41 *
42 * Returns a SqliteDriverPDOStatement that will substitute parameters
43 * and execute through the driver when execute() is called.
44 */
45 public function prepare(string $sql): SqliteDriverPDOStatement
46 {
47 return new SqliteDriverPDOStatement($this->driver, $this->raw_pdo, $sql);
48 }
49
50 /**
51 * Executes a query immediately and returns the result set.
52 */
53 public function query(string $sql): SqliteDriverPDOStatement
54 {
55 $stmt = new SqliteDriverPDOStatement($this->driver, $this->raw_pdo, $sql);
56 $stmt->execute();
57 return $stmt;
58 }
59
60 /**
61 * Quotes a string for safe inclusion in a query.
62 * Delegates to the underlying raw SQLite PDO.
63 */
64 public function quote(string $value, int $type = PDO::PARAM_STR): string
65 {
66 return $this->raw_pdo->quote($value, $type);
67 }
68 }
69
70 /**
71 * PDOStatement-compatible wrapper for WP_SQLite_Driver query results.
72 *
73 * Collects all result rows eagerly after execution and serves them
74 * through fetch/fetchAll/fetchColumn.
75 */
76 class SqliteDriverPDOStatement
77 {
78 /** @var WP_SQLite_Driver */
79 private $driver;
80
81 /** @var PDO The raw SQLite PDO for quote() delegation. */
82 private $raw_pdo;
83
84 /** @var string */
85 private $sql;
86
87 /** @var array Stored result rows after execution. */
88 private $rows = [];
89
90 /** @var int Current position for fetch(). */
91 private $position = 0;
92
93 /** @var array|null Parameters bound via bindValue(). */
94 private $bound_params = null;
95
96 public function __construct(WP_SQLite_Driver $driver, PDO $raw_pdo, string $sql)
97 {
98 $this->driver = $driver;
99 $this->raw_pdo = $raw_pdo;
100 $this->sql = $sql;
101 }
102
103 /**
104 * Executes the prepared statement.
105 *
106 * Substitutes bound parameters into the query, sends it through
107 * WP_SQLite_Driver::query(), and stores the result rows.
108 *
109 * @param array|null $params Positional or named parameters.
110 * @return bool True on success.
111 */
112 public function execute($params = null): bool
113 {
114 // Merge in any parameters set via bindValue().
115 if ($params === null && $this->bound_params !== null) {
116 $params = $this->bound_params;
117 }
118
119 $sql = $this->sql;
120
121 if ($params !== null && count($params) > 0) {
122 // Find ? placeholder positions outside of string literals.
123 $positions = [];
124 $len = strlen($sql);
125 $in_single = false;
126 $in_double = false;
127 for ($i = 0; $i < $len; $i++) {
128 $ch = $sql[$i];
129 if ($ch === "'" && !$in_double) {
130 $in_single = !$in_single;
131 } elseif ($ch === '"' && !$in_single) {
132 $in_double = !$in_double;
133 } elseif ($ch === '?' && !$in_single && !$in_double) {
134 $positions[] = $i;
135 }
136 }
137
138 // Replace positional placeholders from right to left so
139 // earlier offsets stay valid.
140 for ($i = count($positions) - 1; $i >= 0; $i--) {
141 if (!array_key_exists($i, $params)) {
142 continue;
143 }
144 $quoted = $this->raw_pdo->quote($params[$i]);
145 $sql = substr_replace($sql, $quoted, $positions[$i], 1);
146 }
147
148 // Named parameters (:name style).
149 foreach ($params as $key => $value) {
150 if (!is_string($key)) {
151 continue;
152 }
153 $sql = str_replace($key, $this->raw_pdo->quote($value), $sql);
154 }
155 }
156
157 $this->driver->query($sql);
158 $result = $this->driver->get_query_results();
159 $this->rows = is_array($result) ? $result : [];
160
161 // WP_SQLite_Driver returns results as arrays of objects (PDO::FETCH_OBJ
162 // by default). Convert to associative arrays for PDO compatibility.
163 foreach ($this->rows as $i => $row) {
164 if (is_object($row)) {
165 $this->rows[$i] = (array) $row;
166 }
167 }
168
169 $this->position = 0;
170 return true;
171 }
172
173 /**
174 * Fetches the next row from the result set.
175 *
176 * @param int $mode Fetch mode (ignored — always returns associative array).
177 * @return array|false Associative array or false when exhausted.
178 */
179 public function fetch($mode = PDO::FETCH_ASSOC)
180 {
181 if ($this->position >= count($this->rows)) {
182 return false;
183 }
184 return $this->rows[$this->position++];
185 }
186
187 /**
188 * Returns all remaining rows from the result set.
189 *
190 * @param int $mode Fetch mode. Supports FETCH_ASSOC (default) and FETCH_COLUMN.
191 * @return array
192 */
193 public function fetchAll($mode = PDO::FETCH_ASSOC)
194 {
195 $remaining = array_slice($this->rows, $this->position);
196 $this->position = count($this->rows);
197
198 if ($mode === PDO::FETCH_COLUMN) {
199 return array_map(function ($row) {
200 return reset($row);
201 }, $remaining);
202 }
203
204 return $remaining;
205 }
206
207 /**
208 * Returns a single column from the next row.
209 *
210 * @param int $column_number 0-indexed column number.
211 * @return mixed|false The column value, or false if no more rows.
212 */
213 public function fetchColumn(int $column_number = 0)
214 {
215 $row = $this->fetch();
216 if ($row === false) {
217 return false;
218 }
219 $values = array_values($row);
220 return $values[$column_number] ?? false;
221 }
222
223 /**
224 * Binds a value to a named or positional parameter.
225 */
226 public function bindValue($parameter, $value, int $type = PDO::PARAM_STR): bool
227 {
228 if ($this->bound_params === null) {
229 $this->bound_params = [];
230 }
231 $this->bound_params[$parameter] = $value;
232 return true;
233 }
234
235 }
236