git-svn-id: https://adminer.svn.sourceforge.net/svnroot/adminer/trunk@682 7c3ca157-0c34-0410-bff1-cbf682f78f5c
265 lines
6.5 KiB
PHP
265 lines
6.5 KiB
PHP
<?php
|
|
if (extension_loaded($_GET["sqlite_version"] == 2 ? "sqlite" : "sqlite3")) {
|
|
if ($_GET["sqlite_version"] == 2) {
|
|
|
|
class Min_SQLite extends SQLiteDatabase {
|
|
var $extension = "SQLite";
|
|
|
|
function open($filename) {
|
|
parent::__construct($filename);
|
|
}
|
|
|
|
function query($query) {
|
|
$result = @parent::query($query, SQLITE_BOTH, $error);
|
|
if (!$result) {
|
|
$this->error = $error;
|
|
return false;
|
|
} elseif ($result === true) {
|
|
$this->affected_rows = parent::changes();
|
|
return true;
|
|
}
|
|
return new Min_Result($result);
|
|
}
|
|
|
|
function escape_string($string) {
|
|
return sqlite_escape_string($string);
|
|
}
|
|
|
|
function result($result, $field = 0) {
|
|
if (!$result) {
|
|
return false;
|
|
}
|
|
$row = $result->_result->fetch();
|
|
return $row[$field];
|
|
}
|
|
}
|
|
|
|
class Min_Result {
|
|
var $_result, $num_rows;
|
|
|
|
function __construct($result) {
|
|
$this->_result = $result;
|
|
$this->num_rows = $result->numRows();
|
|
}
|
|
|
|
function fetch_assoc() {
|
|
return $this->_result->fetch(SQLITE_ASSOC);
|
|
}
|
|
|
|
function fetch_row() {
|
|
return $this->_result->fetch(SQLITE_NUM);
|
|
}
|
|
|
|
function fetch_field() {
|
|
static $column = -1;
|
|
$column++;
|
|
return (object) array(
|
|
"name" => parent::fieldName($column),
|
|
//! type, orgtable, charsetnr
|
|
);
|
|
}
|
|
|
|
function free() {
|
|
}
|
|
}
|
|
|
|
} else {
|
|
|
|
class Min_SQLite extends SQLite3 {
|
|
var $extension = "SQLite3";
|
|
|
|
function open($filename) {
|
|
parent::__construct($filename);
|
|
}
|
|
|
|
function query($query) {
|
|
$result = @parent::query($query);
|
|
if (!$result) {
|
|
$this->error = parent::lastErrorMsg();
|
|
return false;
|
|
} elseif ($result === true) {
|
|
$this->affected_rows = parent::changes();
|
|
return true;
|
|
}
|
|
return new Min_Result($result);
|
|
}
|
|
|
|
function escape_string($string) {
|
|
return parent::escapeString($string);
|
|
}
|
|
|
|
function result($result, $field = 0) {
|
|
if (!$result) {
|
|
return false;
|
|
}
|
|
$row = $result->_result->fetchArray();
|
|
return $row[$field];
|
|
}
|
|
}
|
|
|
|
class Min_Result {
|
|
var $_result, $num_rows;
|
|
|
|
function __construct($result) {
|
|
$this->_result = $result;
|
|
//! $this->num_rows = ;
|
|
}
|
|
|
|
function fetch_assoc() {
|
|
return $this->_result->fetchArray(SQLITE3_ASSOC);
|
|
}
|
|
|
|
function fetch_row() {
|
|
return $this->_result->fetchArray(SQLITE3_NUM);
|
|
}
|
|
|
|
function fetch_field() {
|
|
static $column = -1;
|
|
$column++;
|
|
return (object) array(
|
|
"name" => parent::columnName($column),
|
|
"type" => parent::columnType($column),
|
|
//! orgtable, charsetnr
|
|
);
|
|
}
|
|
|
|
function free() {
|
|
return $this->_result->finalize();
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
class Min_DB extends Min_SQLite {
|
|
|
|
function __construct() {
|
|
}
|
|
|
|
function select_db($filename) {
|
|
set_exception_handler('connect_error'); // try/catch is not compatible with PHP 4
|
|
$this->open($filename);
|
|
restore_exception_handler();
|
|
$this->server_info = $this->result($this->query("SELECT sqlite_version()"));
|
|
return true;
|
|
}
|
|
|
|
function multi_query($query) {
|
|
return $this->_result = $this->query($query);
|
|
}
|
|
|
|
function store_result() {
|
|
return $this->_result;
|
|
}
|
|
|
|
function next_result() {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
} elseif (extension_loaded("pdo_sqlite")) {
|
|
class Min_DB extends Min_PDO {
|
|
var $extension = "PDO_SQLite";
|
|
|
|
function select_db($filename) {
|
|
set_exception_handler('connect_error'); // try/catch is not compatible with PHP 4
|
|
parent::__construct(($_GET["sqlite_version"] == 2 ? "sqlite2" : "sqlite") . ":$filename");
|
|
restore_exception_handler();
|
|
$this->setAttribute(13, array('Min_PDOStatement')); // PDO::ATTR_STATEMENT_CLASS
|
|
$this->server_info = $this->result($this->query("SELECT sqlite_version()"));
|
|
return true;
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
$types = array("text" => 0, "numeric" => 0, "integer" => 0, "real" => 0, "blob" => 0);
|
|
$unsigned = array();
|
|
|
|
function connect() {
|
|
return new Min_DB;
|
|
}
|
|
|
|
function get_databases() {
|
|
return array();
|
|
}
|
|
|
|
function table_status($table) {
|
|
return array();
|
|
}
|
|
|
|
function fields($table) {
|
|
global $dbh;
|
|
$return = array();
|
|
$result = $dbh->query("PRAGMA table_info(" . idf_escape($table) . ")");
|
|
while ($row = $result->fetch_assoc()) {
|
|
preg_match('~^([^( ]+)(?:\\((.+)\\))?$~', $row["Type"], $match);
|
|
$return[$row["Field"]] = array(
|
|
"field" => $row["name"],
|
|
"type" => $match[1],
|
|
"length" => $match[2],
|
|
"default" => $row["dflt_value"],
|
|
"null" => !$row["notnull"],
|
|
"auto_increment" => false, //!
|
|
"collation" => $row["Collation"], //!
|
|
"comment" => "", //!
|
|
"primary" => $row["pk"],
|
|
);
|
|
}
|
|
$result->free();
|
|
return $return;
|
|
}
|
|
|
|
function indexes($table, $dbh2 = null) {
|
|
global $dbh;
|
|
$return = array();
|
|
$result = $dbh->query("PRAGMA index_list(" . idf_escape($table) . ")");
|
|
while ($row = $result->fetch_assoc()) {
|
|
$return[$row["name"]]["type"] = ($row["unique"] ? "UNIQUE" : "INDEX");
|
|
$result1 = $dbh->query("PRAGMA index_info(" . idf_escape($row["name"]) . ")");
|
|
while ($row1 = $result1->fetch_assoc()) {
|
|
$return[$row["name"]]["columns"][$row1["seqno"]] = $row1["name"];
|
|
}
|
|
$result1->free();
|
|
}
|
|
$result->free();
|
|
//! detect primary key from table definition
|
|
return $return;
|
|
}
|
|
|
|
function foreign_keys($table) {
|
|
global $dbh, $on_actions;
|
|
static $pattern = '(?:[^`]+|``)+';
|
|
$return = array();
|
|
$result = $dbh->query("SHOW CREATE TABLE " . idf_escape($table));
|
|
if ($result) {
|
|
$create_table = $dbh->result($result, 1);
|
|
$result->free();
|
|
preg_match_all("~CONSTRAINT `($pattern)` FOREIGN KEY \\(((?:`$pattern`,? ?)+)\\) REFERENCES `($pattern)`(?:\\.`($pattern)`)? \\(((?:`$pattern`,? ?)+)\\)(?: ON DELETE (" . implode("|", $on_actions) . "))?(?: ON UPDATE (" . implode("|", $on_actions) . "))?~", $create_table, $matches, PREG_SET_ORDER);
|
|
foreach ($matches as $match) {
|
|
preg_match_all("~`($pattern)`~", $match[2], $source);
|
|
preg_match_all("~`($pattern)`~", $match[5], $target);
|
|
$return[$match[1]] = array(
|
|
"db" => idf_unescape(strlen($match[4]) ? $match[3] : $match[4]),
|
|
"table" => idf_unescape(strlen($match[4]) ? $match[4] : $match[3]),
|
|
"source" => array_map('idf_unescape', $source[1]),
|
|
"target" => array_map('idf_unescape', $target[1]),
|
|
"on_delete" => $match[6],
|
|
"on_update" => $match[7],
|
|
);
|
|
}
|
|
}
|
|
return $return;
|
|
}
|
|
|
|
function view($name) {
|
|
global $dbh;
|
|
return array("select" => preg_replace('~^(?:[^`]+|`[^`]*`)* AS ~iU', '', $dbh->result($dbh->query("SELECT sql FROM sqlite_master WHERE name = '" . $dbh->escape_string($name) . "'"), 0)));
|
|
}
|
|
|
|
function collations() {
|
|
return get_vals("PRAGMA collation_list", 1);
|
|
}
|
|
|
|
function table_comment(&$row) {
|
|
}
|