|
<?php |
|
|
|
|
|
|
|
|
|
|
|
|
|
if (!defined('ABSPATH')) { |
|
exit; |
|
} |
|
|
|
|
|
if (!extension_loaded('pdo_sqlite')) { |
|
wp_die('SQLite PDO extension is not available. Please install php-sqlite3.'); |
|
} |
|
|
|
|
|
if (!defined('DB_FILE')) { |
|
define('DB_FILE', ABSPATH . 'wp-content/database/wordpress.db'); |
|
} |
|
|
|
|
|
$db_dir = dirname(DB_FILE); |
|
if (!file_exists($db_dir)) { |
|
wp_mkdir_p($db_dir); |
|
} |
|
|
|
|
|
|
|
|
|
class SQLite_DB { |
|
public $pdo; |
|
public $last_error = ''; |
|
public $insert_id = 0; |
|
public $num_rows = 0; |
|
public $last_query = ''; |
|
public $last_result = null; |
|
public $prefix = 'wp_'; |
|
|
|
|
|
public $posts; |
|
public $users; |
|
public $options; |
|
public $postmeta; |
|
public $usermeta; |
|
public $terms; |
|
public $term_taxonomy; |
|
public $term_relationships; |
|
public $termmeta; |
|
public $comments; |
|
public $commentmeta; |
|
public $links; |
|
public $field_types = array(); |
|
public $charset; |
|
public $collate; |
|
public $dbname; |
|
public $ready = false; |
|
|
|
public function __construct() { |
|
global $table_prefix; |
|
$this->prefix = isset($table_prefix) ? $table_prefix : 'wp_'; |
|
$this->charset = 'utf8'; |
|
$this->collate = ''; |
|
$this->dbname = 'wordpress'; |
|
$this->set_table_names(); |
|
$this->connect(); |
|
$this->ready = true; |
|
} |
|
|
|
private function set_table_names() { |
|
$this->posts = $this->prefix . 'posts'; |
|
$this->users = $this->prefix . 'users'; |
|
$this->options = $this->prefix . 'options'; |
|
$this->postmeta = $this->prefix . 'postmeta'; |
|
$this->usermeta = $this->prefix . 'usermeta'; |
|
$this->terms = $this->prefix . 'terms'; |
|
$this->term_taxonomy = $this->prefix . 'term_taxonomy'; |
|
$this->term_relationships = $this->prefix . 'term_relationships'; |
|
$this->termmeta = $this->prefix . 'termmeta'; |
|
$this->comments = $this->prefix . 'comments'; |
|
$this->commentmeta = $this->prefix . 'commentmeta'; |
|
$this->links = $this->prefix . 'links'; |
|
} |
|
|
|
private function connect() { |
|
try { |
|
$this->pdo = new PDO('sqlite:' . DB_FILE); |
|
$this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); |
|
$this->pdo->exec('PRAGMA foreign_keys = ON'); |
|
} catch (PDOException $e) { |
|
$this->last_error = $e->getMessage(); |
|
wp_die('Database connection failed: ' . $this->last_error); |
|
} |
|
} |
|
|
|
public function query($sql) { |
|
$this->last_query = $sql; |
|
$this->last_error = ''; |
|
$this->last_result = null; |
|
|
|
try { |
|
|
|
$sql = $this->mysql_to_sqlite($sql); |
|
|
|
$stmt = $this->pdo->prepare($sql); |
|
$result = $stmt->execute(); |
|
|
|
if ($result) { |
|
$this->insert_id = $this->pdo->lastInsertId(); |
|
$this->num_rows = $stmt->rowCount(); |
|
$this->last_result = $stmt; |
|
|
|
|
|
if (stripos(trim($sql), 'SELECT') === 0) { |
|
return $this->num_rows; |
|
} |
|
|
|
return true; |
|
} |
|
|
|
return false; |
|
} catch (PDOException $e) { |
|
$this->last_error = $e->getMessage(); |
|
return false; |
|
} |
|
} |
|
|
|
private function mysql_to_sqlite($sql) { |
|
|
|
$sql = str_replace('`', '"', $sql); |
|
$sql = preg_replace('/AUTO_INCREMENT/i', 'AUTOINCREMENT', $sql); |
|
$sql = preg_replace('/INT\(\d+\)/i', 'INTEGER', $sql); |
|
$sql = preg_replace('/TINYINT\(\d+\)/i', 'INTEGER', $sql); |
|
$sql = preg_replace('/BIGINT\(\d+\)/i', 'INTEGER', $sql); |
|
$sql = preg_replace('/VARCHAR\((\d+)\)/i', 'TEXT', $sql); |
|
$sql = preg_replace('/LONGTEXT/i', 'TEXT', $sql); |
|
$sql = preg_replace('/DATETIME/i', 'TEXT', $sql); |
|
$sql = preg_replace('/TIMESTAMP/i', 'TEXT', $sql); |
|
|
|
return $sql; |
|
} |
|
|
|
public function get_results($sql, $output = OBJECT) { |
|
$this->query($sql); |
|
if (!$this->last_result) return null; |
|
|
|
$results = []; |
|
while ($row = $this->last_result->fetch(PDO::FETCH_ASSOC)) { |
|
if ($output === OBJECT) { |
|
$results[] = (object) $row; |
|
} else { |
|
$results[] = $row; |
|
} |
|
} |
|
|
|
return $results; |
|
} |
|
|
|
public function get_row($sql, $output = OBJECT) { |
|
$this->query($sql); |
|
if (!$this->last_result) return null; |
|
|
|
$row = $this->last_result->fetch(PDO::FETCH_ASSOC); |
|
if (!$row) return null; |
|
|
|
if ($output === OBJECT) { |
|
return (object) $row; |
|
} |
|
|
|
return $row; |
|
} |
|
|
|
public function get_var($sql) { |
|
$this->query($sql); |
|
if (!$this->last_result) return null; |
|
|
|
$row = $this->last_result->fetch(PDO::FETCH_NUM); |
|
return $row ? $row[0] : null; |
|
} |
|
|
|
public function insert_id() { |
|
return $this->insert_id; |
|
} |
|
|
|
public function last_error() { |
|
return $this->last_error; |
|
} |
|
|
|
public function num_rows() { |
|
return $this->num_rows; |
|
} |
|
|
|
|
|
public function prepare($query, ...$args) { |
|
if (empty($args)) { |
|
return $query; |
|
} |
|
|
|
$query = str_replace("'%s'", '%s', $query); |
|
$query = str_replace('"%s"', '%s', $query); |
|
$query = str_replace('%s', "'%s'", $query); |
|
$query = str_replace("'%d'", '%d', $query); |
|
$query = str_replace('"%d"', '%d', $query); |
|
|
|
return vsprintf($query, $args); |
|
} |
|
|
|
public function get_charset_collate() { |
|
return ''; |
|
} |
|
|
|
public function esc_like($text) { |
|
return addcslashes($text, '\\%_'); |
|
} |
|
|
|
public function print_error($str = '') { |
|
if ($this->last_error) { |
|
echo '<div id="error"><p class="wpdberror"><strong>WordPress database error:</strong> [' . $this->last_error . ']<br /><code>' . $this->last_query . '</code></p></div>'; |
|
} |
|
} |
|
|
|
|
|
public function set_prefix($prefix, $set_table_names = true) { |
|
if (preg_match('|[^a-z0-9_]|i', $prefix)) { |
|
|
|
return false; |
|
} |
|
|
|
$old_prefix = $this->prefix; |
|
$this->prefix = $prefix; |
|
|
|
if ($set_table_names) { |
|
$this->set_table_names(); |
|
} |
|
|
|
return $old_prefix; |
|
} |
|
|
|
public function set_blog_id($blog_id, $network_id = 0) { |
|
|
|
return $this->prefix; |
|
} |
|
|
|
public function get_blog_prefix($blog_id = null) { |
|
return $this->prefix; |
|
} |
|
|
|
public function tables($scope = 'all', $prefix = true, $blog_id = 0) { |
|
$tables = array( |
|
'posts', 'comments', 'links', 'options', 'postmeta', |
|
'terms', 'term_taxonomy', 'term_relationships', 'termmeta', |
|
'commentmeta', 'users', 'usermeta' |
|
); |
|
|
|
if ($prefix) { |
|
$prefixed_tables = array(); |
|
foreach ($tables as $table) { |
|
$prefixed_tables[] = $this->prefix . $table; |
|
} |
|
return $prefixed_tables; |
|
} |
|
|
|
return $tables; |
|
} |
|
|
|
public function get_table_charset($table) { |
|
return 'utf8'; |
|
} |
|
|
|
public function get_col_charset($table, $column) { |
|
return 'utf8'; |
|
} |
|
|
|
public function check_connection($allow_bail = true) { |
|
return true; |
|
} |
|
|
|
public function db_version() { |
|
return $this->get_var('SELECT sqlite_version()'); |
|
} |
|
|
|
public function flush() { |
|
$this->last_result = null; |
|
$this->last_query = null; |
|
$this->last_error = ''; |
|
} |
|
|
|
public function close() { |
|
$this->pdo = null; |
|
return true; |
|
} |
|
|
|
public function has_cap($db_cap) { |
|
switch (strtolower($db_cap)) { |
|
case 'collation': |
|
case 'group_concat': |
|
case 'subqueries': |
|
return true; |
|
default: |
|
return false; |
|
} |
|
} |
|
|
|
public function get_caller() { |
|
if (function_exists('wp_debug_backtrace_summary')) { |
|
return wp_debug_backtrace_summary(__CLASS__); |
|
} |
|
return ''; |
|
} |
|
|
|
public function init_charset() { |
|
|
|
return true; |
|
} |
|
|
|
public function set_charset($dbh, $charset = null, $collate = null) { |
|
|
|
return true; |
|
} |
|
|
|
|
|
public function insert($table, $data, $format = null) { |
|
return $this->_insert_replace_helper($table, $data, $format, 'INSERT'); |
|
} |
|
|
|
public function replace($table, $data, $format = null) { |
|
return $this->_insert_replace_helper($table, $data, $format, 'REPLACE'); |
|
} |
|
|
|
public function update($table, $data, $where, $format = null, $where_format = null) { |
|
if (!is_array($data) || !is_array($where)) { |
|
return false; |
|
} |
|
|
|
$formats = $format = (array) $format; |
|
$bits = $wheres = array(); |
|
foreach ((array) array_keys($data) as $field) { |
|
if (!empty($formats)) { |
|
$form = ($form = array_shift($formats)) ? $form : $formats[0]; |
|
} elseif (isset($this->field_types[$field])) { |
|
$form = $this->field_types[$field]; |
|
} else { |
|
$form = '%s'; |
|
} |
|
$bits[] = "`$field` = {$form}"; |
|
} |
|
|
|
$where_formats = $where_format = (array) $where_format; |
|
foreach ((array) array_keys($where) as $field) { |
|
if (!empty($where_formats)) { |
|
$form = ($form = array_shift($where_formats)) ? $form : $where_formats[0]; |
|
} elseif (isset($this->field_types[$field])) { |
|
$form = $this->field_types[$field]; |
|
} else { |
|
$form = '%s'; |
|
} |
|
$wheres[] = "`$field` = {$form}"; |
|
} |
|
|
|
$sql = "UPDATE `$table` SET " . implode(', ', $bits) . ' WHERE ' . implode(' AND ', $wheres); |
|
return $this->query($this->prepare($sql, array_merge(array_values($data), array_values($where)))); |
|
} |
|
|
|
public function delete($table, $where, $where_format = null) { |
|
if (!is_array($where)) { |
|
return false; |
|
} |
|
|
|
$where_formats = $where_format = (array) $where_format; |
|
$wheres = array(); |
|
foreach (array_keys($where) as $field) { |
|
if (!empty($where_formats)) { |
|
$form = ($form = array_shift($where_formats)) ? $form : $where_formats[0]; |
|
} elseif (isset($this->field_types[$field])) { |
|
$form = $this->field_types[$field]; |
|
} else { |
|
$form = '%s'; |
|
} |
|
$wheres[] = "`$field` = {$form}"; |
|
} |
|
|
|
$sql = "DELETE FROM `$table` WHERE " . implode(' AND ', $wheres); |
|
return $this->query($this->prepare($sql, array_values($where))); |
|
} |
|
|
|
private function _insert_replace_helper($table, $data, $format = null, $type = 'INSERT') { |
|
if (!in_array(strtoupper($type), array('INSERT', 'REPLACE'))) { |
|
return false; |
|
} |
|
|
|
if (!is_array($data)) { |
|
return false; |
|
} |
|
|
|
$formats = $format = (array) $format; |
|
$fields = array_keys($data); |
|
$formatted_fields = array(); |
|
|
|
foreach ($fields as $field) { |
|
if (!empty($formats)) { |
|
$form = ($form = array_shift($formats)) ? $form : $formats[0]; |
|
} elseif (isset($this->field_types[$field])) { |
|
$form = $this->field_types[$field]; |
|
} else { |
|
$form = '%s'; |
|
} |
|
$formatted_fields[] = $form; |
|
} |
|
|
|
$sql = "$type INTO `$table` (`" . implode('`,`', $fields) . '`) VALUES (' . implode(',', $formatted_fields) . ')'; |
|
return $this->query($this->prepare($sql, array_values($data))); |
|
} |
|
} |
|
|
|
|
|
$wpdb = new SQLite_DB(); |
|
|
|
|
|
if (!isset($GLOBALS['wpdb'])) { |
|
$GLOBALS['wpdb'] = $wpdb; |
|
} |