From a29ac72c9cc24e45acfea716b42845918fcc0227 Mon Sep 17 00:00:00 2001 From: jakubvrana Date: Wed, 21 Apr 2010 22:22:23 +0000 Subject: [PATCH] Improve drivers git-svn-id: https://adminer.svn.sourceforge.net/svnroot/adminer/trunk@1470 7c3ca157-0c34-0410-bff1-cbf682f78f5c --- adminer/drivers/pgsql.inc.php | 15 +++++++++++---- adminer/drivers/sqlite.inc.php | 24 ++++++++++++++---------- adminer/include/editing.inc.php | 4 ++-- adminer/include/functions.inc.php | 3 ++- 4 files changed, 29 insertions(+), 17 deletions(-) diff --git a/adminer/drivers/pgsql.inc.php b/adminer/drivers/pgsql.inc.php index a42a21e6..ff339960 100644 --- a/adminer/drivers/pgsql.inc.php +++ b/adminer/drivers/pgsql.inc.php @@ -105,11 +105,13 @@ if (isset($_GET["pgsql"])) { function fetch_field() { $column = $this->_offset++; $row = new stdClass; - $row->orgtable = pg_field_table($this->_result, $column); + if (function_exists('pg_field_table')) { + $row->orgtable = pg_field_table($this->_result, $column); + } $row->name = pg_field_name($this->_result, $column); $row->orgname = $row->name; $row->type = pg_field_type($this->_result, $column); - $row->charsetnr = ($row->type == "bytea" ? 63 : 0); + $row->charsetnr = ($row->type == "bytea" ? 63 : 0); // 63 - binary return $row; } @@ -178,7 +180,7 @@ if (isset($_GET["pgsql"])) { function tables_list() { global $connection; - return get_key_vals("SELECT table_name, table_type FROM information_schema.tables WHERE table_schema = 'public' ORDER BY table_name"); + return get_key_vals("SELECT table_name, table_type FROM information_schema.tables WHERE table_schema = current_schema() ORDER BY table_name"); } function count_tables($databases) { @@ -188,7 +190,12 @@ if (isset($_GET["pgsql"])) { function table_status($name = "") { global $connection; $return = array(); - $result = $connection->query("SELECT relname AS \"Name\", CASE relkind WHEN 'r' THEN '' ELSE 'view' END AS \"Engine\", pg_relation_size(oid) AS \"Data_length\", pg_catalog.obj_description(oid, 'pg_class') AS \"Comment\" FROM pg_catalog.pg_class WHERE relkind IN ('r','v') AND relnamespace = (SELECT oid FROM pg_namespace WHERE nspname = 'public')" . ($name != "" ? " AND relname = " . $connection->quote($name) : "")); //! Index_length, Auto_increment + $result = $connection->query("SELECT relname AS \"Name\", CASE relkind WHEN 'r' THEN '' ELSE 'view' END AS \"Engine\", pg_relation_size(oid) AS \"Data_length\", pg_catalog.obj_description(oid, 'pg_class') AS \"Comment\" +FROM pg_catalog.pg_class +WHERE relkind IN ('r','v') +AND relnamespace = (SELECT oid FROM pg_namespace WHERE nspname = current_schema())" + . ($name != "" ? " AND relname = " . $connection->quote($name) : "") + ); //! Index_length, Auto_increment while ($row = $result->fetch_assoc()) { $return[$row["Name"]] = $row; } diff --git a/adminer/drivers/sqlite.inc.php b/adminer/drivers/sqlite.inc.php index 5124db4a..8abd2dfa 100644 --- a/adminer/drivers/sqlite.inc.php +++ b/adminer/drivers/sqlite.inc.php @@ -19,6 +19,7 @@ if (isset($_GET["sqlite"]) || isset($_GET["sqlite2"])) { function __construct() { $this->server_info = sqlite_libversion(); + $this->_connection = new SQLiteDatabase(":memory:"); } function open($filename) { @@ -79,9 +80,16 @@ if (isset($_GET["sqlite"]) || isset($_GET["sqlite2"])) { } function fetch_field() { + $name = $this->_result->fieldName($this->_offset++); + $pattern = '(\\[.*]|"(?:[^"]|"")*"|(.+))'; + if (preg_match("~^($pattern\\.)?$pattern\$~", $name, $match)) { + $table = ($match[3] != "" ? $match[3] : idf_unescape($match[2])); + $name = ($match[5] != "" ? $match[5] : idf_unescape($match[4])); + } return (object) array( - "name" => $this->_result->fieldName($this->_offset++), - //! type, orgtable, charsetnr + "name" => $name, + "orgname" => $name, + "orgtable" => $table, ); } @@ -99,7 +107,7 @@ if (isset($_GET["sqlite"]) || isset($_GET["sqlite2"])) { } function open($filename) { - $this->_connection->open($filename); + $this->_connection = new SQLite3($filename); } function query($query) { @@ -146,10 +154,11 @@ if (isset($_GET["sqlite"]) || isset($_GET["sqlite2"])) { function fetch_field() { $column = $this->_offset++; + $type = $this->_result->columnType($column); return (object) array( "name" => $this->_result->columnName($column), - "type" => $this->_result->columnType($column), - //! orgtable, charsetnr + "type" => $type, + "charsetnr" => ($type == SQLITE3_BLOB ? 63 : 0), // 63 - binary ); } @@ -163,13 +172,8 @@ if (isset($_GET["sqlite"]) || isset($_GET["sqlite2"])) { class Min_DB extends Min_SQLite { function select_db($filename) { - static $connected = false; - if ($connected) { - return true; - } set_exception_handler('connect_error'); // try/catch is not compatible with PHP 4 $this->open($filename); - $connected = true; restore_exception_handler(); return true; } diff --git a/adminer/include/editing.inc.php b/adminer/include/editing.inc.php index ee7c86e3..2c5c5334 100644 --- a/adminer/include/editing.inc.php +++ b/adminer/include/editing.inc.php @@ -40,7 +40,7 @@ function select($result, $connection2 = null) { $links[$j] = $orgtable; } } - if ($field->charsetnr == 63) { + if ($field->charsetnr == 63) { // 63 - binary $blobs[$j] = true; } $types[$j] = $field->type; @@ -59,7 +59,7 @@ function select($result, $connection2 = null) { $val = " "; // some content to print a border } else { $val = h($val); - if ($types[$key] == 254) { + if ($types[$key] == 254) { // 254 - char $val = "$val"; } } diff --git a/adminer/include/functions.inc.php b/adminer/include/functions.inc.php index 3dd0fc9a..75d24cd6 100644 --- a/adminer/include/functions.inc.php +++ b/adminer/include/functions.inc.php @@ -13,7 +13,8 @@ function connection() { * @return string */ function idf_unescape($idf) { - return str_replace($idf[0] . $idf[0], $idf[0], substr($idf, 1, -1)); + $last = substr($idf, -1); + return str_replace($last . $last, $last, substr($idf, 1, -1)); } /** Escape string to use inside ''