|
<?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 { |
|
private $pdo; |
|
private $last_error = ''; |
|
private $last_insert_id = 0; |
|
private $num_rows = 0; |
|
|
|
public function __construct() { |
|
$this->connect(); |
|
} |
|
|
|
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) { |
|
try { |
|
|
|
$sql = $this->mysql_to_sqlite($sql); |
|
|
|
$stmt = $this->pdo->prepare($sql); |
|
$result = $stmt->execute(); |
|
|
|
if ($result) { |
|
$this->last_insert_id = $this->pdo->lastInsertId(); |
|
$this->num_rows = $stmt->rowCount(); |
|
return $stmt; |
|
} |
|
|
|
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) { |
|
$stmt = $this->query($sql); |
|
if (!$stmt) return null; |
|
|
|
$results = []; |
|
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { |
|
if ($output === OBJECT) { |
|
$results[] = (object) $row; |
|
} else { |
|
$results[] = $row; |
|
} |
|
} |
|
|
|
return $results; |
|
} |
|
|
|
public function get_row($sql, $output = OBJECT) { |
|
$stmt = $this->query($sql); |
|
if (!$stmt) return null; |
|
|
|
$row = $stmt->fetch(PDO::FETCH_ASSOC); |
|
if (!$row) return null; |
|
|
|
if ($output === OBJECT) { |
|
return (object) $row; |
|
} |
|
|
|
return $row; |
|
} |
|
|
|
public function get_var($sql) { |
|
$stmt = $this->query($sql); |
|
if (!$stmt) return null; |
|
|
|
$row = $stmt->fetch(PDO::FETCH_NUM); |
|
return $row ? $row[0] : null; |
|
} |
|
|
|
public function insert_id() { |
|
return $this->last_insert_id; |
|
} |
|
|
|
public function last_error() { |
|
return $this->last_error; |
|
} |
|
|
|
public function num_rows() { |
|
return $this->num_rows; |
|
} |
|
} |
|
|
|
|
|
$wpdb = new SQLite_DB(); |
|
|
|
|
|
if (!isset($GLOBALS['wpdb'])) { |
|
$GLOBALS['wpdb'] = $wpdb; |
|
} |