Respect PostgreSQL custom types
This commit is contained in:
parent
84d068df8b
commit
4780703d17
|
@ -25,27 +25,26 @@ if ($_POST && !$error && !$_POST["add"] && !$_POST["drop_col"] && !$_POST["up"]
|
||||||
$orig_field = reset($orig_fields);
|
$orig_field = reset($orig_fields);
|
||||||
$after = "FIRST";
|
$after = "FIRST";
|
||||||
foreach ($_POST["fields"] as $key => $field) {
|
foreach ($_POST["fields"] as $key => $field) {
|
||||||
$type_field = (isset($types[$field["type"]]) ? $field : $referencable_primary[$foreign_keys[$field["type"]]]);
|
$foreign_key = $foreign_keys[$field["type"]];
|
||||||
|
$type_field = (isset($foreign_key) ? $referencable_primary[$foreign_key] : $field); //! can collide with user defined type
|
||||||
if ($field["field"] != "") {
|
if ($field["field"] != "") {
|
||||||
if ($type_field) {
|
if (!$field["has_default"]) {
|
||||||
if (!$field["has_default"]) {
|
$field["default"] = null;
|
||||||
$field["default"] = null;
|
}
|
||||||
}
|
$default = eregi_replace(" *on update CURRENT_TIMESTAMP", "", $field["default"]);
|
||||||
$default = eregi_replace(" *on update CURRENT_TIMESTAMP", "", $field["default"]);
|
if ($default != $field["default"]) { // preg_replace $count is available since PHP 5.1.0
|
||||||
if ($default != $field["default"]) { // preg_replace $count is available since PHP 5.1.0
|
$field["on_update"] = "CURRENT_TIMESTAMP";
|
||||||
$field["on_update"] = "CURRENT_TIMESTAMP";
|
$field["default"] = $default;
|
||||||
$field["default"] = $default;
|
}
|
||||||
}
|
if ($key == $_POST["auto_increment_col"]) {
|
||||||
if ($key == $_POST["auto_increment_col"]) {
|
$field["auto_increment"] = true;
|
||||||
$field["auto_increment"] = true;
|
}
|
||||||
}
|
$process_field = process_field($field, $type_field);
|
||||||
$process_field = process_field($field, $type_field);
|
if ($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 (isset($foreign_key)) {
|
||||||
if (!isset($types[$field["type"]])) {
|
$foreign[] = ($TABLE != "" ? "ADD" : " ") . " FOREIGN KEY (" . idf_escape($field["field"]) . ") REFERENCES " . idf_escape($foreign_key) . " (" . idf_escape($type_field["field"]) . ")";
|
||||||
$foreign[] = ($TABLE != "" ? "ADD " : " ") . "FOREIGN KEY (" . idf_escape($field["field"]) . ") REFERENCES " . idf_escape($foreign_keys[$field["type"]]) . " (" . idf_escape($type_field["field"]) . ")";
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
$after = "AFTER " . idf_escape($field["field"]);
|
$after = "AFTER " . idf_escape($field["field"]);
|
||||||
} elseif ($field["orig"] != "") {
|
} elseif ($field["orig"] != "") {
|
||||||
|
|
|
@ -201,8 +201,8 @@ if (isset($_GET["pgsql"])) {
|
||||||
function table_status($name = "") {
|
function table_status($name = "") {
|
||||||
global $connection;
|
global $connection;
|
||||||
$return = array();
|
$return = array();
|
||||||
$result = $connection->query("SELECT relname AS \"Name\", CASE relkind WHEN 'r' THEN '' ELSE 'view' END AS \"Engine\", pg_relation_size(oid) AS \"Data_length\", pg_total_relation_size(oid) - pg_relation_size(oid) AS \"Index_length\", pg_catalog.obj_description(oid, 'pg_class') AS \"Comment\"
|
$result = $connection->query("SELECT relname AS \"Name\", CASE relkind WHEN 'r' THEN '' ELSE 'view' END AS \"Engine\", pg_relation_size(oid) AS \"Data_length\", pg_total_relation_size(oid) - pg_relation_size(oid) AS \"Index_length\", obj_description(oid, 'pg_class') AS \"Comment\"
|
||||||
FROM pg_catalog.pg_class
|
FROM pg_class
|
||||||
WHERE relkind IN ('r','v')
|
WHERE relkind IN ('r','v')
|
||||||
AND relnamespace = (SELECT oid FROM pg_namespace WHERE nspname = current_schema())"
|
AND relnamespace = (SELECT oid FROM pg_namespace WHERE nspname = current_schema())"
|
||||||
. ($name != "" ? " AND relname = " . $connection->quote($name) : "")
|
. ($name != "" ? " AND relname = " . $connection->quote($name) : "")
|
||||||
|
@ -220,24 +220,25 @@ AND relnamespace = (SELECT oid FROM pg_namespace WHERE nspname = current_schema(
|
||||||
function fields($table) {
|
function fields($table) {
|
||||||
global $connection;
|
global $connection;
|
||||||
$return = array();
|
$return = array();
|
||||||
$table_oid = $connection->result("SELECT oid FROM pg_class WHERE relname = " . $connection->quote($table));
|
$result = $connection->query("SELECT a.attname AS field, format_type(a.atttypid, a.atttypmod) AS full_type, d.adsrc AS default, a.attnotnull, col_description(c.oid, a.attnum) AS comment
|
||||||
$result = $connection->query("SELECT *, col_description($table_oid, ordinal_position) AS comment FROM information_schema.columns WHERE table_name = " . $connection->quote($table) . " ORDER BY ordinal_position");
|
FROM pg_class c
|
||||||
|
JOIN pg_namespace n ON c.relnamespace = n.oid
|
||||||
|
JOIN pg_attribute a ON c.oid = a.attrelid
|
||||||
|
LEFT JOIN pg_attrdef d ON c.oid = d.adrelid AND a.attnum = d.adnum
|
||||||
|
WHERE c.relname = " . $connection->quote($table) . "
|
||||||
|
AND n.nspname = current_schema()
|
||||||
|
AND a.attnum > 0
|
||||||
|
ORDER BY a.attnum");
|
||||||
if ($result) {
|
if ($result) {
|
||||||
while ($row = $result->fetch_assoc()) {
|
while ($row = $result->fetch_assoc()) {
|
||||||
$length = $row["character_maximum_length"];
|
//! collation, primary
|
||||||
$return[$row["column_name"]] = array(
|
ereg('(.*)(\\((.*)\\))?', $row["full_type"], $match);
|
||||||
"field" => $row["column_name"],
|
list(, $row["type"], , $row["length"]) = $match;
|
||||||
"full_type" => $row["data_type"] . ($length ? "($length)" : ""),
|
$row["full_type"] = $row["type"] . ($row["length"] ? "($row[length])" : "");
|
||||||
"type" => $row["data_type"],
|
$row["null"] = ($row["attnotnull"] == "f");
|
||||||
"length" => $length,
|
$row["auto_increment"] = eregi("^nextval\\(", $row["default"]);
|
||||||
"default" => $row["column_default"],
|
$row["privileges"] = array("insert" => 1, "select" => 1, "update" => 1);
|
||||||
"null" => ($row["is_nullable"] == "YES"),
|
$return[$row["field"]] = $row;
|
||||||
"auto_increment" => eregi("^nextval\\(", $row["column_default"]),
|
|
||||||
"collation" => $row["collation_name"],
|
|
||||||
"privileges" => array("insert" => 1, "select" => 1, "update" => 1), //! is_updatable
|
|
||||||
"primary" => false, //!
|
|
||||||
"comment" => $row["comment"],
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return $return;
|
return $return;
|
||||||
|
@ -478,7 +479,18 @@ WHERE tc.constraint_type = 'FOREIGN KEY' AND tc.table_name = " . $connection->qu
|
||||||
}
|
}
|
||||||
|
|
||||||
function set_schema($schema) {
|
function set_schema($schema) {
|
||||||
global $connection;
|
global $connection, $types, $structured_types;
|
||||||
|
foreach (get_vals("SELECT typname
|
||||||
|
FROM pg_type
|
||||||
|
WHERE typnamespace = (SELECT oid FROM pg_namespace WHERE nspname = " . $connection->quote($schema) . ")
|
||||||
|
AND typtype IN ('b','d','e')
|
||||||
|
AND typelem = 0"
|
||||||
|
) as $type) { //! get types from current_schemas('t')
|
||||||
|
if (!isset($types[$type])) {
|
||||||
|
$types[$type] = 0;
|
||||||
|
$structured_types[lang('User types')][] = $type;
|
||||||
|
}
|
||||||
|
}
|
||||||
return $connection->query("SET search_path TO " . idf_escape($schema));
|
return $connection->query("SET search_path TO " . idf_escape($schema));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -504,7 +516,7 @@ WHERE tc.constraint_type = 'FOREIGN KEY' AND tc.table_name = " . $connection->qu
|
||||||
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) {
|
) 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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -131,9 +131,10 @@ function process_length($length) {
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
function process_type($field, $collate = "COLLATE") {
|
function process_type($field, $collate = "COLLATE") {
|
||||||
global $connection, $unsigned;
|
global $types, $connection, $unsigned;
|
||||||
return " $field[type]"
|
$type = $field["type"];
|
||||||
. ($field["length"] != "" && !ereg('^date|time$', $field["type"]) ? "(" . process_length($field["length"]) . ")" : "")
|
return " " . (isset($types[$type]) ? $type : idf_escape($type))
|
||||||
|
. ($field["length"] != "" ? "(" . process_length($field["length"]) . ")" : "")
|
||||||
. (ereg('int|float|double|decimal', $field["type"]) && in_array($field["unsigned"], $unsigned) ? " $field[unsigned]" : "")
|
. (ereg('int|float|double|decimal', $field["type"]) && in_array($field["unsigned"], $unsigned) ? " $field[unsigned]" : "")
|
||||||
. (ereg('char|text|enum|set', $field["type"]) && $field["collation"] ? " $collate " . $connection->quote($field["collation"]) : "")
|
. (ereg('char|text|enum|set', $field["type"]) && $field["collation"] ? " $collate " . $connection->quote($field["collation"]) : "")
|
||||||
;
|
;
|
||||||
|
|
|
@ -250,5 +250,6 @@ $translations = array(
|
||||||
'Sequence has been created.' => 'Sekvence byla vytvořena.',
|
'Sequence has been created.' => 'Sekvence byla vytvořena.',
|
||||||
'Sequence has been altered.' => 'Sekvence byla změněna.',
|
'Sequence has been altered.' => 'Sekvence byla změněna.',
|
||||||
'Alter sequence' => 'Pozměnit sekvenci',
|
'Alter sequence' => 'Pozměnit sekvenci',
|
||||||
|
'User types' => 'Uživatelské typy',
|
||||||
'Search data in tables' => 'Vyhledat data v tabulkách',
|
'Search data in tables' => 'Vyhledat data v tabulkách',
|
||||||
);
|
);
|
||||||
|
|
|
@ -3,10 +3,12 @@ Drivers for MS SQL, SQLite, PostgreSQL, Oracle
|
||||||
Allow concurrent logins on the same server
|
Allow concurrent logins on the same server
|
||||||
Allow permanent login without customization
|
Allow permanent login without customization
|
||||||
In-place editation in select
|
In-place editation in select
|
||||||
|
Foreign key options in Table creation
|
||||||
Show number of tables in server overview
|
Show number of tables in server overview
|
||||||
Operator LIKE %%
|
Operator LIKE %%
|
||||||
Remember export parameters in cookie
|
Remember export parameters in cookie
|
||||||
Allow semicolon as CSV separator
|
Allow semicolon as CSV separator
|
||||||
|
Schema and sequences support (PostgreSQL)
|
||||||
Autofocus username in login form
|
Autofocus username in login form
|
||||||
Disable spellchecking in SQL textareas
|
Disable spellchecking in SQL textareas
|
||||||
Display auto_increment value of inserted item
|
Display auto_increment value of inserted item
|
||||||
|
|
1
todo.txt
1
todo.txt
|
@ -32,6 +32,7 @@ Delimiter in export and SQL command
|
||||||
Backward keys in Editor
|
Backward keys in Editor
|
||||||
|
|
||||||
PostgreSQL:
|
PostgreSQL:
|
||||||
|
user types
|
||||||
Users - SELECT * FROM pg_user
|
Users - SELECT * FROM pg_user
|
||||||
ORDER BY COUNT(*)
|
ORDER BY COUNT(*)
|
||||||
Export - http://www.postgresql.org/docs/8.4/static/functions-info.html
|
Export - http://www.postgresql.org/docs/8.4/static/functions-info.html
|
||||||
|
|
Loading…
Reference in a new issue