]> git.joonet.de Git - adminer.git/commitdiff
Basic Oracle support
authorJakub Vrana <jakub@vrana.cz>
Fri, 14 May 2010 16:37:06 +0000 (18:37 +0200)
committerJakub Vrana <jakub@vrana.cz>
Fri, 14 May 2010 17:13:46 +0000 (19:13 +0200)
adminer/drivers/oracle.inc.php [new file with mode: 0644]
adminer/drivers/pgsql.inc.php
adminer/include/bootstrap.inc.php
changes.txt

diff --git a/adminer/drivers/oracle.inc.php b/adminer/drivers/oracle.inc.php
new file mode 100644 (file)
index 0000000..823dce4
--- /dev/null
@@ -0,0 +1,334 @@
+<?php
+$possible_drivers[] = "OCI8";
+$possible_drivers[] = "PDO_OCI";
+if (extension_loaded("oci8") || extension_loaded("pdo_oci")) {
+       $drivers["oracle"] = "Oracle";
+}
+
+if (isset($_GET["oracle"])) {
+       define("DRIVER", "oracle");
+       if (extension_loaded("oci8")) {
+               class Min_DB {
+                       var $extension = "oci8", $_link, $_result, $server_info, $affected_rows, $error;
+
+                       function _error($errno, $error) {
+                               if (ini_bool("html_errors")) {
+                                       $error = html_entity_decode(strip_tags($error));
+                               }
+                               $error = ereg_replace('^[^:]*: ', '', $error);
+                               $this->error = $error;
+                       }
+                       
+                       function connect($server, $username, $password) {
+                               $this->_link = @oci_new_connect($username, $password, $server); //! AL32UTF8
+                               if ($this->_link) {
+                                       $this->server_info = oci_server_version($this->_link);
+                                       return true;
+                               }
+                               $error = oci_error();
+                               $this->error = $error["message"];
+                               return false;
+                       }
+
+                       function quote($string) {
+                               return "'" . str_replace("'", "''", $string) . "'";
+                       }
+
+                       function select_db($database) {
+                               return true;
+                       }
+
+                       function query($query, $unbuffered = false) {
+                               $result = oci_parse($this->_link, $query);
+                               if (!$result) {
+                                       $error = oci_error($this->_link);
+                                       $this->error = $error["message"];
+                                       return false;
+                               }
+                               set_error_handler(array($this, '_error'));
+                               $return = @oci_execute($result);
+                               restore_error_handler();
+                               if ($return) {
+                                       if (oci_num_fields($result)) {
+                                               return new Min_Result($result);
+                                       }
+                                       $this->affected_rows = oci_num_rows($result);
+                               }
+                               return $return;
+                       }
+
+                       function multi_query($query) {
+                               return $this->_result = $this->query($query);
+                       }
+                       
+                       function store_result() {
+                               return $this->_result;
+                       }
+                       
+                       function next_result() {
+                               return false;
+                       }
+                       
+                       function result($query, $field = 1) {
+                               $result = $this->query($query);
+                               if (!is_object($result) || !oci_fetch($result->_result)) {
+                                       return false;
+                               }
+                               return oci_result($result->_result, $field);
+                       }
+               }
+
+               class Min_Result {
+                       var $_result, $_offset = 1, $num_rows;
+
+                       function Min_Result($result) {
+                               $this->_result = $result;
+                               $this->num_rows = -1; // all results unbuffered
+                       }
+
+                       function fetch_assoc() {
+                               return oci_fetch_assoc($this->_result);
+                       }
+
+                       function fetch_row() {
+                               return oci_fetch_row($this->_result);
+                       }
+
+                       function fetch_field() {
+                               $column = $this->_offset++;
+                               $return = new stdClass;
+                               $return->name = oci_field_name($this->_result, $column);
+                               $return->orgname = $return->name;
+                               $return->type = oci_field_type($this->_result, $column);
+                               $return->charsetnr = (ereg("raw|blob|bfile", $return->type) ? 63 : 0); // 63 - binary
+                               return $return;
+                       }
+                       
+                       function __destruct() {
+                               oci_free_statement($this->_result);
+                       }
+               }
+               
+       } elseif (extension_loaded("pdo_oci")) {
+               class Min_DB extends Min_PDO {
+                       var $extension = "PDO_OCI";
+                       
+                       function connect($server, $username, $password) {
+                       }
+                       
+                       function select_db($database) {
+                       }
+               }
+               
+       }
+       
+       function idf_escape($idf) {
+               return '"' . str_replace('"', '""', $idf) . '"';
+       }
+
+       function table($idf) {
+               return idf_escape($idf);
+       }
+
+       function connect() {
+               global $adminer;
+               $connection = new Min_DB;
+               $credentials = $adminer->credentials();
+               if ($connection->connect($credentials[0], $credentials[1], $credentials[2])) {
+                       return $connection;
+               }
+               return $connection->error;
+       }
+
+       function get_databases() {
+               return get_vals("SELECT tablespace_name FROM user_tablespaces");
+       }
+
+       function limit($query, $where, $limit, $offset = 0, $separator = " ") {
+               return " $query$where" . (isset($limit) ? ($where ? " AND" : $separator . "WHERE") . ($offset ? " rownum > $offset AND" : "") . " rownum <= " . ($limit + $offset) : "");
+       }
+
+       function limit1($query, $where) {
+               return " $query$where";
+       }
+
+       function db_collation($db, $collations) {
+               //!
+       }
+
+       function engines() {
+               return array();
+       }
+
+       function logged_user() {
+               global $connection;
+               return $connection->result("SELECT USER FROM DUAL");
+       }
+
+       function tables_list() {
+               global $connection;
+               return get_key_vals("SELECT table_name FROM all_tables WHERE tablespace_name = " . $connection->quote(DB)); //! views
+       }
+
+       function count_tables($databases) {
+               return array();
+       }
+       
+       function table_status($name = "") {
+               global $connection;
+               $return = array();
+               $result = $connection->query('SELECT table_name "Name" FROM all_tables' . ($name != "" ? ' WHERE table_name = ' . $connection->quote($name) : ''));
+               while ($row = $result->fetch_assoc()) {
+                       if ($name != "") {
+                               return $row;
+                       }
+                       $return[$row["Name"]] = $row;
+               }
+               return $return;
+       }
+
+       function fk_support($table_status) {
+               return true;
+       }
+
+       function fields($table) {
+               global $connection;
+               $return = array();
+               $result = $connection->query("SELECT * FROM all_tab_columns WHERE table_name = " . $connection->quote($table) . " ORDER BY column_id");
+               if ($result) {
+                       while ($row = $result->fetch_assoc()) {
+                               $type = $row["DATA_TYPE"];
+                               $length = "$row[DATA_PRECISION],$row[DATA_SCALE]";
+                               if ($length == ",") {
+                                       $length = $row["DATA_LENGTH"];
+                               } //! int
+                               $return[$row["COLUMN_NAME"]] = array(
+                                       "field" => $row["COLUMN_NAME"],
+                                       "full_type" => $type . ($length ? "($length)" : ""),
+                                       "type" => $type,
+                                       "length" => $length,
+                                       "default" => $row["DATA_DEFAULT"],
+                                       "null" => ($row["NULLABLE"] == "Y"),
+                                       //! "auto_increment" => false,
+                                       "collation" => $row["CHARACTER_SET_NAME"],
+                                       "privileges" => array("insert" => 1, "select" => 1, "update" => 1),
+                                       //! "comment" => $row["Comment"],
+                                       //! "primary" => ($row["Key"] == "PRI"),
+                               );
+                       }
+               }
+               return $return;
+       }
+
+       function indexes($table, $connection2 = null) {
+               return array(); //!
+       }
+
+       function collations() {
+               return array(); //!
+       }
+
+       function information_schema($db) {
+               return false;
+       }
+
+       function error() {
+               global $connection;
+               return h($connection->error); //! highlight sqltext from offset
+       }
+       
+       function exact_value($val) {
+               global $connection;
+               return $connection->quote($val);
+       }
+       
+       function explain($connection, $query) {
+               //!
+       }
+       
+       function foreign_keys($table) {
+               return array(); //!
+       }
+
+       function truncate_tables($tables) {
+               foreach ($tables as $table) {
+                       if (!queries("TRUNCATE TABLE " . table($table))) {
+                               return false;
+                       }
+               }
+               return true;
+       }
+
+       function drop_views($views) {
+               foreach ($views as $table) {
+                       if (!queries("DROP VIEW " . table($table))) {
+                               return false;
+                       }
+               }
+               return true;
+       }
+
+       function drop_tables($tables) {
+               foreach ($tables as $table) {
+                       if (!queries("DROP TABLE " . table($table))) {
+                               return false;
+                       }
+               }
+               return true;
+       }
+
+       function begin() {
+               return true; // automatic start
+       }
+       
+       function insert_into($table, $set) {
+               return queries("INSERT INTO " . table($table) . " (" . implode(", ", array_keys($set)) . ")\nVALUES (" . implode(", ", $set) . ")"); //! no columns
+       }
+       
+       function last_id() {
+               return 0; //!
+       }
+       
+       function schemas() {
+               return array();
+       }
+       
+       function get_schema() {
+               return "";
+       }
+       
+       function set_schema($scheme) {
+               return true;
+       }
+       
+       function support($feature) {
+               return false; //!
+       }
+       
+       $jush = "oracle";
+       $types = array();
+       $structured_types = array();
+       foreach (array(
+               lang('Numbers') => array("number" => 38, "binary_float" => 12, "binary_double" => 21),
+               lang('Date and time') => array("date" => 10, "timestamp" => 29, "interval year to month" => 12, "interval day to second" => 28), //! year(), day() to second()
+               lang('Strings') => array("char" => 2000, "varchar2" => 4000, "nchar" => 2000, "nvarchar2" => 4000, "clob" => 4294967295, "nclob" => 4294967295),
+               lang('Binary') => array("raw" => 2000, "long raw" => 2147483648, "blob" => 4294967295, "bfile" => 4294967296),
+       ) as $key => $val) {
+               $types += $val;
+               $structured_types[$key] = array_keys($val);
+       }
+       $unsigned = array();
+       $operators = array("=", "<", ">", "<=", ">=", "!=", "LIKE", "LIKE %%", "IN", "IS NULL", "NOT LIKE", "NOT REGEXP", "NOT IN", "IS NOT NULL");
+       $functions = array("length", "lower", "round", "upper");
+       $grouping = array("avg", "count", "count distinct", "max", "min", "sum");
+       $edit_functions = array(
+               array( //! no parentheses
+                       "date" => "current_date",
+                       "timestamp" => "current_timestamp",
+               ), array(
+                       "number|float|double" => "+/-",
+                       "date|timestamp" => "+ interval/- interval",
+                       "char|clob" => "||",
+               )
+       );
+}
index 48fcca3cdc3a2f826a7740bc308e672997107bde..25d7f859ac964a92e4377117a7f752a8aeaf7021 100644 (file)
@@ -233,7 +233,6 @@ AND relnamespace = (SELECT oid FROM pg_namespace WHERE nspname = current_schema(
                                        "default" => $row["column_default"],
                                        "null" => ($row["is_nullable"] == "YES"),
                                        "auto_increment" => eregi("^nextval\\(", $row["column_default"]),
-                                       "on_update" => "", //!
                                        "collation" => $row["collation_name"],
                                        "privileges" => array("insert" => 1, "select" => 1, "update" => 1), //! is_updatable
                                        "primary" => false, //!
index 608e1b5f38ba788c16b0b2bee8b61467f139c694..f43fbee9cb78c47b6729836a39b2edb8ccd68864 100644 (file)
@@ -62,6 +62,7 @@ include "../adminer/lang/$LANG.inc.php";
 include "../adminer/include/pdo.inc.php";
 include "../adminer/drivers/sqlite.inc.php";
 include "../adminer/drivers/pgsql.inc.php";
+include "../adminer/drivers/oracle.inc.php";
 include "../adminer/drivers/mssql.inc.php";
 include "../adminer/drivers/mysql.inc.php"; // must be included as last driver
 
index c7d02cdbb82091be8166dd049805708ab20c33fa..af3676accb9ddfa14266be4d57cf8338fb31d122 100644 (file)
@@ -1,5 +1,5 @@
 Adminer 3.0.0-dev:
-Drivers for MS SQL, SQLite, PostgreSQL
+Drivers for MS SQL, SQLite, PostgreSQL, Oracle
 Allow concurrent logins on the same server
 Allow permanent login without customization
 In-place editation in select