mirror of
https://github.com/vrana/adminer.git
synced 2025-08-31 01:59:59 +02:00
Compare commits
1 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
5ef2068837 |
6
.gitmodules
vendored
6
.gitmodules
vendored
@@ -4,9 +4,3 @@
|
|||||||
[submodule "JsShrink"]
|
[submodule "JsShrink"]
|
||||||
path = externals/JsShrink
|
path = externals/JsShrink
|
||||||
url = git://github.com/vrana/JsShrink
|
url = git://github.com/vrana/JsShrink
|
||||||
[submodule "designs/hydra"]
|
|
||||||
path = designs/hydra
|
|
||||||
url = https://github.com/Niyko/Hydra-Dark-Theme-for-Adminer
|
|
||||||
[submodule "designs/pepa-linha-dark"]
|
|
||||||
path = designs/pepa-linha-dark
|
|
||||||
url = https://github.com/pepa-linha/Adminer-Design-Dark/
|
|
||||||
|
@@ -4,6 +4,4 @@ php:
|
|||||||
- 7.1
|
- 7.1
|
||||||
- 7.2
|
- 7.2
|
||||||
- 7.3
|
- 7.3
|
||||||
- 7.4
|
|
||||||
- 8.0
|
|
||||||
script: git diff --name-only $TRAVIS_COMMIT_RANGE | grep '\.php$' | xargs -n1 -P8 php -l | grep -v 'No syntax errors'; test $? -eq 1
|
script: git diff --name-only $TRAVIS_COMMIT_RANGE | grep '\.php$' | xargs -n1 -P8 php -l | grep -v 'No syntax errors'; test $? -eq 1
|
||||||
|
39
Makefile
39
Makefile
@@ -1,39 +0,0 @@
|
|||||||
ROOT_DIRECTORY = $(shell dirname "$(realpath $(lastword $(MAKEFILE_LIST)))")
|
|
||||||
PHP := $(shell which php)
|
|
||||||
PORT := 8000
|
|
||||||
|
|
||||||
|
|
||||||
.DEFAULT_GOAL := default
|
|
||||||
|
|
||||||
|
|
||||||
.PHONY: default
|
|
||||||
default: compile
|
|
||||||
|
|
||||||
.PHONY: compile
|
|
||||||
compile:
|
|
||||||
$(PHP) $(ROOT_DIRECTORY)/compile.php
|
|
||||||
|
|
||||||
.PHONY: server
|
|
||||||
server:
|
|
||||||
php \
|
|
||||||
--server 127.0.0.1:$(PORT) \
|
|
||||||
--docroot $(ROOT_DIRECTORY)
|
|
||||||
|
|
||||||
.PHONY: initialize
|
|
||||||
initialize:
|
|
||||||
git \
|
|
||||||
-C $(ROOT_DIRECTORY) \
|
|
||||||
submodule \
|
|
||||||
update \
|
|
||||||
--init \
|
|
||||||
--recursive
|
|
||||||
|
|
||||||
.PHONY: clean
|
|
||||||
clean:
|
|
||||||
rm \
|
|
||||||
--recursive \
|
|
||||||
--force \
|
|
||||||
$(ROOT_DIRECTORY)/adminer.php
|
|
||||||
|
|
||||||
.PHONY: clean.all
|
|
||||||
clean.all: clean
|
|
@@ -54,7 +54,7 @@ if ($_POST && !process_fields($row["fields"]) && !$error) {
|
|||||||
}
|
}
|
||||||
$process_field = process_field($field, $type_field);
|
$process_field = process_field($field, $type_field);
|
||||||
$all_fields[] = array($field["orig"], $process_field, $after);
|
$all_fields[] = array($field["orig"], $process_field, $after);
|
||||||
if (!$orig_field || $process_field != process_field($orig_field, $orig_field)) {
|
if ($process_field != process_field($orig_field, $orig_field)) {
|
||||||
$fields[] = array($field["orig"], $process_field, $after);
|
$fields[] = array($field["orig"], $process_field, $after);
|
||||||
if ($field["orig"] != "" || $after) {
|
if ($field["orig"] != "" || $after) {
|
||||||
$use_all_fields = true;
|
$use_all_fields = true;
|
||||||
|
@@ -112,7 +112,7 @@ if ($adminer->homepage()) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
echo "<tr><td><th>" . lang('%d in total', count($tables_list));
|
echo "<tr><td><th>" . lang('%d in total', count($tables_list));
|
||||||
echo "<td>" . h($jush == "sql" ? $connection->result("SELECT @@default_storage_engine") : "");
|
echo "<td>" . h($jush == "sql" ? $connection->result("SELECT @@storage_engine") : "");
|
||||||
echo "<td>" . h(db_collation(DB, collations()));
|
echo "<td>" . h(db_collation(DB, collations()));
|
||||||
foreach (array("Data_length", "Index_length", "Data_free") as $key) {
|
foreach (array("Data_length", "Index_length", "Data_free") as $key) {
|
||||||
echo "<td align='right' id='sum-$key'>";
|
echo "<td align='right' id='sum-$key'>";
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
add_driver("clickhouse", "ClickHouse (alpha)");
|
$drivers["clickhouse"] = "ClickHouse (alpha)";
|
||||||
|
|
||||||
if (isset($_GET["clickhouse"])) {
|
if (isset($_GET["clickhouse"])) {
|
||||||
define("DRIVER", "clickhouse");
|
define("DRIVER", "clickhouse");
|
||||||
@@ -22,7 +22,7 @@ if (isset($_GET["clickhouse"])) {
|
|||||||
return $file;
|
return $file;
|
||||||
}
|
}
|
||||||
if (!preg_match('~^HTTP/[0-9.]+ 2~i', $http_response_header[0])) {
|
if (!preg_match('~^HTTP/[0-9.]+ 2~i', $http_response_header[0])) {
|
||||||
$this->error = lang('Invalid credentials.') . " $http_response_header[0]";
|
$this->error = $file;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
$return = json_decode($file, true);
|
$return = json_decode($file, true);
|
||||||
@@ -306,7 +306,7 @@ if (isset($_GET["clickhouse"])) {
|
|||||||
function fields($table) {
|
function fields($table) {
|
||||||
$return = array();
|
$return = array();
|
||||||
$result = get_rows("SELECT name, type, default_expression FROM system.columns WHERE " . idf_escape('table') . " = " . q($table));
|
$result = get_rows("SELECT name, type, default_expression FROM system.columns WHERE " . idf_escape('table') . " = " . q($table));
|
||||||
foreach ($result as $row) {
|
foreach($result as $row) {
|
||||||
$type = trim($row['type']);
|
$type = trim($row['type']);
|
||||||
$nullable = strpos($type, 'Nullable(') === 0;
|
$nullable = strpos($type, 'Nullable(') === 0;
|
||||||
$return[trim($row['name'])] = array(
|
$return[trim($row['name'])] = array(
|
||||||
@@ -372,27 +372,21 @@ if (isset($_GET["clickhouse"])) {
|
|||||||
return preg_match("~^(columns|sql|status|table|drop_col)$~", $feature);
|
return preg_match("~^(columns|sql|status|table|drop_col)$~", $feature);
|
||||||
}
|
}
|
||||||
|
|
||||||
function driver_config() {
|
$jush = "clickhouse";
|
||||||
$types = array();
|
$types = array();
|
||||||
$structured_types = array();
|
$structured_types = array();
|
||||||
foreach (array( //! arrays
|
foreach (array( //! arrays
|
||||||
lang('Numbers') => array("Int8" => 3, "Int16" => 5, "Int32" => 10, "Int64" => 19, "UInt8" => 3, "UInt16" => 5, "UInt32" => 10, "UInt64" => 20, "Float32" => 7, "Float64" => 16, 'Decimal' => 38, 'Decimal32' => 9, 'Decimal64' => 18, 'Decimal128' => 38),
|
lang('Numbers') => array("Int8" => 3, "Int16" => 5, "Int32" => 10, "Int64" => 19, "UInt8" => 3, "UInt16" => 5, "UInt32" => 10, "UInt64" => 20, "Float32" => 7, "Float64" => 16, 'Decimal' => 38, 'Decimal32' => 9, 'Decimal64' => 18, 'Decimal128' => 38),
|
||||||
lang('Date and time') => array("Date" => 13, "DateTime" => 20),
|
lang('Date and time') => array("Date" => 13, "DateTime" => 20),
|
||||||
lang('Strings') => array("String" => 0),
|
lang('Strings') => array("String" => 0),
|
||||||
lang('Binary') => array("FixedString" => 0),
|
lang('Binary') => array("FixedString" => 0),
|
||||||
) as $key => $val) {
|
) as $key => $val) {
|
||||||
$types += $val;
|
$types += $val;
|
||||||
$structured_types[$key] = array_keys($val);
|
$structured_types[$key] = array_keys($val);
|
||||||
}
|
|
||||||
return array(
|
|
||||||
'jush' => "clickhouse",
|
|
||||||
'types' => $types,
|
|
||||||
'structured_types' => $structured_types,
|
|
||||||
'unsigned' => array(),
|
|
||||||
'operators' => array("=", "<", ">", "<=", ">=", "!=", "~", "!~", "LIKE", "LIKE %%", "IN", "IS NULL", "NOT LIKE", "NOT IN", "IS NOT NULL", "SQL"),
|
|
||||||
'functions' => array(),
|
|
||||||
'grouping' => array("avg", "count", "count distinct", "max", "min", "sum"),
|
|
||||||
'edit_functions' => array(),
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
$unsigned = array();
|
||||||
|
$operators = array("=", "<", ">", "<=", ">=", "!=", "~", "!~", "LIKE", "LIKE %%", "IN", "IS NULL", "NOT LIKE", "NOT IN", "IS NOT NULL", "SQL");
|
||||||
|
$functions = array();
|
||||||
|
$grouping = array("avg", "count", "count distinct", "max", "min", "sum");
|
||||||
|
$edit_functions = array();
|
||||||
}
|
}
|
@@ -2,11 +2,12 @@
|
|||||||
$drivers["elastic"] = "Elasticsearch (beta)";
|
$drivers["elastic"] = "Elasticsearch (beta)";
|
||||||
|
|
||||||
if (isset($_GET["elastic"])) {
|
if (isset($_GET["elastic"])) {
|
||||||
|
$possible_drivers = array("json + allow_url_fopen");
|
||||||
define("DRIVER", "elastic");
|
define("DRIVER", "elastic");
|
||||||
|
|
||||||
if (function_exists('json_decode') && ini_bool('allow_url_fopen')) {
|
if (function_exists('json_decode') && ini_bool('allow_url_fopen')) {
|
||||||
class Min_DB {
|
class Min_DB {
|
||||||
var $extension = "JSON", $server_info, $errno, $error, $_url, $_db;
|
var $extension = "JSON", $server_info, $errno, $error, $_url;
|
||||||
|
|
||||||
/** Performs query
|
/** Performs query
|
||||||
* @param string
|
* @param string
|
||||||
@@ -27,7 +28,7 @@ if (isset($_GET["elastic"])) {
|
|||||||
return $file;
|
return $file;
|
||||||
}
|
}
|
||||||
if (!preg_match('~^HTTP/[0-9.]+ 2~i', $http_response_header[0])) {
|
if (!preg_match('~^HTTP/[0-9.]+ 2~i', $http_response_header[0])) {
|
||||||
$this->error = lang('Invalid credentials.') . " $http_response_header[0]";
|
$this->error = $file;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
$return = json_decode($file, true);
|
$return = json_decode($file, true);
|
||||||
@@ -283,11 +284,6 @@ if (isset($_GET["elastic"])) {
|
|||||||
|
|
||||||
function tables_list() {
|
function tables_list() {
|
||||||
global $connection;
|
global $connection;
|
||||||
|
|
||||||
if (min_version(6)) {
|
|
||||||
return array('_doc' => 'table');
|
|
||||||
}
|
|
||||||
|
|
||||||
$return = $connection->query('_mapping');
|
$return = $connection->query('_mapping');
|
||||||
if ($return) {
|
if ($return) {
|
||||||
$return = array_fill_keys(array_keys($return[$connection->_db]["mappings"]), 'table');
|
$return = array_fill_keys(array_keys($return[$connection->_db]["mappings"]), 'table');
|
||||||
@@ -343,35 +339,25 @@ if (isset($_GET["elastic"])) {
|
|||||||
|
|
||||||
function fields($table) {
|
function fields($table) {
|
||||||
global $connection;
|
global $connection;
|
||||||
|
$result = $connection->query("$table/_mapping");
|
||||||
$mappings = array();
|
|
||||||
if (min_version(6)) {
|
|
||||||
$result = $connection->query("_mapping");
|
|
||||||
if ($result) {
|
|
||||||
$mappings = $result[$connection->_db]['mappings']['properties'];
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
$result = $connection->query("$table/_mapping");
|
|
||||||
if ($result) {
|
|
||||||
$mappings = $result[$table]['properties'];
|
|
||||||
if (!$mappings) {
|
|
||||||
$mappings = $result[$connection->_db]['mappings'][$table]['properties'];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$return = array();
|
$return = array();
|
||||||
if ($mappings) {
|
if ($result) {
|
||||||
foreach ($mappings as $name => $field) {
|
$mappings = $result[$table]['properties'];
|
||||||
$return[$name] = array(
|
if (!$mappings) {
|
||||||
"field" => $name,
|
$mappings = $result[$connection->_db]['mappings'][$table]['properties'];
|
||||||
"full_type" => $field["type"],
|
}
|
||||||
"type" => $field["type"],
|
if ($mappings) {
|
||||||
"privileges" => array("insert" => 1, "select" => 1, "update" => 1),
|
foreach ($mappings as $name => $field) {
|
||||||
);
|
$return[$name] = array(
|
||||||
if ($field["properties"]) { // only leaf fields can be edited
|
"field" => $name,
|
||||||
unset($return[$name]["privileges"]["insert"]);
|
"full_type" => $field["type"],
|
||||||
unset($return[$name]["privileges"]["update"]);
|
"type" => $field["type"],
|
||||||
|
"privileges" => array("insert" => 1, "select" => 1, "update" => 1),
|
||||||
|
);
|
||||||
|
if ($field["properties"]) { // only leaf fields can be edited
|
||||||
|
unset($return[$name]["privileges"]["insert"]);
|
||||||
|
unset($return[$name]["privileges"]["update"]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -460,27 +446,20 @@ if (isset($_GET["elastic"])) {
|
|||||||
return $connection->last_id;
|
return $connection->last_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
function driver_config() {
|
$jush = "elastic";
|
||||||
$types = array();
|
$operators = array("=", "query");
|
||||||
$structured_types = array();
|
$functions = array();
|
||||||
foreach (array(
|
$grouping = array();
|
||||||
lang('Numbers') => array("long" => 3, "integer" => 5, "short" => 8, "byte" => 10, "double" => 20, "float" => 66, "half_float" => 12, "scaled_float" => 21),
|
$edit_functions = array(array("json"));
|
||||||
lang('Date and time') => array("date" => 10),
|
$types = array(); ///< @var array ($type => $maximum_unsigned_length, ...)
|
||||||
lang('Strings') => array("string" => 65535, "text" => 65535),
|
$structured_types = array(); ///< @var array ($description => array($type, ...), ...)
|
||||||
lang('Binary') => array("binary" => 255),
|
foreach (array(
|
||||||
) as $key => $val) {
|
lang('Numbers') => array("long" => 3, "integer" => 5, "short" => 8, "byte" => 10, "double" => 20, "float" => 66, "half_float" => 12, "scaled_float" => 21),
|
||||||
$types += $val;
|
lang('Date and time') => array("date" => 10),
|
||||||
$structured_types[$key] = array_keys($val);
|
lang('Strings') => array("string" => 65535, "text" => 65535),
|
||||||
}
|
lang('Binary') => array("binary" => 255),
|
||||||
return array(
|
) as $key => $val) {
|
||||||
'possible_drivers' => array("json + allow_url_fopen"),
|
$types += $val;
|
||||||
'jush' => "elastic",
|
$structured_types[$key] = array_keys($val);
|
||||||
'operators' => array("=", "query"),
|
|
||||||
'functions' => array(),
|
|
||||||
'grouping' => array(),
|
|
||||||
'edit_functions' => array(array("json")),
|
|
||||||
'types' => $types,
|
|
||||||
'structured_types' => $structured_types,
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -3,9 +3,10 @@
|
|||||||
* @author Steve Krämer
|
* @author Steve Krämer
|
||||||
*/
|
*/
|
||||||
|
|
||||||
add_driver('firebird', 'Firebird (alpha)');
|
$drivers['firebird'] = 'Firebird (alpha)';
|
||||||
|
|
||||||
if (isset($_GET["firebird"])) {
|
if (isset($_GET["firebird"])) {
|
||||||
|
$possible_drivers = array("interbase");
|
||||||
define("DRIVER", "firebird");
|
define("DRIVER", "firebird");
|
||||||
|
|
||||||
if (extension_loaded("interbase") ) {
|
if (extension_loaded("interbase") ) {
|
||||||
@@ -311,14 +312,9 @@ ORDER BY RDB$INDEX_SEGMENTS.RDB$FIELD_POSITION';
|
|||||||
return preg_match("~^(columns|sql|status|table)$~", $feature);
|
return preg_match("~^(columns|sql|status|table)$~", $feature);
|
||||||
}
|
}
|
||||||
|
|
||||||
function driver_config() {
|
$jush = "firebird";
|
||||||
return array(
|
$operators = array("=");
|
||||||
'possible_drivers' => array("interbase"),
|
$functions = array();
|
||||||
'jush' => "firebird",
|
$grouping = array();
|
||||||
'operators' => array("="),
|
$edit_functions = array();
|
||||||
'functions' => array(),
|
|
||||||
'grouping' => array(),
|
|
||||||
'edit_functions' => array(),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
}
|
@@ -1,7 +1,8 @@
|
|||||||
<?php
|
<?php
|
||||||
$drivers["mongo"] = "MongoDB (alpha)";
|
$drivers["mongo"] = "MongoDB";
|
||||||
|
|
||||||
if (isset($_GET["mongo"])) {
|
if (isset($_GET["mongo"])) {
|
||||||
|
$possible_drivers = array("mongo", "mongodb");
|
||||||
define("DRIVER", "mongo");
|
define("DRIVER", "mongo");
|
||||||
|
|
||||||
if (class_exists('MongoDB')) {
|
if (class_exists('MongoDB')) {
|
||||||
@@ -9,20 +10,7 @@ if (isset($_GET["mongo"])) {
|
|||||||
var $extension = "Mongo", $server_info = MongoClient::VERSION, $error, $last_id, $_link, $_db;
|
var $extension = "Mongo", $server_info = MongoClient::VERSION, $error, $last_id, $_link, $_db;
|
||||||
|
|
||||||
function connect($uri, $options) {
|
function connect($uri, $options) {
|
||||||
try {
|
return @new MongoClient($uri, $options);
|
||||||
$this->_link = new MongoClient($uri, $options);
|
|
||||||
if ($options["password"] != "") {
|
|
||||||
$options["password"] = "";
|
|
||||||
try {
|
|
||||||
new MongoClient($uri, $options);
|
|
||||||
$this->error = lang('Database does not support password.');
|
|
||||||
} catch (Exception $e) {
|
|
||||||
// this is what we want
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (Exception $e) {
|
|
||||||
$this->error = $e->getMessage();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function query($query) {
|
function query($query) {
|
||||||
@@ -42,6 +30,7 @@ if (isset($_GET["mongo"])) {
|
|||||||
function quote($string) {
|
function quote($string) {
|
||||||
return $string;
|
return $string;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
class Min_Result {
|
class Min_Result {
|
||||||
@@ -55,10 +44,10 @@ if (isset($_GET["mongo"])) {
|
|||||||
$this->_charset[$key] = 63;
|
$this->_charset[$key] = 63;
|
||||||
}
|
}
|
||||||
$row[$key] =
|
$row[$key] =
|
||||||
(is_a($val, 'MongoId') ? "ObjectId(\"$val\")" :
|
(is_a($val, 'MongoId') ? 'ObjectId("' . strval($val) . '")' :
|
||||||
(is_a($val, 'MongoDate') ? gmdate("Y-m-d H:i:s", $val->sec) . " GMT" :
|
(is_a($val, 'MongoDate') ? gmdate("Y-m-d H:i:s", $val->sec) . " GMT" :
|
||||||
(is_a($val, 'MongoBinData') ? $val->bin : //! allow downloading
|
(is_a($val, 'MongoBinData') ? $val->bin : //! allow downloading
|
||||||
(is_a($val, 'MongoRegex') ? "$val" :
|
(is_a($val, 'MongoRegex') ? strval($val) :
|
||||||
(is_object($val) ? get_class($val) : // MongoMinKey, MongoMaxKey
|
(is_object($val) ? get_class($val) : // MongoMinKey, MongoMaxKey
|
||||||
$val
|
$val
|
||||||
)))));
|
)))));
|
||||||
@@ -209,36 +198,14 @@ if (isset($_GET["mongo"])) {
|
|||||||
|
|
||||||
} elseif (class_exists('MongoDB\Driver\Manager')) {
|
} elseif (class_exists('MongoDB\Driver\Manager')) {
|
||||||
class Min_DB {
|
class Min_DB {
|
||||||
var $extension = "MongoDB", $server_info = MONGODB_VERSION, $affected_rows, $error, $last_id;
|
var $extension = "MongoDB", $server_info = MONGODB_VERSION, $error, $last_id;
|
||||||
/** @var MongoDB\Driver\Manager */
|
/** @var MongoDB\Driver\Manager */
|
||||||
var $_link;
|
var $_link;
|
||||||
var $_db, $_db_name;
|
var $_db, $_db_name;
|
||||||
|
|
||||||
function connect($uri, $options) {
|
function connect($uri, $options) {
|
||||||
$class = 'MongoDB\Driver\Manager';
|
$class = 'MongoDB\Driver\Manager';
|
||||||
$this->_link = new $class($uri, $options);
|
return new $class($uri, $options);
|
||||||
$this->executeCommand('admin', array('ping' => 1));
|
|
||||||
}
|
|
||||||
|
|
||||||
function executeCommand($db, $command) {
|
|
||||||
$class = 'MongoDB\Driver\Command';
|
|
||||||
try {
|
|
||||||
return $this->_link->executeCommand($db, new $class($command));
|
|
||||||
} catch (Exception $e) {
|
|
||||||
$this->error = $e->getMessage();
|
|
||||||
return array();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function executeBulkWrite($namespace, $bulk, $counter) {
|
|
||||||
try {
|
|
||||||
$results = $this->_link->executeBulkWrite($namespace, $bulk);
|
|
||||||
$this->affected_rows = $results->$counter();
|
|
||||||
return true;
|
|
||||||
} catch (Exception $e) {
|
|
||||||
$this->error = $e->getMessage();
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function query($query) {
|
function query($query) {
|
||||||
@@ -253,6 +220,7 @@ if (isset($_GET["mongo"])) {
|
|||||||
function quote($string) {
|
function quote($string) {
|
||||||
return $string;
|
return $string;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
class Min_Result {
|
class Min_Result {
|
||||||
@@ -266,13 +234,13 @@ if (isset($_GET["mongo"])) {
|
|||||||
$this->_charset[$key] = 63;
|
$this->_charset[$key] = 63;
|
||||||
}
|
}
|
||||||
$row[$key] =
|
$row[$key] =
|
||||||
(is_a($val, 'MongoDB\BSON\ObjectID') ? 'MongoDB\BSON\ObjectID("' . "$val\")" :
|
(is_a($val, 'MongoDB\BSON\ObjectID') ? 'MongoDB\BSON\ObjectID("' . strval($val) . '")' :
|
||||||
(is_a($val, 'MongoDB\BSON\UTCDatetime') ? $val->toDateTime()->format('Y-m-d H:i:s') :
|
(is_a($val, 'MongoDB\BSON\UTCDatetime') ? $val->toDateTime()->format('Y-m-d H:i:s') :
|
||||||
(is_a($val, 'MongoDB\BSON\Binary') ? $val->getData() : //! allow downloading
|
(is_a($val, 'MongoDB\BSON\Binary') ? $val->bin : //! allow downloading
|
||||||
(is_a($val, 'MongoDB\BSON\Regex') ? "$val" :
|
(is_a($val, 'MongoDB\BSON\Regex') ? strval($val) :
|
||||||
(is_object($val) || is_array($val) ? json_encode($val, 256) : // 256 = JSON_UNESCAPED_UNICODE
|
(is_object($val) ? json_encode($val, 256) : // 256 = JSON_UNESCAPED_UNICODE
|
||||||
$val // MongoMinKey, MongoMaxKey
|
$val // MongoMinKey, MongoMaxKey
|
||||||
)))));
|
)))));
|
||||||
}
|
}
|
||||||
$this->_rows[] = $row;
|
$this->_rows[] = $row;
|
||||||
foreach ($row as $key => $val) {
|
foreach ($row as $key => $val) {
|
||||||
@@ -281,7 +249,7 @@ if (isset($_GET["mongo"])) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
$this->num_rows = count($this->_rows);
|
$this->num_rows = $result->count;
|
||||||
}
|
}
|
||||||
|
|
||||||
function fetch_assoc() {
|
function fetch_assoc() {
|
||||||
@@ -341,12 +309,9 @@ if (isset($_GET["mongo"])) {
|
|||||||
$limit = min(200, max(1, (int) $limit));
|
$limit = min(200, max(1, (int) $limit));
|
||||||
$skip = $page * $limit;
|
$skip = $page * $limit;
|
||||||
$class = 'MongoDB\Driver\Query';
|
$class = 'MongoDB\Driver\Query';
|
||||||
try {
|
$query = new $class($where, array('projection' => $select, 'limit' => $limit, 'skip' => $skip, 'sort' => $sort));
|
||||||
return new Min_Result($connection->_link->executeQuery("$connection->_db_name.$table", new $class($where, array('projection' => $select, 'limit' => $limit, 'skip' => $skip, 'sort' => $sort))));
|
$results = $connection->_link->executeQuery("$connection->_db_name.$table", $query);
|
||||||
} catch (Exception $e) {
|
return new Min_Result($results);
|
||||||
$connection->error = $e->getMessage();
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function update($table, $set, $queryWhere, $limit = 0, $separator = "\n") {
|
function update($table, $set, $queryWhere, $limit = 0, $separator = "\n") {
|
||||||
@@ -370,7 +335,9 @@ if (isset($_GET["mongo"])) {
|
|||||||
$update['$unset'] = $removeFields;
|
$update['$unset'] = $removeFields;
|
||||||
}
|
}
|
||||||
$bulk->update($where, $update, array('upsert' => false));
|
$bulk->update($where, $update, array('upsert' => false));
|
||||||
return $connection->executeBulkWrite("$db.$table", $bulk, 'getModifiedCount');
|
$results = $connection->_link->executeBulkWrite("$db.$table", $bulk);
|
||||||
|
$connection->affected_rows = $results->getModifiedCount();
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
function delete($table, $queryWhere, $limit = 0) {
|
function delete($table, $queryWhere, $limit = 0) {
|
||||||
@@ -380,7 +347,9 @@ if (isset($_GET["mongo"])) {
|
|||||||
$class = 'MongoDB\Driver\BulkWrite';
|
$class = 'MongoDB\Driver\BulkWrite';
|
||||||
$bulk = new $class(array());
|
$bulk = new $class(array());
|
||||||
$bulk->delete($where, array('limit' => $limit));
|
$bulk->delete($where, array('limit' => $limit));
|
||||||
return $connection->executeBulkWrite("$db.$table", $bulk, 'getDeletedCount');
|
$results = $connection->_link->executeBulkWrite("$db.$table", $bulk);
|
||||||
|
$connection->affected_rows = $results->getDeletedCount();
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
function insert($table, $set) {
|
function insert($table, $set) {
|
||||||
@@ -388,18 +357,24 @@ if (isset($_GET["mongo"])) {
|
|||||||
$db = $connection->_db_name;
|
$db = $connection->_db_name;
|
||||||
$class = 'MongoDB\Driver\BulkWrite';
|
$class = 'MongoDB\Driver\BulkWrite';
|
||||||
$bulk = new $class(array());
|
$bulk = new $class(array());
|
||||||
if ($set['_id'] == '') {
|
if (isset($set['_id']) && empty($set['_id'])) {
|
||||||
unset($set['_id']);
|
unset($set['_id']);
|
||||||
}
|
}
|
||||||
$bulk->insert($set);
|
$bulk->insert($set);
|
||||||
return $connection->executeBulkWrite("$db.$table", $bulk, 'getInsertedCount');
|
$results = $connection->_link->executeBulkWrite("$db.$table", $bulk);
|
||||||
|
$connection->affected_rows = $results->getInsertedCount();
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function get_databases($flush) {
|
function get_databases($flush) {
|
||||||
|
/** @var Min_DB */
|
||||||
global $connection;
|
global $connection;
|
||||||
$return = array();
|
$return = array();
|
||||||
foreach ($connection->executeCommand('admin', array('listDatabases' => 1)) as $dbs) {
|
$class = 'MongoDB\Driver\Command';
|
||||||
|
$command = new $class(array('listDatabases' => 1));
|
||||||
|
$results = $connection->_link->executeCommand('admin', $command);
|
||||||
|
foreach ($results as $dbs) {
|
||||||
foreach ($dbs->databases as $db) {
|
foreach ($dbs->databases as $db) {
|
||||||
$return[] = $db->name;
|
$return[] = $db->name;
|
||||||
}
|
}
|
||||||
@@ -414,8 +389,11 @@ if (isset($_GET["mongo"])) {
|
|||||||
|
|
||||||
function tables_list() {
|
function tables_list() {
|
||||||
global $connection;
|
global $connection;
|
||||||
|
$class = 'MongoDB\Driver\Command';
|
||||||
|
$command = new $class(array('listCollections' => 1));
|
||||||
|
$results = $connection->_link->executeCommand($connection->_db_name, $command);
|
||||||
$collections = array();
|
$collections = array();
|
||||||
foreach ($connection->executeCommand($connection->_db_name, array('listCollections' => 1)) as $result) {
|
foreach ($results as $result) {
|
||||||
$collections[$result->name] = 'table';
|
$collections[$result->name] = 'table';
|
||||||
}
|
}
|
||||||
return $collections;
|
return $collections;
|
||||||
@@ -428,7 +406,10 @@ if (isset($_GET["mongo"])) {
|
|||||||
function indexes($table, $connection2 = null) {
|
function indexes($table, $connection2 = null) {
|
||||||
global $connection;
|
global $connection;
|
||||||
$return = array();
|
$return = array();
|
||||||
foreach ($connection->executeCommand($connection->_db_name, array('listIndexes' => $table)) as $index) {
|
$class = 'MongoDB\Driver\Command';
|
||||||
|
$command = new $class(array('listIndexes' => $table));
|
||||||
|
$results = $connection->_link->executeCommand($connection->_db_name, $command);
|
||||||
|
foreach ($results as $index) {
|
||||||
$descs = array();
|
$descs = array();
|
||||||
$columns = array();
|
$columns = array();
|
||||||
foreach (get_object_vars($index->key) as $column => $type) {
|
foreach (get_object_vars($index->key) as $column => $type) {
|
||||||
@@ -446,26 +427,24 @@ if (isset($_GET["mongo"])) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function fields($table) {
|
function fields($table) {
|
||||||
global $driver;
|
|
||||||
$fields = fields_from_edit();
|
$fields = fields_from_edit();
|
||||||
if (!$fields) {
|
if (!count($fields)) {
|
||||||
|
global $driver;
|
||||||
$result = $driver->select($table, array("*"), null, null, array(), 10);
|
$result = $driver->select($table, array("*"), null, null, array(), 10);
|
||||||
if ($result) {
|
while ($row = $result->fetch_assoc()) {
|
||||||
while ($row = $result->fetch_assoc()) {
|
foreach ($row as $key => $val) {
|
||||||
foreach ($row as $key => $val) {
|
$row[$key] = null;
|
||||||
$row[$key] = null;
|
$fields[$key] = array(
|
||||||
$fields[$key] = array(
|
"field" => $key,
|
||||||
"field" => $key,
|
"type" => "string",
|
||||||
"type" => "string",
|
"null" => ($key != $driver->primary),
|
||||||
"null" => ($key != $driver->primary),
|
"auto_increment" => ($key == $driver->primary),
|
||||||
"auto_increment" => ($key == $driver->primary),
|
"privileges" => array(
|
||||||
"privileges" => array(
|
"insert" => 1,
|
||||||
"insert" => 1,
|
"select" => 1,
|
||||||
"select" => 1,
|
"update" => 1,
|
||||||
"update" => 1,
|
),
|
||||||
),
|
);
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -475,12 +454,16 @@ if (isset($_GET["mongo"])) {
|
|||||||
function found_rows($table_status, $where) {
|
function found_rows($table_status, $where) {
|
||||||
global $connection;
|
global $connection;
|
||||||
$where = where_to_query($where);
|
$where = where_to_query($where);
|
||||||
$toArray = $connection->executeCommand($connection->_db_name, array('count' => $table_status['Name'], 'query' => $where))->toArray();
|
$class = 'MongoDB\Driver\Command';
|
||||||
|
$command = new $class(array('count' => $table_status['Name'], 'query' => $where));
|
||||||
|
$results = $connection->_link->executeCommand($connection->_db_name, $command);
|
||||||
|
$toArray = $results->toArray();
|
||||||
return $toArray[0]->n;
|
return $toArray[0]->n;
|
||||||
}
|
}
|
||||||
|
|
||||||
function sql_query_where_parser($queryWhere) {
|
function sql_query_where_parser($queryWhere) {
|
||||||
$queryWhere = preg_replace('~^\sWHERE \(?\(?(.+?)\)?\)?$~', '\1', $queryWhere);
|
$queryWhere = trim(preg_replace('/WHERE[\s]?[(]?\(?/', '', $queryWhere));
|
||||||
|
$queryWhere = preg_replace('/\)\)\)$/', ')', $queryWhere);
|
||||||
$wheres = explode(' AND ', $queryWhere);
|
$wheres = explode(' AND ', $queryWhere);
|
||||||
$wheresOr = explode(') OR (', $queryWhere);
|
$wheresOr = explode(') OR (', $queryWhere);
|
||||||
$where = array();
|
$where = array();
|
||||||
@@ -502,8 +485,10 @@ if (isset($_GET["mongo"])) {
|
|||||||
if (is_array($where)) {
|
if (is_array($where)) {
|
||||||
foreach ($where as $expression) {
|
foreach ($where as $expression) {
|
||||||
list($col, $op, $val) = explode(" ", $expression, 3);
|
list($col, $op, $val) = explode(" ", $expression, 3);
|
||||||
if ($col == "_id" && preg_match('~^(MongoDB\\\\BSON\\\\ObjectID)\("(.+)"\)$~', $val, $match)) {
|
if ($col == "_id") {
|
||||||
list(, $class, $val) = $match;
|
$val = str_replace('MongoDB\BSON\ObjectID("', "", $val);
|
||||||
|
$val = str_replace('")', "", $val);
|
||||||
|
$class = 'MongoDB\BSON\ObjectID';
|
||||||
$val = new $class($val);
|
$val = new $class($val);
|
||||||
}
|
}
|
||||||
if (!in_array($op, $adminer->operators)) {
|
if (!in_array($op, $adminer->operators)) {
|
||||||
@@ -575,7 +560,6 @@ if (isset($_GET["mongo"])) {
|
|||||||
"(date)>=",
|
"(date)>=",
|
||||||
"(date)<=",
|
"(date)<=",
|
||||||
);
|
);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function table($idf) {
|
function table($idf) {
|
||||||
@@ -637,11 +621,21 @@ if (isset($_GET["mongo"])) {
|
|||||||
if (($auth_source = getenv("MONGO_AUTH_SOURCE"))) {
|
if (($auth_source = getenv("MONGO_AUTH_SOURCE"))) {
|
||||||
$options["authSource"] = $auth_source;
|
$options["authSource"] = $auth_source;
|
||||||
}
|
}
|
||||||
$connection->connect("mongodb://$server", $options);
|
try {
|
||||||
if ($connection->error) {
|
$connection->_link = $connection->connect("mongodb://$server", $options);
|
||||||
return $connection->error;
|
if ($password != "") {
|
||||||
|
$options["password"] = "";
|
||||||
|
try {
|
||||||
|
$connection->connect("mongodb://$server", $options);
|
||||||
|
return lang('Database does not support password.');
|
||||||
|
} catch (Exception $ex) {
|
||||||
|
// this is what we want
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $connection;
|
||||||
|
} catch (Exception $ex) {
|
||||||
|
return $ex->getMessage();
|
||||||
}
|
}
|
||||||
return $connection;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function alter_indexes($table, $alter) {
|
function alter_indexes($table, $alter) {
|
||||||
@@ -731,15 +725,8 @@ if (isset($_GET["mongo"])) {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
function driver_config() {
|
$jush = "mongo";
|
||||||
global $operators;
|
$functions = array();
|
||||||
return array(
|
$grouping = array();
|
||||||
'possible_drivers' => array("mongo", "mongodb"),
|
$edit_functions = array(array("json"));
|
||||||
'jush' => "mongo",
|
|
||||||
'operators' => $operators,
|
|
||||||
'functions' => array(),
|
|
||||||
'grouping' => array(),
|
|
||||||
'edit_functions' => array(array("json")),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@@ -8,6 +8,7 @@
|
|||||||
$drivers["mssql"] = "MS SQL (beta)";
|
$drivers["mssql"] = "MS SQL (beta)";
|
||||||
|
|
||||||
if (isset($_GET["mssql"])) {
|
if (isset($_GET["mssql"])) {
|
||||||
|
$possible_drivers = array("SQLSRV", "MSSQL", "PDO_DBLIB");
|
||||||
define("DRIVER", "mssql");
|
define("DRIVER", "mssql");
|
||||||
if (extension_loaded("sqlsrv")) {
|
if (extension_loaded("sqlsrv")) {
|
||||||
class Min_DB {
|
class Min_DB {
|
||||||
@@ -367,7 +368,7 @@ if (isset($_GET["mssql"])) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function fields($table) {
|
function fields($table) {
|
||||||
$comments = get_key_vals("SELECT objname, cast(value as varchar(max)) FROM fn_listextendedproperty('MS_DESCRIPTION', 'schema', " . q(get_schema()) . ", 'table', " . q($table) . ", 'column', NULL)");
|
$comments = get_key_vals("SELECT objname, cast(value as varchar) FROM fn_listextendedproperty('MS_DESCRIPTION', 'schema', " . q(get_schema()) . ", 'table', " . q($table) . ", 'column', NULL)");
|
||||||
$return = array();
|
$return = array();
|
||||||
foreach (get_rows("SELECT c.max_length, c.precision, c.scale, c.name, c.is_nullable, c.is_identity, c.collation_name, t.name type, CAST(d.definition as text) [default]
|
foreach (get_rows("SELECT c.max_length, c.precision, c.scale, c.name, c.is_nullable, c.is_identity, c.collation_name, t.name type, CAST(d.definition as text) [default]
|
||||||
FROM sys.all_columns c
|
FROM sys.all_columns c
|
||||||
@@ -494,8 +495,8 @@ WHERE OBJECT_NAME(i.object_id) = " . q($table)
|
|||||||
}
|
}
|
||||||
foreach ($comments as $key => $val) {
|
foreach ($comments as $key => $val) {
|
||||||
$comment = substr($val, 9); // 9 - strlen(" COMMENT ")
|
$comment = substr($val, 9); // 9 - strlen(" COMMENT ")
|
||||||
queries("EXEC sp_dropextendedproperty @name = N'MS_Description', @level0type = N'Schema', @level0name = " . q(get_schema()) . ", @level1type = N'Table', @level1name = " . q($name) . ", @level2type = N'Column', @level2name = " . q($key));
|
queries("EXEC sp_dropextendedproperty @name = N'MS_Description', @level0type = N'Schema', @level0name = " . q(get_schema()) . ", @level1type = N'Table', @level1name = " . q($name) . ", @level2type = N'Column', @level2name = " . q($key));
|
||||||
queries("EXEC sp_addextendedproperty @name = N'MS_Description', @value = " . $comment . ", @level0type = N'Schema', @level0name = " . q(get_schema()) . ", @level1type = N'Table', @level1name = " . q($name) . ", @level2type = N'Column', @level2name = " . q($key));
|
queries("EXEC sp_addextendedproperty @name = N'MS_Description', @value = " . $comment . ", @level0type = N'Schema', @level0name = " . q(get_schema()) . ", @level1type = N'Table', @level1name = " . q($name) . ", @level2type = N'Column', @level2name = " . q($key));
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -645,35 +646,28 @@ WHERE sys1.xtype = 'TR' AND sys2.name = " . q($table)
|
|||||||
return preg_match('~^(comment|columns|database|drop_col|indexes|descidx|scheme|sql|table|trigger|view|view_trigger)$~', $feature); //! routine|
|
return preg_match('~^(comment|columns|database|drop_col|indexes|descidx|scheme|sql|table|trigger|view|view_trigger)$~', $feature); //! routine|
|
||||||
}
|
}
|
||||||
|
|
||||||
function driver_config() {
|
$jush = "mssql";
|
||||||
$types = array();
|
$types = array();
|
||||||
$structured_types = array();
|
$structured_types = array();
|
||||||
foreach (array( //! use sys.types
|
foreach (array( //! use sys.types
|
||||||
lang('Numbers') => array("tinyint" => 3, "smallint" => 5, "int" => 10, "bigint" => 20, "bit" => 1, "decimal" => 0, "real" => 12, "float" => 53, "smallmoney" => 10, "money" => 20),
|
lang('Numbers') => array("tinyint" => 3, "smallint" => 5, "int" => 10, "bigint" => 20, "bit" => 1, "decimal" => 0, "real" => 12, "float" => 53, "smallmoney" => 10, "money" => 20),
|
||||||
lang('Date and time') => array("date" => 10, "smalldatetime" => 19, "datetime" => 19, "datetime2" => 19, "time" => 8, "datetimeoffset" => 10),
|
lang('Date and time') => array("date" => 10, "smalldatetime" => 19, "datetime" => 19, "datetime2" => 19, "time" => 8, "datetimeoffset" => 10),
|
||||||
lang('Strings') => array("char" => 8000, "varchar" => 8000, "text" => 2147483647, "nchar" => 4000, "nvarchar" => 4000, "ntext" => 1073741823),
|
lang('Strings') => array("char" => 8000, "varchar" => 8000, "text" => 2147483647, "nchar" => 4000, "nvarchar" => 4000, "ntext" => 1073741823),
|
||||||
lang('Binary') => array("binary" => 8000, "varbinary" => 8000, "image" => 2147483647),
|
lang('Binary') => array("binary" => 8000, "varbinary" => 8000, "image" => 2147483647),
|
||||||
) as $key => $val) {
|
) as $key => $val) {
|
||||||
$types += $val;
|
$types += $val;
|
||||||
$structured_types[$key] = array_keys($val);
|
$structured_types[$key] = array_keys($val);
|
||||||
}
|
|
||||||
return array(
|
|
||||||
'possible_drivers' => array("SQLSRV", "MSSQL", "PDO_DBLIB"),
|
|
||||||
'jush' => "mssql",
|
|
||||||
'types' => $types,
|
|
||||||
'structured_types' => $structured_types,
|
|
||||||
'unsigned' => array(),
|
|
||||||
'operators' => array("=", "<", ">", "<=", ">=", "!=", "LIKE", "LIKE %%", "IN", "IS NULL", "NOT LIKE", "NOT IN", "IS NOT NULL"),
|
|
||||||
'functions' => array("len", "lower", "round", "upper"),
|
|
||||||
'grouping' => array("avg", "count", "count distinct", "max", "min", "sum"),
|
|
||||||
'edit_functions' => array(
|
|
||||||
array(
|
|
||||||
"date|time" => "getdate",
|
|
||||||
), array(
|
|
||||||
"int|decimal|real|float|money|datetime" => "+/-",
|
|
||||||
"char|text" => "+",
|
|
||||||
)
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
$unsigned = array();
|
||||||
|
$operators = array("=", "<", ">", "<=", ">=", "!=", "LIKE", "LIKE %%", "IN", "IS NULL", "NOT LIKE", "NOT IN", "IS NOT NULL");
|
||||||
|
$functions = array("len", "lower", "round", "upper");
|
||||||
|
$grouping = array("avg", "count", "count distinct", "max", "min", "sum");
|
||||||
|
$edit_functions = array(
|
||||||
|
array(
|
||||||
|
"date|time" => "getdate",
|
||||||
|
), array(
|
||||||
|
"int|decimal|real|float|money|datetime" => "+/-",
|
||||||
|
"char|text" => "+",
|
||||||
|
)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
@@ -2,6 +2,7 @@
|
|||||||
$drivers = array("server" => "MySQL") + $drivers;
|
$drivers = array("server" => "MySQL") + $drivers;
|
||||||
|
|
||||||
if (!defined("DRIVER")) {
|
if (!defined("DRIVER")) {
|
||||||
|
$possible_drivers = array("MySQLi", "MySQL", "PDO_MySQL");
|
||||||
define("DRIVER", "server"); // server - backwards compatibility
|
define("DRIVER", "server"); // server - backwards compatibility
|
||||||
// MySQLi supports everything, MySQL doesn't support multiple result sets, PDO_MySQL doesn't support orgtable
|
// MySQLi supports everything, MySQL doesn't support multiple result sets, PDO_MySQL doesn't support orgtable
|
||||||
if (extension_loaded("mysqli")) {
|
if (extension_loaded("mysqli")) {
|
||||||
@@ -266,7 +267,7 @@ if (!defined("DRIVER")) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function query($query, $unbuffered = false) {
|
function query($query, $unbuffered = false) {
|
||||||
$this->pdo->setAttribute(1000, !$unbuffered); // 1000 - PDO::MYSQL_ATTR_USE_BUFFERED_QUERY
|
$this->setAttribute(1000, !$unbuffered); // 1000 - PDO::MYSQL_ATTR_USE_BUFFERED_QUERY
|
||||||
return parent::query($query, $unbuffered);
|
return parent::query($query, $unbuffered);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -546,7 +547,7 @@ if (!defined("DRIVER")) {
|
|||||||
"type" => $match[1],
|
"type" => $match[1],
|
||||||
"length" => $match[2],
|
"length" => $match[2],
|
||||||
"unsigned" => ltrim($match[3] . $match[4]),
|
"unsigned" => ltrim($match[3] . $match[4]),
|
||||||
"default" => ($row["Default"] != "" || preg_match("~char|set~", $match[1]) ? (preg_match('~text~', $match[1]) ? stripslashes(preg_replace("~^'(.*)'\$~", '\1', $row["Default"])) : $row["Default"]) : null),
|
"default" => ($row["Default"] != "" || preg_match("~char|set~", $match[1]) ? $row["Default"] : null),
|
||||||
"null" => ($row["Null"] == "YES"),
|
"null" => ($row["Null"] == "YES"),
|
||||||
"auto_increment" => ($row["Extra"] == "auto_increment"),
|
"auto_increment" => ($row["Extra"] == "auto_increment"),
|
||||||
"on_update" => (preg_match('~^on update (.+)~i', $row["Extra"], $match) ? $match[1] : ""), //! available since MySQL 5.1.23
|
"on_update" => (preg_match('~^on update (.+)~i', $row["Extra"], $match) ? $match[1] : ""), //! available since MySQL 5.1.23
|
||||||
@@ -949,7 +950,7 @@ if (!defined("DRIVER")) {
|
|||||||
* @return Min_Result
|
* @return Min_Result
|
||||||
*/
|
*/
|
||||||
function explain($connection, $query) {
|
function explain($connection, $query) {
|
||||||
return $connection->query("EXPLAIN " . (min_version(5.1) && !min_version(5.7) ? "PARTITIONS " : "") . $query);
|
return $connection->query("EXPLAIN " . (min_version(5.1) ? "PARTITIONS " : "") . $query);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Get approximate number of rows
|
/** Get approximate number of rows
|
||||||
@@ -1097,67 +1098,47 @@ if (!defined("DRIVER")) {
|
|||||||
return !preg_match("~scheme|sequence|type|view_trigger|materializedview" . (min_version(8) ? "" : "|descidx" . (min_version(5.1) ? "" : "|event|partitioning" . (min_version(5) ? "" : "|routine|trigger|view"))) . "~", $feature);
|
return !preg_match("~scheme|sequence|type|view_trigger|materializedview" . (min_version(8) ? "" : "|descidx" . (min_version(5.1) ? "" : "|event|partitioning" . (min_version(5) ? "" : "|routine|trigger|view"))) . "~", $feature);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Kill a process
|
|
||||||
* @param int
|
|
||||||
* @return bool
|
|
||||||
*/
|
|
||||||
function kill_process($val) {
|
function kill_process($val) {
|
||||||
return queries("KILL " . number($val));
|
return queries("KILL " . number($val));
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Return query to get connection ID
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
function connection_id(){
|
function connection_id(){
|
||||||
return "SELECT CONNECTION_ID()";
|
return "SELECT CONNECTION_ID()";
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Get maximum number of connections
|
|
||||||
* @return int
|
|
||||||
*/
|
|
||||||
function max_connections() {
|
function max_connections() {
|
||||||
global $connection;
|
global $connection;
|
||||||
return $connection->result("SELECT @@max_connections");
|
return $connection->result("SELECT @@max_connections");
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Get driver config
|
$jush = "sql"; ///< @var string JUSH identifier
|
||||||
* @return array array('possible_drivers' => , 'jush' => , 'types' => , 'structured_types' => , 'unsigned' => , 'operators' => , 'functions' => , 'grouping' => , 'edit_functions' => )
|
$types = array(); ///< @var array ($type => $maximum_unsigned_length, ...)
|
||||||
*/
|
$structured_types = array(); ///< @var array ($description => array($type, ...), ...)
|
||||||
function driver_config() {
|
foreach (array(
|
||||||
$types = array(); ///< @var array ($type => $maximum_unsigned_length, ...)
|
lang('Numbers') => array("tinyint" => 3, "smallint" => 5, "mediumint" => 8, "int" => 10, "bigint" => 20, "decimal" => 66, "float" => 12, "double" => 21),
|
||||||
$structured_types = array(); ///< @var array ($description => array($type, ...), ...)
|
lang('Date and time') => array("date" => 10, "datetime" => 19, "timestamp" => 19, "time" => 10, "year" => 4),
|
||||||
foreach (array(
|
lang('Strings') => array("char" => 255, "varchar" => 65535, "tinytext" => 255, "text" => 65535, "mediumtext" => 16777215, "longtext" => 4294967295),
|
||||||
lang('Numbers') => array("tinyint" => 3, "smallint" => 5, "mediumint" => 8, "int" => 10, "bigint" => 20, "decimal" => 66, "float" => 12, "double" => 21),
|
lang('Lists') => array("enum" => 65535, "set" => 64),
|
||||||
lang('Date and time') => array("date" => 10, "datetime" => 19, "timestamp" => 19, "time" => 10, "year" => 4),
|
lang('Binary') => array("bit" => 20, "binary" => 255, "varbinary" => 65535, "tinyblob" => 255, "blob" => 65535, "mediumblob" => 16777215, "longblob" => 4294967295),
|
||||||
lang('Strings') => array("char" => 255, "varchar" => 65535, "tinytext" => 255, "text" => 65535, "mediumtext" => 16777215, "longtext" => 4294967295),
|
lang('Geometry') => array("geometry" => 0, "point" => 0, "linestring" => 0, "polygon" => 0, "multipoint" => 0, "multilinestring" => 0, "multipolygon" => 0, "geometrycollection" => 0),
|
||||||
lang('Lists') => array("enum" => 65535, "set" => 64),
|
) as $key => $val) {
|
||||||
lang('Binary') => array("bit" => 20, "binary" => 255, "varbinary" => 65535, "tinyblob" => 255, "blob" => 65535, "mediumblob" => 16777215, "longblob" => 4294967295),
|
$types += $val;
|
||||||
lang('Geometry') => array("geometry" => 0, "point" => 0, "linestring" => 0, "polygon" => 0, "multipoint" => 0, "multilinestring" => 0, "multipolygon" => 0, "geometrycollection" => 0),
|
$structured_types[$key] = array_keys($val);
|
||||||
) as $key => $val) {
|
|
||||||
$types += $val;
|
|
||||||
$structured_types[$key] = array_keys($val);
|
|
||||||
}
|
|
||||||
return array(
|
|
||||||
'possible_drivers' => array("MySQLi", "MySQL", "PDO_MySQL"),
|
|
||||||
'jush' => "sql", ///< @var string JUSH identifier
|
|
||||||
'types' => $types,
|
|
||||||
'structured_types' => $structured_types,
|
|
||||||
'unsigned' => array("unsigned", "zerofill", "unsigned zerofill"), ///< @var array number variants
|
|
||||||
'operators' => array("=", "<", ">", "<=", ">=", "!=", "LIKE", "LIKE %%", "REGEXP", "IN", "FIND_IN_SET", "IS NULL", "NOT LIKE", "NOT REGEXP", "NOT IN", "IS NOT NULL", "SQL"), ///< @var array operators used in select
|
|
||||||
'functions' => array("char_length", "date", "from_unixtime", "lower", "round", "floor", "ceil", "sec_to_time", "time_to_sec", "upper"), ///< @var array functions used in select
|
|
||||||
'grouping' => array("avg", "count", "count distinct", "group_concat", "max", "min", "sum"), ///< @var array grouping functions used in select
|
|
||||||
'edit_functions' => array( ///< @var array of array("$type|$type2" => "$function/$function2") functions used in editing, [0] - edit and insert, [1] - edit only
|
|
||||||
array(
|
|
||||||
"char" => "md5/sha1/password/encrypt/uuid",
|
|
||||||
"binary" => "md5/sha1",
|
|
||||||
"date|time" => "now",
|
|
||||||
), array(
|
|
||||||
number_type() => "+/-",
|
|
||||||
"date" => "+ interval/- interval",
|
|
||||||
"time" => "addtime/subtime",
|
|
||||||
"char|text" => "concat",
|
|
||||||
)
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
$unsigned = array("unsigned", "zerofill", "unsigned zerofill"); ///< @var array number variants
|
||||||
|
$operators = array("=", "<", ">", "<=", ">=", "!=", "LIKE", "LIKE %%", "REGEXP", "IN", "FIND_IN_SET", "IS NULL", "NOT LIKE", "NOT REGEXP", "NOT IN", "IS NOT NULL", "SQL"); ///< @var array operators used in select
|
||||||
|
$functions = array("char_length", "date", "from_unixtime", "lower", "round", "floor", "ceil", "sec_to_time", "time_to_sec", "upper"); ///< @var array functions used in select
|
||||||
|
$grouping = array("avg", "count", "count distinct", "group_concat", "max", "min", "sum"); ///< @var array grouping functions used in select
|
||||||
|
$edit_functions = array( ///< @var array of array("$type|$type2" => "$function/$function2") functions used in editing, [0] - edit and insert, [1] - edit only
|
||||||
|
array(
|
||||||
|
"char" => "md5/sha1/password/encrypt/uuid",
|
||||||
|
"binary" => "md5/sha1",
|
||||||
|
"date|time" => "now",
|
||||||
|
), array(
|
||||||
|
number_type() => "+/-",
|
||||||
|
"date" => "+ interval/- interval",
|
||||||
|
"time" => "addtime/subtime",
|
||||||
|
"char|text" => "concat",
|
||||||
|
)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
@@ -2,11 +2,11 @@
|
|||||||
$drivers["oracle"] = "Oracle (beta)";
|
$drivers["oracle"] = "Oracle (beta)";
|
||||||
|
|
||||||
if (isset($_GET["oracle"])) {
|
if (isset($_GET["oracle"])) {
|
||||||
|
$possible_drivers = array("OCI8", "PDO_OCI");
|
||||||
define("DRIVER", "oracle");
|
define("DRIVER", "oracle");
|
||||||
if (extension_loaded("oci8")) {
|
if (extension_loaded("oci8")) {
|
||||||
class Min_DB {
|
class Min_DB {
|
||||||
var $extension = "oci8", $_link, $_result, $server_info, $affected_rows, $errno, $error;
|
var $extension = "oci8", $_link, $_result, $server_info, $affected_rows, $errno, $error;
|
||||||
var $_current_db;
|
|
||||||
|
|
||||||
function _error($errno, $error) {
|
function _error($errno, $error) {
|
||||||
if (ini_bool("html_errors")) {
|
if (ini_bool("html_errors")) {
|
||||||
@@ -32,7 +32,6 @@ if (isset($_GET["oracle"])) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function select_db($database) {
|
function select_db($database) {
|
||||||
$this->_current_db = $database;
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -53,7 +52,6 @@ if (isset($_GET["oracle"])) {
|
|||||||
return new Min_Result($result);
|
return new Min_Result($result);
|
||||||
}
|
}
|
||||||
$this->affected_rows = oci_num_rows($result);
|
$this->affected_rows = oci_num_rows($result);
|
||||||
oci_free_statement($result);
|
|
||||||
}
|
}
|
||||||
return $return;
|
return $return;
|
||||||
}
|
}
|
||||||
@@ -121,7 +119,6 @@ if (isset($_GET["oracle"])) {
|
|||||||
} elseif (extension_loaded("pdo_oci")) {
|
} elseif (extension_loaded("pdo_oci")) {
|
||||||
class Min_DB extends Min_PDO {
|
class Min_DB extends Min_PDO {
|
||||||
var $extension = "PDO_OCI";
|
var $extension = "PDO_OCI";
|
||||||
var $_current_db;
|
|
||||||
|
|
||||||
function connect($server, $username, $password) {
|
function connect($server, $username, $password) {
|
||||||
$this->dsn("oci:dbname=//$server;charset=AL32UTF8", $username, $password);
|
$this->dsn("oci:dbname=//$server;charset=AL32UTF8", $username, $password);
|
||||||
@@ -129,7 +126,6 @@ if (isset($_GET["oracle"])) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function select_db($database) {
|
function select_db($database) {
|
||||||
$this->_current_db = $database;
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -146,25 +142,6 @@ if (isset($_GET["oracle"])) {
|
|||||||
return true; // automatic start
|
return true; // automatic start
|
||||||
}
|
}
|
||||||
|
|
||||||
function insertUpdate($table, $rows, $primary) {
|
|
||||||
global $connection;
|
|
||||||
foreach ($rows as $set) {
|
|
||||||
$update = array();
|
|
||||||
$where = array();
|
|
||||||
foreach ($set as $key => $val) {
|
|
||||||
$update[] = "$key = $val";
|
|
||||||
if (isset($primary[idf_unescape($key)])) {
|
|
||||||
$where[] = "$key = $val";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!(($where && queries("UPDATE " . table($table) . " SET " . implode(", ", $update) . " WHERE " . implode(" AND ", $where)) && $connection->affected_rows)
|
|
||||||
|| queries("INSERT INTO " . table($table) . " (" . implode(", ", array_keys($set)) . ") VALUES (" . implode(", ", $set) . ")")
|
|
||||||
)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -188,7 +165,7 @@ if (isset($_GET["oracle"])) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function get_databases() {
|
function get_databases() {
|
||||||
return get_vals("SELECT tablespace_name FROM user_tablespaces ORDER BY 1");
|
return get_vals("SELECT tablespace_name FROM user_tablespaces");
|
||||||
}
|
}
|
||||||
|
|
||||||
function limit($query, $where, $limit, $offset = 0, $separator = " ") {
|
function limit($query, $where, $limit, $offset = 0, $separator = " ") {
|
||||||
@@ -216,51 +193,22 @@ if (isset($_GET["oracle"])) {
|
|||||||
return $connection->result("SELECT USER FROM DUAL");
|
return $connection->result("SELECT USER FROM DUAL");
|
||||||
}
|
}
|
||||||
|
|
||||||
function get_current_db() {
|
|
||||||
global $connection;
|
|
||||||
$db = $connection->_current_db ? $connection->_current_db : DB;
|
|
||||||
unset($connection->_current_db);
|
|
||||||
return $db;
|
|
||||||
}
|
|
||||||
|
|
||||||
function where_owner($prefix, $owner = "owner") {
|
|
||||||
if (!$_GET["ns"]) {
|
|
||||||
return '';
|
|
||||||
}
|
|
||||||
return "$prefix$owner = sys_context('USERENV', 'CURRENT_SCHEMA')";
|
|
||||||
}
|
|
||||||
|
|
||||||
function views_table($columns) {
|
|
||||||
$owner = where_owner('');
|
|
||||||
return "(SELECT $columns FROM all_views WHERE " . ($owner ? $owner : "rownum < 0") . ")";
|
|
||||||
}
|
|
||||||
|
|
||||||
function tables_list() {
|
function tables_list() {
|
||||||
$view = views_table("view_name");
|
return get_key_vals("SELECT table_name, 'table' FROM all_tables WHERE tablespace_name = " . q(DB) . "
|
||||||
$owner = where_owner(" AND ");
|
UNION SELECT view_name, 'view' FROM user_views
|
||||||
return get_key_vals("SELECT table_name, 'table' FROM all_tables WHERE tablespace_name = " . q(DB) . "$owner
|
|
||||||
UNION SELECT view_name, 'view' FROM $view
|
|
||||||
ORDER BY 1"
|
ORDER BY 1"
|
||||||
); //! views don't have schema
|
); //! views don't have schema
|
||||||
}
|
}
|
||||||
|
|
||||||
function count_tables($databases) {
|
function count_tables($databases) {
|
||||||
global $connection;
|
return array();
|
||||||
$return = array();
|
|
||||||
foreach ($databases as $db) {
|
|
||||||
$return[$db] = $connection->result("SELECT COUNT(*) FROM all_tables WHERE tablespace_name = " . q($db));
|
|
||||||
}
|
|
||||||
return $return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function table_status($name = "") {
|
function table_status($name = "") {
|
||||||
$return = array();
|
$return = array();
|
||||||
$search = q($name);
|
$search = q($name);
|
||||||
$db = get_current_db();
|
foreach (get_rows('SELECT table_name "Name", \'table\' "Engine", avg_row_len * num_rows "Data_length", num_rows "Rows" FROM all_tables WHERE tablespace_name = ' . q(DB) . ($name != "" ? " AND table_name = $search" : "") . "
|
||||||
$view = views_table("view_name");
|
UNION SELECT view_name, 'view', 0, 0 FROM user_views" . ($name != "" ? " WHERE view_name = $search" : "") . "
|
||||||
$owner = where_owner(" AND ");
|
|
||||||
foreach (get_rows('SELECT table_name "Name", \'table\' "Engine", avg_row_len * num_rows "Data_length", num_rows "Rows" FROM all_tables WHERE tablespace_name = ' . q($db) . $owner . ($name != "" ? " AND table_name = $search" : "") . "
|
|
||||||
UNION SELECT view_name, 'view', 0, 0 FROM $view" . ($name != "" ? " WHERE view_name = $search" : "") . "
|
|
||||||
ORDER BY 1"
|
ORDER BY 1"
|
||||||
) as $row) {
|
) as $row) {
|
||||||
if ($name != "") {
|
if ($name != "") {
|
||||||
@@ -281,12 +229,11 @@ ORDER BY 1"
|
|||||||
|
|
||||||
function fields($table) {
|
function fields($table) {
|
||||||
$return = array();
|
$return = array();
|
||||||
$owner = where_owner(" AND ");
|
foreach (get_rows("SELECT * FROM all_tab_columns WHERE table_name = " . q($table) . " ORDER BY column_id") as $row) {
|
||||||
foreach (get_rows("SELECT * FROM all_tab_columns WHERE table_name = " . q($table) . "$owner ORDER BY column_id") as $row) {
|
|
||||||
$type = $row["DATA_TYPE"];
|
$type = $row["DATA_TYPE"];
|
||||||
$length = "$row[DATA_PRECISION],$row[DATA_SCALE]";
|
$length = "$row[DATA_PRECISION],$row[DATA_SCALE]";
|
||||||
if ($length == ",") {
|
if ($length == ",") {
|
||||||
$length = $row["CHAR_COL_DECL_LENGTH"];
|
$length = $row["DATA_LENGTH"];
|
||||||
} //! int
|
} //! int
|
||||||
$return[$row["COLUMN_NAME"]] = array(
|
$return[$row["COLUMN_NAME"]] = array(
|
||||||
"field" => $row["COLUMN_NAME"],
|
"field" => $row["COLUMN_NAME"],
|
||||||
@@ -307,12 +254,11 @@ ORDER BY 1"
|
|||||||
|
|
||||||
function indexes($table, $connection2 = null) {
|
function indexes($table, $connection2 = null) {
|
||||||
$return = array();
|
$return = array();
|
||||||
$owner = where_owner(" AND ", "aic.table_owner");
|
foreach (get_rows("SELECT uic.*, uc.constraint_type
|
||||||
foreach (get_rows("SELECT aic.*, ac.constraint_type
|
FROM user_ind_columns uic
|
||||||
FROM all_ind_columns aic
|
LEFT JOIN user_constraints uc ON uic.index_name = uc.constraint_name AND uic.table_name = uc.table_name
|
||||||
LEFT JOIN all_constraints ac ON aic.index_name = ac.constraint_name AND aic.table_name = ac.table_name AND aic.index_owner = ac.owner
|
WHERE uic.table_name = " . q($table) . "
|
||||||
WHERE aic.table_name = " . q($table) . "$owner
|
ORDER BY uc.constraint_type, uic.column_position", $connection2) as $row) {
|
||||||
ORDER BY ac.constraint_type, aic.column_position", $connection2) as $row) {
|
|
||||||
$index_name = $row["INDEX_NAME"];
|
$index_name = $row["INDEX_NAME"];
|
||||||
$return[$index_name]["type"] = ($row["CONSTRAINT_TYPE"] == "P" ? "PRIMARY" : ($row["CONSTRAINT_TYPE"] == "U" ? "UNIQUE" : "INDEX"));
|
$return[$index_name]["type"] = ($row["CONSTRAINT_TYPE"] == "P" ? "PRIMARY" : ($row["CONSTRAINT_TYPE"] == "U" ? "UNIQUE" : "INDEX"));
|
||||||
$return[$index_name]["columns"][] = $row["COLUMN_NAME"];
|
$return[$index_name]["columns"][] = $row["COLUMN_NAME"];
|
||||||
@@ -323,8 +269,7 @@ ORDER BY ac.constraint_type, aic.column_position", $connection2) as $row) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function view($name) {
|
function view($name) {
|
||||||
$view = views_table("view_name, text");
|
$rows = get_rows('SELECT text "select" FROM user_views WHERE view_name = ' . q($name));
|
||||||
$rows = get_rows('SELECT text "select" FROM ' . $view . ' WHERE view_name = ' . q($name));
|
|
||||||
return reset($rows);
|
return reset($rows);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -349,25 +294,13 @@ ORDER BY ac.constraint_type, aic.column_position", $connection2) as $row) {
|
|||||||
function found_rows($table_status, $where) {
|
function found_rows($table_status, $where) {
|
||||||
}
|
}
|
||||||
|
|
||||||
function auto_increment() {
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
function alter_table($table, $name, $fields, $foreign, $comment, $engine, $collation, $auto_increment, $partitioning) {
|
function alter_table($table, $name, $fields, $foreign, $comment, $engine, $collation, $auto_increment, $partitioning) {
|
||||||
$alter = $drop = array();
|
$alter = $drop = array();
|
||||||
$orig_fields = ($table ? fields($table) : array());
|
|
||||||
foreach ($fields as $field) {
|
foreach ($fields as $field) {
|
||||||
$val = $field[1];
|
$val = $field[1];
|
||||||
if ($val && $field[0] != "" && idf_escape($field[0]) != $val[0]) {
|
if ($val && $field[0] != "" && idf_escape($field[0]) != $val[0]) {
|
||||||
queries("ALTER TABLE " . table($table) . " RENAME COLUMN " . idf_escape($field[0]) . " TO $val[0]");
|
queries("ALTER TABLE " . table($table) . " RENAME COLUMN " . idf_escape($field[0]) . " TO $val[0]");
|
||||||
}
|
}
|
||||||
$orig_field = $orig_fields[$field[0]];
|
|
||||||
if ($val && $orig_field) {
|
|
||||||
$old = process_field($orig_field, $orig_field);
|
|
||||||
if ($val[2] == $old[2]) {
|
|
||||||
$val[2] = "";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ($val) {
|
if ($val) {
|
||||||
$alter[] = ($table != "" ? ($field[0] != "" ? "MODIFY (" : "ADD (") : " ") . implode($val) . ($table != "" ? ")" : ""); //! error with name change only
|
$alter[] = ($table != "" ? ($field[0] != "" ? "MODIFY (" : "ADD (") : " ") . implode($val) . ($table != "" ? ")" : ""); //! error with name change only
|
||||||
} else {
|
} else {
|
||||||
@@ -383,38 +316,6 @@ ORDER BY ac.constraint_type, aic.column_position", $connection2) as $row) {
|
|||||||
;
|
;
|
||||||
}
|
}
|
||||||
|
|
||||||
function alter_indexes($table, $alter) {
|
|
||||||
$create = array();
|
|
||||||
$drop = array();
|
|
||||||
$queries = array();
|
|
||||||
foreach ($alter as $val) {
|
|
||||||
$val[2] = preg_replace('~ DESC$~', '', $val[2]);
|
|
||||||
if ($val[0] != "INDEX") {
|
|
||||||
//! descending UNIQUE indexes results in syntax error
|
|
||||||
$create[] = ($val[2] == "DROP"
|
|
||||||
? "\nDROP CONSTRAINT " . idf_escape($val[1])
|
|
||||||
: "\nADD" . ($val[1] != "" ? " CONSTRAINT " . idf_escape($val[1]) : "") . " $val[0] " . ($val[0] == "PRIMARY" ? "KEY " : "") . "(" . implode(", ", $val[2]) . ")"
|
|
||||||
);
|
|
||||||
} elseif ($val[2] == "DROP") {
|
|
||||||
$drop[] = idf_escape($val[1]);
|
|
||||||
} else {
|
|
||||||
$queries[] = "CREATE INDEX " . idf_escape($val[1] != "" ? $val[1] : uniqid($table . "_")) . " ON " . table($table) . " (" . implode(", ", $val[2]) . ")";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ($create) {
|
|
||||||
array_unshift($queries, "ALTER TABLE " . table($table) . implode(",", $create));
|
|
||||||
}
|
|
||||||
if ($drop) {
|
|
||||||
array_unshift($queries, "DROP INDEX " . implode(", ", $drop));
|
|
||||||
}
|
|
||||||
foreach ($queries as $query) {
|
|
||||||
if (!queries($query)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
function foreign_keys($table) {
|
function foreign_keys($table) {
|
||||||
$return = array();
|
$return = array();
|
||||||
$query = "SELECT c_list.CONSTRAINT_NAME as NAME,
|
$query = "SELECT c_list.CONSTRAINT_NAME as NAME,
|
||||||
@@ -458,8 +359,7 @@ AND c_src.TABLE_NAME = " . q($table);
|
|||||||
}
|
}
|
||||||
|
|
||||||
function schemas() {
|
function schemas() {
|
||||||
$return = get_vals("SELECT DISTINCT owner FROM dba_segments WHERE owner IN (SELECT username FROM dba_users WHERE default_tablespace NOT IN ('SYSTEM','SYSAUX')) ORDER BY 1");
|
return get_vals("SELECT DISTINCT owner FROM dba_segments WHERE owner IN (SELECT username FROM dba_users WHERE default_tablespace NOT IN ('SYSTEM','SYSAUX'))");
|
||||||
return ($return ? $return : get_vals("SELECT DISTINCT owner FROM all_tables WHERE tablespace_name = " . q(DB) . " ORDER BY 1"));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function get_schema() {
|
function get_schema() {
|
||||||
@@ -501,40 +401,33 @@ ORDER BY PROCESS
|
|||||||
}
|
}
|
||||||
|
|
||||||
function support($feature) {
|
function support($feature) {
|
||||||
return preg_match('~^(columns|database|drop_col|indexes|descidx|processlist|scheme|sql|status|table|variables|view)$~', $feature); //!
|
return preg_match('~^(columns|database|drop_col|indexes|descidx|processlist|scheme|sql|status|table|variables|view|view_trigger)$~', $feature); //!
|
||||||
}
|
}
|
||||||
|
|
||||||
function driver_config() {
|
$jush = "oracle";
|
||||||
$types = array();
|
$types = array();
|
||||||
$structured_types = array();
|
$structured_types = array();
|
||||||
foreach (array(
|
foreach (array(
|
||||||
lang('Numbers') => array("number" => 38, "binary_float" => 12, "binary_double" => 21),
|
lang('Numbers') => array("number" => 38, "binary_float" => 12, "binary_double" => 21),
|
||||||
lang('Date and time') => array("date" => 10, "timestamp" => 29, "interval year" => 12, "interval day" => 28), //! year(), day() to second()
|
lang('Date and time') => array("date" => 10, "timestamp" => 29, "interval year" => 12, "interval day" => 28), //! year(), day() to second()
|
||||||
lang('Strings') => array("char" => 2000, "varchar2" => 4000, "nchar" => 2000, "nvarchar2" => 4000, "clob" => 4294967295, "nclob" => 4294967295),
|
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),
|
lang('Binary') => array("raw" => 2000, "long raw" => 2147483648, "blob" => 4294967295, "bfile" => 4294967296),
|
||||||
) as $key => $val) {
|
) as $key => $val) {
|
||||||
$types += $val;
|
$types += $val;
|
||||||
$structured_types[$key] = array_keys($val);
|
$structured_types[$key] = array_keys($val);
|
||||||
}
|
|
||||||
return array(
|
|
||||||
'possible_drivers' => array("OCI8", "PDO_OCI"),
|
|
||||||
'jush' => "oracle",
|
|
||||||
'types' => $types,
|
|
||||||
'structured_types' => $structured_types,
|
|
||||||
'unsigned' => array(),
|
|
||||||
'operators' => array("=", "<", ">", "<=", ">=", "!=", "LIKE", "LIKE %%", "IN", "IS NULL", "NOT LIKE", "NOT REGEXP", "NOT IN", "IS NOT NULL", "SQL"),
|
|
||||||
'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" => "||",
|
|
||||||
)
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
$unsigned = array();
|
||||||
|
$operators = array("=", "<", ">", "<=", ">=", "!=", "LIKE", "LIKE %%", "IN", "IS NULL", "NOT LIKE", "NOT REGEXP", "NOT IN", "IS NOT NULL", "SQL");
|
||||||
|
$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" => "||",
|
||||||
|
)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
@@ -2,6 +2,7 @@
|
|||||||
$drivers["pgsql"] = "PostgreSQL";
|
$drivers["pgsql"] = "PostgreSQL";
|
||||||
|
|
||||||
if (isset($_GET["pgsql"])) {
|
if (isset($_GET["pgsql"])) {
|
||||||
|
$possible_drivers = array("PgSQL", "PDO_PgSQL");
|
||||||
define("DRIVER", "pgsql");
|
define("DRIVER", "pgsql");
|
||||||
if (extension_loaded("pgsql")) {
|
if (extension_loaded("pgsql")) {
|
||||||
class Min_DB {
|
class Min_DB {
|
||||||
@@ -40,7 +41,7 @@ if (isset($_GET["pgsql"])) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function value($val, $field) {
|
function value($val, $field) {
|
||||||
return ($field["type"] == "bytea" && $val !== null ? pg_unescape_bytea($val) : $val);
|
return ($field["type"] == "bytea" ? pg_unescape_bytea($val) : $val);
|
||||||
}
|
}
|
||||||
|
|
||||||
function quoteBinary($string) {
|
function quoteBinary($string) {
|
||||||
@@ -149,7 +150,8 @@ if (isset($_GET["pgsql"])) {
|
|||||||
function connect($server, $username, $password) {
|
function connect($server, $username, $password) {
|
||||||
global $adminer;
|
global $adminer;
|
||||||
$db = $adminer->database();
|
$db = $adminer->database();
|
||||||
$this->dsn("pgsql:host='" . str_replace(":", "' port='", addcslashes($server, "'\\")) . "' client_encoding=utf8 dbname='" . ($db != "" ? addcslashes($db, "'\\") : "postgres") . "'", $username, $password); //! client_encoding is supported since 9.1 but we can't yet use min_version here
|
$string = "pgsql:host='" . str_replace(":", "' port='", addcslashes($server, "'\\")) . "' options='-c client_encoding=utf8'";
|
||||||
|
$this->dsn("$string dbname='" . ($db != "" ? addcslashes($db, "'\\") : "postgres") . "'", $username, $password);
|
||||||
//! connect without DB in case of an error
|
//! connect without DB in case of an error
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -290,7 +292,7 @@ if (isset($_GET["pgsql"])) {
|
|||||||
|
|
||||||
function db_collation($db, $collations) {
|
function db_collation($db, $collations) {
|
||||||
global $connection;
|
global $connection;
|
||||||
return $connection->result("SELECT datcollate FROM pg_database WHERE datname = " . q($db));
|
return $connection->result("SHOW LC_COLLATE"); //! respect $db
|
||||||
}
|
}
|
||||||
|
|
||||||
function engines() {
|
function engines() {
|
||||||
@@ -325,7 +327,7 @@ ORDER BY 1";
|
|||||||
foreach (get_rows("SELECT c.relname AS \"Name\", CASE c.relkind WHEN 'r' THEN 'table' WHEN 'm' THEN 'materialized view' ELSE 'view' END AS \"Engine\", pg_relation_size(c.oid) AS \"Data_length\", pg_total_relation_size(c.oid) - pg_relation_size(c.oid) AS \"Index_length\", obj_description(c.oid, 'pg_class') AS \"Comment\", " . (min_version(12) ? "''" : "CASE WHEN c.relhasoids THEN 'oid' ELSE '' END") . " AS \"Oid\", c.reltuples as \"Rows\", n.nspname
|
foreach (get_rows("SELECT c.relname AS \"Name\", CASE c.relkind WHEN 'r' THEN 'table' WHEN 'm' THEN 'materialized view' ELSE 'view' END AS \"Engine\", pg_relation_size(c.oid) AS \"Data_length\", pg_total_relation_size(c.oid) - pg_relation_size(c.oid) AS \"Index_length\", obj_description(c.oid, 'pg_class') AS \"Comment\", " . (min_version(12) ? "''" : "CASE WHEN c.relhasoids THEN 'oid' ELSE '' END") . " AS \"Oid\", c.reltuples as \"Rows\", n.nspname
|
||||||
FROM pg_class c
|
FROM pg_class c
|
||||||
JOIN pg_namespace n ON(n.nspname = current_schema() AND n.oid = c.relnamespace)
|
JOIN pg_namespace n ON(n.nspname = current_schema() AND n.oid = c.relnamespace)
|
||||||
WHERE relkind IN ('r', 'm', 'v', 'f', 'p')
|
WHERE relkind IN ('r', 'm', 'v', 'f')
|
||||||
" . ($name != "" ? "AND relname = " . q($name) : "ORDER BY relname")
|
" . ($name != "" ? "AND relname = " . q($name) : "ORDER BY relname")
|
||||||
) as $row) { //! Index_length, Auto_increment
|
) as $row) { //! Index_length, Auto_increment
|
||||||
$return[$row["Name"]] = $row;
|
$return[$row["Name"]] = $row;
|
||||||
@@ -348,7 +350,7 @@ WHERE relkind IN ('r', 'm', 'v', 'f', 'p')
|
|||||||
'timestamp with time zone' => 'timestamptz',
|
'timestamp with time zone' => 'timestamptz',
|
||||||
);
|
);
|
||||||
|
|
||||||
$identity_column = min_version(10) ? 'a.attidentity' : '0';
|
$identity_column = min_version(10) ? "(a.attidentity = 'd')::int" : '0';
|
||||||
|
|
||||||
foreach (get_rows("SELECT a.attname AS field, format_type(a.atttypid, a.atttypmod) AS full_type, pg_get_expr(d.adbin, d.adrelid) AS default, a.attnotnull::int, col_description(c.oid, a.attnum) AS comment, $identity_column AS identity
|
foreach (get_rows("SELECT a.attname AS field, format_type(a.atttypid, a.atttypmod) AS full_type, pg_get_expr(d.adbin, d.adrelid) AS default, a.attnotnull::int, col_description(c.oid, a.attnum) AS comment, $identity_column AS identity
|
||||||
FROM pg_class c
|
FROM pg_class c
|
||||||
@@ -373,13 +375,13 @@ ORDER BY a.attnum"
|
|||||||
$row["type"] = $type;
|
$row["type"] = $type;
|
||||||
$row["full_type"] = $row["type"] . $length . $addon . $array;
|
$row["full_type"] = $row["type"] . $length . $addon . $array;
|
||||||
}
|
}
|
||||||
if (in_array($row['identity'], array('a', 'd'))) {
|
if ($row['identity']) {
|
||||||
$row['default'] = 'GENERATED ' . ($row['identity'] == 'd' ? 'BY DEFAULT' : 'ALWAYS') . ' AS IDENTITY';
|
$row['default'] = 'GENERATED BY DEFAULT AS IDENTITY';
|
||||||
}
|
}
|
||||||
$row["null"] = !$row["attnotnull"];
|
$row["null"] = !$row["attnotnull"];
|
||||||
$row["auto_increment"] = $row['identity'] || preg_match('~^nextval\(~i', $row["default"]);
|
$row["auto_increment"] = $row['identity'] || preg_match('~^nextval\(~i', $row["default"]);
|
||||||
$row["privileges"] = array("insert" => 1, "select" => 1, "update" => 1);
|
$row["privileges"] = array("insert" => 1, "select" => 1, "update" => 1);
|
||||||
if (preg_match('~(.+)::[^,)]+(.*)~', $row["default"], $match)) {
|
if (preg_match('~(.+)::[^)]+(.*)~', $row["default"], $match)) {
|
||||||
$row["default"] = ($match[1] == "NULL" ? null : (($match[1][0] == "'" ? idf_unescape($match[1]) : $match[1]) . $match[2]));
|
$row["default"] = ($match[1] == "NULL" ? null : (($match[1][0] == "'" ? idf_unescape($match[1]) : $match[1]) . $match[2]));
|
||||||
}
|
}
|
||||||
$return[$row["field"]] = $row;
|
$return[$row["field"]] = $row;
|
||||||
@@ -395,7 +397,7 @@ ORDER BY a.attnum"
|
|||||||
$return = array();
|
$return = array();
|
||||||
$table_oid = $connection2->result("SELECT oid FROM pg_class WHERE relnamespace = (SELECT oid FROM pg_namespace WHERE nspname = current_schema()) AND relname = " . q($table));
|
$table_oid = $connection2->result("SELECT oid FROM pg_class WHERE relnamespace = (SELECT oid FROM pg_namespace WHERE nspname = current_schema()) AND relname = " . q($table));
|
||||||
$columns = get_key_vals("SELECT attnum, attname FROM pg_attribute WHERE attrelid = $table_oid AND attnum > 0", $connection2);
|
$columns = get_key_vals("SELECT attnum, attname FROM pg_attribute WHERE attrelid = $table_oid AND attnum > 0", $connection2);
|
||||||
foreach (get_rows("SELECT relname, indisunique::int, indisprimary::int, indkey, indoption, (indpred IS NOT NULL)::int as indispartial FROM pg_index i, pg_class ci WHERE i.indrelid = $table_oid AND ci.oid = i.indexrelid", $connection2) as $row) {
|
foreach (get_rows("SELECT relname, indisunique::int, indisprimary::int, indkey, indoption , (indpred IS NOT NULL)::int as indispartial FROM pg_index i, pg_class ci WHERE i.indrelid = $table_oid AND ci.oid = i.indexrelid", $connection2) as $row) {
|
||||||
$relname = $row["relname"];
|
$relname = $row["relname"];
|
||||||
$return[$relname]["type"] = ($row["indispartial"] ? "INDEX" : ($row["indisprimary"] ? "PRIMARY" : ($row["indisunique"] ? "UNIQUE" : "INDEX")));
|
$return[$relname]["type"] = ($row["indispartial"] ? "INDEX" : ($row["indisprimary"] ? "PRIMARY" : ($row["indisunique"] ? "UNIQUE" : "INDEX")));
|
||||||
$return[$relname]["columns"] = array();
|
$return[$relname]["columns"] = array();
|
||||||
@@ -434,26 +436,9 @@ ORDER BY conkey, conname") as $row) {
|
|||||||
return $return;
|
return $return;
|
||||||
}
|
}
|
||||||
|
|
||||||
function constraints($table) {
|
|
||||||
global $on_actions;
|
|
||||||
$return = array();
|
|
||||||
foreach (get_rows("SELECT conname, consrc
|
|
||||||
FROM pg_catalog.pg_constraint
|
|
||||||
INNER JOIN pg_catalog.pg_namespace ON pg_constraint.connamespace = pg_namespace.oid
|
|
||||||
INNER JOIN pg_catalog.pg_class ON pg_constraint.conrelid = pg_class.oid AND pg_constraint.connamespace = pg_class.relnamespace
|
|
||||||
WHERE pg_constraint.contype = 'c'
|
|
||||||
AND conrelid != 0 -- handle only CONSTRAINTs here, not TYPES
|
|
||||||
AND nspname = current_schema()
|
|
||||||
AND relname = " . q($table) . "
|
|
||||||
ORDER BY connamespace, conname") as $row) {
|
|
||||||
$return[$row['conname']] = $row['consrc'];
|
|
||||||
}
|
|
||||||
return $return;
|
|
||||||
}
|
|
||||||
|
|
||||||
function view($name) {
|
function view($name) {
|
||||||
global $connection;
|
global $connection;
|
||||||
return array("select" => trim($connection->result("SELECT pg_get_viewdef(" . $connection->result("SELECT oid FROM pg_class WHERE relnamespace = (SELECT oid FROM pg_namespace WHERE nspname = current_schema()) AND relname = " . q($name)) . ")")));
|
return array("select" => trim($connection->result("SELECT pg_get_viewdef(" . $connection->result("SELECT oid FROM pg_class WHERE relname = " . q($name)) . ")")));
|
||||||
}
|
}
|
||||||
|
|
||||||
function collations() {
|
function collations() {
|
||||||
@@ -507,14 +492,11 @@ ORDER BY connamespace, conname") as $row) {
|
|||||||
} else {
|
} else {
|
||||||
$val5 = $val[5];
|
$val5 = $val[5];
|
||||||
unset($val[5]);
|
unset($val[5]);
|
||||||
|
if (isset($val[6]) && $field[0] == "") { // auto_increment
|
||||||
|
$val[1] = ($val[1] == "bigint" ? " big" : " ") . "serial";
|
||||||
|
}
|
||||||
if ($field[0] == "") {
|
if ($field[0] == "") {
|
||||||
if (isset($val[6])) { // auto_increment
|
|
||||||
$val[1] = ($val[1] == " bigint" ? " big" : ($val[1] == " smallint" ? " small" : " ")) . "serial";
|
|
||||||
}
|
|
||||||
$alter[] = ($table != "" ? "ADD " : " ") . implode($val);
|
$alter[] = ($table != "" ? "ADD " : " ") . implode($val);
|
||||||
if (isset($val[6])) {
|
|
||||||
$alter[] = ($table != "" ? "ADD" : " ") . " PRIMARY KEY ($val[0])";
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
if ($column != $val[0]) {
|
if ($column != $val[0]) {
|
||||||
$queries[] = "ALTER TABLE " . table($name) . " RENAME $column TO $val[0]";
|
$queries[] = "ALTER TABLE " . table($name) . " RENAME $column TO $val[0]";
|
||||||
@@ -623,7 +605,7 @@ ORDER BY connamespace, conname") as $row) {
|
|||||||
|
|
||||||
function triggers($table) {
|
function triggers($table) {
|
||||||
$return = array();
|
$return = array();
|
||||||
foreach (get_rows("SELECT * FROM information_schema.triggers WHERE trigger_schema = current_schema() AND event_object_table = " . q($table)) as $row) {
|
foreach (get_rows("SELECT * FROM information_schema.triggers WHERE event_object_table = " . q($table)) as $row) {
|
||||||
$return[$row["trigger_name"]] = array($row["action_timing"], $row["event_manipulation"]);
|
$return[$row["trigger_name"]] = array($row["action_timing"], $row["event_manipulation"]);
|
||||||
}
|
}
|
||||||
return $return;
|
return $return;
|
||||||
@@ -722,23 +704,6 @@ AND typelem = 0"
|
|||||||
return $return;
|
return $return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// create_sql() produces CREATE TABLE without FK CONSTRAINTs
|
|
||||||
// foreign_keys_sql() produces all FK CONSTRAINTs as ALTER TABLE ... ADD CONSTRAINT
|
|
||||||
// so that all FKs can be added after all tables have been created, avoiding any need to reorder CREATE TABLE statements in order of their FK dependencies
|
|
||||||
function foreign_keys_sql($table) {
|
|
||||||
$return = "";
|
|
||||||
|
|
||||||
$status = table_status($table);
|
|
||||||
$fkeys = foreign_keys($table);
|
|
||||||
ksort($fkeys);
|
|
||||||
|
|
||||||
foreach ($fkeys as $fkey_name => $fkey) {
|
|
||||||
$return .= "ALTER TABLE ONLY " . idf_escape($status['nspname']) . "." . idf_escape($status['Name']) . " ADD CONSTRAINT " . idf_escape($fkey_name) . " $fkey[definition] " . ($fkey['deferrable'] ? 'DEFERRABLE' : 'NOT DEFERRABLE') . ";\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
return ($return ? "$return\n" : $return);
|
|
||||||
}
|
|
||||||
|
|
||||||
function create_sql($table, $auto_increment, $style) {
|
function create_sql($table, $auto_increment, $style) {
|
||||||
global $connection;
|
global $connection;
|
||||||
$return = '';
|
$return = '';
|
||||||
@@ -753,7 +718,8 @@ AND typelem = 0"
|
|||||||
$fields = fields($table);
|
$fields = fields($table);
|
||||||
$indexes = indexes($table);
|
$indexes = indexes($table);
|
||||||
ksort($indexes);
|
ksort($indexes);
|
||||||
$constraints = constraints($table);
|
$fkeys = foreign_keys($table);
|
||||||
|
ksort($fkeys);
|
||||||
|
|
||||||
if (!$status || empty($fields)) {
|
if (!$status || empty($fields)) {
|
||||||
return false;
|
return false;
|
||||||
@@ -776,7 +742,7 @@ AND typelem = 0"
|
|||||||
: "SELECT * FROM $sequence_name"
|
: "SELECT * FROM $sequence_name"
|
||||||
));
|
));
|
||||||
$sequences[] = ($style == "DROP+CREATE" ? "DROP SEQUENCE IF EXISTS $sequence_name;\n" : "")
|
$sequences[] = ($style == "DROP+CREATE" ? "DROP SEQUENCE IF EXISTS $sequence_name;\n" : "")
|
||||||
. "CREATE SEQUENCE $sequence_name INCREMENT $sq[increment_by] MINVALUE $sq[min_value] MAXVALUE $sq[max_value]" . ($auto_increment && $sq['last_value'] ? " START $sq[last_value]" : "") . " CACHE $sq[cache_value];";
|
. "CREATE SEQUENCE $sequence_name INCREMENT $sq[increment_by] MINVALUE $sq[min_value] MAXVALUE $sq[max_value] START " . ($auto_increment ? $sq['last_value'] : 1) . " CACHE $sq[cache_value];";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -793,8 +759,9 @@ AND typelem = 0"
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach ($constraints as $conname => $consrc) {
|
// foreign keys
|
||||||
$return_parts[] = "CONSTRAINT " . idf_escape($conname) . " CHECK $consrc";
|
foreach ($fkeys as $fkey_name => $fkey) {
|
||||||
|
$return_parts[] = "CONSTRAINT " . idf_escape($fkey_name) . " $fkey[definition] " . ($fkey['deferrable'] ? 'DEFERRABLE' : 'NOT DEFERRABLE');
|
||||||
}
|
}
|
||||||
|
|
||||||
$return .= implode(",\n ", $return_parts) . "\n) WITH (oids = " . ($status['Oid'] ? 'true' : 'false') . ");";
|
$return .= implode(",\n ", $return_parts) . "\n) WITH (oids = " . ($status['Oid'] ? 'true' : 'false') . ");";
|
||||||
@@ -878,39 +845,32 @@ AND typelem = 0"
|
|||||||
return $connection->result("SHOW max_connections");
|
return $connection->result("SHOW max_connections");
|
||||||
}
|
}
|
||||||
|
|
||||||
function driver_config() {
|
$jush = "pgsql";
|
||||||
$types = array();
|
$types = array();
|
||||||
$structured_types = array();
|
$structured_types = array();
|
||||||
foreach (array( //! arrays
|
foreach (array( //! arrays
|
||||||
lang('Numbers') => array("smallint" => 5, "integer" => 10, "bigint" => 19, "boolean" => 1, "numeric" => 0, "real" => 7, "double precision" => 16, "money" => 20),
|
lang('Numbers') => array("smallint" => 5, "integer" => 10, "bigint" => 19, "boolean" => 1, "numeric" => 0, "real" => 7, "double precision" => 16, "money" => 20),
|
||||||
lang('Date and time') => array("date" => 13, "time" => 17, "timestamp" => 20, "timestamptz" => 21, "interval" => 0),
|
lang('Date and time') => array("date" => 13, "time" => 17, "timestamp" => 20, "timestamptz" => 21, "interval" => 0),
|
||||||
lang('Strings') => array("character" => 0, "character varying" => 0, "text" => 0, "tsquery" => 0, "tsvector" => 0, "uuid" => 0, "xml" => 0),
|
lang('Strings') => array("character" => 0, "character varying" => 0, "text" => 0, "tsquery" => 0, "tsvector" => 0, "uuid" => 0, "xml" => 0),
|
||||||
lang('Binary') => array("bit" => 0, "bit varying" => 0, "bytea" => 0),
|
lang('Binary') => array("bit" => 0, "bit varying" => 0, "bytea" => 0),
|
||||||
lang('Network') => array("cidr" => 43, "inet" => 43, "macaddr" => 17, "txid_snapshot" => 0),
|
lang('Network') => array("cidr" => 43, "inet" => 43, "macaddr" => 17, "txid_snapshot" => 0),
|
||||||
lang('Geometry') => array("box" => 0, "circle" => 0, "line" => 0, "lseg" => 0, "path" => 0, "point" => 0, "polygon" => 0),
|
lang('Geometry') => array("box" => 0, "circle" => 0, "line" => 0, "lseg" => 0, "path" => 0, "point" => 0, "polygon" => 0),
|
||||||
) as $key => $val) { //! can be retrieved from pg_type
|
) as $key => $val) { //! can be retrieved from pg_type
|
||||||
$types += $val;
|
$types += $val;
|
||||||
$structured_types[$key] = array_keys($val);
|
$structured_types[$key] = array_keys($val);
|
||||||
}
|
|
||||||
return array(
|
|
||||||
'possible_drivers' => array("PgSQL", "PDO_PgSQL"),
|
|
||||||
'jush' => "pgsql",
|
|
||||||
'types' => $types,
|
|
||||||
'structured_types' => $structured_types,
|
|
||||||
'unsigned' => array(),
|
|
||||||
'operators' => array("=", "<", ">", "<=", ">=", "!=", "~", "!~", "LIKE", "LIKE %%", "ILIKE", "ILIKE %%", "IN", "IS NULL", "NOT LIKE", "NOT IN", "IS NOT NULL"), // no "SQL" to avoid CSRF
|
|
||||||
'functions' => array("char_length", "lower", "round", "to_hex", "to_timestamp", "upper"),
|
|
||||||
'grouping' => array("avg", "count", "count distinct", "max", "min", "sum"),
|
|
||||||
'edit_functions' => array(
|
|
||||||
array(
|
|
||||||
"char" => "md5",
|
|
||||||
"date|time" => "now",
|
|
||||||
), array(
|
|
||||||
number_type() => "+/-",
|
|
||||||
"date|time" => "+ interval/- interval", //! escape
|
|
||||||
"char|text" => "||",
|
|
||||||
)
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
$unsigned = array();
|
||||||
|
$operators = array("=", "<", ">", "<=", ">=", "!=", "~", "!~", "LIKE", "LIKE %%", "ILIKE", "ILIKE %%", "IN", "IS NULL", "NOT LIKE", "NOT IN", "IS NOT NULL"); // no "SQL" to avoid CSRF
|
||||||
|
$functions = array("char_length", "lower", "round", "to_hex", "to_timestamp", "upper");
|
||||||
|
$grouping = array("avg", "count", "count distinct", "max", "min", "sum");
|
||||||
|
$edit_functions = array(
|
||||||
|
array(
|
||||||
|
"char" => "md5",
|
||||||
|
"date|time" => "now",
|
||||||
|
), array(
|
||||||
|
number_type() => "+/-",
|
||||||
|
"date|time" => "+ interval/- interval", //! escape
|
||||||
|
"char|text" => "||",
|
||||||
|
)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
@@ -1,7 +1,8 @@
|
|||||||
<?php
|
<?php
|
||||||
add_driver("simpledb", "SimpleDB");
|
$drivers["simpledb"] = "SimpleDB";
|
||||||
|
|
||||||
if (isset($_GET["simpledb"])) {
|
if (isset($_GET["simpledb"])) {
|
||||||
|
$possible_drivers = array("SimpleXML + allow_url_fopen");
|
||||||
define("DRIVER", "simpledb");
|
define("DRIVER", "simpledb");
|
||||||
|
|
||||||
if (class_exists('SimpleXMLElement') && ini_bool('allow_url_fopen')) {
|
if (class_exists('SimpleXMLElement') && ini_bool('allow_url_fopen')) {
|
||||||
@@ -475,14 +476,9 @@ if (isset($_GET["simpledb"])) {
|
|||||||
return $return;
|
return $return;
|
||||||
}
|
}
|
||||||
|
|
||||||
function driver_config() {
|
$jush = "simpledb";
|
||||||
return array(
|
$operators = array("=", "<", ">", "<=", ">=", "!=", "LIKE", "LIKE %%", "IN", "IS NULL", "NOT LIKE", "IS NOT NULL");
|
||||||
'possible_drivers' => array("SimpleXML + allow_url_fopen"),
|
$functions = array();
|
||||||
'jush' => "simpledb",
|
$grouping = array("count");
|
||||||
'operators' => array("=", "<", ">", "<=", ">=", "!=", "LIKE", "LIKE %%", "IN", "IS NULL", "NOT LIKE", "IS NOT NULL"),
|
$edit_functions = array(array("json"));
|
||||||
'functions' => array(),
|
|
||||||
'grouping' => array("count"),
|
|
||||||
'edit_functions' => array(array("json")),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
}
|
@@ -3,6 +3,7 @@ $drivers["sqlite"] = "SQLite 3";
|
|||||||
$drivers["sqlite2"] = "SQLite 2";
|
$drivers["sqlite2"] = "SQLite 2";
|
||||||
|
|
||||||
if (isset($_GET["sqlite"]) || isset($_GET["sqlite2"])) {
|
if (isset($_GET["sqlite"]) || isset($_GET["sqlite2"])) {
|
||||||
|
$possible_drivers = array((isset($_GET["sqlite"]) ? "SQLite3" : "SQLite"), "PDO_SQLite");
|
||||||
define("DRIVER", (isset($_GET["sqlite"]) ? "sqlite" : "sqlite2"));
|
define("DRIVER", (isset($_GET["sqlite"]) ? "sqlite" : "sqlite2"));
|
||||||
if (class_exists(isset($_GET["sqlite"]) ? "SQLite3" : "SQLiteDatabase")) {
|
if (class_exists(isset($_GET["sqlite"]) ? "SQLite3" : "SQLiteDatabase")) {
|
||||||
if (isset($_GET["sqlite"])) {
|
if (isset($_GET["sqlite"])) {
|
||||||
@@ -190,7 +191,6 @@ if (isset($_GET["sqlite"]) || isset($_GET["sqlite2"])) {
|
|||||||
if (is_readable($filename) && $this->query("ATTACH " . $this->quote(preg_match("~(^[/\\\\]|:)~", $filename) ? $filename : dirname($_SERVER["SCRIPT_FILENAME"]) . "/$filename") . " AS a")) { // is_readable - SQLite 3
|
if (is_readable($filename) && $this->query("ATTACH " . $this->quote(preg_match("~(^[/\\\\]|:)~", $filename) ? $filename : dirname($_SERVER["SCRIPT_FILENAME"]) . "/$filename") . " AS a")) { // is_readable - SQLite 3
|
||||||
parent::__construct($filename);
|
parent::__construct($filename);
|
||||||
$this->query("PRAGMA foreign_keys = 1");
|
$this->query("PRAGMA foreign_keys = 1");
|
||||||
$this->query("PRAGMA busy_timeout = 500");
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
@@ -784,25 +784,20 @@ if (isset($_GET["sqlite"]) || isset($_GET["sqlite2"])) {
|
|||||||
return preg_match('~^(columns|database|drop_col|dump|indexes|descidx|move_col|sql|status|table|trigger|variables|view|view_trigger)$~', $feature);
|
return preg_match('~^(columns|database|drop_col|dump|indexes|descidx|move_col|sql|status|table|trigger|variables|view|view_trigger)$~', $feature);
|
||||||
}
|
}
|
||||||
|
|
||||||
function driver_config() {
|
$jush = "sqlite";
|
||||||
return array(
|
$types = array("integer" => 0, "real" => 0, "numeric" => 0, "text" => 0, "blob" => 0);
|
||||||
'possible_drivers' => array((isset($_GET["sqlite"]) ? "SQLite3" : "SQLite"), "PDO_SQLite"),
|
$structured_types = array_keys($types);
|
||||||
'jush' => "sqlite",
|
$unsigned = array();
|
||||||
'types' => array("integer" => 0, "real" => 0, "numeric" => 0, "text" => 0, "blob" => 0),
|
$operators = array("=", "<", ">", "<=", ">=", "!=", "LIKE", "LIKE %%", "IN", "IS NULL", "NOT LIKE", "NOT IN", "IS NOT NULL", "SQL"); // REGEXP can be user defined function
|
||||||
'structured_types' => array_keys($types),
|
$functions = array("hex", "length", "lower", "round", "unixepoch", "upper");
|
||||||
'unsigned' => array(),
|
$grouping = array("avg", "count", "count distinct", "group_concat", "max", "min", "sum");
|
||||||
'operators' => array("=", "<", ">", "<=", ">=", "!=", "LIKE", "LIKE %%", "IN", "IS NULL", "NOT LIKE", "NOT IN", "IS NOT NULL", "SQL"), // REGEXP can be user defined function
|
$edit_functions = array(
|
||||||
'functions' => array("hex", "length", "lower", "round", "unixepoch", "upper"),
|
array(
|
||||||
'grouping' => array("avg", "count", "count distinct", "group_concat", "max", "min", "sum"),
|
// "text" => "date('now')/time('now')/datetime('now')",
|
||||||
'edit_functions' => array(
|
), array(
|
||||||
array(
|
"integer|real|numeric" => "+/-",
|
||||||
// "text" => "date('now')/time('now')/datetime('now')",
|
// "text" => "date/time/datetime",
|
||||||
), array(
|
"text" => "||",
|
||||||
"integer|real|numeric" => "+/-",
|
)
|
||||||
// "text" => "date/time/datetime",
|
);
|
||||||
"text" => "||",
|
|
||||||
)
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@@ -14,7 +14,7 @@ if ($_POST && !$error) {
|
|||||||
$is_sql = preg_match('~sql~', $_POST["format"]);
|
$is_sql = preg_match('~sql~', $_POST["format"]);
|
||||||
|
|
||||||
if ($is_sql) {
|
if ($is_sql) {
|
||||||
echo "-- Adminer $VERSION " . $drivers[DRIVER] . " " . str_replace("\n", " ", $connection->server_info) . " dump\n\n";
|
echo "-- Adminer $VERSION " . $drivers[DRIVER] . " dump\n\n";
|
||||||
if ($jush == "sql") {
|
if ($jush == "sql") {
|
||||||
echo "SET NAMES utf8;
|
echo "SET NAMES utf8;
|
||||||
SET time_zone = '+00:00';
|
SET time_zone = '+00:00';
|
||||||
@@ -22,8 +22,7 @@ SET foreign_key_checks = 0;
|
|||||||
" . ($_POST["data_style"] ? "SET sql_mode = 'NO_AUTO_VALUE_ON_ZERO';
|
" . ($_POST["data_style"] ? "SET sql_mode = 'NO_AUTO_VALUE_ON_ZERO';
|
||||||
" : "") . "
|
" : "") . "
|
||||||
";
|
";
|
||||||
$connection->query("SET time_zone = '+00:00'");
|
$connection->query("SET time_zone = '+00:00';");
|
||||||
$connection->query("SET sql_mode = ''");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -106,16 +105,6 @@ SET foreign_key_checks = 0;
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// add FKs after creating tables (except in MySQL which uses SET FOREIGN_KEY_CHECKS=0)
|
|
||||||
if (function_exists('foreign_keys_sql')) {
|
|
||||||
foreach (table_status('', true) as $name => $table_status) {
|
|
||||||
$table = (DB == "" || in_array($name, (array) $_POST["tables"]));
|
|
||||||
if ($table && !is_view($table_status)) {
|
|
||||||
echo foreign_keys_sql($name);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach ($views as $view) {
|
foreach ($views as $view) {
|
||||||
$adminer->dumpTable($view, $_POST["table_style"], 1);
|
$adminer->dumpTable($view, $_POST["table_style"], 1);
|
||||||
}
|
}
|
||||||
|
@@ -60,7 +60,7 @@ if ($row["ns"] != "") {
|
|||||||
set_schema($row["ns"]);
|
set_schema($row["ns"]);
|
||||||
}
|
}
|
||||||
$referencable = array_keys(array_filter(table_status('', true), 'fk_support'));
|
$referencable = array_keys(array_filter(table_status('', true), 'fk_support'));
|
||||||
$target = array_keys(fields(in_array($row["table"], $referencable) ? $row["table"] : reset($referencable)));
|
$target = ($TABLE === $row["table"] ? $source : array_keys(fields(in_array($row["table"], $referencable) ? $row["table"] : reset($referencable))));
|
||||||
$onchange = "this.form['change-js'].value = '1'; this.form.submit();";
|
$onchange = "this.form['change-js'].value = '1'; this.form.submit();";
|
||||||
echo "<p>" . lang('Target table') . ": " . html_select("table", $referencable, $row["table"], $onchange) . "\n";
|
echo "<p>" . lang('Target table') . ": " . html_select("table", $referencable, $row["table"], $onchange) . "\n";
|
||||||
if ($jush == "pgsql") {
|
if ($jush == "pgsql") {
|
||||||
|
@@ -480,7 +480,7 @@ class Adminer {
|
|||||||
echo "</script>\n";
|
echo "</script>\n";
|
||||||
echo "</div></fieldset>\n";
|
echo "</div></fieldset>\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Print command box in select
|
/** Print command box in select
|
||||||
* @return bool whether to print default commands
|
* @return bool whether to print default commands
|
||||||
*/
|
*/
|
||||||
@@ -563,7 +563,6 @@ class Adminer {
|
|||||||
foreach ($fields as $name => $field) {
|
foreach ($fields as $name => $field) {
|
||||||
if ((preg_match('~^[-\d.' . (preg_match('~IN$~', $val["op"]) ? ',' : '') . ']+$~', $val["val"]) || !preg_match('~' . number_type() . '|bit~', $field["type"]))
|
if ((preg_match('~^[-\d.' . (preg_match('~IN$~', $val["op"]) ? ',' : '') . ']+$~', $val["val"]) || !preg_match('~' . number_type() . '|bit~', $field["type"]))
|
||||||
&& (!preg_match("~[\x80-\xFF]~", $val["val"]) || preg_match('~char|text|enum|set~', $field["type"]))
|
&& (!preg_match("~[\x80-\xFF]~", $val["val"]) || preg_match('~char|text|enum|set~', $field["type"]))
|
||||||
&& (!preg_match('~date|timestamp~', $field["type"]) || preg_match('~^\d+-\d+-\d+~', $val["val"]))
|
|
||||||
) {
|
) {
|
||||||
$cols[] = $prefix . $driver->convertSearch(idf_escape($name), $val, $field) . $cond;
|
$cols[] = $prefix . $driver->convertSearch(idf_escape($name), $val, $field) . $cond;
|
||||||
}
|
}
|
||||||
@@ -659,16 +658,6 @@ class Adminer {
|
|||||||
;
|
;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Print before edit form
|
|
||||||
* @param string
|
|
||||||
* @param array
|
|
||||||
* @param mixed
|
|
||||||
* @param bool
|
|
||||||
* @return null
|
|
||||||
*/
|
|
||||||
function editRowPrint($table, $fields, $row, $update) {
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Functions displayed in edit form
|
/** Functions displayed in edit form
|
||||||
* @param array single field from fields()
|
* @param array single field from fields()
|
||||||
* @return array
|
* @return array
|
||||||
@@ -676,20 +665,19 @@ class Adminer {
|
|||||||
function editFunctions($field) {
|
function editFunctions($field) {
|
||||||
global $edit_functions;
|
global $edit_functions;
|
||||||
$return = ($field["null"] ? "NULL/" : "");
|
$return = ($field["null"] ? "NULL/" : "");
|
||||||
$update = isset($_GET["select"]) || where($_GET);
|
|
||||||
foreach ($edit_functions as $key => $functions) {
|
foreach ($edit_functions as $key => $functions) {
|
||||||
if (!$key || (!isset($_GET["call"]) && $update)) { // relative functions
|
if (!$key || (!isset($_GET["call"]) && (isset($_GET["select"]) || where($_GET)))) { // relative functions
|
||||||
foreach ($functions as $pattern => $val) {
|
foreach ($functions as $pattern => $val) {
|
||||||
if (!$pattern || preg_match("~$pattern~", $field["type"])) {
|
if (!$pattern || preg_match("~$pattern~", $field["type"])) {
|
||||||
$return .= "/$val";
|
$return .= "/$val";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
if ($key && !preg_match('~set|blob|bytea|raw|file~', $field["type"])) {
|
||||||
if ($key && !preg_match('~set|blob|bytea|raw|file|bool~', $field["type"])) {
|
$return .= "/SQL";
|
||||||
$return .= "/SQL";
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ($field["auto_increment"] && !$update) {
|
if ($field["auto_increment"] && !isset($_GET["select"]) && !where($_GET)) {
|
||||||
$return = lang('Auto Increment');
|
$return = lang('Auto Increment');
|
||||||
}
|
}
|
||||||
return explode("/", $return);
|
return explode("/", $return);
|
||||||
@@ -1010,7 +998,7 @@ bodyLoad('<?php echo (is_object($connection) ? preg_replace('~^(\d\.?\d).*~s', '
|
|||||||
function databasesPrint($missing) {
|
function databasesPrint($missing) {
|
||||||
global $adminer, $connection;
|
global $adminer, $connection;
|
||||||
$databases = $this->databases();
|
$databases = $this->databases();
|
||||||
if (DB && $databases && !in_array(DB, $databases)) {
|
if ($databases && !in_array(DB, $databases)) {
|
||||||
array_unshift($databases, DB);
|
array_unshift($databases, DB);
|
||||||
}
|
}
|
||||||
?>
|
?>
|
||||||
@@ -1050,10 +1038,7 @@ bodyLoad('<?php echo (is_object($connection) ? preg_replace('~^(\d\.?\d).*~s', '
|
|||||||
foreach ($tables as $table => $status) {
|
foreach ($tables as $table => $status) {
|
||||||
$name = $this->tableName($status);
|
$name = $this->tableName($status);
|
||||||
if ($name != "") {
|
if ($name != "") {
|
||||||
echo '<li><a href="' . h(ME) . 'select=' . urlencode($table) . '"'
|
echo '<li><a href="' . h(ME) . 'select=' . urlencode($table) . '"' . bold($_GET["select"] == $table || $_GET["edit"] == $table, "select") . ">" . lang('select') . "</a> ";
|
||||||
. bold($_GET["select"] == $table || $_GET["edit"] == $table, "select")
|
|
||||||
. " title='" . lang('Select data') . "'>" . lang('select') . "</a> "
|
|
||||||
;
|
|
||||||
echo (support("table") || support("indexes")
|
echo (support("table") || support("indexes")
|
||||||
? '<a href="' . h(ME) . 'table=' . urlencode($table) . '"'
|
? '<a href="' . h(ME) . 'table=' . urlencode($table) . '"'
|
||||||
. bold(in_array($table, array($_GET["table"], $_GET["create"], $_GET["indexes"], $_GET["foreign"], $_GET["trigger"])), (is_view($status) ? "view" : "structure"))
|
. bold(in_array($table, array($_GET["table"], $_GET["create"], $_GET["indexes"], $_GET["foreign"], $_GET["trigger"])), (is_view($status) ? "view" : "structure"))
|
||||||
@@ -1066,3 +1051,8 @@ bodyLoad('<?php echo (is_object($connection) ? preg_replace('~^(\d\.?\d).*~s', '
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$adminer = (function_exists('adminer_object') ? adminer_object() : new Adminer);
|
||||||
|
if ($adminer->operators === null) {
|
||||||
|
$adminer->operators = $operators;
|
||||||
|
}
|
||||||
|
@@ -73,12 +73,18 @@ if ($auth) {
|
|||||||
redirect(auth_url($vendor, $server, $username, $db));
|
redirect(auth_url($vendor, $server, $username, $db));
|
||||||
}
|
}
|
||||||
|
|
||||||
} elseif ($_POST["logout"] && (!$has_token || verify_token())) {
|
} elseif ($_POST["logout"]) {
|
||||||
foreach (array("pwds", "db", "dbs", "queries") as $key) {
|
if ($has_token && !verify_token()) {
|
||||||
set_session($key, null);
|
page_header(lang('Logout'), lang('Invalid CSRF token. Send the form again.'));
|
||||||
|
page_footer("db");
|
||||||
|
exit;
|
||||||
|
} else {
|
||||||
|
foreach (array("pwds", "db", "dbs", "queries") as $key) {
|
||||||
|
set_session($key, null);
|
||||||
|
}
|
||||||
|
unset_permanent();
|
||||||
|
redirect(substr(preg_replace('~\b(username|db|ns)=[^&]*&~', '', ME), 0, -1), lang('Logout successful.') . ' ' . lang('Thanks for using Adminer, consider <a href="https://www.adminer.org/en/donation/">donating</a>.'));
|
||||||
}
|
}
|
||||||
unset_permanent();
|
|
||||||
redirect(substr(preg_replace('~\b(username|db|ns)=[^&]*&~', '', ME), 0, -1), lang('Logout successful.') . ' ' . lang('Thanks for using Adminer, consider <a href="https://www.adminer.org/en/donation/">donating</a>.'));
|
|
||||||
|
|
||||||
} elseif ($permanent && !$_SESSION["pwds"]) {
|
} elseif ($permanent && !$_SESSION["pwds"]) {
|
||||||
session_regenerate_id();
|
session_regenerate_id();
|
||||||
@@ -119,7 +125,7 @@ function auth_error($error) {
|
|||||||
$password = get_password();
|
$password = get_password();
|
||||||
if ($password !== null) {
|
if ($password !== null) {
|
||||||
if ($password === false) {
|
if ($password === false) {
|
||||||
$error .= ($error ? '<br>' : '') . lang('Master password expired. <a href="https://www.adminer.org/en/extension/"%s>Implement</a> %s method to make it permanent.', target_blank(), '<code>permanentLogin()</code>');
|
$error .= '<br>' . lang('Master password expired. <a href="https://www.adminer.org/en/extension/"%s>Implement</a> %s method to make it permanent.', target_blank(), '<code>permanentLogin()</code>');
|
||||||
}
|
}
|
||||||
set_password(DRIVER, SERVER, $_GET["username"], null);
|
set_password(DRIVER, SERVER, $_GET["username"], null);
|
||||||
}
|
}
|
||||||
@@ -156,7 +162,7 @@ stop_session(true);
|
|||||||
|
|
||||||
if (isset($_GET["username"]) && is_string(get_password())) {
|
if (isset($_GET["username"]) && is_string(get_password())) {
|
||||||
list($host, $port) = explode(":", SERVER, 2);
|
list($host, $port) = explode(":", SERVER, 2);
|
||||||
if (preg_match('~^\s*([-+]?\d+)~', $port, $match) && ($match[1] < 1024 || $match[1] > 65535)) { // is_numeric('80#') would still connect to port 80
|
if (is_numeric($port) && ($port < 1024 || $port > 65535)) {
|
||||||
auth_error(lang('Connecting to privileged ports is not allowed.'));
|
auth_error(lang('Connecting to privileged ports is not allowed.'));
|
||||||
}
|
}
|
||||||
check_invalid_login();
|
check_invalid_login();
|
||||||
@@ -170,12 +176,6 @@ if (!is_object($connection) || ($login = $adminer->login($_GET["username"], get_
|
|||||||
auth_error($error . (preg_match('~^ | $~', get_password()) ? '<br>' . lang('There is a space in the input password which might be the cause.') : ''));
|
auth_error($error . (preg_match('~^ | $~', get_password()) ? '<br>' . lang('There is a space in the input password which might be the cause.') : ''));
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($_POST["logout"] && $has_token && !verify_token()) {
|
|
||||||
page_header(lang('Logout'), lang('Invalid CSRF token. Send the form again.'));
|
|
||||||
page_footer("db");
|
|
||||||
exit;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($auth && $_POST["token"]) {
|
if ($auth && $_POST["token"]) {
|
||||||
$_POST["token"] = $token; // reset token after explicit login
|
$_POST["token"] = $token; // reset token after explicit login
|
||||||
}
|
}
|
||||||
|
@@ -1,10 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
function adminer_errors($errno, $errstr) {
|
|
||||||
return !!preg_match('~^(Trying to access array offset on value of type null|Undefined array key)~', $errstr);
|
|
||||||
}
|
|
||||||
|
|
||||||
error_reporting(6135); // errors and warnings
|
error_reporting(6135); // errors and warnings
|
||||||
set_error_handler('adminer_errors', 2); // 2 - E_WARNING
|
|
||||||
|
|
||||||
include "../adminer/include/coverage.inc.php";
|
include "../adminer/include/coverage.inc.php";
|
||||||
|
|
||||||
@@ -65,7 +60,7 @@ if (!defined("SID")) {
|
|||||||
|
|
||||||
// disable magic quotes to be able to use database escaping function
|
// disable magic quotes to be able to use database escaping function
|
||||||
remove_slashes(array(&$_GET, &$_POST, &$_COOKIE), $filter);
|
remove_slashes(array(&$_GET, &$_POST, &$_COOKIE), $filter);
|
||||||
if (function_exists("get_magic_quotes_runtime") && get_magic_quotes_runtime()) {
|
if (get_magic_quotes_runtime()) {
|
||||||
set_magic_quotes_runtime(false);
|
set_magic_quotes_runtime(false);
|
||||||
}
|
}
|
||||||
@set_time_limit(0); // @ - can be disabled
|
@set_time_limit(0); // @ - can be disabled
|
||||||
@@ -80,29 +75,16 @@ include "../adminer/drivers/sqlite.inc.php";
|
|||||||
include "../adminer/drivers/pgsql.inc.php";
|
include "../adminer/drivers/pgsql.inc.php";
|
||||||
include "../adminer/drivers/oracle.inc.php";
|
include "../adminer/drivers/oracle.inc.php";
|
||||||
include "../adminer/drivers/mssql.inc.php";
|
include "../adminer/drivers/mssql.inc.php";
|
||||||
|
include "../adminer/drivers/firebird.inc.php";
|
||||||
|
include "../adminer/drivers/simpledb.inc.php";
|
||||||
include "../adminer/drivers/mongo.inc.php";
|
include "../adminer/drivers/mongo.inc.php";
|
||||||
include "../adminer/drivers/elastic.inc.php";
|
include "../adminer/drivers/elastic.inc.php";
|
||||||
include "./include/adminer.inc.php";
|
include "../adminer/drivers/clickhouse.inc.php";
|
||||||
$adminer = (function_exists('adminer_object') ? adminer_object() : new Adminer);
|
|
||||||
include "../adminer/drivers/mysql.inc.php"; // must be included as last driver
|
include "../adminer/drivers/mysql.inc.php"; // must be included as last driver
|
||||||
|
|
||||||
$config = driver_config();
|
|
||||||
$possible_drivers = $config['possible_drivers'];
|
|
||||||
$jush = $config['jush'];
|
|
||||||
$types = $config['types'];
|
|
||||||
$structured_types = $config['structured_types'];
|
|
||||||
$unsigned = $config['unsigned'];
|
|
||||||
$operators = $config['operators'];
|
|
||||||
$functions = $config['functions'];
|
|
||||||
$grouping = $config['grouping'];
|
|
||||||
$edit_functions = $config['edit_functions'];
|
|
||||||
if ($adminer->operators === null) {
|
|
||||||
$adminer->operators = $operators;
|
|
||||||
}
|
|
||||||
|
|
||||||
define("SERVER", $_GET[DRIVER]); // read from pgsql=localhost
|
define("SERVER", $_GET[DRIVER]); // read from pgsql=localhost
|
||||||
define("DB", $_GET["db"]); // for the sake of speed and size
|
define("DB", $_GET["db"]); // for the sake of speed and size
|
||||||
define("ME", preg_replace('~\?.*~', '', relative_uri()) . '?'
|
define("ME", str_replace(":", "%3a", preg_replace('~^[^?]*/([^?]*).*~', '\1', $_SERVER["REQUEST_URI"])) . '?'
|
||||||
. (sid() ? SID . '&' : '')
|
. (sid() ? SID . '&' : '')
|
||||||
. (SERVER !== null ? DRIVER . "=" . urlencode(SERVER) . '&' : '')
|
. (SERVER !== null ? DRIVER . "=" . urlencode(SERVER) . '&' : '')
|
||||||
. (isset($_GET["username"]) ? "username=" . urlencode($_GET["username"]) . '&' : '')
|
. (isset($_GET["username"]) ? "username=" . urlencode($_GET["username"]) . '&' : '')
|
||||||
@@ -110,6 +92,7 @@ define("ME", preg_replace('~\?.*~', '', relative_uri()) . '?'
|
|||||||
);
|
);
|
||||||
|
|
||||||
include "../adminer/include/version.inc.php";
|
include "../adminer/include/version.inc.php";
|
||||||
|
include "./include/adminer.inc.php";
|
||||||
include "../adminer/include/design.inc.php";
|
include "../adminer/include/design.inc.php";
|
||||||
include "../adminer/include/xxtea.inc.php";
|
include "../adminer/include/xxtea.inc.php";
|
||||||
include "../adminer/include/auth.inc.php";
|
include "../adminer/include/auth.inc.php";
|
||||||
|
@@ -75,7 +75,7 @@ var thousandsSeparator = '<?php echo js_escape(lang(',')); ?>';
|
|||||||
if ($breadcrumb === false) {
|
if ($breadcrumb === false) {
|
||||||
echo "$server\n";
|
echo "$server\n";
|
||||||
} else {
|
} else {
|
||||||
echo "<a href='" . h($link) . "' accesskey='1' title='Alt+Shift+1'>$server</a> » ";
|
echo "<a href='" . ($link ? h($link) : ".") . "' accesskey='1' title='Alt+Shift+1'>$server</a> » ";
|
||||||
if ($_GET["ns"] != "" || (DB != "" && is_array($breadcrumb))) {
|
if ($_GET["ns"] != "" || (DB != "" && is_array($breadcrumb))) {
|
||||||
echo '<a href="' . h($link . "&db=" . urlencode(DB) . (support("scheme") ? "&ns=" : "")) . '">' . h(DB) . '</a> » ';
|
echo '<a href="' . h($link . "&db=" . urlencode(DB) . (support("scheme") ? "&ns=" : "")) . '">' . h(DB) . '</a> » ';
|
||||||
}
|
}
|
||||||
|
@@ -1,15 +1,4 @@
|
|||||||
<?php
|
<?php
|
||||||
$drivers = array();
|
|
||||||
|
|
||||||
/** Add a driver
|
|
||||||
* @param string
|
|
||||||
* @param string
|
|
||||||
* @return null
|
|
||||||
*/
|
|
||||||
function add_driver($id, $name) {
|
|
||||||
global $drivers;
|
|
||||||
$drivers[$id] = $name;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*abstract*/ class Min_SQL {
|
/*abstract*/ class Min_SQL {
|
||||||
var $_conn;
|
var $_conn;
|
||||||
|
@@ -61,20 +61,6 @@ function select($result, $connection2 = null, $orgtables = array(), $limit = 0)
|
|||||||
}
|
}
|
||||||
echo "<tr" . odd() . ">";
|
echo "<tr" . odd() . ">";
|
||||||
foreach ($row as $key => $val) {
|
foreach ($row as $key => $val) {
|
||||||
$link = "";
|
|
||||||
if (isset($links[$key]) && !$columns[$links[$key]]) {
|
|
||||||
if ($orgtables && $jush == "sql") { // MySQL EXPLAIN
|
|
||||||
$table = $row[array_search("table=", $links)];
|
|
||||||
$link = ME . $links[$key] . urlencode($orgtables[$table] != "" ? $orgtables[$table] : $table);
|
|
||||||
} else {
|
|
||||||
$link = ME . "edit=" . urlencode($links[$key]);
|
|
||||||
foreach ($indexes[$links[$key]] as $col => $j) {
|
|
||||||
$link .= "&where" . urlencode("[" . bracket_escape($col) . "]") . "=" . urlencode($row[$j]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} elseif (is_url($val)) {
|
|
||||||
$link = $val;
|
|
||||||
}
|
|
||||||
if ($val === null) {
|
if ($val === null) {
|
||||||
$val = "<i>NULL</i>";
|
$val = "<i>NULL</i>";
|
||||||
} elseif ($blobs[$key] && !is_utf8($val)) {
|
} elseif ($blobs[$key] && !is_utf8($val)) {
|
||||||
@@ -85,8 +71,17 @@ function select($result, $connection2 = null, $orgtables = array(), $limit = 0)
|
|||||||
$val = "<code>$val</code>";
|
$val = "<code>$val</code>";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ($link) {
|
if (isset($links[$key]) && !$columns[$links[$key]]) {
|
||||||
$val = "<a href='" . h($link) . "'" . (is_url($link) ? target_blank() : '') . ">$val</a>";
|
if ($orgtables && $jush == "sql") { // MySQL EXPLAIN
|
||||||
|
$table = $row[array_search("table=", $links)];
|
||||||
|
$link = $links[$key] . urlencode($orgtables[$table] != "" ? $orgtables[$table] : $table);
|
||||||
|
} else {
|
||||||
|
$link = "edit=" . urlencode($links[$key]);
|
||||||
|
foreach ($indexes[$links[$key]] as $col => $j) {
|
||||||
|
$link .= "&where" . urlencode("[" . bracket_escape($col) . "]") . "=" . urlencode($row[$j]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$val = "<a href='" . h(ME . $link) . "'>$val</a>";
|
||||||
}
|
}
|
||||||
echo "<td>$val";
|
echo "<td>$val";
|
||||||
}
|
}
|
||||||
|
@@ -62,7 +62,7 @@ function number_type() {
|
|||||||
* @return null modified in place
|
* @return null modified in place
|
||||||
*/
|
*/
|
||||||
function remove_slashes($process, $filter = false) {
|
function remove_slashes($process, $filter = false) {
|
||||||
if (function_exists("get_magic_quotes_gpc") && get_magic_quotes_gpc()) {
|
if (get_magic_quotes_gpc()) {
|
||||||
while (list($key, $val) = each($process)) {
|
while (list($key, $val) = each($process)) {
|
||||||
foreach ($val as $k => $v) {
|
foreach ($val as $k => $v) {
|
||||||
unset($process[$key][$k]);
|
unset($process[$key][$k]);
|
||||||
@@ -721,19 +721,12 @@ function format_time($start) {
|
|||||||
return lang('%.3f s', max(0, microtime(true) - $start));
|
return lang('%.3f s', max(0, microtime(true) - $start));
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Get relative REQUEST_URI
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
function relative_uri() {
|
|
||||||
return str_replace(":", "%3a", preg_replace('~^[^?]*/([^?]*)~', '\1', $_SERVER["REQUEST_URI"]));
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Remove parameter from query string
|
/** Remove parameter from query string
|
||||||
* @param string
|
* @param string
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
function remove_from_uri($param = "") {
|
function remove_from_uri($param = "") {
|
||||||
return substr(preg_replace("~(?<=[?&])($param" . (SID ? "" : "|" . session_name()) . ")=[^&]*&~", '', relative_uri() . "&"), 0, -1);
|
return substr(preg_replace("~(?<=[?&])($param" . (SID ? "" : "|" . session_name()) . ")=[^&]*&~", '', "$_SERVER[REQUEST_URI]&"), 0, -1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Generate page number for pagination
|
/** Generate page number for pagination
|
||||||
@@ -849,18 +842,19 @@ function friendly_url($val) {
|
|||||||
/** Print hidden fields
|
/** Print hidden fields
|
||||||
* @param array
|
* @param array
|
||||||
* @param array
|
* @param array
|
||||||
* @param string
|
|
||||||
* @return bool
|
* @return bool
|
||||||
*/
|
*/
|
||||||
function hidden_fields($process, $ignore = array(), $prefix = '') {
|
function hidden_fields($process, $ignore = array()) {
|
||||||
$return = false;
|
$return = false;
|
||||||
foreach ($process as $key => $val) {
|
while (list($key, $val) = each($process)) {
|
||||||
if (!in_array($key, $ignore)) {
|
if (!in_array($key, $ignore)) {
|
||||||
if (is_array($val)) {
|
if (is_array($val)) {
|
||||||
hidden_fields($val, array(), $key);
|
foreach ($val as $k => $v) {
|
||||||
|
$process[$key . "[$k]"] = $v;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
$return = true;
|
$return = true;
|
||||||
echo '<input type="hidden" name="' . h($prefix ? $prefix . "[$key]" : $key) . '" value="' . h($val) . '">';
|
echo '<input type="hidden" name="' . h($key) . '" value="' . h($val) . '">';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1115,7 +1109,7 @@ function dump_headers($identifier, $multi_table = false) {
|
|||||||
$return = $adminer->dumpHeaders($identifier, $multi_table);
|
$return = $adminer->dumpHeaders($identifier, $multi_table);
|
||||||
$output = $_POST["output"];
|
$output = $_POST["output"];
|
||||||
if ($output != "text") {
|
if ($output != "text") {
|
||||||
header("Content-Disposition: attachment; filename=" . $adminer->dumpFilename($identifier) . ".$return" . ($output != "file" && preg_match('~^[0-9a-z]+$~', $output) ? ".$output" : ""));
|
header("Content-Disposition: attachment; filename=" . $adminer->dumpFilename($identifier) . ".$return" . ($output != "file" && !preg_match('~[^0-9a-z]~', $output) ? ".$output" : ""));
|
||||||
}
|
}
|
||||||
session_write_close();
|
session_write_close();
|
||||||
ob_flush();
|
ob_flush();
|
||||||
@@ -1129,7 +1123,7 @@ function dump_headers($identifier, $multi_table = false) {
|
|||||||
*/
|
*/
|
||||||
function dump_csv($row) {
|
function dump_csv($row) {
|
||||||
foreach ($row as $key => $val) {
|
foreach ($row as $key => $val) {
|
||||||
if (preg_match('~["\n,;\t]|^0|\.\d*0$~', $val) || $val === "") {
|
if (preg_match("~[\"\n,;\t]~", $val) || $val === "") {
|
||||||
$row[$key] = '"' . str_replace('"', '""', $val) . '"';
|
$row[$key] = '"' . str_replace('"', '""', $val) . '"';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1411,16 +1405,15 @@ function on_help($command, $side = 0) {
|
|||||||
* @param bool
|
* @param bool
|
||||||
* @return null
|
* @return null
|
||||||
*/
|
*/
|
||||||
function edit_form($table, $fields, $row, $update) {
|
function edit_form($TABLE, $fields, $row, $update) {
|
||||||
global $adminer, $jush, $token, $error;
|
global $adminer, $jush, $token, $error;
|
||||||
$table_name = $adminer->tableName(table_status1($table, true));
|
$table_name = $adminer->tableName(table_status1($TABLE, true));
|
||||||
page_header(
|
page_header(
|
||||||
($update ? lang('Edit') : lang('Insert')),
|
($update ? lang('Edit') : lang('Insert')),
|
||||||
$error,
|
$error,
|
||||||
array("select" => array($table, $table_name)),
|
array("select" => array($TABLE, $table_name)),
|
||||||
$table_name
|
$table_name
|
||||||
);
|
);
|
||||||
$adminer->editRowPrint($table, $fields, $row, $update);
|
|
||||||
if ($row === false) {
|
if ($row === false) {
|
||||||
echo "<p class='error'>" . lang('No rows.') . "\n";
|
echo "<p class='error'>" . lang('No rows.') . "\n";
|
||||||
}
|
}
|
||||||
@@ -1444,7 +1437,7 @@ function edit_form($table, $fields, $row, $update) {
|
|||||||
$value = ($row !== null
|
$value = ($row !== null
|
||||||
? ($row[$name] != "" && $jush == "sql" && preg_match("~enum|set~", $field["type"])
|
? ($row[$name] != "" && $jush == "sql" && preg_match("~enum|set~", $field["type"])
|
||||||
? (is_array($row[$name]) ? array_sum($row[$name]) : +$row[$name])
|
? (is_array($row[$name]) ? array_sum($row[$name]) : +$row[$name])
|
||||||
: (is_bool($row[$name]) ? +$row[$name] : $row[$name])
|
: $row[$name]
|
||||||
)
|
)
|
||||||
: (!$update && $field["auto_increment"]
|
: (!$update && $field["auto_increment"]
|
||||||
? ""
|
? ""
|
||||||
@@ -1461,9 +1454,6 @@ function edit_form($table, $fields, $row, $update) {
|
|||||||
: ($value === false ? null : ($value !== null ? '' : 'NULL'))
|
: ($value === false ? null : ($value !== null ? '' : 'NULL'))
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
if (!$_POST && !$update && $value == $field["default"] && preg_match('~^[\w.]+\(~', $value)) {
|
|
||||||
$function = "SQL";
|
|
||||||
}
|
|
||||||
if (preg_match("~time~", $field["type"]) && preg_match('~^CURRENT_TIMESTAMP~i', $value)) {
|
if (preg_match("~time~", $field["type"]) && preg_match('~^CURRENT_TIMESTAMP~i', $value)) {
|
||||||
$value = "";
|
$value = "";
|
||||||
$function = "now";
|
$function = "now";
|
||||||
|
@@ -1,8 +1,8 @@
|
|||||||
<?php
|
<?php
|
||||||
// PDO can be used in several database drivers
|
// PDO can be used in several database drivers
|
||||||
if (extension_loaded('pdo')) {
|
if (extension_loaded('pdo')) {
|
||||||
/*abstract*/ class Min_PDO {
|
/*abstract*/ class Min_PDO extends PDO {
|
||||||
var $_result, $server_info, $affected_rows, $errno, $error, $pdo;
|
var $_result, $server_info, $affected_rows, $errno, $error;
|
||||||
|
|
||||||
function __construct() {
|
function __construct() {
|
||||||
global $adminer;
|
global $adminer;
|
||||||
@@ -14,26 +14,21 @@ if (extension_loaded('pdo')) {
|
|||||||
|
|
||||||
function dsn($dsn, $username, $password, $options = array()) {
|
function dsn($dsn, $username, $password, $options = array()) {
|
||||||
try {
|
try {
|
||||||
$this->pdo = new PDO($dsn, $username, $password, $options);
|
parent::__construct($dsn, $username, $password, $options);
|
||||||
} catch (Exception $ex) {
|
} catch (Exception $ex) {
|
||||||
auth_error(h($ex->getMessage()));
|
auth_error(h($ex->getMessage()));
|
||||||
}
|
}
|
||||||
$this->pdo->setAttribute(3, 1); // 3 - PDO::ATTR_ERRMODE, 1 - PDO::ERRMODE_WARNING
|
$this->setAttribute(13, array('Min_PDOStatement')); // 13 - PDO::ATTR_STATEMENT_CLASS
|
||||||
$this->pdo->setAttribute(13, array('Min_PDOStatement')); // 13 - PDO::ATTR_STATEMENT_CLASS
|
$this->server_info = @$this->getAttribute(4); // 4 - PDO::ATTR_SERVER_VERSION
|
||||||
$this->server_info = @$this->pdo->getAttribute(4); // 4 - PDO::ATTR_SERVER_VERSION
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*abstract function select_db($database);*/
|
/*abstract function select_db($database);*/
|
||||||
|
|
||||||
function quote($string) {
|
|
||||||
return $this->pdo->quote($string);
|
|
||||||
}
|
|
||||||
|
|
||||||
function query($query, $unbuffered = false) {
|
function query($query, $unbuffered = false) {
|
||||||
$result = $this->pdo->query($query);
|
$result = parent::query($query);
|
||||||
$this->error = "";
|
$this->error = "";
|
||||||
if (!$result) {
|
if (!$result) {
|
||||||
list(, $this->errno, $this->error) = $this->pdo->errorInfo();
|
list(, $this->errno, $this->error) = $this->errorInfo();
|
||||||
if (!$this->error) {
|
if (!$this->error) {
|
||||||
$this->error = lang('Unknown error.');
|
$this->error = lang('Unknown error.');
|
||||||
}
|
}
|
||||||
@@ -100,3 +95,5 @@ if (extension_loaded('pdo')) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$drivers = array();
|
||||||
|
@@ -1,2 +1,2 @@
|
|||||||
<?php
|
<?php
|
||||||
$VERSION = "4.8.0";
|
$VERSION = "4.7.6";
|
||||||
|
@@ -280,7 +280,7 @@ $translations = array(
|
|||||||
'If you did not send this request from Adminer then close this page.' => 'Wenn Sie diese Anfrage nicht von Adminer gesendet haben, schließen Sie diese Seite.',
|
'If you did not send this request from Adminer then close this page.' => 'Wenn Sie diese Anfrage nicht von Adminer gesendet haben, schließen Sie diese Seite.',
|
||||||
'You can upload a big SQL file via FTP and import it from server.' => 'Sie können eine große SQL-Datei per FTP hochladen und dann vom Server importieren.',
|
'You can upload a big SQL file via FTP and import it from server.' => 'Sie können eine große SQL-Datei per FTP hochladen und dann vom Server importieren.',
|
||||||
'You are offline.' => 'Sie sind offline.',
|
'You are offline.' => 'Sie sind offline.',
|
||||||
'You have no privileges to update this table.' => 'Sie haben keine Rechte, um diese Tabelle zu aktualisieren.',
|
'You have no privileges to update this table.' => 'Sie haben keine Rechte, um diese Tabelle zu aktualisieren.' ,
|
||||||
'Saving' => 'Speichere',
|
'Saving' => 'Speichere',
|
||||||
'yes' => 'ja',
|
'yes' => 'ja',
|
||||||
'no' => 'nein',
|
'no' => 'nein',
|
||||||
|
@@ -234,7 +234,7 @@ $translations = array(
|
|||||||
'Sort' => 'Ταξινόμηση',
|
'Sort' => 'Ταξινόμηση',
|
||||||
'descending' => 'Φθίνουσα',
|
'descending' => 'Φθίνουσα',
|
||||||
'Limit' => 'Όριο',
|
'Limit' => 'Όριο',
|
||||||
'Limit rows' => 'Περιορισμός σειρών',
|
'Limit rows' => 'Περιοριμός σειρών',
|
||||||
'Text length' => 'Μήκος κειμένου',
|
'Text length' => 'Μήκος κειμένου',
|
||||||
'Action' => 'Ενέργεια',
|
'Action' => 'Ενέργεια',
|
||||||
'Full table scan' => 'Πλήρης σάρωση πινάκων',
|
'Full table scan' => 'Πλήρης σάρωση πινάκων',
|
||||||
|
@@ -333,18 +333,4 @@ $translations = array(
|
|||||||
'Type has been dropped.' => 'Tyyppi poistettiin.',
|
'Type has been dropped.' => 'Tyyppi poistettiin.',
|
||||||
'Type has been created.' => 'Tyyppi luotiin.',
|
'Type has been created.' => 'Tyyppi luotiin.',
|
||||||
'Alter type' => 'Muuta tyyppiä',
|
'Alter type' => 'Muuta tyyppiä',
|
||||||
|
|
||||||
'Thanks for using Adminer, consider <a href="https://www.adminer.org/en/donation/">donating</a>.' => 'Kiitos, kun käytät Admineriä, voit <a href="https://www.adminer.org/en/donation/">tehdä lahjoituksen tästä</a>.',
|
|
||||||
'Drop %s?' => 'Poistetaanko %s?',
|
|
||||||
'overwrite' => 'kirjoittaen päälle',
|
|
||||||
'DB' => 'TK',
|
|
||||||
'ATTACH queries are not supported.' => 'ATTACH-komennolla tehtyjä kyselyjä ei tueta.',
|
|
||||||
'Warnings' => 'Varoitukset',
|
|
||||||
'Adminer does not support accessing a database without a password, <a href="https://www.adminer.org/en/password/"%s>more information</a>.' => 'Adminer ei tue pääsyä tietokantaan ilman salasanaa, katso tarkemmin <a href="https://www.adminer.org/en/password/"%s>täältä</a>.',
|
|
||||||
'The action will be performed after successful login with the same credentials.' => 'Toiminto suoritetaan sen jälkeen, kun on onnistuttu kirjautumaan samoilla käyttäjätunnuksilla uudestaan.',
|
|
||||||
'Connecting to privileged ports is not allowed.' => 'Yhteydet etuoikeutettuihin portteihin eivät ole sallittuja.',
|
|
||||||
'There is a space in the input password which might be the cause.' => 'Syynä voi olla syötetyssä salasanassa oleva välilyönti.',
|
|
||||||
'Unknown error.' => 'Tuntematon virhe.',
|
|
||||||
'Database does not support password.' => 'Tietokanta ei tue salasanaa.',
|
|
||||||
'Disable %s or enable %s or %s extensions.' => 'Poista käytöstä %s tai ota käyttöön laajennus %s tai %s.',
|
|
||||||
);
|
);
|
||||||
|
@@ -175,7 +175,7 @@ $translations = array(
|
|||||||
'Repair' => 'Javít',
|
'Repair' => 'Javít',
|
||||||
'Truncate' => 'Felszabadít',
|
'Truncate' => 'Felszabadít',
|
||||||
'Tables have been truncated.' => 'A tábla felszabadítva.',
|
'Tables have been truncated.' => 'A tábla felszabadítva.',
|
||||||
'Rows' => 'Sorok',
|
'Rows' => 'Oszlop',
|
||||||
',' => ' ',
|
',' => ' ',
|
||||||
'0123456789' => '0123456789',
|
'0123456789' => '0123456789',
|
||||||
'Tables have been moved.' => 'Táblák áthelyezve.',
|
'Tables have been moved.' => 'Táblák áthelyezve.',
|
||||||
|
@@ -1,280 +1,267 @@
|
|||||||
<?php
|
<?php
|
||||||
$translations = array(
|
$translations = array(
|
||||||
'$1-$3-$5' => '$1-$3-$5',
|
|
||||||
'%.3f s' => '%.3f 초',
|
|
||||||
'%d byte(s)' => '%d 바이트',
|
|
||||||
'%d e-mail(s) have been sent.' => '%d개 메일을 보냈습니다.',
|
|
||||||
'%d in total' => '총 %d개',
|
|
||||||
'%d item(s) have been affected.' => '%d개 항목을 갱신했습니다.',
|
|
||||||
'%d process(es) have been killed.' => '%d개 프로세스를 강제 종료하였습니다.',
|
|
||||||
'%d query(s) executed OK.' => '%d개 쿼리를 잘 실행했습니다.',
|
|
||||||
'%d row(s) have been imported.' => '%d개 행을 가져 왔습니다.',
|
|
||||||
'%d row(s)' => '%d개 행',
|
|
||||||
'%s version: %s through PHP extension %s' => '%s 버전 %s, PHP 확장 %s',
|
|
||||||
',' => ',',
|
|
||||||
'0123456789' => '0123456789',
|
|
||||||
'[yyyy]-mm-dd' => '[yyyy]-mm-dd',
|
|
||||||
'Action' => '실행',
|
|
||||||
'Add column' => '열 추가',
|
|
||||||
'Add foreign key' => '외부 키를 추가',
|
|
||||||
'Add next' => '다음 추가',
|
|
||||||
'Add trigger' => '트리거 추가',
|
|
||||||
'Aggregation' => '집합',
|
|
||||||
'Alter database' => '데이터베이스 변경',
|
|
||||||
'Alter event' => '이벤트 변경',
|
|
||||||
'Alter function' => '함수 변경',
|
|
||||||
'Alter indexes' => '색인 변경',
|
|
||||||
'Alter procedure' => '시저 변경',
|
|
||||||
'Alter schema' => '스키마 변경',
|
|
||||||
'Alter sequence' => '순서 변경',
|
|
||||||
'Alter table' => '테이블 변경',
|
|
||||||
'Alter trigger' => '트리거 변경',
|
|
||||||
'Alter type' => '형 변경',
|
|
||||||
'Alter view' => '보기 변경',
|
|
||||||
'Alter' => '변경',
|
|
||||||
'Analyze' => '분석',
|
|
||||||
'anywhere' => '모든',
|
|
||||||
'Are you sure?' => '실행 하시겠습니까?',
|
|
||||||
'At given time' => '지정 시간',
|
|
||||||
'Attachments' => '첨부 파일',
|
|
||||||
'Auto Increment' => '자동 증가',
|
|
||||||
'Binary' => '이진',
|
|
||||||
'Call' => '호출',
|
|
||||||
'Change' => '변경',
|
|
||||||
'Check' => '확인',
|
|
||||||
'Clear' => '삭제',
|
|
||||||
'Clone' => '복제',
|
|
||||||
'collation' => '정렬',
|
|
||||||
'Collation' => '정렬',
|
|
||||||
'Column (length)' => '열 (길이)',
|
|
||||||
'Column name' => '열 이름',
|
|
||||||
'Column' => '열',
|
|
||||||
'Comment' => '주석',
|
|
||||||
'Compute' => '계산하기',
|
|
||||||
'Copy' => '복사',
|
|
||||||
'Create database' => '데이터베이스 만들기',
|
|
||||||
'Create event' => '만들기',
|
|
||||||
'Create function' => '함수 만들기',
|
|
||||||
'Create procedure' => '시저 만들기',
|
|
||||||
'Create schema' => '스키마 추가',
|
|
||||||
'Create sequence' => '시퀀스 만들기',
|
|
||||||
'Create table' => '테이블 만들기',
|
|
||||||
'Create trigger' => '트리거 만들기',
|
|
||||||
'Create type' => '사용자 정의 형식 만들기',
|
|
||||||
'Create user' => '사용자 만들기',
|
|
||||||
'Create view' => '뷰 만들기',
|
|
||||||
'Data Free' => '데이터 여유',
|
|
||||||
'Data Length' => '데이터 길이',
|
|
||||||
'Data' => '데이터',
|
|
||||||
'Database has been altered.' => '데이터베이스를 변경했습니다.',
|
|
||||||
'Database has been created.' => '데이터베이스를 만들었습니다.',
|
|
||||||
'Database has been dropped.' => '데이터베이스를 삭제했습니다.',
|
|
||||||
'Database has been renamed.' => '데이터베이스의 이름을 바꾸었습니다.',
|
|
||||||
'Database schema' => '데이터베이스 구조',
|
|
||||||
'database' => '데이터베이스',
|
|
||||||
'Database' => '데이터베이스',
|
|
||||||
'Databases have been dropped.' => '데이터베이스를 삭제했습니다.',
|
|
||||||
'Date and time' => '시간',
|
|
||||||
'Default values' => '기본값',
|
|
||||||
'Delete' => '삭제',
|
|
||||||
'descending' => '역순',
|
|
||||||
'Drop' => '삭제',
|
|
||||||
'E-mail' => '메일',
|
|
||||||
'Edit all' => '모두 편집',
|
|
||||||
'Edit' => '편집',
|
|
||||||
'edit' => '편집',
|
|
||||||
'Editor' => '에디터',
|
|
||||||
'empty' => '비어있음',
|
|
||||||
'End' => '종료',
|
|
||||||
'engine' => '엔진',
|
|
||||||
'Engine' => '엔진',
|
|
||||||
'Error in query' => '쿼리의 오류',
|
|
||||||
'Event has been altered.' => '변경했습니다.',
|
|
||||||
'Event has been created.' => '만들었습니다.',
|
|
||||||
'Event has been dropped.' => '삭제했습니다.',
|
|
||||||
'Event' => '이벤트',
|
|
||||||
'Events' => '이벤트',
|
|
||||||
'Every' => '매 번',
|
|
||||||
'Execute' => '실행',
|
|
||||||
'Export' => '내보내기',
|
|
||||||
'File does not exist.' => '파일이 존재하지 않습니다.',
|
|
||||||
'File exists.' => '파일이 이미 있습니다.',
|
|
||||||
'File upload' => '파일 올리기',
|
|
||||||
'File uploads are disabled.' => '파일 업로드가 잘못되었습니다.',
|
|
||||||
'Foreign key has been altered.' => '외부 키를 변경했습니다.',
|
|
||||||
'Foreign key has been created.' => '외부 키를 만들었습니다.',
|
|
||||||
'Foreign key has been dropped.' => '외부 키를 제거했습니다.',
|
|
||||||
'Foreign key' => '외부 키',
|
|
||||||
'Foreign keys' => '외부 키',
|
|
||||||
'Format' => '형식',
|
|
||||||
'From server' => '서버에서 실행',
|
|
||||||
'From' => '보낸 사람',
|
|
||||||
'Functions' => '함수',
|
|
||||||
'Geometry' => '기하 형',
|
|
||||||
'Grant' => '권한 부여',
|
|
||||||
'Hashed' => 'Hashed',
|
|
||||||
'HH:MM:SS' => '시:분:초',
|
|
||||||
'History' => '이력',
|
|
||||||
'Import' => '가져 오기',
|
|
||||||
'Index Length' => '색인 길이',
|
|
||||||
'Index Type' => '색인 형',
|
|
||||||
'Indexes have been altered.' => '색인을 변경했습니다.',
|
|
||||||
'Indexes' => '색인',
|
|
||||||
'Insert' => '삽입',
|
|
||||||
'Invalid credentials.' => '잘못된 로그인',
|
|
||||||
'Invalid CSRF token. Send the form again.' => '잘못된 CSRF 토큰입니다. 다시 보내주십시오.',
|
|
||||||
'Invalid database.' => '잘못된 데이터베이스입니다.',
|
|
||||||
'Invalid schema.' => '잘못된 스키마입니다.',
|
|
||||||
'Item has been deleted.' => '항목을 삭제했습니다.',
|
|
||||||
'Item has been updated.' => '항목을 갱신했습니다.',
|
|
||||||
'Item%s has been inserted.' => '%s 항목을 삽입했습니다.',
|
|
||||||
'Kill' => '강제 종료',
|
|
||||||
'Language' => '언어',
|
|
||||||
'last' => '마지막',
|
|
||||||
'Length' => '길이',
|
|
||||||
'Limit rows' => '행 제약',
|
|
||||||
'Limit' => '제약',
|
|
||||||
'Lists' => '목록',
|
|
||||||
'Load more data' => '더 많은 데이터 부르기',
|
|
||||||
'Loading' => '부르는 중',
|
|
||||||
'Logged as: %s' => '다음으로 로그인했습니다: %s',
|
|
||||||
'Login' => '로그인',
|
'Login' => '로그인',
|
||||||
'Logout successful.' => '로그아웃을 성공했습니다.',
|
'Logout successful.' => '로그아웃',
|
||||||
'Logout' => '로그아웃',
|
'Invalid credentials.' => '잘못된 로그인',
|
||||||
'ltr' => 'ltr',
|
|
||||||
'Maximum allowed file size is %sB.' => '파일의 최대 크기 %sB',
|
|
||||||
'Maximum number of allowed fields exceeded. Please increase %s.' => '정의 가능한 최대 필드 수를 초과했습니다. %s(을)를 늘리십시오.',
|
|
||||||
'Modify' => '수정',
|
|
||||||
'Move down' => '아래로',
|
|
||||||
'Move to other database' => '다른 데이터베이스로 이동',
|
|
||||||
'Move up' => '위로',
|
|
||||||
'Move' => '이동',
|
|
||||||
'Name' => '이름',
|
|
||||||
'Network' => '네트워크 형',
|
|
||||||
'New item' => '항목 만들기',
|
|
||||||
'No commands to execute.' => '실행할 수 있는 명령이 없습니다.',
|
|
||||||
'No extension' => '확장이 없습니다.',
|
|
||||||
'No rows.' => '행이 없습니다.',
|
|
||||||
'No tables.' => '테이블이 없습니다.',
|
|
||||||
'None of the supported PHP extensions (%s) are available.' => 'PHP 확장(%s)이 설치되어 있지 않습니다.',
|
|
||||||
'now' => '현재 시간',
|
|
||||||
'Numbers' => '숫자',
|
|
||||||
'On completion preserve' => '완성 후 저장',
|
|
||||||
'ON DELETE' => '지울 때',
|
|
||||||
'ON UPDATE' => '업데이트할 때',
|
|
||||||
'open' => '열',
|
|
||||||
'Optimize' => '최적화',
|
|
||||||
'Options' => '설정',
|
|
||||||
'original' => '원본',
|
|
||||||
'Output' => '출력',
|
|
||||||
'overwrite' => '덮어쓰기',
|
|
||||||
'Page' => '페이지',
|
|
||||||
'Parameter name' => '매개변수 이름',
|
|
||||||
'Partition by' => '파티션',
|
|
||||||
'Partition name' => '파티션 이름',
|
|
||||||
'Partitions' => '파티션',
|
|
||||||
'Password' => '비밀번호',
|
|
||||||
'Permanent link' => '영구적으로 링크',
|
|
||||||
'Permanent login' => '영구적으로 로그인',
|
|
||||||
'Please use one of the extensions %s.' => '확장 %s 중 하나를 사용하십시오.',
|
|
||||||
'Privileges' => '권한',
|
|
||||||
'Process list' => '프로세스 목록',
|
|
||||||
'Query executed OK, %d row(s) affected.' => '쿼리를 잘 실행했습니다. %d행을 변경했습니다.',
|
|
||||||
'Refresh' => '새로 고침',
|
|
||||||
'Relations' => '관계',
|
|
||||||
'Remove' => '제거',
|
|
||||||
'Repair' => '복구',
|
|
||||||
'Return type' => '반환 형식',
|
|
||||||
'Revoke' => '권한 취소',
|
|
||||||
'Routine has been altered.' => '루틴을 변경했습니다.',
|
|
||||||
'Routine has been called, %d row(s) affected.' => '루틴을 호출했습니다. %d 행을 변경했습니다.',
|
|
||||||
'Routine has been created.' => '루틴을 추가했습니다.',
|
|
||||||
'Routine has been dropped.' => '루틴을 제거했습니다.',
|
|
||||||
'Routine' => '루틴',
|
|
||||||
'Routines' => '루틴',
|
|
||||||
'Rows' => '행',
|
|
||||||
'Run file' => '파일을 실행',
|
|
||||||
'Save and continue edit' => '저장하고 계속 편집하기',
|
|
||||||
'Save and insert next' => '저장하고 다음에 추가',
|
|
||||||
'Save' => '저장',
|
|
||||||
'save' => '저장',
|
|
||||||
'Schedule' => '예약',
|
|
||||||
'Schema has been altered.' => '스키마를 변경했습니다.',
|
|
||||||
'Schema has been created.' => '스키마를 추가했습니다.',
|
|
||||||
'Schema has been dropped.' => '스키마를 삭제했습니다.',
|
|
||||||
'Schema' => '스키마',
|
|
||||||
'Search data in tables' => '테이블 내 데이터 검색',
|
|
||||||
'Search' => '검색',
|
|
||||||
'Select data' => '데이터를 선택하십시오.',
|
|
||||||
'Select database' => '데이터베이스를 선택하십시오.',
|
|
||||||
'Select' => '선택',
|
|
||||||
'select' => '선택',
|
|
||||||
'Selected' => '선택됨',
|
|
||||||
'Send' => '보내기',
|
|
||||||
'Sequence has been altered.' => '시퀀스를 변경했습니다.',
|
|
||||||
'Sequence has been created.' => '시퀀스를 추가했습니다.',
|
|
||||||
'Sequence has been dropped.' => '시퀀스를 제거했습니다.',
|
|
||||||
'Sequences' => '시퀀스',
|
|
||||||
'Server' => '서버',
|
'Server' => '서버',
|
||||||
'Session expired, please login again.' => '세션이 만료되었습니다. 다시 로그인하십시오.',
|
'Username' => '사용자이름',
|
||||||
'Session support must be enabled.' => '세션 지원을 사용해야만 합니다.',
|
'Password' => '비밀번호',
|
||||||
'Show only errors' => '오류 만 표시',
|
'Select database' => '데이터베이스를 선택하십시오.',
|
||||||
'Show structure' => '구조 표시',
|
'Invalid database.' => '잘못된 데이터베이스입니다.',
|
||||||
'Size' => '크기',
|
'Table has been dropped.' => '테이블을 삭제했습니다.',
|
||||||
'Sort' => '정렬',
|
|
||||||
'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => '원본과 대상 열은 동일한 데이터 형식이어야만 합니다. 목표 열에 색인과 데이터가 존재해야만 합니다.',
|
|
||||||
'Source' => '소스',
|
|
||||||
'SQL command' => 'SQL 명령',
|
|
||||||
'Start' => '시작',
|
|
||||||
'Status' => '상태',
|
|
||||||
'Stop on error' => '오류의 경우 중지',
|
|
||||||
'Strings' => '문자열',
|
|
||||||
'Subject' => '제목',
|
|
||||||
'System' => '데이터베이스 형식',
|
|
||||||
'Table has been altered.' => '테이블을 변경했습니다.',
|
'Table has been altered.' => '테이블을 변경했습니다.',
|
||||||
'Table has been created.' => '테이블을 만들었습니다.',
|
'Table has been created.' => '테이블을 만들었습니다.',
|
||||||
'Table has been dropped.' => '테이블을 삭제했습니다.',
|
'Alter table' => '테이블 변경',
|
||||||
|
'Create table' => '테이블 만들기',
|
||||||
'Table name' => '테이블 이름',
|
'Table name' => '테이블 이름',
|
||||||
'Table' => '테이블',
|
'engine' => '엔진',
|
||||||
'Tables and views' => '테이블과 뷰',
|
'collation' => '정렬',
|
||||||
'Tables have been copied.' => '테이블을 복사했습니다',
|
'Column name' => '열 이름',
|
||||||
'Tables have been dropped.' => '테이블을 삭제했습니다.',
|
|
||||||
'Tables have been moved.' => '테이블을 옮겼습니다.',
|
|
||||||
'Tables have been truncated.' => '테이블의 데이터 내용만 지웠습니다.',
|
|
||||||
'Tables' => '테이블',
|
|
||||||
'Target table' => '테이블',
|
|
||||||
'Target' => '타겟',
|
|
||||||
'Text length' => '문자열의 길이',
|
|
||||||
'Time' => '시간',
|
|
||||||
'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'POST 데이터가 너무 큽니다. 데이터 크기를 줄이거나 %s 설정을 늘리십시오.',
|
|
||||||
'Trigger has been altered.' => '트리거를 변경했습니다.',
|
|
||||||
'Trigger has been created.' => '트리거를 추가했습니다.',
|
|
||||||
'Trigger has been dropped.' => '트리거를 제거했습니다.',
|
|
||||||
'Triggers' => '트리거',
|
|
||||||
'Truncate' => '데이터 내용만 지우기',
|
|
||||||
'Type has been created.' => '유형을 추가했습니다.',
|
|
||||||
'Type has been dropped.' => '유형을 삭제했습니다.',
|
|
||||||
'Type' => '형',
|
'Type' => '형',
|
||||||
'Unable to select the table' => '테이블을 선택할 수 없습니다.',
|
'Length' => '길이',
|
||||||
'Unable to upload a file.' => '파일을 업로드 할 수 없습니다.',
|
'Auto Increment' => '자동증가',
|
||||||
'Use edit link to modify this value.' => '이 값을 수정하려면 편집 링크를 사용하십시오.',
|
'Options' => '설정',
|
||||||
|
'Save' => '저장',
|
||||||
|
'Drop' => '삭제',
|
||||||
|
'Database has been dropped.' => '데이터베이스를 삭제했습니다.',
|
||||||
|
'Database has been created.' => '데이터베이스를 만들었습니다.',
|
||||||
|
'Database has been renamed.' => '데이터베이스의 이름을 바꾸었습니다.',
|
||||||
|
'Database has been altered.' => '데이터베이스를 변경했습니다.',
|
||||||
|
'Alter database' => '데이터베이스 변경',
|
||||||
|
'Create database' => '데이터베이스 만들기',
|
||||||
|
'SQL command' => 'SQL 명령',
|
||||||
|
'Logout' => '로그아웃',
|
||||||
|
'database' => '데이터베이스',
|
||||||
'Use' => '사용',
|
'Use' => '사용',
|
||||||
'User has been altered.' => '사용자를 변경했습니다.',
|
'No tables.' => '테이블이 없습니다.',
|
||||||
'User has been created.' => '사용자를 만들었습니다.',
|
'select' => '선택',
|
||||||
'User has been dropped.' => '사용자를 제거했습니다.',
|
'Item has been deleted.' => '항목을 삭제했습니다.',
|
||||||
'Username' => '사용자이름',
|
'Item has been updated.' => '항목을 갱신했습니다.',
|
||||||
'Vacuum' => '청소',
|
'Edit' => '편집',
|
||||||
'Values' => '값',
|
'Insert' => '삽입',
|
||||||
'Variables' => '변수',
|
'Save and insert next' => '저장하고 다음에 추가',
|
||||||
|
'Delete' => '삭제',
|
||||||
|
'Database' => '데이터베이스',
|
||||||
|
'Routines' => '루틴',
|
||||||
|
'Indexes have been altered.' => '인덱스를 변경했습니다.',
|
||||||
|
'Indexes' => '색인',
|
||||||
|
'Alter indexes' => '인덱스 변경',
|
||||||
|
'Add next' => '추가',
|
||||||
|
'Language' => '언어',
|
||||||
|
'Select' => '선택',
|
||||||
|
'New item' => '항목 만들기',
|
||||||
|
'Search' => '검색',
|
||||||
|
'Sort' => '정렬',
|
||||||
|
'descending' => '역순',
|
||||||
|
'Limit' => '제약',
|
||||||
|
'No rows.' => '행이 없습니다.',
|
||||||
|
'Action' => '실행',
|
||||||
|
'edit' => '편집',
|
||||||
|
'Page' => '페이지',
|
||||||
|
'Query executed OK, %d row(s) affected.' => '쿼리를 실행했습니다. %d 행을 변경했습니다.',
|
||||||
|
'Error in query' => '쿼리의 오류',
|
||||||
|
'Execute' => '실행',
|
||||||
|
'Table' => '테이블',
|
||||||
|
'Foreign keys' => '외부 키',
|
||||||
|
'Triggers' => '트리거',
|
||||||
|
'View' => '보기',
|
||||||
|
'Unable to select the table' => '테이블을 선택할 수 없습니다.',
|
||||||
|
'Invalid CSRF token. Send the form again.' => '잘못된 CSRF 토큰. 다시 보내주십시오.',
|
||||||
|
'Comment' => '코멘트',
|
||||||
|
'Default values' => '기본값',
|
||||||
|
'%d byte(s)' => '%d 바이트',
|
||||||
|
'No commands to execute.' => '실행할 수 있는 명령이 없습니다.',
|
||||||
|
'Unable to upload a file.' => '파일을 업로드 할 수 없습니다.',
|
||||||
|
'File upload' => '파일 올리기',
|
||||||
|
'File uploads are disabled.' => '파일 업로드가 잘못되었습니다.',
|
||||||
|
'Routine has been called, %d row(s) affected.' => '루틴을 호출했습니다. %d 행을 변경했습니다.',
|
||||||
|
'Call' => '외침',
|
||||||
|
'No extension' => '확장 기능이 없습니다.',
|
||||||
|
'None of the supported PHP extensions (%s) are available.' => 'PHP 확장 (%s)가 설치되어 있지 않습니다.',
|
||||||
|
'Session support must be enabled.' => '세션을 사용하십시오.',
|
||||||
|
'Session expired, please login again.' => '세션 만료. 다시 로그인하십시오.',
|
||||||
|
'Text length' => '문자열의 길이',
|
||||||
|
'Foreign key has been dropped.' => '외부 키를 제거했습니다.',
|
||||||
|
'Foreign key has been altered.' => '외부 키를 변경했습니다.',
|
||||||
|
'Foreign key has been created.' => '외부 키를 만들었습니다.',
|
||||||
|
'Foreign key' => '외부 키',
|
||||||
|
'Target table' => '테이블',
|
||||||
|
'Change' => '변경',
|
||||||
|
'Source' => '소스',
|
||||||
|
'Target' => '타겟',
|
||||||
|
'Add column' => '열 추가',
|
||||||
|
'Alter' => '변경',
|
||||||
|
'Add foreign key' => '외부 키를 추가',
|
||||||
|
'ON DELETE' => 'ON DELETE',
|
||||||
|
'ON UPDATE' => 'ON UPDATE',
|
||||||
|
'Index Type' => '인덱스 형',
|
||||||
|
'Column (length)' => '열 (길이)',
|
||||||
|
'View has been dropped.' => '보기를 삭제했습니다.',
|
||||||
'View has been altered.' => '보기를 변경했습니다.',
|
'View has been altered.' => '보기를 변경했습니다.',
|
||||||
'View has been created.' => '보기를 만들었습니다.',
|
'View has been created.' => '보기를 만들었습니다.',
|
||||||
'View has been dropped.' => '보기를 삭제했습니다.',
|
'Alter view' => '보기 변경',
|
||||||
'View' => '보기',
|
'Create view' => '뷰 만들기',
|
||||||
'Warnings' => '경고',
|
'Name' => '이름',
|
||||||
'Webserver file %s' => '웹서버 파일 %s',
|
'Process list' => '프로세스 목록',
|
||||||
|
'%d process(es) have been killed.' => '%d 프로세스를 강제 종료되었습니다.',
|
||||||
|
'Kill' => '강제 종료',
|
||||||
|
'Parameter name' => '참조 여명',
|
||||||
|
'Database schema' => '구조',
|
||||||
|
'Create procedure' => '시저 만들기',
|
||||||
|
'Create function' => '함수 만들기',
|
||||||
|
'Routine has been dropped.' => '루틴 만들기',
|
||||||
|
'Routine has been altered.' => '루틴 변경',
|
||||||
|
'Routine has been created.' => '루틴 만들기',
|
||||||
|
'Alter function' => '함수의 변경',
|
||||||
|
'Alter procedure' => '시저 변경',
|
||||||
|
'Return type' => '반환 형식',
|
||||||
|
'Add trigger' => '트리거 추가',
|
||||||
|
'Trigger has been dropped.' => '트리거를 제거했습니다.',
|
||||||
|
'Trigger has been altered.' => '트리거를 변경했습니다.',
|
||||||
|
'Trigger has been created.' => '트리거를 추가했습니다.',
|
||||||
|
'Alter trigger' => '트리거 변경',
|
||||||
|
'Create trigger' => '트리거 만들기',
|
||||||
|
'Time' => '시간',
|
||||||
|
'Event' => '이벤트',
|
||||||
|
'%s version: %s through PHP extension %s' => '%s 버전 %s, PHP 확장 %s',
|
||||||
|
'%d row(s)' => '%d 행',
|
||||||
|
'Remove' => '제외',
|
||||||
|
'Are you sure?' => '실행 하시겠습니까?',
|
||||||
|
'Privileges' => '권한',
|
||||||
|
'Create user' => '사용자 만들기',
|
||||||
|
'User has been dropped.' => '사용자 삭제',
|
||||||
|
'User has been altered.' => '사용자 변경',
|
||||||
|
'User has been created.' => '사용자 만들기',
|
||||||
|
'Hashed' => 'Hashed',
|
||||||
|
'Column' => '열',
|
||||||
|
'Routine' => '루틴',
|
||||||
|
'Grant' => '권한 부여',
|
||||||
|
'Revoke' => '권한 취소',
|
||||||
|
'Logged as: %s' => '로그 : %s',
|
||||||
|
'Too big POST data. Reduce the data or increase the %s configuration directive.' => 'POST 데이터가 너무 큽니다. 데이터 크기를 줄이거나 %s 설정을 늘리십시오.',
|
||||||
|
'Move up' => '상',
|
||||||
|
'Move down' => '아래',
|
||||||
|
'Export' => '내보내기',
|
||||||
|
'Tables' => '테이블',
|
||||||
|
'Data' => '데이터',
|
||||||
|
'Output' => '출력',
|
||||||
|
'open' => '열',
|
||||||
|
'save' => '저장',
|
||||||
|
'Format' => '형식',
|
||||||
|
'Functions' => '함수',
|
||||||
|
'Aggregation' => '집합',
|
||||||
|
'Event has been dropped.' => '삭제했습니다.',
|
||||||
|
'Event has been altered.' => '변경했습니다.',
|
||||||
|
'Event has been created.' => '만들었습니다.',
|
||||||
|
'Alter event' => '변경',
|
||||||
|
'Create event' => '만들기',
|
||||||
|
'Start' => '시작',
|
||||||
|
'End' => '종료',
|
||||||
|
'Every' => '매번',
|
||||||
|
'Status' => '상태',
|
||||||
|
'On completion preserve' => '완성 후 저장',
|
||||||
|
'Events' => '이벤트',
|
||||||
|
'Schedule' => '일정',
|
||||||
|
'At given time' => '지정 시간',
|
||||||
|
'Tables have been truncated.' => '테이블을 truncate했습니다.',
|
||||||
|
'Tables have been moved.' => '테이블을 옮겼습니다.',
|
||||||
|
'Tables and views' => '테이블과 뷰',
|
||||||
|
'Engine' => '엔진',
|
||||||
|
'Collation' => '정렬',
|
||||||
|
'Data Length' => '데이터 길이',
|
||||||
|
'Index Length' => '인덱스 길이',
|
||||||
|
'Data Free' => '여유',
|
||||||
|
'Rows' => '행',
|
||||||
|
',' => ',',
|
||||||
|
'0123456789' => '0123456789',
|
||||||
|
'Analyze' => '분석',
|
||||||
|
'Optimize' => '최적화',
|
||||||
|
'Check' => '확인',
|
||||||
|
'Repair' => '복구',
|
||||||
|
'Truncate' => 'Truncate',
|
||||||
|
'Move to other database' => '다른 데이터베이스로 이동',
|
||||||
|
'Move' => '이동',
|
||||||
|
'Save and continue edit' => '저장하고 계속',
|
||||||
|
'original' => '원래',
|
||||||
|
'%d item(s) have been affected.' => '%d를 갱신했습니다.',
|
||||||
'Whole result' => '모든 결과',
|
'Whole result' => '모든 결과',
|
||||||
'yes' => '네',
|
'Tables have been dropped.' => '테이블을 삭제했습니다.',
|
||||||
'You are offline.' => '오프라인입니다.',
|
'Clone' => '복제',
|
||||||
'You can upload a big SQL file via FTP and import it from server.' => '큰 SQL 파일은 FTP를 통하여 업로드하여 서버에서 가져올 수 있습니다.',
|
'Maximum number of allowed fields exceeded. Please increase %s.' => '정의 가능한 최대 필드 수를 초과했습니다. %s를 늘리십시오.',
|
||||||
'You have no privileges to update this table.' => '이 테이블을 업데이트할 권한이 없습니다.',
|
'Partition by' => '파티션',
|
||||||
|
'Partitions' => '파티션',
|
||||||
|
'Partition name' => '파티션 이름',
|
||||||
|
'Values' => '값',
|
||||||
|
'%d row(s) have been imported.' => '%d 행을 가져 왔습니다.',
|
||||||
|
'Show structure' => '구조',
|
||||||
|
'anywhere' => '모든',
|
||||||
|
'Import' => '가져 오기',
|
||||||
|
'Stop on error' => '오류의 경우 중지',
|
||||||
|
'Select data' => '데이터',
|
||||||
|
'%.3f s' => '%.3f 초',
|
||||||
|
'$1-$3-$5' => '$1-$3-$5',
|
||||||
|
'[yyyy]-mm-dd' => '[yyyy]-mm-dd',
|
||||||
|
'History' => '역사',
|
||||||
|
'Variables' => '변수',
|
||||||
|
'Source and target columns must have the same data type, there must be an index on the target columns and referenced data must exist.' => '원본 및 대상 열은 동일한 데이터 형식이어야합니다. 목표 컬럼에 인덱스와 데이터가 존재해야합니다.',
|
||||||
|
'Relations' => '관계',
|
||||||
|
'Run file' => '파일을 실행',
|
||||||
|
'Clear' => '삭제',
|
||||||
|
'Maximum allowed file size is %sB.' => '파일의 최대 크기 %sB',
|
||||||
|
'Numbers' => '숫자',
|
||||||
|
'Date and time' => '시간',
|
||||||
|
'Strings' => '문자열',
|
||||||
|
'Binary' => '이진',
|
||||||
|
'Lists' => '목록',
|
||||||
|
'Editor' => '에디터',
|
||||||
|
'E-mail' => '메일',
|
||||||
|
'From' => '보낸 사람',
|
||||||
|
'Subject' => '제목',
|
||||||
|
'Send' => '보내기',
|
||||||
|
'%d e-mail(s) have been sent.' => '%d 메일을 보냈습니다.',
|
||||||
|
'Webserver file %s' => 'Web 서버 파일 %s',
|
||||||
|
'File does not exist.' => '파일이 존재하지 않습니다.',
|
||||||
|
'%d in total' => '총 %d',
|
||||||
|
'Permanent login' => '영구적으로 로그인',
|
||||||
|
'Databases have been dropped.' => '데이터베이스를 삭제했습니다.',
|
||||||
|
'Search data in tables' => '데이터 검색',
|
||||||
|
'Schema' => '스키마',
|
||||||
|
'Alter schema' => '스키마 변경',
|
||||||
|
'Create schema' => '스키마 추가',
|
||||||
|
'Schema has been dropped.' => '스키마를 삭제했습니다.',
|
||||||
|
'Schema has been created.' => '스키마를 추가했습니다.',
|
||||||
|
'Schema has been altered.' => '스키마를 변경했습니다.',
|
||||||
|
'Sequences' => '시퀀스',
|
||||||
|
'Create sequence' => '시퀀스 만들기',
|
||||||
|
'Alter sequence' => '순서 변경',
|
||||||
|
'Sequence has been dropped.' => '시퀀스를 제거했습니다.',
|
||||||
|
'Sequence has been created.' => '시퀀스를 추가했습니다.',
|
||||||
|
'Sequence has been altered.' => '순서를 변경했습니다.',
|
||||||
|
'User types' => '사용자 정의 형',
|
||||||
|
'Create type' => '사용자 정의 형식 만들기',
|
||||||
|
'Alter type' => '사용자 정의 형식 변경',
|
||||||
|
'Type has been dropped.' => '사용자 정의 형식을 삭제했습니다.',
|
||||||
|
'Type has been created.' => '사용자 정의 형식을 추가했습니다.',
|
||||||
|
'Use edit link to modify this value.' => '링크 편집',
|
||||||
|
'last' => '마지막',
|
||||||
|
'From server' => '서버에서 실행',
|
||||||
|
'System' => '데이터베이스 형식',
|
||||||
|
'empty' => '하늘',
|
||||||
|
'Network' => '네트워크 형',
|
||||||
|
'Geometry' => '기하 형',
|
||||||
|
'File exists.' => '파일이 이미 있습니다.',
|
||||||
|
'Attachments' => '첨부 파일',
|
||||||
|
'Item%s has been inserted.' => '%s 항목을 삽입했습니다.',
|
||||||
|
'now' => '현재 시간',
|
||||||
|
'%d query(s) executed OK.' => '%d 쿼리를 실행했습니다.',
|
||||||
|
'Show only errors' => '오류 만 표시',
|
||||||
|
'Refresh' => '새로 고침',
|
||||||
|
'Invalid schema.' => '잘못된 스키마',
|
||||||
|
'Please use one of the extensions %s.' => '하나의 확장 기능을 사용하십시오 %s',
|
||||||
|
'ltr' => 'ltr',
|
||||||
|
'Tables have been copied.' => '테이블을 복사했습니다',
|
||||||
|
'Copy' => '복사',
|
||||||
|
'Permanent link' => '영구 링크',
|
||||||
|
'Edit all' => '모든 편집',
|
||||||
|
'HH:MM:SS' => '시:분:초',
|
||||||
);
|
);
|
||||||
|
@@ -289,15 +289,4 @@ $translations = array(
|
|||||||
'Saving' => 'Сохранение',
|
'Saving' => 'Сохранение',
|
||||||
'yes' => 'Да',
|
'yes' => 'Да',
|
||||||
'no' => 'Нет',
|
'no' => 'Нет',
|
||||||
'Drop %s?' => 'Удалить %s?',
|
|
||||||
'overwrite' => 'перезаписать',
|
|
||||||
'DB' => 'DB',
|
|
||||||
'Warnings' => 'Предупреждения',
|
|
||||||
'Adminer does not support accessing a database without a password, <a href="https://www.adminer.org/en/password/"%s>more information</a>.' => 'Adminer не поддерживает доступ к базе данных без пароля, <a href="https://www.adminer.org/en/password/"%s>больше информации</a>.',
|
|
||||||
'Thanks for using Adminer, consider <a href="https://www.adminer.org/en/donation/">donating</a>.' => 'Спасибо за использование Adminer, рассмотрите возможность <a href="https://www.adminer.org/en/donation/">пожертвования</a>.',
|
|
||||||
'The action will be performed after successful login with the same credentials.' => 'Действие будет выполнено после успешного входа в систему с теми же учетными данными.',
|
|
||||||
'Connecting to privileged ports is not allowed.' => 'Подключение к привилегированным портам не допускается.',
|
|
||||||
'There is a space in the input password which might be the cause.' => 'В введеном пароле есть пробел, это может быть причиною.',
|
|
||||||
'Unknown error.' => 'Неизвестная ошибка.',
|
|
||||||
'Database does not support password.' => 'База данных не поддерживает пароль.',
|
|
||||||
);
|
);
|
||||||
|
@@ -313,34 +313,4 @@ $translations = array(
|
|||||||
'Type has been dropped.' => 'Тип було видалено.',
|
'Type has been dropped.' => 'Тип було видалено.',
|
||||||
'Type has been created.' => 'Тип було створено.',
|
'Type has been created.' => 'Тип було створено.',
|
||||||
'Alter type' => 'Змінити тип',
|
'Alter type' => 'Змінити тип',
|
||||||
'Drop %s?' => 'Вилучити %s?',
|
|
||||||
'Materialized view' => 'Матеріалізований вигляд',
|
|
||||||
'Selected' => 'Вибрані',
|
|
||||||
'overwrite' => 'перезаписати',
|
|
||||||
'DB' => 'DB',
|
|
||||||
'File must be in UTF-8 encoding.' => 'Файл повинен бути в кодуванні UTF-8.',
|
|
||||||
'Modify' => 'Змінити',
|
|
||||||
'Load more data' => 'Завантажити ще дані',
|
|
||||||
'Loading' => 'Завантаження',
|
|
||||||
'ATTACH queries are not supported.' => 'ATTACH-запити не підтримуються.',
|
|
||||||
'Warnings' => 'Попередження',
|
|
||||||
'Limit rows' => 'Обмеження рядків',
|
|
||||||
'Adminer does not support accessing a database without a password, <a href="https://www.adminer.org/en/password/"%s>more information</a>.' => 'Adminer не підтримує доступ до бази даних без пароля, <a href="https://www.adminer.org/en/password/"%s>більше інформації</a>.',
|
|
||||||
'Default value' => 'Значення за замовчуванням',
|
|
||||||
'Full table scan' => 'Повне сканування таблиці',
|
|
||||||
'Too many unsuccessful logins, try again in %d minute(s).' => array('Занадто багато невдалих спроб входу. Спробуйте знову через %d хвилину.', 'Занадто багато невдалих спроб входу. Спробуйте знову через %d хвилини.', 'Занадто багато невдалих спроб входу. Спробуйте знову через %d хвилин.'),
|
|
||||||
'Thanks for using Adminer, consider <a href="https://www.adminer.org/en/donation/">donating</a>.' => 'Дякуємо, що користуєтесь Adminer, подумайте про <a href="https://www.adminer.org/en/donation/">внесок</a>.',
|
|
||||||
'Master password expired. <a href="https://www.adminer.org/en/extension/"%s>Implement</a> %s method to make it permanent.' => 'Термін дії майстер пароля минув. <a href="https://www.adminer.org/en/extension/"%s>Реалізуйте</a> метод %s, щоб зробити його постійним.',
|
|
||||||
'The action will be performed after successful login with the same credentials.' => 'Дія буде виконуватися після успішного входу в систему з тими ж обліковими даними.',
|
|
||||||
'Connecting to privileged ports is not allowed.' => 'Підключення до привілейованих портів заборонено.',
|
|
||||||
'There is a space in the input password which might be the cause.' => 'У вхідному паролі є пробіл, який може бути причиною.',
|
|
||||||
'If you did not send this request from Adminer then close this page.' => 'Якщо ви не посилали цей запит з Adminer, закрийте цю сторінку.',
|
|
||||||
'You can upload a big SQL file via FTP and import it from server.' => 'Ви можете завантажити великий файл SQL через FTP та імпортувати його з сервера.',
|
|
||||||
'Size' => 'Розмір',
|
|
||||||
'Compute' => 'Обчислити',
|
|
||||||
'You are offline.' => 'Ви офлайн.',
|
|
||||||
'You have no privileges to update this table.' => 'Ви не маєте привілеїв для оновлення цієї таблиці.',
|
|
||||||
'Saving' => 'Збереження',
|
|
||||||
'Unknown error.' => 'Невідома помилка.',
|
|
||||||
'Database does not support password.' => 'База даних не підтримує пароль.',
|
|
||||||
);
|
);
|
||||||
|
@@ -8,9 +8,6 @@ function adminer_object() {
|
|||||||
include_once $filename;
|
include_once $filename;
|
||||||
}
|
}
|
||||||
|
|
||||||
// enable extra drivers just by including them
|
|
||||||
//~ include "../plugins/drivers/simpledb.php";
|
|
||||||
|
|
||||||
$plugins = array(
|
$plugins = array(
|
||||||
// specify enabled plugins here
|
// specify enabled plugins here
|
||||||
new AdminerDatabaseHide(array('information_schema')),
|
new AdminerDatabaseHide(array('information_schema')),
|
||||||
|
@@ -331,7 +331,7 @@ if (!$columns && support("table")) {
|
|||||||
$column = idf_escape($key);
|
$column = idf_escape($key);
|
||||||
$href = remove_from_uri('(order|desc)[^=]*|page') . '&order%5B0%5D=' . urlencode($key);
|
$href = remove_from_uri('(order|desc)[^=]*|page') . '&order%5B0%5D=' . urlencode($key);
|
||||||
$desc = "&desc%5B0%5D=1";
|
$desc = "&desc%5B0%5D=1";
|
||||||
echo "<th id='th[" . h(bracket_escape($key)) . "]'>" . script("mixin(qsl('th'), {onmouseover: partial(columnMouse), onmouseout: partial(columnMouse, ' hidden')});", "");
|
echo "<th>" . script("mixin(qsl('th'), {onmouseover: partial(columnMouse), onmouseout: partial(columnMouse, ' hidden')});", "");
|
||||||
echo '<a href="' . h($href . ($order[0] == $column || $order[0] == $key || (!$order && $is_group && $group[0] == $column) ? $desc : '')) . '">'; // $order[0] == $key - COUNT(*)
|
echo '<a href="' . h($href . ($order[0] == $column || $order[0] == $key || (!$order && $is_group && $group[0] == $column) ? $desc : '')) . '">'; // $order[0] == $key - COUNT(*)
|
||||||
echo apply_sql_function($val["fun"], $name) . "</a>"; //! columns looking like functions
|
echo apply_sql_function($val["fun"], $name) . "</a>"; //! columns looking like functions
|
||||||
echo "<span class='column hidden'>";
|
echo "<span class='column hidden'>";
|
||||||
|
@@ -222,7 +222,7 @@ if (!isset($_GET["import"])) {
|
|||||||
}
|
}
|
||||||
echo "<p>";
|
echo "<p>";
|
||||||
textarea("query", $q, 20);
|
textarea("query", $q, 20);
|
||||||
echo script(($_POST ? "" : "qs('textarea').focus();\n") . "qs('#form').onsubmit = partial(sqlSubmit, qs('#form'), '" . js_escape(remove_from_uri("sql|limit|error_stops|only_errors|history")) . "');");
|
echo script(($_POST ? "" : "qs('textarea').focus();\n") . "qs('#form').onsubmit = partial(sqlSubmit, qs('#form'), '" . remove_from_uri("sql|limit|error_stops|only_errors") . "');");
|
||||||
echo "<p>$execute\n";
|
echo "<p>$execute\n";
|
||||||
echo lang('Limit rows') . ": <input type='number' name='limit' class='size' value='" . h($_POST ? $_POST["limit"] : $_GET["limit"]) . "'>\n";
|
echo lang('Limit rows') . ": <input type='number' name='limit' class='size' value='" . h($_POST ? $_POST["limit"] : $_GET["limit"]) . "'>\n";
|
||||||
|
|
||||||
@@ -244,8 +244,8 @@ if (!isset($_GET["import"])) {
|
|||||||
echo "<p>";
|
echo "<p>";
|
||||||
}
|
}
|
||||||
|
|
||||||
echo checkbox("error_stops", 1, ($_POST ? $_POST["error_stops"] : isset($_GET["import"]) || $_GET["error_stops"]), lang('Stop on error')) . "\n";
|
echo checkbox("error_stops", 1, ($_POST ? $_POST["error_stops"] : isset($_GET["import"])), lang('Stop on error')) . "\n";
|
||||||
echo checkbox("only_errors", 1, ($_POST ? $_POST["only_errors"] : isset($_GET["import"]) || $_GET["only_errors"]), lang('Show only errors')) . "\n";
|
echo checkbox("only_errors", 1, ($_POST ? $_POST["only_errors"] : isset($_GET["import"])), lang('Show only errors')) . "\n";
|
||||||
echo "<input type='hidden' name='token' value='$token'>\n";
|
echo "<input type='hidden' name='token' value='$token'>\n";
|
||||||
|
|
||||||
if (!isset($_GET["import"]) && $history) {
|
if (!isset($_GET["import"]) && $history) {
|
||||||
|
@@ -17,14 +17,14 @@ function bodyLoad(version, maria) {
|
|||||||
for (var i = 1; i < obj.length; i++) {
|
for (var i = 1; i < obj.length; i++) {
|
||||||
obj[i] = obj[i]
|
obj[i] = obj[i]
|
||||||
.replace(/\.html/, '/')
|
.replace(/\.html/, '/')
|
||||||
.replace(/-type-syntax/, '-data-types')
|
.replace(/(numeric)(-type-overview)/, '$1-data$2')
|
||||||
.replace(/numeric-(data-types)/, '$1-$&')
|
|
||||||
.replace(/#statvar_.*/, '#$$1')
|
.replace(/#statvar_.*/, '#$$1')
|
||||||
;
|
;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
obj[key] = (maria ? obj[key].replace(/dev\.mysql\.com\/doc\/mysql\/en\//, 'mariadb.com/kb/en/library/') : obj[key]) // MariaDB
|
obj[key] = obj[key]
|
||||||
|
.replace(/dev\.mysql\.com\/doc\/mysql\/en\//, (maria ? 'mariadb.com/kb/en/library/' : '$&')) // MariaDB
|
||||||
.replace(/\/doc\/mysql/, '/doc/refman/' + version) // MySQL
|
.replace(/\/doc\/mysql/, '/doc/refman/' + version) // MySQL
|
||||||
.replace(/\/docs\/current/, '/docs/' + version) // PostgreSQL
|
.replace(/\/docs\/current/, '/docs/' + version) // PostgreSQL
|
||||||
;
|
;
|
||||||
|
109
changes.txt
109
changes.txt
@@ -1,56 +1,3 @@
|
|||||||
Adminer 4.8.0 (released 2021-02-10):
|
|
||||||
Support function default values in insert (bug #713)
|
|
||||||
Allow SQL pseudo-function in insert
|
|
||||||
Skip date columns for non-date values in search anywhere
|
|
||||||
Add DB version to comment in export
|
|
||||||
Support PHP 8 in create table (regression from 4.7.9)
|
|
||||||
MySQL 8: Fix EXPLAIN in SQL command
|
|
||||||
PostgreSQL: Create PRIMARY KEY for auto increment columns
|
|
||||||
PostgreSQL: Avoid exporting empty sequence last value (bug #768)
|
|
||||||
PostgreSQL: Do not show triggers from other schemas (PR #412)
|
|
||||||
PostgreSQL: Fix multi-parameter functions in default values (bug #736)
|
|
||||||
PostgreSQL: Fix displaying NULL bytea fields
|
|
||||||
PostgreSQL PDO: Do not select NULL function for false values in edit
|
|
||||||
Oracle: Alter indexes
|
|
||||||
Oracle: Count tables
|
|
||||||
Oracle: Import from CSV
|
|
||||||
Oracle: Fix column size with string type
|
|
||||||
MongoDB: Handle errors
|
|
||||||
SimpleDB, Firebird, ClickHouse: Move to plugin
|
|
||||||
|
|
||||||
Adminer 4.7.9 (released 2021-02-07):
|
|
||||||
Fix XSS in browsers which don't encode URL parameters (bug #775, regression from 4.7.0)
|
|
||||||
Elasticsearch, ClickHouse: Do not print response if HTTP code is not 200
|
|
||||||
Don't syntax highlight during IME composition (bug #747)
|
|
||||||
Quote values with leading and trailing zeroes in CSV export (bug #777)
|
|
||||||
Link URLs in SQL command (PR #411)
|
|
||||||
Fix displayed foreign key columns from other DB (bug #766)
|
|
||||||
Re-enable PHP warnings (regression from 4.7.8)
|
|
||||||
MySQL: Do not export names in quotes with sql_mode='ANSI_QUOTES' (bug #749)
|
|
||||||
MySQL: Avoid error in PHP 8 when connecting to socket (PR #409)
|
|
||||||
MySQL: Don't quote default value of text fields (bug #779)
|
|
||||||
PostgreSQL: Export all FKs after all CREATE TABLE (PR #351)
|
|
||||||
PostgreSQL: Fix dollar-quoted syntax highlighting (bug #738)
|
|
||||||
PostgreSQL: Do not show view definition from other schema (PR #392)
|
|
||||||
PostgreSQL: Use bigserial for bigint auto increment (bug #765, regression from 3.0.0)
|
|
||||||
PostgreSQL PDO: Support PgBouncer, unsupport PostgreSQL < 9.1 (bug #771)
|
|
||||||
PostgreSQL 10: Support GENERATED ALWAYS BY IDENTITY (PR #386)
|
|
||||||
PostgreSQL 10: Support partitioned tables (PR #396)
|
|
||||||
PostgreSQL 11: Create PRIMARY KEY for auto increment columns
|
|
||||||
SQLite: Set busy_timeout to 500
|
|
||||||
MS SQL: Don't truncate comments to 30 chars (PR #376)
|
|
||||||
Elasticsearch 6: Fix displaying type mapping (PR #402)
|
|
||||||
MongoDB: Fix password-less check in the mongo extension (PR #405)
|
|
||||||
Editor: Cast to string when searching (bug #325)
|
|
||||||
Editor: Avoid trailing dot in export filename
|
|
||||||
|
|
||||||
Adminer 4.7.8 (released 2020-12-06):
|
|
||||||
Support PHP 8
|
|
||||||
Disallow connecting to privileged ports (bug #769)
|
|
||||||
|
|
||||||
Adminer 4.7.7 (released 2020-05-11):
|
|
||||||
Fix open redirect if Adminer is accessible at //adminer.php%2F@
|
|
||||||
|
|
||||||
Adminer 4.7.6 (released 2020-01-31):
|
Adminer 4.7.6 (released 2020-01-31):
|
||||||
Speed up alter table form (regression from 4.4.0)
|
Speed up alter table form (regression from 4.4.0)
|
||||||
Fix clicking on non-input fields in alter table (regression from 4.6.2)
|
Fix clicking on non-input fields in alter table (regression from 4.6.2)
|
||||||
@@ -381,7 +328,7 @@ Adminer 3.7.1 (released 2013-06-29):
|
|||||||
Increase click target for checkboxes
|
Increase click target for checkboxes
|
||||||
Use shadow for highlighting default button
|
Use shadow for highlighting default button
|
||||||
Don't use LIMIT 1 if inline updating unique row
|
Don't use LIMIT 1 if inline updating unique row
|
||||||
Don't check previous checkbox on added column in create table (bug #326)
|
Don't check previous checkbox on added column in create table (bug #3614245)
|
||||||
Order table list by name
|
Order table list by name
|
||||||
Verify UTF-8 encoding of CSV import
|
Verify UTF-8 encoding of CSV import
|
||||||
Notify user about expired master password for permanent login
|
Notify user about expired master password for permanent login
|
||||||
@@ -392,7 +339,7 @@ Display error on invalid alter table and view pages
|
|||||||
MySQL: Speed up updating rows without numeric or UTF-8 primary key
|
MySQL: Speed up updating rows without numeric or UTF-8 primary key
|
||||||
Non-MySQL: Descending indexes
|
Non-MySQL: Descending indexes
|
||||||
PostgreSQL: Fix detecting oid column in PDO
|
PostgreSQL: Fix detecting oid column in PDO
|
||||||
PostgreSQL: Handle timestamp types (bug #324)
|
PostgreSQL: Handle timestamp types (bug #3614086)
|
||||||
Add Korean translation
|
Add Korean translation
|
||||||
|
|
||||||
Adminer 3.7.0 (released 2013-05-19):
|
Adminer 3.7.0 (released 2013-05-19):
|
||||||
@@ -405,9 +352,9 @@ Disable SQL export when applying functions in select
|
|||||||
Allow using lang() in plugins (customization)
|
Allow using lang() in plugins (customization)
|
||||||
Remove bzip2 compression support
|
Remove bzip2 compression support
|
||||||
Constraint memory used in TAR export
|
Constraint memory used in TAR export
|
||||||
Allow exporting views dependent on each other (bug #214)
|
Allow exporting views dependent on each other (bug #3459151)
|
||||||
Fix resetting search (bug #318)
|
Fix resetting search (bug #3612507)
|
||||||
Don't use LIMIT 1 if updating unique row (bug #320)
|
Don't use LIMIT 1 if updating unique row (bug #3613109)
|
||||||
Restrict editing rows without unique identifier to search results
|
Restrict editing rows without unique identifier to search results
|
||||||
Display navigation bellow main content on mobile browsers
|
Display navigation bellow main content on mobile browsers
|
||||||
Get number of rows on export page asynchronously
|
Get number of rows on export page asynchronously
|
||||||
@@ -415,7 +362,7 @@ Respect 'whole result' even if some rows are checked (bug #339 since Adminer 3.7
|
|||||||
MySQL: Optimize create table page and Editor navigation
|
MySQL: Optimize create table page and Editor navigation
|
||||||
MySQL: Display bit type as binary number
|
MySQL: Display bit type as binary number
|
||||||
MySQL: Improve export of binary data types
|
MySQL: Improve export of binary data types
|
||||||
MySQL: Fix handling of POINT data type (bug #282)
|
MySQL: Fix handling of POINT data type (bug #3582578)
|
||||||
MySQL: Don't export binary and geometry columns twice in select
|
MySQL: Don't export binary and geometry columns twice in select
|
||||||
MySQL: Fix EXPLAIN in MySQL < 5.1, bug since Adminer 3.6.4
|
MySQL: Fix EXPLAIN in MySQL < 5.1, bug since Adminer 3.6.4
|
||||||
SQLite: Export views
|
SQLite: Export views
|
||||||
@@ -430,11 +377,11 @@ Recover original view, trigger, routine if creating fails
|
|||||||
Do not store plain text password to history in creating user
|
Do not store plain text password to history in creating user
|
||||||
Selectable ON UPDATE CURRENT_TIMESTAMP field in create table
|
Selectable ON UPDATE CURRENT_TIMESTAMP field in create table
|
||||||
Open database to a new window after selecting it with Ctrl
|
Open database to a new window after selecting it with Ctrl
|
||||||
Clear column name after resetting search (bug #296)
|
Clear column name after resetting search (bug #3601200)
|
||||||
Explain partitions in SQL query (bug #294)
|
Explain partitions in SQL query (bug #3600150)
|
||||||
Allow loading more data with inline edit (bug #299)
|
Allow loading more data with inline edit (bug #3605531)
|
||||||
Stay on the same page after deleting rows (bug #301)
|
Stay on the same page after deleting rows (bug #3605845)
|
||||||
Respect checked tables in export filename (bug #133)
|
Respect checked tables in export filename (bug #3245464)
|
||||||
Respect PHP configuration max_input_vars
|
Respect PHP configuration max_input_vars
|
||||||
Fix unsetting permanent login after logout
|
Fix unsetting permanent login after logout
|
||||||
Disable autocapitalize in identifiers on mobile browsers
|
Disable autocapitalize in identifiers on mobile browsers
|
||||||
@@ -519,11 +466,11 @@ Ukrainian translation
|
|||||||
Bengali translation
|
Bengali translation
|
||||||
|
|
||||||
Adminer 3.3.4 (released 2012-03-07):
|
Adminer 3.3.4 (released 2012-03-07):
|
||||||
Foreign keys default actions (bug #188)
|
Foreign keys default actions (bug #3397606)
|
||||||
SET DEFAULT foreign key action
|
SET DEFAULT foreign key action
|
||||||
Fix minor parser bug in SQL command with webserver file
|
Fix minor parser bug in SQL command with webserver file
|
||||||
Ctrl+click on button opens form to a blank window
|
Ctrl+click on button opens form to a blank window
|
||||||
Trim table and column names (bug #195)
|
Trim table and column names (bug #3405309)
|
||||||
Error message with no response from server in AJAX
|
Error message with no response from server in AJAX
|
||||||
Esc to cancel AJAX request
|
Esc to cancel AJAX request
|
||||||
Move AJAX loading indicator to the right
|
Move AJAX loading indicator to the right
|
||||||
@@ -535,9 +482,9 @@ Ability to disable export (customization)
|
|||||||
Extensible list of databases (customization)
|
Extensible list of databases (customization)
|
||||||
MySQL: set autocommit after connect
|
MySQL: set autocommit after connect
|
||||||
SQLite, PostgreSQL: vacuum
|
SQLite, PostgreSQL: vacuum
|
||||||
SQLite, PostgreSQL: don't use LIKE for numbers (bug #202)
|
SQLite, PostgreSQL: don't use LIKE for numbers (bug #3420408)
|
||||||
PostgreSQL: fix alter foreign key
|
PostgreSQL: fix alter foreign key
|
||||||
PostgreSQL over PDO: connect if the eponymous database does not exist (bug #185)
|
PostgreSQL over PDO: connect if the eponymous database does not exist (bug #3391619)
|
||||||
Boolean search (Editor)
|
Boolean search (Editor)
|
||||||
Persian translation
|
Persian translation
|
||||||
|
|
||||||
@@ -565,8 +512,8 @@ Adminer 3.3.0 (released 2011-07-19):
|
|||||||
Use Esc to disable in-place edit
|
Use Esc to disable in-place edit
|
||||||
Shortcut for database privileges
|
Shortcut for database privileges
|
||||||
Editable index names
|
Editable index names
|
||||||
Append new index with auto index selection (bug #138)
|
Append new index with auto index selection (bug #3282127)
|
||||||
Preserve original timestamp value in multiple update (bug #158)
|
Preserve original timestamp value in multiple update (bug #3312614)
|
||||||
Bit type default value
|
Bit type default value
|
||||||
Display foreign key name in tooltip
|
Display foreign key name in tooltip
|
||||||
Display default column value in table overview
|
Display default column value in table overview
|
||||||
@@ -580,7 +527,7 @@ Display foreign keys from other schemas (PostgreSQL)
|
|||||||
Pagination support (Oracle)
|
Pagination support (Oracle)
|
||||||
Autocomplete for big foreign keys (Editor)
|
Autocomplete for big foreign keys (Editor)
|
||||||
Display name of the referenced record in PostgreSQL (Editor)
|
Display name of the referenced record in PostgreSQL (Editor)
|
||||||
Prefer NULL to empty string (Editor, bug #162)
|
Prefer NULL to empty string (Editor, bug #3323800)
|
||||||
Display searched columns (Editor)
|
Display searched columns (Editor)
|
||||||
Customizable favicon (customization)
|
Customizable favicon (customization)
|
||||||
Method name can return a link (customization)
|
Method name can return a link (customization)
|
||||||
@@ -592,8 +539,8 @@ Fix AJAX history after reload
|
|||||||
|
|
||||||
Adminer 3.2.1 (released 2011-03-23):
|
Adminer 3.2.1 (released 2011-03-23):
|
||||||
Ability to save expression in edit
|
Ability to save expression in edit
|
||||||
Respect default database collation (bug #119)
|
Respect default database collation (bug #3191489)
|
||||||
Don't export triggers without table (bug #123)
|
Don't export triggers without table (bug #3193489)
|
||||||
Esc to focus next field in Tab textarea
|
Esc to focus next field in Tab textarea
|
||||||
Send forms by Ctrl+Enter on <select>
|
Send forms by Ctrl+Enter on <select>
|
||||||
Enum editor and textarea Ctrl+Enter working in IE
|
Enum editor and textarea Ctrl+Enter working in IE
|
||||||
@@ -616,8 +563,8 @@ Get long texts and slow information by AJAX
|
|||||||
Most links and forms by AJAX in browsers with support for history.pushState
|
Most links and forms by AJAX in browsers with support for history.pushState
|
||||||
Copy tables
|
Copy tables
|
||||||
Ability to search by expression in select
|
Ability to search by expression in select
|
||||||
Export SQL command result (bug #99)
|
Export SQL command result (bug #3116854)
|
||||||
Focus first field with insert (bug #106)
|
Focus first field with insert (bug #3126501)
|
||||||
Permanent link in schema
|
Permanent link in schema
|
||||||
Display total time in show only errors mode in SQL command
|
Display total time in show only errors mode in SQL command
|
||||||
History: edit all
|
History: edit all
|
||||||
@@ -630,7 +577,7 @@ Utilize oids in PostgreSQL
|
|||||||
Homepage customization
|
Homepage customization
|
||||||
Use IN for search in numeric fields (Editor)
|
Use IN for search in numeric fields (Editor)
|
||||||
Use password input for _md5 and _sha1 fields (Editor)
|
Use password input for _md5 and _sha1 fields (Editor)
|
||||||
Work without session.use_cookies (bug #107)
|
Work without session.use_cookies (bug #3138640)
|
||||||
Fix saving schema to cookie in Opera
|
Fix saving schema to cookie in Opera
|
||||||
Portuguese, Slovenian and Turkish translation
|
Portuguese, Slovenian and Turkish translation
|
||||||
|
|
||||||
@@ -643,10 +590,10 @@ Recognize $$ strings in SQL command (PostgreSQL)
|
|||||||
Highlight and edit SQL command in processlist
|
Highlight and edit SQL command in processlist
|
||||||
Always display all drivers
|
Always display all drivers
|
||||||
Timestamp at the end of export
|
Timestamp at the end of export
|
||||||
Link to refresh database cache (bug #96)
|
Link to refresh database cache (bug #3102451)
|
||||||
Support for virtual foreign keys
|
Support for virtual foreign keys
|
||||||
Disable XSS "protection" of IE8
|
Disable XSS "protection" of IE8
|
||||||
Immunity against zend.ze1_compatibility_mode (bug #86)
|
Immunity against zend.ze1_compatibility_mode (bug #3089645)
|
||||||
Fix last page with empty result set
|
Fix last page with empty result set
|
||||||
Arabic translation and RTL support
|
Arabic translation and RTL support
|
||||||
Dual licensing: Apache or GPL
|
Dual licensing: Apache or GPL
|
||||||
@@ -694,7 +641,7 @@ Add Drop button to Alter pages (regression from 2.0.0)
|
|||||||
Link COUNT(*) result to listing
|
Link COUNT(*) result to listing
|
||||||
Newlines in select query edit
|
Newlines in select query edit
|
||||||
Return to referrer after edit
|
Return to referrer after edit
|
||||||
Respect session.auto_start (bug #42)
|
Respect session.auto_start (bug #2967284)
|
||||||
|
|
||||||
Adminer 2.3.0 (released 2010-02-26):
|
Adminer 2.3.0 (released 2010-02-26):
|
||||||
Support for permanent login (customization required)
|
Support for permanent login (customization required)
|
||||||
@@ -723,7 +670,7 @@ Link URLs in select
|
|||||||
Display number of manipulated rows in JS confirm
|
Display number of manipulated rows in JS confirm
|
||||||
Set required memory in SQL command
|
Set required memory in SQL command
|
||||||
Fix removed default in ALTER
|
Fix removed default in ALTER
|
||||||
Display whitespace in texts (bug #11)
|
Display whitespace in texts (bug #2858042)
|
||||||
ClickJacking protection in modern browsers
|
ClickJacking protection in modern browsers
|
||||||
E-mail attachments (Editor)
|
E-mail attachments (Editor)
|
||||||
Optional year in date (Editor)
|
Optional year in date (Editor)
|
||||||
@@ -742,7 +689,7 @@ Use ON DUPLICATE KEY UPDATE for CSV import
|
|||||||
Print ALTER export instead of executing it
|
Print ALTER export instead of executing it
|
||||||
Click on row selects it
|
Click on row selects it
|
||||||
Fix Editor date format
|
Fix Editor date format
|
||||||
Fix long SQL query crash (bug #3)
|
Fix long SQL query crash (bug #2839231)
|
||||||
Speed up simple alter table
|
Speed up simple alter table
|
||||||
Traditional Chinese translation
|
Traditional Chinese translation
|
||||||
|
|
||||||
|
22
compile.php
22
compile.php
@@ -1,11 +1,6 @@
|
|||||||
#!/usr/bin/env php
|
#!/usr/bin/env php
|
||||||
<?php
|
<?php
|
||||||
function adminer_errors($errno, $errstr) {
|
|
||||||
return !!preg_match('~^(Trying to access array offset on value of type null|Undefined array key)~', $errstr);
|
|
||||||
}
|
|
||||||
|
|
||||||
error_reporting(6135); // errors and warnings
|
error_reporting(6135); // errors and warnings
|
||||||
set_error_handler('adminer_errors', 2); // 2 - E_WARNING
|
|
||||||
include dirname(__FILE__) . "/adminer/include/version.inc.php";
|
include dirname(__FILE__) . "/adminer/include/version.inc.php";
|
||||||
include dirname(__FILE__) . "/externals/JsShrink/jsShrink.php";
|
include dirname(__FILE__) . "/externals/JsShrink/jsShrink.php";
|
||||||
|
|
||||||
@@ -41,7 +36,7 @@ function lang_ids($match) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function put_file($match) {
|
function put_file($match) {
|
||||||
global $project, $VERSION, $driver;
|
global $project, $VERSION;
|
||||||
if (basename($match[2]) == '$LANG.inc.php') {
|
if (basename($match[2]) == '$LANG.inc.php') {
|
||||||
return $match[0]; // processed later
|
return $match[0]; // processed later
|
||||||
}
|
}
|
||||||
@@ -61,9 +56,6 @@ header("Cache-Control: immutable");
|
|||||||
echo "adminer/file.inc.php: Caching headers placeholder not found\n";
|
echo "adminer/file.inc.php: Caching headers placeholder not found\n";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ($driver && dirname($match[2]) == "../adminer/drivers") {
|
|
||||||
$return = preg_replace('~^if \(isset\(\$_GET\["' . $driver . '"]\)\) \{(.*)^}~ms', '\1', $return);
|
|
||||||
}
|
|
||||||
if (basename($match[2]) != "lang.inc.php" || !$_SESSION["lang"]) {
|
if (basename($match[2]) != "lang.inc.php" || !$_SESSION["lang"]) {
|
||||||
if (basename($match[2]) == "lang.inc.php") {
|
if (basename($match[2]) == "lang.inc.php") {
|
||||||
$return = str_replace('function lang($idf, $number = null) {', 'function lang($idf, $number = null) {
|
$return = str_replace('function lang($idf, $number = null) {', 'function lang($idf, $number = null) {
|
||||||
@@ -108,7 +100,7 @@ function lzw_compress($string) {
|
|||||||
$word = "";
|
$word = "";
|
||||||
$codes = array();
|
$codes = array();
|
||||||
for ($i=0; $i <= strlen($string); $i++) {
|
for ($i=0; $i <= strlen($string); $i++) {
|
||||||
$x = @$string[$i];
|
$x = $string[$i];
|
||||||
if (strlen($x) && isset($dictionary[$word . $x])) {
|
if (strlen($x) && isset($dictionary[$word . $x])) {
|
||||||
$word .= $x;
|
$word .= $x;
|
||||||
} elseif ($i) {
|
} elseif ($i) {
|
||||||
@@ -241,7 +233,7 @@ function php_shrink($input) {
|
|||||||
$short_variables[$key] = short_identifier($number, $chars); // could use also numbers and \x7f-\xff
|
$short_variables[$key] = short_identifier($number, $chars); // could use also numbers and \x7f-\xff
|
||||||
}
|
}
|
||||||
|
|
||||||
$set = array_flip(preg_split('//', '!"#$%&\'()*+,-./:;<=>?@[]^`{|}'));
|
$set = array_flip(preg_split('//', '!"#$%&\'()*+,-./:;<=>?@[\]^`{|}'));
|
||||||
$space = '';
|
$space = '';
|
||||||
$output = '';
|
$output = '';
|
||||||
$in_echo = false;
|
$in_echo = false;
|
||||||
@@ -323,14 +315,6 @@ function compile_file($match) {
|
|||||||
return '"' . add_quo_slashes($file) . '"';
|
return '"' . add_quo_slashes($file) . '"';
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!function_exists("each")) {
|
|
||||||
function each(&$arr) {
|
|
||||||
$key = key($arr);
|
|
||||||
next($arr);
|
|
||||||
return $key === null ? false : array($key, $arr[$key]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function min_version() {
|
function min_version() {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@@ -1,729 +0,0 @@
|
|||||||
/*
|
|
||||||
* Theme by Douglas Damasio [http://github.com/douglasdamasio]
|
|
||||||
* Based on Pepa Linha
|
|
||||||
* Color syntax inspired by Dracula Theme [https://draculatheme.com/]
|
|
||||||
* @version 1.0 (June 2020)
|
|
||||||
*/
|
|
||||||
@import url('https://fonts.googleapis.com/css2?family=Source+Sans+Pro:wght@300;400;600&family=Ubuntu:wght@500;700&display=swap');
|
|
||||||
|
|
||||||
:root {
|
|
||||||
--color-darkBackground: #282a36;
|
|
||||||
--color-darkCurrentLine: #44475a;
|
|
||||||
--color-darkForeground: #f8f8f2;
|
|
||||||
--color-darkComment: #6272a4;
|
|
||||||
--color-darkCyan: #8be9fd;
|
|
||||||
--color-darkGreen: #50fa7b;
|
|
||||||
--color-darkOrange: #ffb86c;
|
|
||||||
--color-darkPink: #ff79c6;
|
|
||||||
--color-darkPurple: #bd93f9;
|
|
||||||
--color-darkRed: #ff5555;
|
|
||||||
--color-darkYellow: #f1fa8c;
|
|
||||||
|
|
||||||
--color-darkTitleSite: #bcc2cd;
|
|
||||||
--color-darkDraculaSite: #383a59;
|
|
||||||
--color-darkDraculaVSCode: #22222c;
|
|
||||||
}
|
|
||||||
html,
|
|
||||||
body {
|
|
||||||
height: 100%;
|
|
||||||
background: var(--color-darkBackground);
|
|
||||||
}
|
|
||||||
|
|
||||||
body {
|
|
||||||
font-family: 'Source Sans Pro', sans-serif;
|
|
||||||
}
|
|
||||||
|
|
||||||
div {
|
|
||||||
color: var(--color-darkForeground);
|
|
||||||
}
|
|
||||||
|
|
||||||
h1 {
|
|
||||||
margin: 0;
|
|
||||||
padding: 0;
|
|
||||||
background: none;
|
|
||||||
border: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
h2 {
|
|
||||||
margin: 0;
|
|
||||||
padding: 0;
|
|
||||||
background: none;
|
|
||||||
border: 0;
|
|
||||||
font-family: 'Ubuntu', sans-serif;
|
|
||||||
font-size: 32px;
|
|
||||||
font-weight: 700;
|
|
||||||
color: var(--color-darkPink);
|
|
||||||
border-bottom: 1px solid var(--color-darkComment);
|
|
||||||
padding-bottom: 6px;
|
|
||||||
margin-bottom: 40px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.rtl h2 {
|
|
||||||
margin: 0;
|
|
||||||
margin-bottom: 40px;
|
|
||||||
}
|
|
||||||
|
|
||||||
h3 {
|
|
||||||
font-size: 22px;
|
|
||||||
margin: 0 0 10px;
|
|
||||||
border-bottom: 1px solid var(--color-darkComment);
|
|
||||||
padding: 0;
|
|
||||||
padding-bottom: 6px;
|
|
||||||
color: var(--color-darkGreen);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
p {
|
|
||||||
margin: 0;
|
|
||||||
margin-bottom: 15px;
|
|
||||||
align-items: center;
|
|
||||||
color: var(--color-darkForeground);
|
|
||||||
}
|
|
||||||
|
|
||||||
a {
|
|
||||||
color:var(--color-darkPink);
|
|
||||||
text-decoration:none;
|
|
||||||
}
|
|
||||||
|
|
||||||
a:visited {
|
|
||||||
color: var(--color-darkPurple);
|
|
||||||
}
|
|
||||||
|
|
||||||
a:link:hover,
|
|
||||||
a:visited:hover {
|
|
||||||
color: var(--color-darkPink);
|
|
||||||
text-decoration:underline;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
a[href*=charsets] {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
table {
|
|
||||||
border: 0;
|
|
||||||
margin: 0;
|
|
||||||
margin-top: 15px;
|
|
||||||
}
|
|
||||||
|
|
||||||
th, td {
|
|
||||||
border: 0;
|
|
||||||
padding: 6px;
|
|
||||||
color: var(--color-darkOrange);
|
|
||||||
}
|
|
||||||
|
|
||||||
th {
|
|
||||||
background: none;
|
|
||||||
color: var(--color-darkCyan);
|
|
||||||
font-weight: normal;
|
|
||||||
}
|
|
||||||
|
|
||||||
tbody tr:hover td,
|
|
||||||
tbody tr:hover th {
|
|
||||||
background: var(--color-darkCurrentLine);
|
|
||||||
}
|
|
||||||
|
|
||||||
table:not(.checkable) th {
|
|
||||||
min-width: 120px;
|
|
||||||
}
|
|
||||||
|
|
||||||
thead td,
|
|
||||||
thead th {
|
|
||||||
background: var(--color-darkComment);
|
|
||||||
}
|
|
||||||
|
|
||||||
thead td,
|
|
||||||
thead td a,
|
|
||||||
thead td a:link:hover,
|
|
||||||
thead td a:visited,
|
|
||||||
thead td a:visited:hover,
|
|
||||||
thead th,
|
|
||||||
thead th a,
|
|
||||||
thead th a:link:hover,
|
|
||||||
thead th a:visited,
|
|
||||||
thead th a:visited:hover {
|
|
||||||
color: var(--color-darkForeground);
|
|
||||||
}
|
|
||||||
|
|
||||||
table.checkable,
|
|
||||||
p.links + table,
|
|
||||||
pre + table,
|
|
||||||
#edit-fields,
|
|
||||||
p + table,
|
|
||||||
h3 + table {
|
|
||||||
border: 1px solid var(--color-darkCurrentLine);
|
|
||||||
margin-bottom: 15px;
|
|
||||||
}
|
|
||||||
|
|
||||||
table.checkable tbody tr:hover td,
|
|
||||||
table.checkable tbody tr:hover th {
|
|
||||||
background: var(--color-darkCurrentLine);
|
|
||||||
}
|
|
||||||
|
|
||||||
.js .checkable .checked td,
|
|
||||||
.js .checkable .checked th {
|
|
||||||
background: var(--color-darkDraculaSite);
|
|
||||||
}
|
|
||||||
|
|
||||||
.js .checkable thead .checked td,
|
|
||||||
.js .checkable thead .checked th {
|
|
||||||
background: var(--color-darkPurple);
|
|
||||||
}
|
|
||||||
|
|
||||||
.odd th,
|
|
||||||
.odd td {
|
|
||||||
background: var(--color-darkDraculaVSCode);
|
|
||||||
}
|
|
||||||
|
|
||||||
fieldset {
|
|
||||||
display: inline-block;
|
|
||||||
padding: 15px;
|
|
||||||
padding-top: 5px;
|
|
||||||
margin: 0 0 15px;
|
|
||||||
border: 0;
|
|
||||||
background: var(--color-darkBackground);
|
|
||||||
}
|
|
||||||
|
|
||||||
fieldset select {
|
|
||||||
margin-right: 5px;
|
|
||||||
}
|
|
||||||
|
|
||||||
fieldset input[type=button],
|
|
||||||
fieldset input[type=submit],
|
|
||||||
fieldset p {
|
|
||||||
margin-bottom: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
fieldset div p {
|
|
||||||
margin-top: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
legend {
|
|
||||||
display: inline-block;
|
|
||||||
padding: 6px 15px;
|
|
||||||
margin: 0 0 0 -15px;
|
|
||||||
background: var(--color-darkDraculaSite);
|
|
||||||
font-family: 'Source Sans Pro', sans-serif;
|
|
||||||
color: var(--color-darkOrange);
|
|
||||||
}
|
|
||||||
|
|
||||||
legend a,
|
|
||||||
legend a:link:hover {
|
|
||||||
color: var(--color-darkOrange);
|
|
||||||
text-decoration: underline;
|
|
||||||
}
|
|
||||||
|
|
||||||
code {
|
|
||||||
background: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
p code,
|
|
||||||
pre code,
|
|
||||||
pre[contenteditable=true] {
|
|
||||||
padding: 10px 15px;
|
|
||||||
display: block;
|
|
||||||
font-size: 17px;
|
|
||||||
margin-bottom: 15px;
|
|
||||||
}
|
|
||||||
|
|
||||||
p code + a,
|
|
||||||
p code + a:link:hover,
|
|
||||||
p code + a:visited:hover {
|
|
||||||
margin-left: 15px;
|
|
||||||
position: relative;
|
|
||||||
top: -20px;
|
|
||||||
color: var(--color-darkOrange);
|
|
||||||
font-size: 12px;
|
|
||||||
text-decoration: underline;
|
|
||||||
text-transform: lowercase;
|
|
||||||
}
|
|
||||||
|
|
||||||
#content {
|
|
||||||
margin: 0;
|
|
||||||
margin-left: 400px;
|
|
||||||
margin-right: 54px;
|
|
||||||
padding: 0;
|
|
||||||
padding-top: 50px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#content > p {
|
|
||||||
margin-bottom: 15px;
|
|
||||||
color: var(--color-darkForeground);
|
|
||||||
}
|
|
||||||
|
|
||||||
.rtl #content {
|
|
||||||
margin: 0;
|
|
||||||
margin-left: 54px;
|
|
||||||
margin-right: 400px;
|
|
||||||
padding: 0;
|
|
||||||
padding-top: 50px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#menu {
|
|
||||||
width: 347px;
|
|
||||||
border-right: 1px solid var(--color-darkBackground);
|
|
||||||
box-shadow: inset -1px 0 0 #000000b4;
|
|
||||||
margin: 0;
|
|
||||||
padding: 0;
|
|
||||||
top: 0;
|
|
||||||
background: var(--color-darkDraculaVSCode);
|
|
||||||
bottom: 0;
|
|
||||||
position: fixed;
|
|
||||||
padding: 0 15px;
|
|
||||||
box-sizing: border-box;
|
|
||||||
}
|
|
||||||
|
|
||||||
#menu h1 {
|
|
||||||
background: none left top no-repeat;
|
|
||||||
/* background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAD0AAAAyCAIAAABgVkRrAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYxIDY0LjE0MDk0OSwgMjAxMC8xMi8wNy0xMDo1NzowMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNS4xIFdpbmRvd3MiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NTA0RDI5NkM5QkRGMTFFMzg4ODNEQjEzNjY5NzJEMEEiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NTA0RDI5NkQ5QkRGMTFFMzg4ODNEQjEzNjY5NzJEMEEiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo1MDREMjk2QTlCREYxMUUzODg4M0RCMTM2Njk3MkQwQSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo1MDREMjk2QjlCREYxMUUzODg4M0RCMTM2Njk3MkQwQSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PnG4emkAAASXSURBVHja7Fk9aNtAFL6EDKKUoqGDySRKB1FC8dDBdCgeOmQoIUMG0yGE0EFT8dDBUwidPJQQQgcNpYROGjKI0sFDB9GhaMhgSgcPpWgqHjqYYsINJfQ7PfV0tmX9JI4Sgx+HI8f26bt3733fe6elIf/LbqwdHbJWS1wYBrMstrXJVg36ZJnNhQWBWMB9k+215gq3tDeHBH3pRseJtC8ee2ezEzd62+ncDH/DhS+ttC88qbMPDntaj952uyvXD3q7ETvyyE77pq5HFz9614r7V8C2GnBezBgp9tGNl3ffzIjvwZ9B//dA7Mz3YPLTyl29UhE+MI0KW9YKh2yjwQZichEAjsNu6WlUqNqkvwHUO+0BJeD2gn4hJFXTwAIw6jUzYxlwHkCTvWqy1+0Ct7FtsPh/3Ofc9brOJ5+8ezHr9gKMcGpWf2SK8bhKk48sA1kIOiODmzc2c8U0DLrzwhI5ypjA3fsZtNrOgPP4y5pmGJXamqHd1kQMTIkENYpwEfQHEW7GsGkYZse393ewb+Y9IwE0PJcOejQ2pFgK3Li3BI14hZM269XKaiXPVPodHUOs6l48o/+t5wO038OcQGztHzd31uPfUEgQdCQi3JkfumLLHa9LoK2tunPQtJ6v5wQ9zWoPzebupms34QKxmZNJAugIDzJE+V4rbTrDSMYtr3AD+H5WFIfZ0lIFPu50otiF7zfW2dlgquKccTFWRxYQ8wlFJOVTdc2gAChq/V99vxdgD7O5CIBO/Yi/P3vsUY2dOOxBdSrzIBm2dxJwq+hlaiId9dua5OlEv/IhH0vKvAYXfvUjvUTFB2STeinJu91Oxo3Eh58onwRXcB7zWkGj/Maa9203+9soPIyWEKBEkQdc8veo+sS4wQkYzV1Bi+A1Ee5DnhO33BxsSw1/wszGPHkXmqI7yIQzPvnvhPqEFjAWtSq7j7n2YplwSctVV8F/FXazbN76nQXu68btfe3Odmqwahl5Ca6tel0UVdnVc6pRBX/JkrgYn0RCY0cdAMhYvGYxHbEklbJ++FoqD8LTUiwTlZLEha55WKOmSybWTCXD1eJG8dnc4XAYqmdgmoRFyp/ZqqHbgMiD8qGXZeAOs1RD9YyhBgBVTgL3cMTHwKd2xyUL50qmTI5p/oK/F7jnEjeycLZTFz02SrKlaSPGbe0fOx+9mbTGcMHhe/fwuFMGn4Dy7BMPA3oBGkZrbIDgcp9JgK37YYtZjmSuqApH9yPRcTp+TM939THOpkaYroMguRuSE14tbuegif11vS58poYm7i1vn6fdxF6hMoNk4leIvTJ0B1FhPQ/PxM45eZ2HGjkY8jHXqptghGJJqqmKVHn1oCr4k93xgr8XuOcZ9zmf7dQym68Et6QFcFaBk7EsQ5fdfuteHW7xPM3asyVh05EkxFJITMHuGDUCukxwvOz3YI31mtWoX7TRXkrDjQhBLeFOHBtQQ6n/f8TDlAd/6mNBP7xO7Ecbz2qNjfrl6qoU3Mr5Qa4j9yyLHqZd7jwjL241QQFdPiJTdT7RsBuapslzi5mqVSHcKXYetcZlSelU3P8EGADW25uhkIE0mQAAAABJRU5ErkJggg==); */
|
|
||||||
background-image: url();
|
|
||||||
line-height: 50px;
|
|
||||||
padding-left: 50px;
|
|
||||||
padding-top: 9px;
|
|
||||||
/* text-transform: lowercase; */
|
|
||||||
margin: 25px 0 10px 16px;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#menu h1 a {
|
|
||||||
font-style: normal;
|
|
||||||
}
|
|
||||||
|
|
||||||
#menu h1 .version {
|
|
||||||
color: var(--color-darkPurple);
|
|
||||||
}
|
|
||||||
|
|
||||||
#menu a {
|
|
||||||
color: var(--color-darkForeground);
|
|
||||||
}
|
|
||||||
|
|
||||||
#menu p, #tables {
|
|
||||||
border: 0;
|
|
||||||
padding: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#menu #dbs {
|
|
||||||
background: var(--color-darkDraculaVSCode);
|
|
||||||
padding: 0 15px 15px;
|
|
||||||
border: 1px solid var(--color-darkForeground);
|
|
||||||
border-bottom: 0;
|
|
||||||
box-sizing: border-box;
|
|
||||||
color: var(--color-darkCyan);
|
|
||||||
}
|
|
||||||
|
|
||||||
#menu #dbs select {
|
|
||||||
outline: 0;
|
|
||||||
border-color: var(--color-darkComment);
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
#menu p.links {
|
|
||||||
margin: 0 0 15px;
|
|
||||||
border: 1px solid var(--color-darkForeground);
|
|
||||||
border-top: 0;
|
|
||||||
text-align: center;
|
|
||||||
display: table;
|
|
||||||
width: 100%;
|
|
||||||
box-sizing: border-box;
|
|
||||||
}
|
|
||||||
|
|
||||||
#menu p.links a {
|
|
||||||
padding: 8px;
|
|
||||||
margin: 0;
|
|
||||||
display: table-cell;
|
|
||||||
font-size: 12px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#menu p.links a:hover {
|
|
||||||
color: var(--color-darkPink);
|
|
||||||
}
|
|
||||||
|
|
||||||
#menu p.links a.active {
|
|
||||||
font-weight: normal;
|
|
||||||
background: var(--color-darkCurrentLine);
|
|
||||||
color: var(--color-darkYellow);
|
|
||||||
}
|
|
||||||
|
|
||||||
#content p.links {
|
|
||||||
margin: -10px 0 15px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#content p.links a {
|
|
||||||
padding: 8px;
|
|
||||||
margin: 0;
|
|
||||||
display: table-cell;
|
|
||||||
border: 1px solid var(--color-darkBackground);
|
|
||||||
}
|
|
||||||
|
|
||||||
#content p.links a,
|
|
||||||
#content p.links a:visited,
|
|
||||||
#content p.links a:hover {
|
|
||||||
color: var(--color-darkCyan);
|
|
||||||
}
|
|
||||||
|
|
||||||
#content p.links a.active {
|
|
||||||
font-weight: normal;
|
|
||||||
border: 1px solid var(--color-darkTitleSite);
|
|
||||||
background: var(--color-darkCurrentLine);
|
|
||||||
}
|
|
||||||
|
|
||||||
#tables {
|
|
||||||
max-height: 100%;
|
|
||||||
margin: 32px -15px !important;
|
|
||||||
position: absolute;
|
|
||||||
left: 15px;
|
|
||||||
right: 15px;
|
|
||||||
bottom: 0;
|
|
||||||
top: 220px;
|
|
||||||
overflow: hidden !important;
|
|
||||||
overflow-y: auto !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
.rtl #tables {
|
|
||||||
overflow: hidden !important;
|
|
||||||
overflow-y: auto !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
#tables a {
|
|
||||||
float: right;
|
|
||||||
padding: 6px 15px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.rtl #tables a {
|
|
||||||
float: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
#tables a[title] {
|
|
||||||
float: none;
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
|
|
||||||
.rtl #tables a:first-child,
|
|
||||||
.rtl #tables br + a {
|
|
||||||
float: left;
|
|
||||||
display: block;
|
|
||||||
margin-left: 15px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#tables a:hover,
|
|
||||||
#tables a:hover + a,
|
|
||||||
#tables a.active,
|
|
||||||
#tables a.active + a {
|
|
||||||
background: var(--color-darkBackground);
|
|
||||||
color: var(--color-darkPink);
|
|
||||||
}
|
|
||||||
|
|
||||||
#tables br {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.js .column {
|
|
||||||
background: var(--color-darkDraculaVSCode);
|
|
||||||
}
|
|
||||||
|
|
||||||
.js .checked .column {
|
|
||||||
background: var(--color-darkDraculaVSCode);
|
|
||||||
}
|
|
||||||
|
|
||||||
.pages {
|
|
||||||
left: 400px;
|
|
||||||
background: var(--color-darkCyan);
|
|
||||||
color: var(--color-darkBackground);
|
|
||||||
font-weight: bold;
|
|
||||||
border: 0;
|
|
||||||
display: inline-block;
|
|
||||||
position: static;
|
|
||||||
}
|
|
||||||
|
|
||||||
.pages a,
|
|
||||||
.pages a:link,
|
|
||||||
.pages a:link:hover,
|
|
||||||
.pages a:visited,
|
|
||||||
.pages a:visited:hover {
|
|
||||||
color: var(--color-darkBackground);
|
|
||||||
font-weight: normal;
|
|
||||||
}
|
|
||||||
|
|
||||||
#breadcrumb {
|
|
||||||
margin: 0;
|
|
||||||
left: 400px;
|
|
||||||
background: none;
|
|
||||||
padding: 0;
|
|
||||||
padding-top: 25px;
|
|
||||||
font-size: 12px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#breadcrumb a {
|
|
||||||
color: var(--color-darkForeground);
|
|
||||||
text-decoration: underline;
|
|
||||||
}
|
|
||||||
|
|
||||||
#breadcrumb,
|
|
||||||
#breadcrumb a:hover {
|
|
||||||
color: var(--color-darkTitleSite);
|
|
||||||
}
|
|
||||||
|
|
||||||
.rtl #breadcrumb {
|
|
||||||
margin: 0;
|
|
||||||
padding: 0;
|
|
||||||
padding-top: 25px;
|
|
||||||
right: 400px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.logout,
|
|
||||||
.rtl .logout {
|
|
||||||
top: 30px;
|
|
||||||
right: 54px;
|
|
||||||
margin: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.rtl .logout {
|
|
||||||
right: auto;
|
|
||||||
left: 54px;
|
|
||||||
}
|
|
||||||
|
|
||||||
input:not([type]),
|
|
||||||
input[type="color"],
|
|
||||||
input[type="email"],
|
|
||||||
input[type="number"],
|
|
||||||
input[type="password"],
|
|
||||||
input[type="tel"],
|
|
||||||
input[type="url"],
|
|
||||||
input[type="text"],
|
|
||||||
input[type="search"] {
|
|
||||||
border: 1px solid var(--color-darkCurrentLine);
|
|
||||||
background-color: var(--color-darkBackground);
|
|
||||||
padding: 6px;
|
|
||||||
margin: 0;
|
|
||||||
box-sizing: border-box;
|
|
||||||
color: var(--color-darkForeground);
|
|
||||||
}
|
|
||||||
|
|
||||||
table:not(#table) input:not([type]),
|
|
||||||
table:not(#table) input[type="color"],
|
|
||||||
table:not(#table) input[type="email"],
|
|
||||||
table:not(#table) input[type="number"],
|
|
||||||
table:not(#table) input[type="password"],
|
|
||||||
table:not(#table) input[type="tel"],
|
|
||||||
table:not(#table) input[type="url"],
|
|
||||||
table:not(#table) input[type="text"],
|
|
||||||
table:not(#table) input[type="search"] {
|
|
||||||
min-width: 280px;
|
|
||||||
}
|
|
||||||
|
|
||||||
input[type=submit],
|
|
||||||
input[type=button] {
|
|
||||||
border: 0;
|
|
||||||
padding: 7px 12px;
|
|
||||||
cursor: pointer;
|
|
||||||
outline: 0;
|
|
||||||
box-shadow: none;
|
|
||||||
background: var(--color-darkGreen);
|
|
||||||
color: var(--color-darkBackground);
|
|
||||||
font-weight: bold;
|
|
||||||
margin-bottom: 5px;
|
|
||||||
transition: background .4s ease;
|
|
||||||
border-radius: 5px;
|
|
||||||
margin-top: 20px;
|
|
||||||
}
|
|
||||||
|
|
||||||
input[type=submit][disabled],
|
|
||||||
input[type=button][disabled] {
|
|
||||||
background: var(--color-darkTitleSite) !important;
|
|
||||||
color: var(--color-darkBackground);
|
|
||||||
cursor: not-allowed;
|
|
||||||
}
|
|
||||||
|
|
||||||
input[type=submit]:hover,
|
|
||||||
input[type=button]:hover,
|
|
||||||
input[type=submit]:focus,
|
|
||||||
input[type=button]:focus {
|
|
||||||
background: var(--color-darkGreen);
|
|
||||||
opacity: 0.8;
|
|
||||||
}
|
|
||||||
|
|
||||||
.logout input[type=submit] {
|
|
||||||
background: var(--color-darkRed);
|
|
||||||
color: var(--color-darkForeground);
|
|
||||||
}
|
|
||||||
|
|
||||||
.logout input[type=submit]:hover {
|
|
||||||
background: var(--color-darkRed);
|
|
||||||
opacity: 0.8;
|
|
||||||
}
|
|
||||||
|
|
||||||
input.default,
|
|
||||||
input.default {
|
|
||||||
box-shadow: none;
|
|
||||||
background: var(--color-darkGreen);
|
|
||||||
color: var(--color-darkDraculaVSCode);
|
|
||||||
font-weight: bold;
|
|
||||||
}
|
|
||||||
|
|
||||||
select {
|
|
||||||
box-sizing: border-box;
|
|
||||||
margin: 0;
|
|
||||||
padding: 6px 0;
|
|
||||||
border: 1px solid var(--color-darkCurrentLine);
|
|
||||||
background-color: var(--color-darkBackground);
|
|
||||||
color: var(--color-darkForeground);
|
|
||||||
}
|
|
||||||
|
|
||||||
label {
|
|
||||||
cursor: pointer;
|
|
||||||
margin: 18px;
|
|
||||||
color: var(--color-darkOrange);
|
|
||||||
}
|
|
||||||
|
|
||||||
.error,
|
|
||||||
.message {
|
|
||||||
margin: 0;
|
|
||||||
margin-bottom: 15px;
|
|
||||||
background: var(--color-darkCurrentLine);
|
|
||||||
color: var(--color-darkRed);
|
|
||||||
}
|
|
||||||
|
|
||||||
#logins a,
|
|
||||||
#tables a,
|
|
||||||
#tables span {
|
|
||||||
background: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
#form > p {
|
|
||||||
margin-bottom: 15px;
|
|
||||||
color: var(--color-darkForeground);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#schema .table {
|
|
||||||
padding: 6px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#schema .table a {
|
|
||||||
display: block;
|
|
||||||
margin: -6px;
|
|
||||||
margin-bottom: 6px;
|
|
||||||
padding: 6px;
|
|
||||||
color: var(--color-darkBackground);
|
|
||||||
background: var(--color-darkPurple);
|
|
||||||
}
|
|
||||||
|
|
||||||
#schema .table br {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
#schema .table span {
|
|
||||||
display: block;
|
|
||||||
margin-bottom: 1px solid var(--color-darkDraculaVSCode);
|
|
||||||
}
|
|
||||||
|
|
||||||
#lang {
|
|
||||||
position: fixed;
|
|
||||||
top: 55px;
|
|
||||||
right: 100%;
|
|
||||||
z-index: 10;
|
|
||||||
margin-right: -340px;
|
|
||||||
line-height: normal;
|
|
||||||
padding: 0;
|
|
||||||
left: auto;
|
|
||||||
font-size: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#lang select {
|
|
||||||
font-size: 12px;
|
|
||||||
padding: 0;
|
|
||||||
text-align: right;
|
|
||||||
border: 0;
|
|
||||||
background: none;
|
|
||||||
-webkit-appearance: none;
|
|
||||||
-moz-appearance: none;
|
|
||||||
appearance: none;
|
|
||||||
cursor: pointer;
|
|
||||||
outline: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#lang select option {
|
|
||||||
text-align: right;
|
|
||||||
}
|
|
||||||
|
|
||||||
.rtl #lang {
|
|
||||||
margin-right: 0;
|
|
||||||
left: 100%;
|
|
||||||
margin-left: -261px;
|
|
||||||
right: auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
.jush {
|
|
||||||
color: var(--color-darkForeground);
|
|
||||||
}
|
|
||||||
|
|
||||||
.jush a {
|
|
||||||
color: var(--color-darkPurple);
|
|
||||||
}
|
|
||||||
|
|
||||||
.jush-sql a,
|
|
||||||
.jush-sql_code a,
|
|
||||||
.jush-sqlite a,
|
|
||||||
.jush-pgsql a,
|
|
||||||
.jush-mssql a,
|
|
||||||
.jush-oracle a,
|
|
||||||
.jush-simpledb a {
|
|
||||||
font-weight: normal;
|
|
||||||
}
|
|
||||||
|
|
||||||
.jush-bac,
|
|
||||||
.jush-php_bac,
|
|
||||||
.jush-bra,
|
|
||||||
.jush-mssql_bra,
|
|
||||||
.jush-sqlite_quo {
|
|
||||||
color: var(--color-darkYellow);
|
|
||||||
}
|
|
||||||
|
|
||||||
.jush-php_quo,
|
|
||||||
.jush-quo,
|
|
||||||
.jush-quo_one,
|
|
||||||
.jush-php_eot,
|
|
||||||
.jush-apo,
|
|
||||||
.jush-sql_apo,
|
|
||||||
.jush-sqlite_apo,
|
|
||||||
.jush-sql_quo,
|
|
||||||
.jush-sql_eot {
|
|
||||||
color: var(--color-darkOrange);
|
|
||||||
}
|
|
||||||
|
|
||||||
.jush-num,
|
|
||||||
.jush-clr {
|
|
||||||
color: var(--color-darkPurple);
|
|
||||||
}
|
|
||||||
|
|
||||||
@media print {
|
|
||||||
.logout {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
#breadcrumb {
|
|
||||||
position: static;
|
|
||||||
}
|
|
||||||
|
|
||||||
#content {
|
|
||||||
margin: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.footer {
|
|
||||||
position: sticky;
|
|
||||||
bottom: 0;
|
|
||||||
margin-right: -20px;
|
|
||||||
border-top: 20px solid var(--color-darkBackground);
|
|
||||||
border-image: var(--color-darkBackground) 100% 0;
|
|
||||||
border-image-source: var(--color-darkBackground);
|
|
||||||
border-image-slice: 100% 0;
|
|
||||||
border-image-width: 1;
|
|
||||||
border-image-outset: 0;
|
|
||||||
border-image-repeat: stretch;
|
|
||||||
}
|
|
||||||
|
|
||||||
.footer > div {
|
|
||||||
background: var(--color-darkBackground);
|
|
||||||
padding: 0 0 .5em;
|
|
||||||
}
|
|
Submodule designs/hydra deleted from afcef61f66
@@ -19,9 +19,9 @@ html/*\*/>/*/*/body a[href$="dump="] {background:url("data:image/png;base64,iVBO
|
|||||||
html/*\*/>/*/*/body select[name="db"] {background:white url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAEYSURBVBgZBcHPio5hGAfg6/2+R980k6wmJgsJ5U/ZOAqbSc2GnXOwUg7BESgLUeIQ1GSjLFnMwsKGGg1qxJRmPM97/1zXFAAAAEADdlfZzr26miup2svnelq7d2aYgt3rebl585wN6+K3I1/9fJe7O/uIePP2SypJkiRJ0vMhr55FLCA3zgIAOK9uQ4MS361ZOSX+OrTvkgINSjS/HIvhjxNNFGgQsbSmabohKDNoUGLohsls6BaiQIMSs2FYmnXdUsygQYmumy3Nhi6igwalDEOJEjPKP7CA2aFNK8Bkyy3fdNCg7r9/fW3jgpVJbDmy5+PB2IYp4MXFelQ7izPrhkPHB+P5/PjhD5gCgCenx+VR/dODEwD+A3T7nqbxwf1HAAAAAElFTkSuQmCC") no-repeat scroll left bottom; padding-left:16px;}
|
html/*\*/>/*/*/body select[name="db"] {background:white url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAEYSURBVBgZBcHPio5hGAfg6/2+R980k6wmJgsJ5U/ZOAqbSc2GnXOwUg7BESgLUeIQ1GSjLFnMwsKGGg1qxJRmPM97/1zXFAAAAEADdlfZzr26miup2svnelq7d2aYgt3rebl585wN6+K3I1/9fJe7O/uIePP2SypJkiRJ0vMhr55FLCA3zgIAOK9uQ4MS361ZOSX+OrTvkgINSjS/HIvhjxNNFGgQsbSmabohKDNoUGLohsls6BaiQIMSs2FYmnXdUsygQYmumy3Nhi6igwalDEOJEjPKP7CA2aFNK8Bkyy3fdNCg7r9/fW3jgpVJbDmy5+PB2IYp4MXFelQ7izPrhkPHB+P5/PjhD5gCgCenx+VR/dODEwD+A3T7nqbxwf1HAAAAAElFTkSuQmCC") no-repeat scroll left bottom; padding-left:16px;}
|
||||||
html/*\*/>/*/*/body select[name="db"] option {padding-left:18px;}
|
html/*\*/>/*/*/body select[name="db"] option {padding-left:18px;}
|
||||||
|
|
||||||
html/*\*/>/*/*/body #menu li a[href*="&select="] {background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAHISURBVDjLpVPNK0RRFP+9D98syMwUspHkm9I0YkFZWBFKkZ0s7a3Ewh+ilChK7FgoZCJFKYlYKB8zk2+Z5t0P577He29kQU7dd+6575zf+d1zztWklPiPmOozt/U4SThjXIoyIQS4AJjSXO0lGGlvcXAm6Vzsz4xUhm0AIeX4QLig+C+ZpxbOG1wGhGYHr1zMUmZGWRgs0ha3PE1nX/8mWmdgWTzLB+DUYbhm9FfZ35IEyrhXA3VXJfPbsV8B9LQUIeUHYJ8ASobag1jcucNgW8g9W4reYSDi2YnnZDoDiwCokDANct6NwTB0LEdj0HRA/wxa2SN25JNBEdWluUhZ366gqmAaGvrCAXKOozccTGPgt8+vn8GYSGcgyTYp3dpBnBg42nbQPRBTo5bTvqYkmxL6AQhNTWQGBXY3B7BxlEBXozcW64dxRKoKUZBju+P06gl5WaaviMJBM3TNDlbypemIZgHYOnlwASsCmW7nHADGnBoQ3c76YmweJ9BR5zFYjsbRHwm4tmJg6PhWA7pCXXk+bu7fURHKweXtq/sWaksz7SC/CCGFrwtyZ3r+rCnFRZ7qr1qc6mLZj4f9OEyPL8lVpbX/PucPv5QPKHB1TdEAAAAASUVORK5CYII=") no-repeat scroll left bottom; clear:left; display:block; float:left; height:16px; margin-right:8px; padding-top:1px; overflow:hidden; padding-left:16px; width:0; text-decoration:none;}
|
html/*\*/>/*/*/body #menu p a[href*="&select="] {background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAHISURBVDjLpVPNK0RRFP+9D98syMwUspHkm9I0YkFZWBFKkZ0s7a3Ewh+ilChK7FgoZCJFKYlYKB8zk2+Z5t0P577He29kQU7dd+6575zf+d1zztWklPiPmOozt/U4SThjXIoyIQS4AJjSXO0lGGlvcXAm6Vzsz4xUhm0AIeX4QLig+C+ZpxbOG1wGhGYHr1zMUmZGWRgs0ha3PE1nX/8mWmdgWTzLB+DUYbhm9FfZ35IEyrhXA3VXJfPbsV8B9LQUIeUHYJ8ASobag1jcucNgW8g9W4reYSDi2YnnZDoDiwCokDANct6NwTB0LEdj0HRA/wxa2SN25JNBEdWluUhZ366gqmAaGvrCAXKOozccTGPgt8+vn8GYSGcgyTYp3dpBnBg42nbQPRBTo5bTvqYkmxL6AQhNTWQGBXY3B7BxlEBXozcW64dxRKoKUZBju+P06gl5WaaviMJBM3TNDlbypemIZgHYOnlwASsCmW7nHADGnBoQ3c76YmweJ9BR5zFYjsbRHwm4tmJg6PhWA7pCXXk+bu7fURHKweXtq/sWaksz7SC/CCGFrwtyZ3r+rCnFRZ7qr1qc6mLZj4f9OEyPL8lVpbX/PucPv5QPKHB1TdEAAAAASUVORK5CYII=") no-repeat scroll left bottom; clear:left; display:block; float:left; height:16px; margin-right:8px; padding-top:1px; overflow:hidden; padding-left:16px; width:0; text-decoration:none;}
|
||||||
|
|
||||||
html/*\*/>/*/*/body #menu li a[href*="&table="], html/*\*/>/*/*/body #menu li a[href*="&view="] {clear:right; margin-left:24px; display:block; height:17px; padding-bottom:1px; text-decoration:none;}
|
html/*\*/>/*/*/body #menu p a[href*="&table="], html/*\*/>/*/*/body #menu p a[href*="&view="] {clear:right; margin-left:24px; display:block; height:17px; padding-bottom:1px; text-decoration:none;}
|
||||||
|
|
||||||
html/*\*/>/*/*/body #menu p#tables br {display:none;}
|
html/*\*/>/*/*/body #menu p#tables br {display:none;}
|
||||||
|
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
A colourful, RTL-friendly theme.
|
A colourful RTL-friendly theme.
|
||||||
Update from https://github.com/lucas-sandery/adminer/raw/master/designs/lucas-sandery/adminer.css
|
Update from https://github.com/vrana/adminer/raw/master/designs/lucas-sandery/adminer.css
|
||||||
|
|
||||||
Icons from http://FlatIcon.com:
|
Icons from http://FlatIcon.com:
|
||||||
"Translation" by Freepik
|
"Translation" by Freepik
|
||||||
@@ -13,7 +13,7 @@ Icons from http://FlatIcon.com:
|
|||||||
"Forbidden Mark" by Pavel Kozlov
|
"Forbidden Mark" by Pavel Kozlov
|
||||||
"Search" by Freepik
|
"Search" by Freepik
|
||||||
|
|
||||||
Background adapted from "All Work and No Play", http://thenewcode.com/1008/SVG-Movie-Backgrounds-Andys-Room-and-Overlook-Hotel
|
Background from "All Work and No Play", http://thenewcode.com/1008/SVG-Movie-Backgrounds-Andys-Room-and-Overlook-Hotel
|
||||||
*/
|
*/
|
||||||
html {
|
html {
|
||||||
height: 100%;
|
height: 100%;
|
||||||
@@ -23,7 +23,6 @@ body {
|
|||||||
min-height: 100%;
|
min-height: 100%;
|
||||||
display: flex;
|
display: flex;
|
||||||
background: #41658a;
|
background: #41658a;
|
||||||
box-sizing: border-box;
|
|
||||||
}
|
}
|
||||||
p {
|
p {
|
||||||
margin-right: 0;
|
margin-right: 0;
|
||||||
@@ -134,9 +133,6 @@ thead a:visited:focus,
|
|||||||
.message p > a:visited:focus {
|
.message p > a:visited:focus {
|
||||||
color: #f39561;
|
color: #f39561;
|
||||||
}
|
}
|
||||||
pre {
|
|
||||||
overflow-x: auto;
|
|
||||||
}
|
|
||||||
code.jush-sql {
|
code.jush-sql {
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
padding: 0.3em 0.5em 0.2em;
|
padding: 0.3em 0.5em 0.2em;
|
||||||
@@ -168,11 +164,6 @@ th > code {
|
|||||||
.footer {
|
.footer {
|
||||||
background: #fff url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 340.6 491.8' width='56px' height='81px'%3E%3Cpolygon fill='%2370a37f' fill-opacity='0.05' points='229.9,208.7 170.5,243 111,208.7 111,140 170.5,105.7 229.9,140'/%3E%3Cpolygon fill='%2370a37f' fill-opacity='0.05' points='0,305.3 59.5,339.6 59.5,408.3 0,442.6'/%3E%3Cpolygon fill='%2370a37f' fill-opacity='0.05' points='342.8,442.6 283.3,408.3 283.3,339.6 342.8,305.3'/%3E%3Cpolygon fill='%2379b473' fill-opacity='0.05' points='91.6,0 0,52.9 0,0'/%3E%3Cpolygon fill='%2379b473' fill-opacity='0.05' points='340.6,0 340.6,52.9 248.8,0'/%3E%3Cpolygon fill='%2379b473' fill-opacity='0.05' points='21.4,264.6 102.8,311.6 102.8,431.7 -1.2,491.8 0,544.5 149.7,458.1 149.1,285.1 68.2,236.7 68.2,116.6 172.2,56.5 276.2,116.6 276.2,236.7 192.5,285 192.5,337.1 192.5,337.1 192.5,458.1 342.2,544.5 341,491.8 237,431.7 237,311.6 320.8,263.3 320.8,90.2 171.1,3.8 21.4,90.2'/%3E%3C/svg%3E") fixed;
|
background: #fff url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 340.6 491.8' width='56px' height='81px'%3E%3Cpolygon fill='%2370a37f' fill-opacity='0.05' points='229.9,208.7 170.5,243 111,208.7 111,140 170.5,105.7 229.9,140'/%3E%3Cpolygon fill='%2370a37f' fill-opacity='0.05' points='0,305.3 59.5,339.6 59.5,408.3 0,442.6'/%3E%3Cpolygon fill='%2370a37f' fill-opacity='0.05' points='342.8,442.6 283.3,408.3 283.3,339.6 342.8,305.3'/%3E%3Cpolygon fill='%2379b473' fill-opacity='0.05' points='91.6,0 0,52.9 0,0'/%3E%3Cpolygon fill='%2379b473' fill-opacity='0.05' points='340.6,0 340.6,52.9 248.8,0'/%3E%3Cpolygon fill='%2379b473' fill-opacity='0.05' points='21.4,264.6 102.8,311.6 102.8,431.7 -1.2,491.8 0,544.5 149.7,458.1 149.1,285.1 68.2,236.7 68.2,116.6 172.2,56.5 276.2,116.6 276.2,236.7 192.5,285 192.5,337.1 192.5,337.1 192.5,458.1 342.2,544.5 341,491.8 237,431.7 237,311.6 320.8,263.3 320.8,90.2 171.1,3.8 21.4,90.2'/%3E%3C/svg%3E") fixed;
|
||||||
}
|
}
|
||||||
@supports (-ms-ime-align: auto) {
|
|
||||||
.footer {
|
|
||||||
background: #fff;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.scrollable {
|
.scrollable {
|
||||||
overflow: auto;
|
overflow: auto;
|
||||||
}
|
}
|
||||||
@@ -211,7 +202,6 @@ h2 {
|
|||||||
padding: 2em 20px 0.5em;
|
padding: 2em 20px 0.5em;
|
||||||
border-bottom-style: none;
|
border-bottom-style: none;
|
||||||
color: #fff;
|
color: #fff;
|
||||||
overflow-wrap: break-word;
|
|
||||||
}
|
}
|
||||||
h1,
|
h1,
|
||||||
h2,
|
h2,
|
||||||
@@ -257,7 +247,7 @@ input.required {
|
|||||||
}
|
}
|
||||||
table {
|
table {
|
||||||
border-style: none;
|
border-style: none;
|
||||||
background: rgba(255, 255, 255, 0.6);
|
background: rgba(255, 255, 255, 0.8);
|
||||||
}
|
}
|
||||||
td,
|
td,
|
||||||
th {
|
th {
|
||||||
@@ -285,27 +275,20 @@ thead th,
|
|||||||
thead td {
|
thead td {
|
||||||
border-color: #fff;
|
border-color: #fff;
|
||||||
padding: 0.5em 0.8em 0.6em;
|
padding: 0.5em 0.8em 0.6em;
|
||||||
|
background: #414073;
|
||||||
color: #fff;
|
color: #fff;
|
||||||
}
|
}
|
||||||
thead th {
|
thead th {
|
||||||
text-align: left;
|
text-align: left;
|
||||||
font-weight: normal;
|
font-weight: normal;
|
||||||
}
|
}
|
||||||
.js .checkable thead .checked th,
|
|
||||||
thead th {
|
|
||||||
background: #414073;
|
|
||||||
position: relative;
|
|
||||||
background-clip: padding-box;
|
|
||||||
}
|
|
||||||
.rtl thead th {
|
.rtl thead th {
|
||||||
text-align: right;
|
text-align: right;
|
||||||
}
|
}
|
||||||
.js .checkable thead .checked td,
|
|
||||||
thead td {
|
thead td {
|
||||||
background: #41658a;
|
background: #41658a;
|
||||||
}
|
}
|
||||||
.js .column {
|
.js .column {
|
||||||
z-index: 1;
|
|
||||||
background: transparent;
|
background: transparent;
|
||||||
padding: 0;
|
padding: 0;
|
||||||
margin-top: 0;
|
margin-top: 0;
|
||||||
@@ -342,20 +325,20 @@ tbody tr:nth-child(n):hover td {
|
|||||||
tbody tr:nth-child(n):hover th {
|
tbody tr:nth-child(n):hover th {
|
||||||
background: rgba(236, 72, 18, 0.2);
|
background: rgba(236, 72, 18, 0.2);
|
||||||
}
|
}
|
||||||
.js .checkable tbody .checked td {
|
.js .checkable .checked td {
|
||||||
background: rgba(236, 72, 18, 0.25);
|
background: rgba(236, 72, 18, 0.25);
|
||||||
}
|
}
|
||||||
.js .checkable tbody .checked:nth-child(even) td,
|
.js .checkable .checked:nth-child(even) td,
|
||||||
.js .checkable tbody .checked th {
|
.js .checkable .checked th {
|
||||||
background: rgba(236, 72, 18, 0.3);
|
background: rgba(236, 72, 18, 0.3);
|
||||||
}
|
}
|
||||||
.js .checkable tbody .checked:nth-child(even) th {
|
.js .checkable .checked:nth-child(even) th {
|
||||||
background: rgba(236, 72, 18, 0.35);
|
background: rgba(236, 72, 18, 0.35);
|
||||||
}
|
}
|
||||||
.js .checkable tbody .checked:hover td {
|
.js .checkable .checked:hover td {
|
||||||
background: rgba(236, 72, 18, 0.4);
|
background: rgba(236, 72, 18, 0.4);
|
||||||
}
|
}
|
||||||
.js .checkable tbody .checked:hover th {
|
.js .checkable .checked:hover th {
|
||||||
background: rgba(236, 72, 18, 0.45);
|
background: rgba(236, 72, 18, 0.45);
|
||||||
}
|
}
|
||||||
.icon {
|
.icon {
|
||||||
@@ -385,9 +368,12 @@ tbody tr:nth-child(n):hover th {
|
|||||||
.column a[href="#fieldset-search"] {
|
.column a[href="#fieldset-search"] {
|
||||||
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' version='1.1' viewBox='0 0 310.088 310.088' enable-background='new 0 0 310.088 310.088' width='512px' height='512px'%3E%3Cg%3E%3Cpath d='m299.85,250.413l-62.808-62.808c-3.982-3.982-10.437-3.982-14.418,0l-3.539,3.539-18.586-18.586c29.709-42.872 25.472-102.152-12.716-140.34-42.958-42.958-112.606-42.958-155.563,0s-42.958,112.606 0,155.563c38.189,38.188 97.468,42.425 140.34,12.716l18.586,18.586-3.539,3.539c-3.982,3.981-3.982,10.437 0,14.418l62.808,62.808c13.651,13.651 35.785,13.651 49.436,0s13.65-35.784-0.001-49.435zm-251.368-78.895c-33.921-33.921-33.921-89.115-0.001-123.036 33.922-33.921 89.117-33.922 123.037-0.001v0.001c33.922,33.921 33.922,89.115 0,123.036-16.96,16.961-39.239,25.441-61.518,25.441-22.279,0-44.558-8.48-61.518-25.441z' fill='%23FFFFFF'/%3E%3C/g%3E%3C/svg%3E");
|
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' version='1.1' viewBox='0 0 310.088 310.088' enable-background='new 0 0 310.088 310.088' width='512px' height='512px'%3E%3Cg%3E%3Cpath d='m299.85,250.413l-62.808-62.808c-3.982-3.982-10.437-3.982-14.418,0l-3.539,3.539-18.586-18.586c29.709-42.872 25.472-102.152-12.716-140.34-42.958-42.958-112.606-42.958-155.563,0s-42.958,112.606 0,155.563c38.189,38.188 97.468,42.425 140.34,12.716l18.586,18.586-3.539,3.539c-3.982,3.981-3.982,10.437 0,14.418l62.808,62.808c13.651,13.651 35.785,13.651 49.436,0s13.65-35.784-0.001-49.435zm-251.368-78.895c-33.921-33.921-33.921-89.115-0.001-123.036 33.922-33.921 89.117-33.922 123.037-0.001v0.001c33.922,33.921 33.922,89.115 0,123.036-16.96,16.961-39.239,25.441-61.518,25.441-22.279,0-44.558-8.48-61.518-25.441z' fill='%23FFFFFF'/%3E%3C/g%3E%3C/svg%3E");
|
||||||
}
|
}
|
||||||
.loadmore,
|
.loadmore {
|
||||||
|
margin-right: -0.4em;
|
||||||
|
}
|
||||||
.rtl .loadmore {
|
.rtl .loadmore {
|
||||||
margin: 0;
|
margin-right: 0;
|
||||||
|
margin-left: -0.4em;
|
||||||
}
|
}
|
||||||
.footer {
|
.footer {
|
||||||
margin: 0;
|
margin: 0;
|
||||||
@@ -400,9 +386,6 @@ tbody tr:nth-child(n):hover th {
|
|||||||
background: transparent;
|
background: transparent;
|
||||||
padding: 0;
|
padding: 0;
|
||||||
}
|
}
|
||||||
.footer ~ div {
|
|
||||||
margin-top: 0.8em;
|
|
||||||
}
|
|
||||||
#lang,
|
#lang,
|
||||||
.logout {
|
.logout {
|
||||||
z-index: 3;
|
z-index: 3;
|
||||||
@@ -411,7 +394,6 @@ tbody tr:nth-child(n):hover th {
|
|||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
width: 2em;
|
width: 2em;
|
||||||
height: 2em;
|
height: 2em;
|
||||||
position: fixed;
|
|
||||||
}
|
}
|
||||||
#lang {
|
#lang {
|
||||||
left: 18em;
|
left: 18em;
|
||||||
@@ -421,6 +403,8 @@ tbody tr:nth-child(n):hover th {
|
|||||||
}
|
}
|
||||||
.rtl .logout {
|
.rtl .logout {
|
||||||
margin: 0;
|
margin: 0;
|
||||||
|
left: 0;
|
||||||
|
right: auto;
|
||||||
}
|
}
|
||||||
#lang select,
|
#lang select,
|
||||||
#logout {
|
#logout {
|
||||||
@@ -433,8 +417,8 @@ tbody tr:nth-child(n):hover th {
|
|||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
z-index: 1;
|
z-index: 1;
|
||||||
}
|
}
|
||||||
#lang:before,
|
#lang:after,
|
||||||
.logout:before {
|
.logout:after {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
top: 0;
|
top: 0;
|
||||||
left: 0;
|
left: 0;
|
||||||
@@ -446,16 +430,15 @@ tbody tr:nth-child(n):hover th {
|
|||||||
background: #2d3047 center no-repeat;
|
background: #2d3047 center no-repeat;
|
||||||
background-size: 70%;
|
background-size: 70%;
|
||||||
}
|
}
|
||||||
#lang:before {
|
#lang:after {
|
||||||
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' version='1.1' viewBox='0 0 470 470' enable-background='new 0 0 470 470' width='512px' height='512px'%3E%3Cg%3E%3Cpath d='m432.5,227.5h-77.031c-0.611-37.438-5.782-73.616-14.771-105.694h50.518c4.143,0 7.5-3.357 7.5-7.5s-3.357-7.5-7.5-7.5h-55.112c-8.018-24.165-18.316-45.521-30.553-62.656-2.408-3.371-7.093-4.153-10.462-1.745-3.371,2.407-4.152,7.092-1.745,10.462 10.618,14.868 19.688,33.199 26.965,53.939h-77.809v-69.306c0-4.143-3.357-7.5-7.5-7.5s-7.5,3.357-7.5,7.5v69.306h-77.81c7.277-20.74 16.347-39.071 26.965-53.939 2.407-3.37 1.626-8.055-1.745-10.462-3.372-2.407-8.055-1.625-10.462,1.745-12.237,17.135-22.535,38.492-30.553,62.656h-55.112c-4.143,0-7.5,3.357-7.5,7.5s3.357,7.5 7.5,7.5h50.518c-8.988,32.078-14.159,68.256-14.771,105.694h-77.03c-4.143,0-7.5,3.357-7.5,7.5s3.357,7.5 7.5,7.5h77.031c0.611,37.438 5.782,73.616 14.771,105.694h-50.519c-4.143,0-7.5,3.357-7.5,7.5s3.357,7.5 7.5,7.5h55.112c8.019,24.169 18.32,45.529 30.56,62.666 1.464,2.049 3.77,3.142 6.11,3.142 1.508,0 3.031-0.454 4.353-1.397 3.37-2.408 4.151-7.092 1.744-10.463-10.621-14.869-19.693-33.204-26.972-53.947h77.81v69.305c0,4.143 3.357,7.5 7.5,7.5s7.5-3.357 7.5-7.5v-69.306h77.81c-7.278,20.744-16.351,39.078-26.972,53.947-2.407,3.371-1.626,8.055 1.744,10.463 1.321,0.943 2.844,1.397 4.353,1.397 2.341,0 4.646-1.093 6.11-3.142 12.24-17.137 22.54-38.497 30.56-62.666h55.112c4.143,0 7.5-3.357 7.5-7.5s-3.357-7.5-7.5-7.5h-50.519c8.989-32.078 14.16-68.256 14.771-105.694h77.031c4.143,0 7.5-3.357 7.5-7.5s-3.357-7.499-7.5-7.499zm-107.36-105.694c9.313,31.683 14.695,67.958 15.326,105.694h-97.966v-105.694h82.64zm-180.28,0h82.64v105.694h-97.966c0.632-37.737 6.013-74.011 15.326-105.694zm0,226.388c-9.313-31.683-14.695-67.958-15.326-105.694h97.966v105.694h-82.64zm180.28,0h-82.64v-105.694h97.966c-0.632,37.737-6.013,74.012-15.326,105.694z' fill='%23ECEBE4'/%3E%3Cpath d='M401.17,68.83C356.784,24.444,297.771,0,235,0S113.216,24.444,68.83,68.83S0,172.229,0,235.001 c0,46.271,13.391,90.899,38.764,129.316l-28.718,86.148c-0.898,2.695-0.197,5.667,1.812,7.676c2.009,2.008,4.979,2.708,7.676,1.812 l86.15-28.716C144.102,456.609,188.729,470,235,470c62.771,0,121.784-24.444,166.17-68.83S470,297.771,470,235.001 C470,172.229,445.556,113.216,401.17,68.83z M235,455c-44.491,0-87.355-13.222-123.961-38.235 c-1.262-0.862-2.739-1.308-4.231-1.308c-0.797,0-1.598,0.127-2.372,0.385L29.02,440.979l25.14-75.414 c0.741-2.225,0.399-4.668-0.923-6.604C28.222,322.357,15,279.492,15,235.001C15,113.692,113.691,15,235,15s220,98.692,220,220.001 C455,356.309,356.309,455,235,455z' fill='%23ECEBE4'/%3E%3C/g%3E%3C/svg%3E");
|
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' version='1.1' viewBox='0 0 470 470' enable-background='new 0 0 470 470' width='512px' height='512px'%3E%3Cg%3E%3Cpath d='m432.5,227.5h-77.031c-0.611-37.438-5.782-73.616-14.771-105.694h50.518c4.143,0 7.5-3.357 7.5-7.5s-3.357-7.5-7.5-7.5h-55.112c-8.018-24.165-18.316-45.521-30.553-62.656-2.408-3.371-7.093-4.153-10.462-1.745-3.371,2.407-4.152,7.092-1.745,10.462 10.618,14.868 19.688,33.199 26.965,53.939h-77.809v-69.306c0-4.143-3.357-7.5-7.5-7.5s-7.5,3.357-7.5,7.5v69.306h-77.81c7.277-20.74 16.347-39.071 26.965-53.939 2.407-3.37 1.626-8.055-1.745-10.462-3.372-2.407-8.055-1.625-10.462,1.745-12.237,17.135-22.535,38.492-30.553,62.656h-55.112c-4.143,0-7.5,3.357-7.5,7.5s3.357,7.5 7.5,7.5h50.518c-8.988,32.078-14.159,68.256-14.771,105.694h-77.03c-4.143,0-7.5,3.357-7.5,7.5s3.357,7.5 7.5,7.5h77.031c0.611,37.438 5.782,73.616 14.771,105.694h-50.519c-4.143,0-7.5,3.357-7.5,7.5s3.357,7.5 7.5,7.5h55.112c8.019,24.169 18.32,45.529 30.56,62.666 1.464,2.049 3.77,3.142 6.11,3.142 1.508,0 3.031-0.454 4.353-1.397 3.37-2.408 4.151-7.092 1.744-10.463-10.621-14.869-19.693-33.204-26.972-53.947h77.81v69.305c0,4.143 3.357,7.5 7.5,7.5s7.5-3.357 7.5-7.5v-69.306h77.81c-7.278,20.744-16.351,39.078-26.972,53.947-2.407,3.371-1.626,8.055 1.744,10.463 1.321,0.943 2.844,1.397 4.353,1.397 2.341,0 4.646-1.093 6.11-3.142 12.24-17.137 22.54-38.497 30.56-62.666h55.112c4.143,0 7.5-3.357 7.5-7.5s-3.357-7.5-7.5-7.5h-50.519c8.989-32.078 14.16-68.256 14.771-105.694h77.031c4.143,0 7.5-3.357 7.5-7.5s-3.357-7.499-7.5-7.499zm-107.36-105.694c9.313,31.683 14.695,67.958 15.326,105.694h-97.966v-105.694h82.64zm-180.28,0h82.64v105.694h-97.966c0.632-37.737 6.013-74.011 15.326-105.694zm0,226.388c-9.313-31.683-14.695-67.958-15.326-105.694h97.966v105.694h-82.64zm180.28,0h-82.64v-105.694h97.966c-0.632,37.737-6.013,74.012-15.326,105.694z' fill='%23ECEBE4'/%3E%3Cpath d='M401.17,68.83C356.784,24.444,297.771,0,235,0S113.216,24.444,68.83,68.83S0,172.229,0,235.001 c0,46.271,13.391,90.899,38.764,129.316l-28.718,86.148c-0.898,2.695-0.197,5.667,1.812,7.676c2.009,2.008,4.979,2.708,7.676,1.812 l86.15-28.716C144.102,456.609,188.729,470,235,470c62.771,0,121.784-24.444,166.17-68.83S470,297.771,470,235.001 C470,172.229,445.556,113.216,401.17,68.83z M235,455c-44.491,0-87.355-13.222-123.961-38.235 c-1.262-0.862-2.739-1.308-4.231-1.308c-0.797,0-1.598,0.127-2.372,0.385L29.02,440.979l25.14-75.414 c0.741-2.225,0.399-4.668-0.923-6.604C28.222,322.357,15,279.492,15,235.001C15,113.692,113.691,15,235,15s220,98.692,220,220.001 C455,356.309,356.309,455,235,455z' fill='%23ECEBE4'/%3E%3C/g%3E%3C/svg%3E");
|
||||||
}
|
}
|
||||||
.logout:before {
|
.logout:after {
|
||||||
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' version='1.1' viewBox='0 0 512 512' enable-background='new 0 0 512 512' width='512px' height='512px'%3E%3Cg%3E%3Cpath d='m256,501c-129.6,0-235-102.2-235-227.8 0-87.8 50.6-166.3 132.1-204.9 10.2-4.8 22.4-0.5 27.2,9.7 4.8,10.2 0.5,22.4-9.7,27.2-67.1,31.8-108.7,96.1-108.7,168-7.10543e-15,103.1 87.1,187 194.1,187 107,0 194.1-83.9 194.1-187 0-72.4-44-138.9-112.2-169.5-10.3-4.6-14.9-16.7-10.3-27 4.6-10.3 16.7-14.9 27-10.2 82.9,37.1 136.4,118.3 136.4,206.7 0,125.6-105.4,227.8-235,227.8z' fill='%23FFFFFF'/%3E%3Cpath d='m256,287.9c-11.3,0-20.4-9.1-20.4-20.4v-236.1c0-11.3 9.2-20.4 20.4-20.4 11.3,0 20.4,9.1 20.4,20.4v236.1c0,11.3-9.1,20.4-20.4,20.4z' fill='%23FFFFFF'/%3E%3C/g%3E%3C/svg%3E");
|
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' version='1.1' viewBox='0 0 512 512' enable-background='new 0 0 512 512' width='512px' height='512px'%3E%3Cg%3E%3Cpath d='m256,501c-129.6,0-235-102.2-235-227.8 0-87.8 50.6-166.3 132.1-204.9 10.2-4.8 22.4-0.5 27.2,9.7 4.8,10.2 0.5,22.4-9.7,27.2-67.1,31.8-108.7,96.1-108.7,168-7.10543e-15,103.1 87.1,187 194.1,187 107,0 194.1-83.9 194.1-187 0-72.4-44-138.9-112.2-169.5-10.3-4.6-14.9-16.7-10.3-27 4.6-10.3 16.7-14.9 27-10.2 82.9,37.1 136.4,118.3 136.4,206.7 0,125.6-105.4,227.8-235,227.8z' fill='%23FFFFFF'/%3E%3Cpath d='m256,287.9c-11.3,0-20.4-9.1-20.4-20.4v-236.1c0-11.3 9.2-20.4 20.4-20.4 11.3,0 20.4,9.1 20.4,20.4v236.1c0,11.3-9.1,20.4-20.4,20.4z' fill='%23FFFFFF'/%3E%3C/g%3E%3C/svg%3E");
|
||||||
}
|
}
|
||||||
#lang:focus-within:before,
|
/* need a real element for :focus ~ styling */
|
||||||
#lang:hover:before,
|
#lang:hover:after,
|
||||||
.logout:focus-within:before,
|
.logout:hover:after {
|
||||||
.logout:hover:before {
|
|
||||||
background-color: #ec5f12;
|
background-color: #ec5f12;
|
||||||
}
|
}
|
||||||
#menu {
|
#menu {
|
||||||
@@ -464,7 +447,6 @@ tbody tr:nth-child(n):hover th {
|
|||||||
width: auto;
|
width: auto;
|
||||||
flex: 0 0 20em;
|
flex: 0 0 20em;
|
||||||
max-width: 20em;
|
max-width: 20em;
|
||||||
z-index: 1;
|
|
||||||
}
|
}
|
||||||
h1 {
|
h1 {
|
||||||
background: #414073;
|
background: #414073;
|
||||||
@@ -544,70 +526,6 @@ button:disabled {
|
|||||||
background-color: rgba(76, 57, 87, 0.35);
|
background-color: rgba(76, 57, 87, 0.35);
|
||||||
cursor: not-allowed;
|
cursor: not-allowed;
|
||||||
}
|
}
|
||||||
input[type="file"]::-ms-browse {
|
|
||||||
display: inline-block;
|
|
||||||
font-size: 85%;
|
|
||||||
text-align: center;
|
|
||||||
background: #4c3957;
|
|
||||||
color: #fff;
|
|
||||||
padding: 0.5em 0.8em 0.6em;
|
|
||||||
margin: 0;
|
|
||||||
border-style: none;
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
input[type="file"]:hover::-ms-browse,
|
|
||||||
input[type="file"]:focus::-ms-browse {
|
|
||||||
color: #fff;
|
|
||||||
background: #ec5f12;
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
input[type="file"]:disabled::-ms-browse {
|
|
||||||
background-color: rgba(76, 57, 87, 0.35);
|
|
||||||
cursor: not-allowed;
|
|
||||||
}
|
|
||||||
input[type="file"]::-webkit-file-upload-button {
|
|
||||||
-webkit-appearance: none;
|
|
||||||
display: inline-block;
|
|
||||||
font-size: 85%;
|
|
||||||
text-align: center;
|
|
||||||
background: #4c3957;
|
|
||||||
color: #fff;
|
|
||||||
padding: 0.5em 0.8em 0.6em;
|
|
||||||
margin: 0;
|
|
||||||
border-style: none;
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
input[type="file"]:hover::-webkit-file-upload-button,
|
|
||||||
input[type="file"]:focus::-webkit-file-upload-button {
|
|
||||||
color: #fff;
|
|
||||||
background: #ec5f12;
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
input[type="file"]:disabled::-webkit-file-upload-button {
|
|
||||||
background-color: rgba(76, 57, 87, 0.35);
|
|
||||||
cursor: not-allowed;
|
|
||||||
}
|
|
||||||
input[type="file"]::-moz-file-upload-button {
|
|
||||||
display: inline-block;
|
|
||||||
font-size: 85%;
|
|
||||||
text-align: center;
|
|
||||||
background: #4c3957;
|
|
||||||
color: #fff;
|
|
||||||
padding: 0.5em 0.8em 0.6em;
|
|
||||||
margin: 0;
|
|
||||||
border-style: none;
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
input[type="file"]:hover::-moz-file-upload-button,
|
|
||||||
input[type="file"]:focus::-moz-file-upload-button {
|
|
||||||
color: #fff;
|
|
||||||
background: #ec5f12;
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
input[type="file"]:disabled::-moz-file-upload-button {
|
|
||||||
background-color: rgba(76, 57, 87, 0.35);
|
|
||||||
cursor: not-allowed;
|
|
||||||
}
|
|
||||||
.links .active {
|
.links .active {
|
||||||
font-weight: normal;
|
font-weight: normal;
|
||||||
background-color: #414073;
|
background-color: #414073;
|
||||||
@@ -761,9 +679,6 @@ input[type="file"]:disabled::-moz-file-upload-button {
|
|||||||
-o-box-decoration-break: clone;
|
-o-box-decoration-break: clone;
|
||||||
box-decoration-break: clone;
|
box-decoration-break: clone;
|
||||||
}
|
}
|
||||||
.logout {
|
|
||||||
position: absolute;
|
|
||||||
}
|
|
||||||
#lang {
|
#lang {
|
||||||
margin-left: auto;
|
margin-left: auto;
|
||||||
position: relative;
|
position: relative;
|
||||||
|
Submodule designs/pepa-linha-dark deleted from 81eb3c4870
@@ -341,7 +341,6 @@ ORDER BY ORDINAL_POSITION", null, "") as $row) { //! requires MySQL 5
|
|||||||
}
|
}
|
||||||
|
|
||||||
function selectSearchProcess($fields, $indexes) {
|
function selectSearchProcess($fields, $indexes) {
|
||||||
global $driver;
|
|
||||||
$return = array();
|
$return = array();
|
||||||
foreach ((array) $_GET["where"] as $key => $where) {
|
foreach ((array) $_GET["where"] as $key => $where) {
|
||||||
$col = $where["col"];
|
$col = $where["col"];
|
||||||
@@ -357,11 +356,11 @@ ORDER BY ORDINAL_POSITION", null, "") as $row) { //! requires MySQL 5
|
|||||||
} else {
|
} else {
|
||||||
$text_type = preg_match('~char|text|enum|set~', $field["type"]);
|
$text_type = preg_match('~char|text|enum|set~', $field["type"]);
|
||||||
$value = $this->processInput($field, (!$op && $text_type && preg_match('~^[^%]+$~', $val) ? "%$val%" : $val));
|
$value = $this->processInput($field, (!$op && $text_type && preg_match('~^[^%]+$~', $val) ? "%$val%" : $val));
|
||||||
$conds[] = $driver->convertSearch($name, $val, $field) . ($value == "NULL" ? " IS" . ($op == ">=" ? " NOT" : "") . " $value"
|
$conds[] = $name . ($value == "NULL" ? " IS" . ($op == ">=" ? " NOT" : "") . " $value"
|
||||||
: (in_array($op, $this->operators) || $op == "=" ? " $op $value"
|
: (in_array($op, $this->operators) || $op == "=" ? " $op $value"
|
||||||
: ($text_type ? " LIKE $value"
|
: ($text_type ? " LIKE $value"
|
||||||
: " IN (" . str_replace(",", "', '", $value) . ")"
|
: " IN (" . str_replace(",", "', '", $value) . ")"
|
||||||
)));
|
))); //! can issue "Illegal mix of collations" for columns in other character sets - solve by CONVERT($name using utf8)
|
||||||
if ($key < 0 && $val == "0") {
|
if ($key < 0 && $val == "0") {
|
||||||
$conds[] = "$name IS NULL";
|
$conds[] = "$name IS NULL";
|
||||||
}
|
}
|
||||||
@@ -452,9 +451,6 @@ ORDER BY ORDINAL_POSITION", null, "") as $row) { //! requires MySQL 5
|
|||||||
return " <span class='time'>" . @date("H:i:s") . "</span><!--\n" . str_replace("--", "--><!-- ", $query) . "\n" . ($time ? "($time)\n" : "") . "-->";
|
return " <span class='time'>" . @date("H:i:s") . "</span><!--\n" . str_replace("--", "--><!-- ", $query) . "\n" . ($time ? "($time)\n" : "") . "-->";
|
||||||
}
|
}
|
||||||
|
|
||||||
function editRowPrint($table, $fields, $row, $update) {
|
|
||||||
}
|
|
||||||
|
|
||||||
function editFunctions($field) {
|
function editFunctions($field) {
|
||||||
$return = array();
|
$return = array();
|
||||||
if ($field["null"] && preg_match('~blob~', $field["type"])) {
|
if ($field["null"] && preg_match('~blob~', $field["type"])) {
|
||||||
@@ -658,3 +654,5 @@ qsl('div').onclick = whisperClick;", "")
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$adminer = (function_exists('adminer_object') ? adminer_object() : new Adminer);
|
||||||
|
2
externals/jush
vendored
2
externals/jush
vendored
Submodule externals/jush updated: ae33623c66...275c9cc888
@@ -1,11 +0,0 @@
|
|||||||
Enable drivers in this directory like this:
|
|
||||||
|
|
||||||
<?php
|
|
||||||
function adminer_object() {
|
|
||||||
include "./plugins/drivers/simpledb.php"; // the driver is enabled just by including
|
|
||||||
return new Adminer; // or return AdminerPlugin if you want to use other plugins
|
|
||||||
}
|
|
||||||
|
|
||||||
// include original Adminer
|
|
||||||
include "./adminer.php";
|
|
||||||
?>
|
|
@@ -29,7 +29,7 @@ class AdminerLoginIp {
|
|||||||
}
|
}
|
||||||
if ($_SERVER["HTTP_X_FORWARDED_FOR"]) {
|
if ($_SERVER["HTTP_X_FORWARDED_FOR"]) {
|
||||||
foreach ($this->forwarded_for as $forwarded_for) {
|
foreach ($this->forwarded_for as $forwarded_for) {
|
||||||
if (strncasecmp(preg_replace('~.*, *~', '', $_SERVER["HTTP_X_FORWARDED_FOR"]), $forwarded_for, strlen($forwarded_for)) == 0) {
|
if (strncasecmp(preg_replace('~.*, *~', '', $_SERVER["HTTP_X_FORWARDED_FOR"]), $forwarded_for, strlen($forwarded_for))) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/** Require One-Time Password at login
|
/** Require One-Time Password at login
|
||||||
* You can generate the secret and install it into Google Authenticator e.g. with https://github.com/sonata-project/GoogleAuthenticator or https://php.vrana.cz/jednorazove-heslo.php
|
* You can generate the secret and install it into Google Authenticator e.g. with https://github.com/sonata-project/GoogleAuthenticator
|
||||||
* @link https://www.adminer.org/plugins/#use
|
* @link https://www.adminer.org/plugins/#use
|
||||||
* @author Jakub Vrana, https://www.vrana.cz/
|
* @author Jakub Vrana, https://www.vrana.cz/
|
||||||
* @license https://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
|
* @license https://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
|
||||||
|
@@ -83,9 +83,6 @@ class AdminerPlugin extends Adminer {
|
|||||||
return $this->_appendPlugin(__FUNCTION__, $args);
|
return $this->_appendPlugin(__FUNCTION__, $args);
|
||||||
}
|
}
|
||||||
|
|
||||||
function editRowPrint($table, $fields, $row, $update) {
|
|
||||||
}
|
|
||||||
|
|
||||||
function editFunctions($field) {
|
function editFunctions($field) {
|
||||||
$args = func_get_args();
|
$args = func_get_args();
|
||||||
return $this->_appendPlugin(__FUNCTION__, $args);
|
return $this->_appendPlugin(__FUNCTION__, $args);
|
||||||
|
@@ -40,8 +40,8 @@ tinyMCE.init({
|
|||||||
|
|
||||||
function selectVal(&$val, $link, $field, $original) {
|
function selectVal(&$val, $link, $field, $original) {
|
||||||
if (preg_match("~_html~", $field["field"]) && $val != '') {
|
if (preg_match("~_html~", $field["field"]) && $val != '') {
|
||||||
$ellipsis = "<i>…</i>";
|
$ellipsis = "<i>…</i>";
|
||||||
$length = strlen($ellipsis);
|
$length = strlen($ellipsis);
|
||||||
$shortened = (substr($val, -$length) == $ellipsis);
|
$shortened = (substr($val, -$length) == $ellipsis);
|
||||||
if ($shortened) {
|
if ($shortened) {
|
||||||
$val = substr($val, 0, -$length);
|
$val = substr($val, 0, -$length);
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
||||||
<head>
|
<head>
|
||||||
<meta content="text/html; charset=UTF-8" http-equiv="content-type" />
|
<meta content="text/html; charset=UTF-8" http-equiv="content-type" />
|
||||||
@@ -150,7 +150,7 @@
|
|||||||
<td>50</td>
|
<td>50</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td>check</td>
|
<td>click</td>
|
||||||
<td>name=comments<datalist><option>name=comments</option></datalist></td>
|
<td>name=comments<datalist><option>name=comments</option></datalist></td>
|
||||||
<td></td>
|
<td></td>
|
||||||
</tr>
|
</tr>
|
||||||
@@ -383,7 +383,7 @@
|
|||||||
<td>50</td>
|
<td>50</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td>check</td>
|
<td>click</td>
|
||||||
<td>name=comments<datalist><option>name=comments</option></datalist></td>
|
<td>name=comments<datalist><option>name=comments</option></datalist></td>
|
||||||
<td></td>
|
<td></td>
|
||||||
</tr>
|
</tr>
|
||||||
@@ -420,7 +420,7 @@
|
|||||||
<tbody>
|
<tbody>
|
||||||
<tr>
|
<tr>
|
||||||
<td>open</td>
|
<td>open</td>
|
||||||
<td>/adminer/?username=ODBC&db=adminer_test&table=albums<datalist><option>/adminer/?username=ODBC&db=adminer_test&table=albums</option></datalist></td>
|
<td>/adminer/?username=ODBC&db=adminer_test&table=interprets<datalist><option>/adminer/?username=ODBC&db=adminer_test&table=interprets</option></datalist></td>
|
||||||
<td></td>
|
<td></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
@@ -485,7 +485,12 @@
|
|||||||
<td></td>
|
<td></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td>check</td>
|
<td>uncheck</td>
|
||||||
|
<td>name=defaults<datalist><option>name=defaults</option></datalist></td>
|
||||||
|
<td></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>click</td>
|
||||||
<td>name=defaults<datalist><option>name=defaults</option></datalist></td>
|
<td>name=defaults<datalist><option>name=defaults</option></datalist></td>
|
||||||
<td></td>
|
<td></td>
|
||||||
</tr>
|
</tr>
|
||||||
@@ -535,7 +540,6 @@
|
|||||||
<td>Trigger has been created.<datalist><option>Trigger has been created.</option></datalist></td>
|
<td>Trigger has been created.<datalist><option>Trigger has been created.</option></datalist></td>
|
||||||
<td></td>
|
<td></td>
|
||||||
</tr>
|
</tr>
|
||||||
</tr>
|
|
||||||
</tbody></table>
|
</tbody></table>
|
||||||
<table cellpadding="1" cellspacing="1" border="1">
|
<table cellpadding="1" cellspacing="1" border="1">
|
||||||
<thead>
|
<thead>
|
||||||
@@ -1233,7 +1237,7 @@ END</td>
|
|||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td>click</td>
|
<td>click</td>
|
||||||
<td>xpath=(//a[contains(text(),'=')])[1]<datalist><option>xpath=(//a[contains(text(),'=')])[1]</option></datalist></td>
|
<td>xpath=(//a[contains(text(),'=')])[3]<datalist><option>xpath=(//a[contains(text(),'=')])[3]</option></datalist></td>
|
||||||
<td></td>
|
<td></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
@@ -1251,9 +1255,14 @@ END</td>
|
|||||||
<td>link=Warnings<datalist><option>link=Warnings</option></datalist></td>
|
<td>link=Warnings<datalist><option>link=Warnings</option></datalist></td>
|
||||||
<td></td>
|
<td></td>
|
||||||
</tr>
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>click</td>
|
||||||
|
<td>//div[@id='warnings']/table/tbody/tr/td[3]<datalist><option>//div[@id='warnings']/table/tbody/tr/td[3]</option></datalist></td>
|
||||||
|
<td></td>
|
||||||
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td>verifyText</td>
|
<td>verifyText</td>
|
||||||
<td>//div[@id='warnings']/div/table/tbody/tr/td[3]<datalist><option>//div[@id='warnings']/div/table/tbody/tr/td[3]</option></datalist></td>
|
<td>//div[@id='warnings']/table/tbody/tr/td[3]<datalist><option>//div[@id='warnings']/table/tbody/tr/td[3]</option></datalist></td>
|
||||||
<td>Truncated incorrect DOUBLE value: '1.2.3'</td>
|
<td>Truncated incorrect DOUBLE value: '1.2.3'</td>
|
||||||
</tr>
|
</tr>
|
||||||
</tbody></table>
|
</tbody></table>
|
||||||
|
Reference in New Issue
Block a user