Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Newer
Older
100644 290 lines (277 sloc) 12.577 kb
a7096dd Separate editing functions
jakubvrana authored
1 <?php
471ae2b Move select function
jakubvrana authored
2 /** Print select result
3 * @param Min_Result
4 * @param Min_DB connection to examine indexes
5 * @return null
6 */
64d616c Rename get_dbh to connection
jakubvrana authored
7 function select($result, $connection2 = null) {
471ae2b Move select function
jakubvrana authored
8 if (!$result->num_rows) {
9 echo "<p class='message'>" . lang('No rows.') . "\n";
10 } else {
11 echo "<table cellspacing='0' class='nowrap'>\n";
12 $links = array(); // colno => orgtable - create links from these columns
13 $indexes = array(); // orgtable => array(column => colno) - primary keys
14 $columns = array(); // orgtable => array(column => ) - not selected columns in primary key
15 $blobs = array(); // colno => bool - display bytes for blobs
16 $types = array(); // colno => type - display char in <code>
17 odd(''); // reset odd for each result
18 for ($i=0; $row = $result->fetch_row(); $i++) {
19 if (!$i) {
20 echo "<thead><tr>";
21 for ($j=0; $j < count($row); $j++) {
22 $field = $result->fetch_field();
23 if (strlen($field->orgtable)) {
24 if (!isset($indexes[$field->orgtable])) {
25 // find primary key in each table
26 $indexes[$field->orgtable] = array();
64d616c Rename get_dbh to connection
jakubvrana authored
27 foreach (indexes($field->orgtable, $connection2) as $index) {
471ae2b Move select function
jakubvrana authored
28 if ($index["type"] == "PRIMARY") {
29 $indexes[$field->orgtable] = array_flip($index["columns"]);
30 break;
31 }
32 }
33 $columns[$field->orgtable] = $indexes[$field->orgtable];
34 }
35 if (isset($columns[$field->orgtable][$field->orgname])) {
36 unset($columns[$field->orgtable][$field->orgname]);
37 $indexes[$field->orgtable][$field->orgname] = $j;
38 $links[$j] = $field->orgtable;
39 }
40 }
41 if ($field->charsetnr == 63) {
42 $blobs[$j] = true;
43 }
44 $types[$j] = $field->type;
45 echo "<th>" . h($field->name);
46 }
47 echo "</thead>\n";
48 }
49 echo "<tr" . odd() . ">";
50 foreach ($row as $key => $val) {
51 if (!isset($val)) {
52 $val = "<i>NULL</i>";
53 } else {
54 if ($blobs[$key] && !is_utf8($val)) {
55 $val = "<i>" . lang('%d byte(s)', strlen($val)) . "</i>"; //! link to download
24801a0 Display whitespace in texts (bug #2858042)
jakubvrana authored
56 } elseif (!strlen($val)) {
471ae2b Move select function
jakubvrana authored
57 $val = "&nbsp;"; // some content to print a border
58 } else {
50881f8 Move whitespace to CSS
jakubvrana authored
59 $val = h($val);
471ae2b Move select function
jakubvrana authored
60 if ($types[$key] == 254) {
61 $val = "<code>$val</code>";
62 }
63 }
64 if (isset($links[$key]) && !$columns[$links[$key]]) {
65 $link = "edit=" . urlencode($links[$key]);
66 foreach ($indexes[$links[$key]] as $col => $j) {
67 $link .= "&where" . urlencode("[" . bracket_escape($col) . "]") . "=" . urlencode($row[$j]);
68 }
69 $val = "<a href='" . h(ME . $link) . "'>$val</a>";
70 }
71 }
72 echo "<td>$val";
73 }
74 }
75 echo "</table>\n";
76 }
77 }
78
ced9de9 Create single column foreign key in table structure
jakubvrana authored
79 function referencable_primary($self) {
80 $return = array(); // table_name => field
81 foreach (table_status_referencable() as $table_name => $table) {
82 if ($table_name != $self) {
83 foreach (fields($table_name) as $field) {
84 if ($field["primary"]) {
85 if ($return[$table_name]) { // multi column primary key
86 unset($return[$table_name]);
87 break;
88 }
89 $return[$table_name] = $field;
90 }
91 }
92 }
93 }
94 return $return;
95 }
96
97 function edit_type($key, $field, $collations, $foreign_keys = array()) {
26b07bf Separate types to groups in table creation
jakubvrana authored
98 global $structured_types, $unsigned, $inout;
f2813b5 Don't hide/show added/dropped columns (bug 1920167)
jakubvrana authored
99 ?>
0698409 Utilize html_select
jakubvrana authored
100 <td><select name="<?php echo $key; ?>[type]" class="type" onchange="editing_type_change(this);"><?php echo optionlist($structured_types + ($foreign_keys ? array(lang('Foreign keys') => $foreign_keys) : array()), $field["type"]); ?></select>
689699a Shortcut for htmlspecialchars
jakubvrana authored
101 <td><input name="<?php echo $key; ?>[length]" value="<?php echo h($field["length"]); ?>" size="3">
493eb6b Remove space
jakubvrana authored
102 <td><?php
5cac902 Work with default values
jakubvrana authored
103 echo "<select name='$key" . "[collation]'" . (ereg('(char|text|enum|set)$', $field["type"]) ? "" : " class='hidden'") . '><option value="">(' . lang('collation') . ')' . optionlist($collations, $field["collation"]) . '</select>';
104 echo ($unsigned ? " <select name='$key" . "[unsigned]'" . (!$field["type"] || ereg('(int|float|double|decimal)$', $field["type"]) ? "" : " class='hidden'") . '><option>' . optionlist($unsigned, $field["unsigned"]) . '</select>' : '');
a7096dd Separate editing functions
jakubvrana authored
105 }
106
f93c84e Function process_length used only in Adminer
jakubvrana authored
107 function process_length($length) {
108 global $enum_length;
109 return (preg_match("~^\\s*(?:$enum_length)(?:\\s*,\\s*(?:$enum_length))*\\s*\$~", $length) && preg_match_all("~$enum_length~", $length, $matches) ? implode(",", $matches[0]) : preg_replace('~[^0-9,+-]~', '', $length));
110 }
111
a3c969c Routines uses CHARACTER SET
jakubvrana authored
112 function process_type($field, $collate = "COLLATE") {
5cac902 Work with default values
jakubvrana authored
113 global $connection, $unsigned;
a7096dd Separate editing functions
jakubvrana authored
114 return " $field[type]"
5c862ba Allow char(0)
jakubvrana authored
115 . (strlen($field["length"]) && !ereg('^date|time$', $field["type"]) ? "(" . process_length($field["length"]) . ")" : "")
5abd943 Change simple preg_match to ereg
jakubvrana authored
116 . (ereg('int|float|double|decimal', $field["type"]) && in_array($field["unsigned"], $unsigned) ? " $field[unsigned]" : "")
64d616c Rename get_dbh to connection
jakubvrana authored
117 . (ereg('char|text|enum|set', $field["type"]) && $field["collation"] ? " $collate " . $connection->quote($field["collation"]) : "")
a7096dd Separate editing functions
jakubvrana authored
118 ;
119 }
120
2e680bc Speedup of simple alter table
jakubvrana authored
121 function process_field($field, $type_field) {
64d616c Rename get_dbh to connection
jakubvrana authored
122 global $connection;
2e680bc Speedup of simple alter table
jakubvrana authored
123 return idf_escape($field["field"]) . process_type($type_field)
124 . ($field["null"] ? " NULL" : " NOT NULL") // NULL for timestamp
5cac902 Work with default values
jakubvrana authored
125 . (!isset($field["default"]) ? "" : " DEFAULT " . ($field["type"] == "timestamp" && eregi("^CURRENT_TIMESTAMP$", $field["default"]) ? $field["default"] : $connection->quote($field["default"])))
126 . ($field["on_update"] ? " ON UPDATE $field[on_update]" : "")
64d616c Rename get_dbh to connection
jakubvrana authored
127 . " COMMENT " . $connection->quote($field["comment"])
2e680bc Speedup of simple alter table
jakubvrana authored
128 ;
129 }
130
3015aed Separate type_class
jakubvrana authored
131 function type_class($type) {
d144e9c Save bytes
jakubvrana authored
132 foreach (array(
133 'char' => 'text',
134 'date' => 'time|year',
135 'binary' => 'blob',
136 'enum' => 'set',
137 ) as $key => $val) {
c0c7ab3 Typo
jakubvrana authored
138 if (ereg("$key|$val", $type)) {
d144e9c Save bytes
jakubvrana authored
139 return " class='$key'";
140 }
3015aed Separate type_class
jakubvrana authored
141 }
142 }
143
ced9de9 Create single column foreign key in table structure
jakubvrana authored
144 function edit_fields($fields, $collations, $type = "TABLE", $allowed = 0, $foreign_keys = array()) {
d31d4e9 Emulate REQUEST_URI
jakubvrana authored
145 global $inout;
540e217 Separate JavaScript
jakubvrana authored
146 $column_comments = false;
147 foreach ($fields as $field) {
148 if (strlen($field["comment"])) {
149 $column_comments = true;
150 }
151 }
f2813b5 Don't hide/show added/dropped columns (bug 1920167)
jakubvrana authored
152 ?>
4e5b126 Highlight odd and hover rows
jakubvrana authored
153 <thead><tr>
b349612 Remove useless translations
jakubvrana authored
154 <?php if ($type == "PROCEDURE") { ?><td>&nbsp;<?php } ?>
ace55ed HTML instead of XHTML
jakubvrana authored
155 <th><?php echo ($type == "TABLE" ? lang('Column name') : lang('Parameter name')); ?>
156 <td><?php echo lang('Type'); ?>
157 <td><?php echo lang('Length'); ?>
158 <td><?php echo lang('Options'); ?>
a7096dd Separate editing functions
jakubvrana authored
159 <?php if ($type == "TABLE") { ?>
b349612 Remove useless translations
jakubvrana authored
160 <td>NULL
16ed399 Shorten Auto Increment to support 1024 width
jakubvrana authored
161 <td><input type="radio" name="auto_increment_col" value=""><acronym title="<?php echo lang('Auto Increment'); ?>">A_I</acronym>
4cead56 Edit default values directly in table creation
jakubvrana authored
162 <td class="hidden"><?php echo lang('Default values'); ?>
ace55ed HTML instead of XHTML
jakubvrana authored
163 <td<?php echo ($column_comments ? "" : " class='hidden'"); ?>><?php echo lang('Comment'); ?>
a7096dd Separate editing functions
jakubvrana authored
164 <?php } ?>
ab3c366 Separate static files
jakubvrana authored
165 <td><?php echo "<input type='image' name='add[0]' src='../adminer/static/plus.gif' alt='+' title='" . lang('Add next') . "'>"; ?><script type="text/javascript">row_count = <?php echo count($fields); ?>;</script>
ace55ed HTML instead of XHTML
jakubvrana authored
166 </thead>
a7096dd Separate editing functions
jakubvrana authored
167 <?php
93c27c9 Separate type_change()
jakubvrana authored
168 foreach ($fields as $i => $field) {
169 $i++;
3cd113f Procedures test
jakubvrana authored
170 $display = (isset($_POST["add"][$i-1]) || (isset($field["field"]) && !$_POST["drop_col"][$i]));
93c27c9 Separate type_change()
jakubvrana authored
171 ?>
a76c555 Remove odd() from create
jakubvrana authored
172 <tr<?php echo ($display ? "" : " style='display: none;'"); ?>>
0698409 Utilize html_select
jakubvrana authored
173 <?php
174 if ($type == "PROCEDURE") {
175 echo "<td>" . html_select("fields[$i][inout]", $inout, $field["inout"]);
176 }
177 ?>
689699a Shortcut for htmlspecialchars
jakubvrana authored
178 <th><?php if ($display) { ?><input name="fields[<?php echo $i; ?>][field]" value="<?php echo h($field["field"]); ?>" onchange="<?php echo (strlen($field["field"]) || count($fields) > 1 ? "" : "editing_add_row(this, $allowed); "); ?>editing_name_change(this);" maxlength="64"><?php } ?><input type="hidden" name="fields[<?php echo $i; ?>][orig]" value="<?php echo h($field[($_POST ? "orig" : "field")]); ?>">
ced9de9 Create single column foreign key in table structure
jakubvrana authored
179 <?php edit_type("fields[$i]", $field, $collations, $foreign_keys); ?>
a7096dd Separate editing functions
jakubvrana authored
180 <?php if ($type == "TABLE") { ?>
6b30cfa Separate checkbox
jakubvrana authored
181 <td><?php echo checkbox("fields[$i][null]", 1, $field["null"]); ?>
cb6d36c HTML instead of XHTML
jakubvrana authored
182 <td><input type="radio" name="auto_increment_col" value="<?php echo $i; ?>"<?php if ($field["auto_increment"]) { ?> checked<?php } ?>>
6b30cfa Separate checkbox
jakubvrana authored
183 <td class="nowrap hidden"><?php echo checkbox("fields[$i][has_default]", 1, $field["has_default"]); ?><input name="fields[<?php echo $i; ?>][default]" value="<?php echo h($field["default"]); ?>" onchange="this.previousSibling.checked = true;">
689699a Shortcut for htmlspecialchars
jakubvrana authored
184 <td<?php echo ($column_comments ? "" : " class='hidden'"); ?>><input name="fields[<?php echo $i; ?>][comment]" value="<?php echo h($field["comment"]); ?>" maxlength="255">
a7096dd Separate editing functions
jakubvrana authored
185 <?php } ?>
186 <?php
8ddbf43 Don't remove onchange after click on add
jakubvrana authored
187 echo "<td class='nowrap'><input type='image' name='add[$i]' src='../adminer/static/plus.gif' alt='+' title='" . lang('Add next') . "' onclick='return !editing_add_row(this, $allowed, 1);'>";
ab3c366 Separate static files
jakubvrana authored
188 echo "&nbsp;<input type='image' name='drop_col[$i]' src='../adminer/static/cross.gif' alt='x' title='" . lang('Remove') . "' onclick='return !editing_remove_row(this);'>";
189 echo "&nbsp;<input type='image' name='up[$i]' src='../adminer/static/up.gif' alt='^' title='" . lang('Move up') . "'>";
190 echo "&nbsp;<input type='image' name='down[$i]' src='../adminer/static/down.gif' alt='v' title='" . lang('Move down') . "'>";
50881f8 Move whitespace to CSS
jakubvrana authored
191 echo "\n";
a7096dd Separate editing functions
jakubvrana authored
192 }
93c27c9 Separate type_change()
jakubvrana authored
193 return $column_comments;
a7096dd Separate editing functions
jakubvrana authored
194 }
93c27c9 Separate type_change()
jakubvrana authored
195
fd8948f Order of columns in table
jakubvrana authored
196 function process_fields(&$fields) {
197 ksort($fields);
198 $offset = 0;
199 if ($_POST["up"]) {
200 $last = 0;
201 foreach ($fields as $key => $field) {
202 if (key($_POST["up"]) == $key) {
203 unset($fields[$key]);
204 array_splice($fields, $last, 0, array($field));
205 break;
206 }
207 if (isset($field["field"])) {
208 $last = $offset;
209 }
210 $offset++;
211 }
212 }
213 if ($_POST["down"]) {
214 $found = false;
215 foreach ($fields as $key => $field) {
216 if (isset($field["field"]) && $found) {
217 unset($fields[key($_POST["down"])]);
218 array_splice($fields, $offset, 0, array($found));
219 break;
220 }
221 if (key($_POST["down"]) == $key) {
222 $found = $field;
223 }
224 $offset++;
225 }
226 }
227 $fields = array_values($fields);
228 if ($_POST["add"]) {
229 array_splice($fields, key($_POST["add"]), 0, array(array()));
230 }
231 }
232
8060c5b Routines
jakubvrana authored
233 function normalize_enum($match) {
234 return "'" . str_replace("'", "''", addcslashes(stripcslashes(str_replace($match[0]{0} . $match[0]{0}, $match[0]{0}, substr($match[0], 1, -1))), '\\')) . "'";
235 }
236
a7096dd Separate editing functions
jakubvrana authored
237 function routine($name, $type) {
64d616c Rename get_dbh to connection
jakubvrana authored
238 global $connection, $enum_length, $inout, $types;
9fa3b9d Type aliases in routine
jakubvrana authored
239 $aliases = array("bit" => "tinyint", "bool" => "tinyint", "boolean" => "tinyint", "integer" => "int", "double precision" => "float", "real" => "float", "dec" => "decimal", "numeric" => "decimal", "fixed" => "decimal", "national char" => "char", "national varchar" => "varchar");
79c70ad Change regular expression (bug #2859386)
jakubvrana authored
240 $type_pattern = "(" . implode("|", array_keys($types + $aliases)) . ")(?:\\s*\\(((?:[^'\")]*|$enum_length)+)\\))?\\s*(zerofill\\s*)?(unsigned(?:\\s+zerofill)?)?(?:\\s*(?:CHARSET|CHARACTER\\s+SET)\\s*['\"]?([^'\"\\s]+)['\"]?)?";
26c9d64 Fix long SQL query crash (bug #2839231)
jakubvrana authored
241 $pattern = "\\s*(" . ($type == "FUNCTION" ? "" : implode("|", $inout)) . ")?\\s*(?:`((?:[^`]|``)*)`\\s*|\\b(\\S+)\\s+)$type_pattern";
64d616c Rename get_dbh to connection
jakubvrana authored
242 $create = $connection->result($connection->query("SHOW CREATE $type " . idf_escape($name)), 2);
8060c5b Routines
jakubvrana authored
243 preg_match("~\\(((?:$pattern\\s*,?)*)\\)" . ($type == "FUNCTION" ? "\\s*RETURNS\\s+$type_pattern" : "") . "\\s*(.*)~is", $create, $match);
a7096dd Separate editing functions
jakubvrana authored
244 $fields = array();
8060c5b Routines
jakubvrana authored
245 preg_match_all("~$pattern\\s*,?~is", $match[1], $matches, PREG_SET_ORDER);
2184679 Use field name in routine
jakubvrana authored
246 foreach ($matches as $param) {
247 $name = str_replace("``", "`", $param[2]) . $param[3];
9fa3b9d Type aliases in routine
jakubvrana authored
248 $data_type = strtolower($param[4]);
2184679 Use field name in routine
jakubvrana authored
249 $fields[$name] = array(
250 "field" => $name,
9fa3b9d Type aliases in routine
jakubvrana authored
251 "type" => (isset($aliases[$data_type]) ? $aliases[$data_type] : $data_type),
a7096dd Separate editing functions
jakubvrana authored
252 "length" => preg_replace_callback("~$enum_length~s", 'normalize_enum', $param[5]),
253 "unsigned" => strtolower(preg_replace('~\\s+~', ' ', trim("$param[7] $param[6]"))),
254 "inout" => strtoupper($param[1]),
8060c5b Routines
jakubvrana authored
255 "collation" => strtolower($param[8]),
a7096dd Separate editing functions
jakubvrana authored
256 );
257 }
258 if ($type != "FUNCTION") {
8060c5b Routines
jakubvrana authored
259 return array("fields" => $fields, "definition" => $match[10]);
a7096dd Separate editing functions
jakubvrana authored
260 }
8060c5b Routines
jakubvrana authored
261 $returns = array("type" => $match[10], "length" => $match[11], "unsigned" => $match[13], "collation" => $match[14]);
262 return array("fields" => $fields, "returns" => $returns, "definition" => $match[15]);
a7096dd Separate editing functions
jakubvrana authored
263 }
464d84a Define functions unconditionally
jakubvrana authored
264
265 function grant($grant, $privileges, $columns, $on) {
266 if (!$privileges) {
267 return true;
268 }
269 if ($privileges == array("ALL PRIVILEGES", "GRANT OPTION")) {
270 // can't be granted or revoked together
271 return ($grant == "GRANT"
272 ? queries("$grant ALL PRIVILEGES$on WITH GRANT OPTION")
273 : queries("$grant ALL PRIVILEGES$on") && queries("$grant GRANT OPTION$on")
274 );
275 }
276 return queries("$grant " . preg_replace('~(GRANT OPTION)\\([^)]*\\)~', '\\1', implode("$columns, ", $privileges) . $columns) . $on);
277 }
32d5b9c Inform about dropped routine, trigger and view
jakubvrana authored
278
279 function drop_create($drop, $create, $location, $message_drop, $message_alter, $message_create, $name) {
280 if ($_POST["drop"]) {
281 return query_redirect($drop, $location, $message_drop, true, !$_POST["dropped"]);
282 }
283 $dropped = strlen($name) && ($_POST["dropped"] || queries($drop));
284 $created = queries($create);
dbdd40a Introduce queries_redirect function
jakubvrana authored
285 if (!queries_redirect($location, (strlen($name) ? $message_alter : $message_create), $created) && $dropped) {
32d5b9c Inform about dropped routine, trigger and view
jakubvrana authored
286 $_SESSION["messages"][] = $message_drop;
287 }
288 return $dropped;
289 }
Something went wrong with that request. Please try again.