1 |
6daefa8c
|
Petr Lukašík
|
<?php
|
2 |
|
|
|
3 |
|
|
/**
|
4 |
|
|
* List tables in a database
|
5 |
|
|
*
|
6 |
|
|
* $Id: tblproperties.php,v 1.67 2005/10/18 03:45:16 chriskl Exp $
|
7 |
|
|
*/
|
8 |
|
|
|
9 |
|
|
// Include application functions
|
10 |
|
|
include_once('./libraries/lib.inc.php');
|
11 |
|
|
|
12 |
|
|
$action = (isset($_REQUEST['action'])) ? $_REQUEST['action'] : '';
|
13 |
|
|
$PHP_SELF = $_SERVER['PHP_SELF'];
|
14 |
|
|
|
15 |
|
|
/**
|
16 |
|
|
* Function to save after altering a table
|
17 |
|
|
*/
|
18 |
|
|
function doSaveAlter() {
|
19 |
|
|
global $data, $lang, $_reload_browser;
|
20 |
|
|
|
21 |
|
|
// For databases that don't allow owner change
|
22 |
|
|
if (!isset($_POST['owner'])) $_POST['owner'] = '';
|
23 |
|
|
// Default tablespace to null if it isn't set
|
24 |
|
|
if (!isset($_POST['tablespace'])) $_POST['tablespace'] = null;
|
25 |
|
|
|
26 |
|
|
$status = $data->alterTable($_POST['table'], $_POST['name'], $_POST['owner'], $_POST['comment'], $_POST['tablespace']);
|
27 |
|
|
if ($status == 0) {
|
28 |
|
|
// If table has been renamed, need to change to the new name and
|
29 |
|
|
// reload the browser frame.
|
30 |
|
|
if ($_POST['table'] != $_POST['name']) {
|
31 |
|
|
// Jump them to the new table name
|
32 |
|
|
$_REQUEST['table'] = $_POST['name'];
|
33 |
|
|
// Force a browser reload
|
34 |
|
|
$_reload_browser = true;
|
35 |
|
|
}
|
36 |
|
|
doDefault($lang['strtablealtered']);
|
37 |
|
|
}
|
38 |
|
|
else
|
39 |
|
|
doAlter($lang['strtablealteredbad']);
|
40 |
|
|
}
|
41 |
|
|
|
42 |
|
|
/**
|
43 |
|
|
* Function to allow altering of a table
|
44 |
|
|
*/
|
45 |
|
|
function doAlter($msg = '') {
|
46 |
|
|
global $data, $misc;
|
47 |
|
|
global $PHP_SELF, $lang;
|
48 |
|
|
|
49 |
|
|
$misc->printTrail('table');
|
50 |
|
|
$misc->printTitle($lang['stralter'], 'pg.table.alter');
|
51 |
|
|
$misc->printMsg($msg);
|
52 |
|
|
|
53 |
|
|
// Fetch table info
|
54 |
|
|
$table = $data->getTable($_REQUEST['table']);
|
55 |
|
|
// Fetch all users
|
56 |
|
|
$users = $data->getUsers();
|
57 |
|
|
// Fetch all tablespaces from the database
|
58 |
|
|
if ($data->hasTablespaces()) $tablespaces = $data->getTablespaces(true);
|
59 |
|
|
|
60 |
|
|
if ($table->recordCount() > 0) {
|
61 |
|
|
|
62 |
|
|
if (!isset($_POST['name'])) $_POST['name'] = $table->f['relname'];
|
63 |
|
|
if (!isset($_POST['owner'])) $_POST['owner'] = $table->f['relowner'];
|
64 |
|
|
if (!isset($_POST['comment'])) $_POST['comment'] = $table->f['relcomment'];
|
65 |
|
|
if ($data->hasTablespaces() && !isset($_POST['tablespace'])) $_POST['tablespace'] = $table->f['tablespace'];
|
66 |
|
|
|
67 |
|
|
echo "<form action=\"$PHP_SELF\" method=\"post\">\n";
|
68 |
|
|
echo "<table>\n";
|
69 |
|
|
echo "<tr><th class=\"data left required\">{$lang['strname']}</th>\n";
|
70 |
|
|
echo "<td class=\"data1\">";
|
71 |
|
|
echo "<input name=\"name\" size=\"32\" maxlength=\"{$data->_maxNameLen}\" value=\"",
|
72 |
|
|
htmlspecialchars($_POST['name']), "\" /></td></tr>\n";
|
73 |
|
|
|
74 |
|
|
$server_info = $misc->getServerInfo();
|
75 |
|
|
if ($data->hasAlterTableOwner() && $data->isSuperUser($server_info['username'])) {
|
76 |
|
|
echo "<tr><th class=\"data left required\">{$lang['strowner']}</th>\n";
|
77 |
|
|
echo "<td class=\"data1\"><select name=\"owner\">";
|
78 |
|
|
while (!$users->EOF) {
|
79 |
|
|
$uname = $users->f['usename'];
|
80 |
|
|
echo "<option value=\"", htmlspecialchars($uname), "\"",
|
81 |
|
|
($uname == $_POST['owner']) ? ' selected="selected"' : '', ">", htmlspecialchars($uname), "</option>\n";
|
82 |
|
|
$users->moveNext();
|
83 |
|
|
}
|
84 |
|
|
echo "</select></td></tr>\n";
|
85 |
|
|
}
|
86 |
|
|
|
87 |
|
|
// Tablespace (if there are any)
|
88 |
|
|
if ($data->hasTablespaces() && $tablespaces->recordCount() > 0) {
|
89 |
|
|
echo "\t<tr>\n\t\t<th class=\"data left\">{$lang['strtablespace']}</th>\n";
|
90 |
|
|
echo "\t\t<td class=\"data1\">\n\t\t\t<select name=\"tablespace\">\n";
|
91 |
|
|
// Always offer the default (empty) option
|
92 |
|
|
echo "\t\t\t\t<option value=\"\"",
|
93 |
|
|
($_POST['tablespace'] == '') ? ' selected="selected"' : '', "></option>\n";
|
94 |
|
|
// Display all other tablespaces
|
95 |
|
|
while (!$tablespaces->EOF) {
|
96 |
|
|
$spcname = htmlspecialchars($tablespaces->f['spcname']);
|
97 |
|
|
echo "\t\t\t\t<option value=\"{$spcname}\"",
|
98 |
|
|
($spcname == $_POST['tablespace']) ? ' selected="selected"' : '', ">{$spcname}</option>\n";
|
99 |
|
|
$tablespaces->moveNext();
|
100 |
|
|
}
|
101 |
|
|
echo "\t\t\t</select>\n\t\t</td>\n\t</tr>\n";
|
102 |
|
|
}
|
103 |
|
|
|
104 |
|
|
echo "<tr><th class=\"data left\">{$lang['strcomment']}</th>\n";
|
105 |
|
|
echo "<td class=\"data1\">";
|
106 |
|
|
echo "<textarea rows=\"3\" cols=\"32\" name=\"comment\" wrap=\"virtual\">",
|
107 |
|
|
htmlspecialchars($_POST['comment']), "</textarea></td></tr>\n";
|
108 |
|
|
echo "</table>\n";
|
109 |
|
|
echo "<p><input type=\"hidden\" name=\"action\" value=\"alter\" />\n";
|
110 |
|
|
echo "<input type=\"hidden\" name=\"table\" value=\"", htmlspecialchars($_REQUEST['table']), "\" />\n";
|
111 |
|
|
echo $misc->form;
|
112 |
|
|
echo "<input type=\"submit\" name=\"alter\" value=\"{$lang['stralter']}\" />\n";
|
113 |
|
|
echo "<input type=\"submit\" name=\"cancel\" value=\"{$lang['strcancel']}\" /></p>\n";
|
114 |
|
|
echo "</form>\n";
|
115 |
|
|
}
|
116 |
|
|
else echo "<p>{$lang['strnodata']}</p>\n";
|
117 |
|
|
}
|
118 |
|
|
|
119 |
|
|
function doExport($msg = '') {
|
120 |
|
|
global $data, $misc;
|
121 |
|
|
global $PHP_SELF, $lang;
|
122 |
|
|
|
123 |
|
|
// Determine whether or not the table has an object ID
|
124 |
|
|
$hasID = $data->hasObjectID($_REQUEST['table']);
|
125 |
|
|
|
126 |
|
|
$misc->printTrail('table');
|
127 |
|
|
$misc->printTabs('table','export');
|
128 |
|
|
$misc->printMsg($msg);
|
129 |
|
|
|
130 |
|
|
echo "<form action=\"dataexport.php\" method=\"post\">\n";
|
131 |
|
|
echo "<table>\n";
|
132 |
|
|
echo "<tr><th class=\"data\">{$lang['strformat']}</th><th class=\"data\" colspan=\"2\">{$lang['stroptions']}</th></tr>\n";
|
133 |
|
|
// Data only
|
134 |
|
|
echo "<tr><th class=\"data left\" rowspan=\"", ($hasID) ? 2 : 1, "\">";
|
135 |
|
|
echo "<input type=\"radio\" name=\"what\" value=\"dataonly\" checked=\"checked\" />{$lang['strdataonly']}</th>\n";
|
136 |
|
|
echo "<td>{$lang['strformat']}</td>\n";
|
137 |
|
|
echo "<td><select name=\"d_format\">\n";
|
138 |
|
|
echo "<option value=\"copy\">COPY</option>\n";
|
139 |
|
|
echo "<option value=\"sql\">SQL</option>\n";
|
140 |
|
|
echo "<option value=\"csv\">CSV</option>\n";
|
141 |
|
|
echo "<option value=\"tab\">{$lang['strtabbed']}</option>\n";
|
142 |
|
|
echo "<option value=\"html\">XHTML</option>\n";
|
143 |
|
|
echo "<option value=\"xml\">XML</option>\n";
|
144 |
|
|
echo "</select>\n</td>\n</tr>\n";
|
145 |
|
|
if ($hasID) {
|
146 |
|
|
echo "<tr><td>{$lang['stroids']}</td><td><input type=\"checkbox\" name=\"d_oids\" /></td>\n</tr>\n";
|
147 |
|
|
}
|
148 |
|
|
// Structure only
|
149 |
|
|
echo "<tr><th class=\"data left\"><input type=\"radio\" name=\"what\" value=\"structureonly\" />{$lang['strstructureonly']}</th>\n";
|
150 |
|
|
echo "<td>{$lang['strdrop']}</td><td><input type=\"checkbox\" name=\"s_clean\" /></td>\n</tr>\n";
|
151 |
|
|
// Structure and data
|
152 |
|
|
echo "<tr><th class=\"data left\" rowspan=\"", ($hasID) ? 3 : 2, "\">";
|
153 |
|
|
echo "<input type=\"radio\" name=\"what\" value=\"structureanddata\" />{$lang['strstructureanddata']}</th>\n";
|
154 |
|
|
echo "<td>{$lang['strformat']}</td>\n";
|
155 |
|
|
echo "<td><select name=\"sd_format\">\n";
|
156 |
|
|
echo "<option value=\"copy\">COPY</option>\n";
|
157 |
|
|
echo "<option value=\"sql\">SQL</option>\n";
|
158 |
|
|
echo "</select>\n</td>\n</tr>\n";
|
159 |
|
|
echo "<tr><td>{$lang['strdrop']}</td><td><input type=\"checkbox\" name=\"sd_clean\" /></td>\n</tr>\n";
|
160 |
|
|
if ($hasID) {
|
161 |
|
|
echo "<tr><td>{$lang['stroids']}</td><td><input type=\"checkbox\" name=\"sd_oids\" /></td>\n</tr>\n";
|
162 |
|
|
}
|
163 |
|
|
echo "</table>\n";
|
164 |
|
|
|
165 |
|
|
echo "<h3>{$lang['stroptions']}</h3>\n";
|
166 |
|
|
echo "<p><input type=\"radio\" name=\"output\" value=\"show\" checked=\"checked\" />{$lang['strshow']}\n";
|
167 |
|
|
echo "<br/><input type=\"radio\" name=\"output\" value=\"download\" />{$lang['strdownload']}</p>\n";
|
168 |
|
|
|
169 |
|
|
echo "<p><input type=\"hidden\" name=\"action\" value=\"export\" />\n";
|
170 |
|
|
echo $misc->form;
|
171 |
|
|
echo "<input type=\"hidden\" name=\"subject\" value=\"table\" />\n";
|
172 |
|
|
echo "<input type=\"hidden\" name=\"table\" value=\"", htmlspecialchars($_REQUEST['table']), "\" />\n";
|
173 |
|
|
echo "<input type=\"submit\" value=\"{$lang['strexport']}\" /></p>\n";
|
174 |
|
|
echo "</form>\n";
|
175 |
|
|
}
|
176 |
|
|
|
177 |
|
|
function doImport($msg = '') {
|
178 |
|
|
global $data, $misc;
|
179 |
|
|
global $PHP_SELF, $lang;
|
180 |
|
|
|
181 |
|
|
$misc->printTrail('table');
|
182 |
|
|
$misc->printTabs('table','import');
|
183 |
|
|
$misc->printMsg($msg);
|
184 |
|
|
|
185 |
|
|
// Check that file uploads are enabled
|
186 |
|
|
if (ini_get('file_uploads')) {
|
187 |
|
|
// Don't show upload option if max size of uploads is zero
|
188 |
|
|
$max_size = $misc->inisizeToBytes(ini_get('upload_max_filesize'));
|
189 |
|
|
if (is_double($max_size) && $max_size > 0) {
|
190 |
|
|
echo "<form action=\"dataimport.php\" method=\"post\" enctype=\"multipart/form-data\">\n";
|
191 |
|
|
echo "<table>\n";
|
192 |
|
|
echo "<tr><th class=\"data left required\">{$lang['strformat']}</th>";
|
193 |
|
|
echo "<td><select name=\"format\">\n";
|
194 |
|
|
echo "<option value=\"auto\">{$lang['strauto']}</option>\n";
|
195 |
|
|
echo "<option value=\"csv\">CSV</option>\n";
|
196 |
|
|
echo "<option value=\"tab\">{$lang['strtabbed']}</option>\n";
|
197 |
|
|
if (function_exists('xml_parser_create')) {
|
198 |
|
|
echo "<option value=\"xml\">XML</option>\n";
|
199 |
|
|
}
|
200 |
|
|
echo "</select>\n</td>\n</tr>\n";
|
201 |
|
|
echo "<tr><th class=\"data left required\">{$lang['strallowednulls']}</th>";
|
202 |
|
|
echo "<td><select multiple size=\"3\" name=\"allowednulls[]\">\n";
|
203 |
|
|
echo "<option value=\"default\" selected=\"selected\">{$lang['strbackslashn']}</option>\n";
|
204 |
|
|
echo "<option value=\"null\">{$lang['strnull']}</option>\n";
|
205 |
|
|
echo "<option value=\"emptystring\">{$lang['stremptystring'] }</option>\n";
|
206 |
|
|
echo "</select>\n</td>\n</tr>\n";
|
207 |
|
|
echo "<tr><th class=\"data left required\">{$lang['strfile']}</th>";
|
208 |
|
|
echo "<td><input type=\"hidden\" name=\"MAX_FILE_SIZE\" value=\"{$max_size}\" />\n";
|
209 |
|
|
echo "<input type=\"file\" name=\"source\" />\n";
|
210 |
|
|
echo "</table>\n";
|
211 |
|
|
echo "<p><input type=\"hidden\" name=\"action\" value=\"import\" />\n";
|
212 |
|
|
echo $misc->form;
|
213 |
|
|
echo "<input type=\"hidden\" name=\"table\" value=\"", htmlspecialchars($_REQUEST['table']), "\" />\n";
|
214 |
|
|
echo "<input type=\"submit\" value=\"{$lang['strimport']}\" /></p>\n";
|
215 |
|
|
echo "</form>\n";
|
216 |
|
|
}
|
217 |
|
|
}
|
218 |
|
|
else echo "<p>{$lang['strnouploads']}</p>\n";
|
219 |
|
|
}
|
220 |
|
|
|
221 |
|
|
/**
|
222 |
|
|
* Displays a screen where they can add a column
|
223 |
|
|
*/
|
224 |
|
|
function doAddColumn($msg = '') {
|
225 |
|
|
global $data, $misc;
|
226 |
|
|
global $PHP_SELF, $lang;
|
227 |
|
|
|
228 |
|
|
if (!isset($_REQUEST['stage'])) $_REQUEST['stage'] = 1;
|
229 |
|
|
|
230 |
|
|
switch ($_REQUEST['stage']) {
|
231 |
|
|
case 1:
|
232 |
|
|
global $lang;
|
233 |
|
|
|
234 |
|
|
// Set variable defaults
|
235 |
|
|
if (!isset($_POST['field'])) $_POST['field'] = '';
|
236 |
|
|
if (!isset($_POST['type'])) $_POST['type'] = '';
|
237 |
|
|
if (!isset($_POST['array'])) $_POST['array'] = '';
|
238 |
|
|
if (!isset($_POST['length'])) $_POST['length'] = '';
|
239 |
|
|
if (!isset($_POST['default'])) $_POST['default'] = '';
|
240 |
|
|
if (!isset($_POST['comment'])) $_POST['comment'] = '';
|
241 |
|
|
|
242 |
|
|
// Fetch all available types
|
243 |
|
|
$types = $data->getTypes(true, false, true);
|
244 |
|
|
|
245 |
|
|
$misc->printTrail('table');
|
246 |
|
|
$misc->printTitle($lang['straddcolumn'], 'pg.column.add');
|
247 |
|
|
$misc->printMsg($msg);
|
248 |
|
|
|
249 |
|
|
echo "<form action=\"$PHP_SELF\" method=\"post\">\n";
|
250 |
|
|
|
251 |
|
|
// Output table header
|
252 |
|
|
echo "<table>\n<tr>";
|
253 |
|
|
echo "<tr><th class=\"data required\">{$lang['strcolumn']}</th><th colspan=\"2\" class=\"data required\">{$lang['strtype']}</th>";
|
254 |
|
|
echo "<th class=\"data\">{$lang['strlength']}</th>";
|
255 |
|
|
if ($data->hasAlterColumnType()) echo "<th class=\"data\">{$lang['strnotnull']}</th><th class=\"data\">{$lang['strdefault']}</th>";
|
256 |
|
|
echo "<th class=\"data\">{$lang['strcomment']}</th></tr>";
|
257 |
|
|
|
258 |
|
|
echo "<tr><td><input name=\"field\" size=\"16\" maxlength=\"{$data->_maxNameLen}\" value=\"",
|
259 |
|
|
htmlspecialchars($_POST['field']), "\" /></td>";
|
260 |
|
|
echo "<td><select name=\"type\">\n";
|
261 |
|
|
// Output any "magic" types. This came in with the alter column type so we'll check that
|
262 |
|
|
if ($data->hasAlterColumnType()) {
|
263 |
|
|
foreach ($data->extraTypes as $v) {
|
264 |
|
|
echo "<option value=\"", htmlspecialchars($v), "\"",
|
265 |
|
|
($v == $_POST['type']) ? ' selected="selected"' : '', ">",
|
266 |
|
|
$misc->printVal($v), "</option>\n";
|
267 |
|
|
}
|
268 |
|
|
}
|
269 |
|
|
while (!$types->EOF) {
|
270 |
|
|
$typname = $types->f['typname'];
|
271 |
|
|
echo "<option value=\"", htmlspecialchars($typname), "\"", ($typname == $_POST['type']) ? ' selected="selected"' : '', ">",
|
272 |
|
|
$misc->printVal($typname), "</option>\n";
|
273 |
|
|
$types->moveNext();
|
274 |
|
|
}
|
275 |
|
|
echo "</select></td>";
|
276 |
|
|
|
277 |
|
|
// Output array type selector
|
278 |
|
|
echo "<td><select name=\"array\">\n";
|
279 |
|
|
echo "<option value=\"\"", ($_POST['array'] == '') ? ' selected="selected"' : '', "></option>\n";
|
280 |
|
|
echo "<option value=\"[]\"", ($_POST['array'] == '[]') ? ' selected="selected"' : '', ">[ ]</option>\n";
|
281 |
|
|
echo "</select></td>\n";
|
282 |
|
|
|
283 |
|
|
echo "<td><input name=\"length\" size=\"8\" value=\"",
|
284 |
|
|
htmlspecialchars($_POST['length']), "\" /></td>";
|
285 |
|
|
// Support for adding column with not null and default
|
286 |
|
|
if ($data->hasAlterColumnType()) {
|
287 |
|
|
echo "<td><input type=\"checkbox\" name=\"notnull\"",
|
288 |
|
|
(isset($_REQUEST['notnull'])) ? ' checked="checked"' : '', " /></td>\n";
|
289 |
|
|
echo "<td><input name=\"default\" size=\"20\" value=\"",
|
290 |
|
|
htmlspecialchars($_POST['default']), "\" /></td>";
|
291 |
|
|
}
|
292 |
|
|
else {
|
293 |
|
|
echo "<input type=\"hidden\" name=\"default\" value=\"\" />\n";
|
294 |
|
|
}
|
295 |
|
|
echo "<td><input name=\"comment\" size=\"40\" value=\"",
|
296 |
|
|
htmlspecialchars($_POST['comment']), "\" /></td></tr>";
|
297 |
|
|
echo "</table>\n";
|
298 |
|
|
echo "<input type=\"hidden\" name=\"action\" value=\"add_column\" />\n";
|
299 |
|
|
echo "<input type=\"hidden\" name=\"stage\" value=\"2\" />\n";
|
300 |
|
|
echo $misc->form;
|
301 |
|
|
echo "<input type=\"hidden\" name=\"table\" value=\"", htmlspecialchars($_REQUEST['table']), "\">\n";
|
302 |
|
|
echo "<p><input type=\"submit\" value=\"{$lang['stradd']}\" />\n";
|
303 |
|
|
echo "<input type=\"submit\" name=\"cancel\" value=\"{$lang['strcancel']}\" /></p>\n";
|
304 |
|
|
echo "</form>\n";
|
305 |
|
|
|
306 |
|
|
break;
|
307 |
|
|
case 2:
|
308 |
|
|
global $data, $lang;
|
309 |
|
|
|
310 |
|
|
// Check inputs
|
311 |
|
|
if (trim($_POST['field']) == '') {
|
312 |
|
|
$_REQUEST['stage'] = 1;
|
313 |
|
|
doAddColumn($lang['strcolneedsname']);
|
314 |
|
|
return;
|
315 |
|
|
}
|
316 |
|
|
|
317 |
|
|
$status = $data->addColumn($_POST['table'], $_POST['field'],
|
318 |
|
|
$_POST['type'], $_POST['array'] != '', $_POST['length'], isset($_POST['notnull']),
|
319 |
|
|
$_POST['default'], $_POST['comment']);
|
320 |
|
|
if ($status == 0)
|
321 |
|
|
doDefault($lang['strcolumnadded']);
|
322 |
|
|
else {
|
323 |
|
|
$_REQUEST['stage'] = 1;
|
324 |
|
|
doAddColumn($lang['strcolumnaddedbad']);
|
325 |
|
|
return;
|
326 |
|
|
}
|
327 |
|
|
break;
|
328 |
|
|
default:
|
329 |
|
|
echo "<p>{$lang['strinvalidparam']}</p>\n";
|
330 |
|
|
}
|
331 |
|
|
}
|
332 |
|
|
|
333 |
|
|
/**
|
334 |
|
|
* Displays a screen where they can alter a column
|
335 |
|
|
*/
|
336 |
|
|
function doProperties($msg = '') {
|
337 |
|
|
global $data, $misc;
|
338 |
|
|
global $PHP_SELF, $lang;
|
339 |
|
|
|
340 |
|
|
if (!isset($_REQUEST['stage'])) $_REQUEST['stage'] = 1;
|
341 |
|
|
|
342 |
|
|
switch ($_REQUEST['stage']) {
|
343 |
|
|
case 1:
|
344 |
|
|
global $lang;
|
345 |
|
|
|
346 |
|
|
$misc->printTrail('column');
|
347 |
|
|
$misc->printTitle($lang['straltercolumn'], 'pg.column.alter');
|
348 |
|
|
$misc->printMsg($msg);
|
349 |
|
|
|
350 |
|
|
echo "<form action=\"$PHP_SELF\" method=\"post\">\n";
|
351 |
|
|
|
352 |
|
|
// Output table header
|
353 |
|
|
echo "<table>\n<tr>";
|
354 |
|
|
echo "<tr><th class=\"data required\">{$lang['strname']}</th>";
|
355 |
|
|
if ($data->hasAlterColumnType()) {
|
356 |
|
|
echo "<th class=\"data required\" colspan=\"2\">{$lang['strtype']}</th>";
|
357 |
|
|
echo "<th class=\"data\">{$lang['strlength']}</th>";
|
358 |
|
|
}
|
359 |
|
|
else {
|
360 |
|
|
echo "<th class=\"data required\">{$lang['strtype']}</th>";
|
361 |
|
|
}
|
362 |
|
|
echo "<th class=\"data\">{$lang['strnotnull']}</th><th class=\"data\">{$lang['strdefault']}</th><th class=\"data\">{$lang['strcomment']}</th></tr>";
|
363 |
|
|
|
364 |
|
|
$column = $data->getTableAttributes($_REQUEST['table'], $_REQUEST['column']);
|
365 |
|
|
$column->f['attnotnull'] = $data->phpBool($column->f['attnotnull']);
|
366 |
|
|
|
367 |
|
|
// Upon first drawing the screen, load the existing column information
|
368 |
|
|
// from the database.
|
369 |
|
|
if (!isset($_REQUEST['default'])) {
|
370 |
|
|
$_REQUEST['field'] = $column->f['attname'];
|
371 |
|
|
$_REQUEST['type'] = $column->f['base_type'];
|
372 |
|
|
// Check to see if its' an array type...
|
373 |
|
|
// XXX: HACKY
|
374 |
|
|
if (substr($column->f['base_type'], strlen($column->f['base_type']) - 2) == '[]') {
|
375 |
|
|
$_REQUEST['type'] = substr($column->f['base_type'], 0, strlen($column->f['base_type']) - 2);
|
376 |
|
|
$_REQUEST['array'] = '[]';
|
377 |
|
|
}
|
378 |
|
|
else {
|
379 |
|
|
$_REQUEST['type'] = $column->f['base_type'];
|
380 |
|
|
$_REQUEST['array'] = '';
|
381 |
|
|
}
|
382 |
|
|
// To figure out the length, look in the brackets :(
|
383 |
|
|
// XXX: HACKY
|
384 |
|
|
if ($column->f['type'] != $column->f['base_type'] && ereg('\\(([0-9, ]*)\\)', $column->f['type'], $bits)) {
|
385 |
|
|
$_REQUEST['length'] = $bits[1];
|
386 |
|
|
}
|
387 |
|
|
else
|
388 |
|
|
$_REQUEST['length'] = '';
|
389 |
|
|
$_REQUEST['default'] = $_REQUEST['olddefault'] = $column->f['adsrc'];
|
390 |
|
|
if ($column->f['attnotnull']) $_REQUEST['notnull'] = 'YES';
|
391 |
|
|
$_REQUEST['comment'] = $column->f['comment'];
|
392 |
|
|
}
|
393 |
|
|
|
394 |
|
|
// Column name
|
395 |
|
|
echo "<tr><td><input name=\"field\" size=\"32\" value=\"",
|
396 |
|
|
htmlspecialchars($_REQUEST['field']), "\" /></td>";
|
397 |
|
|
|
398 |
|
|
// Column type
|
399 |
|
|
if ($data->hasAlterColumnType()) {
|
400 |
|
|
// Fetch all available types
|
401 |
|
|
$types = $data->getTypes(true, false, true);
|
402 |
|
|
|
403 |
|
|
echo "<td><select name=\"type\">\n";
|
404 |
|
|
// Output any "magic" types. This came in with Alter Column Type so we don't need to check that
|
405 |
|
|
foreach ($data->extraTypes as $v) {
|
406 |
|
|
echo "<option value=\"", htmlspecialchars($v), "\"",
|
407 |
|
|
($v == $_REQUEST['type']) ? ' selected="selected"' : '', ">",
|
408 |
|
|
$misc->printVal($v), "</option>\n";
|
409 |
|
|
}
|
410 |
|
|
while (!$types->EOF) {
|
411 |
|
|
$typname = $types->f['typname'];
|
412 |
|
|
echo "<option value=\"", htmlspecialchars($typname), "\"", ($typname == $_REQUEST['type']) ? ' selected="selected"' : '', ">",
|
413 |
|
|
$misc->printVal($typname), "</option>\n";
|
414 |
|
|
$types->moveNext();
|
415 |
|
|
}
|
416 |
|
|
echo "</select></td>";
|
417 |
|
|
|
418 |
|
|
// Output array type selector
|
419 |
|
|
echo "<td><select name=\"array\">\n";
|
420 |
|
|
echo "<option value=\"\"", ($_REQUEST['array'] == '') ? ' selected="selected"' : '', "></option>\n";
|
421 |
|
|
echo "<option value=\"[]\"", ($_REQUEST['array'] == '[]') ? ' selected="selected"' : '', ">[ ]</option>\n";
|
422 |
|
|
echo "</select></td>\n";
|
423 |
|
|
|
424 |
|
|
echo "<td><input name=\"length\" size=\"8\" value=\"",
|
425 |
|
|
htmlspecialchars($_REQUEST['length']), "\" /></td>";
|
426 |
|
|
} else {
|
427 |
|
|
// Otherwise draw the read-only type name
|
428 |
|
|
echo "<td>", $misc->printVal($data->formatType($column->f['type'], $column->f['atttypmod'])), "</td>";
|
429 |
|
|
}
|
430 |
|
|
|
431 |
|
|
echo "<td><input type=\"checkbox\" name=\"notnull\"", (isset($_REQUEST['notnull'])) ? ' checked="checked"' : '', " /></td>\n";
|
432 |
|
|
echo "<td><input name=\"default\" size=\"20\" value=\"",
|
433 |
|
|
htmlspecialchars($_REQUEST['default']), "\" /></td>";
|
434 |
|
|
echo "<td><input name=\"comment\" size=\"20\" value=\"",
|
435 |
|
|
htmlspecialchars($_REQUEST['comment']), "\" /></td>";
|
436 |
|
|
|
437 |
|
|
echo "</table>\n";
|
438 |
|
|
echo "<p><input type=\"hidden\" name=\"action\" value=\"properties\" />\n";
|
439 |
|
|
echo "<input type=\"hidden\" name=\"stage\" value=\"2\" />\n";
|
440 |
|
|
echo $misc->form;
|
441 |
|
|
echo "<input type=\"hidden\" name=\"table\" value=\"", htmlspecialchars($_REQUEST['table']), "\" />\n";
|
442 |
|
|
echo "<input type=\"hidden\" name=\"column\" value=\"", htmlspecialchars($_REQUEST['column']), "\" />\n";
|
443 |
|
|
echo "<input type=\"hidden\" name=\"olddefault\" value=\"", htmlspecialchars($_REQUEST['olddefault']), "\" />\n";
|
444 |
|
|
if ($column->f['attnotnull']) echo "<input type=\"hidden\" name=\"oldnotnull\" value=\"on\" />\n";
|
445 |
|
|
echo "<input type=\"hidden\" name=\"oldtype\" value=\"", htmlspecialchars($data->formatType($column->f['type'], $column->f['atttypmod'])), "\" />\n";
|
446 |
|
|
// Add hidden variables to suppress error notices if we don't support altering column type
|
447 |
|
|
if (!$data->hasAlterColumnType()) {
|
448 |
|
|
echo "<input type=\"hidden\" name=\"type\" value=\"", htmlspecialchars($_REQUEST['type']), "\" />\n";
|
449 |
|
|
echo "<input type=\"hidden\" name=\"length\" value=\"", htmlspecialchars($_REQUEST['length']), "\" />\n";
|
450 |
|
|
echo "<input type=\"hidden\" name=\"array\" value=\"", htmlspecialchars($_REQUEST['array']), "\" />\n";
|
451 |
|
|
}
|
452 |
|
|
echo "<input type=\"submit\" value=\"{$lang['stralter']}\" />\n";
|
453 |
|
|
echo "<input type=\"submit\" name=\"cancel\" value=\"{$lang['strcancel']}\" /></p>\n";
|
454 |
|
|
echo "</form>\n";
|
455 |
|
|
|
456 |
|
|
break;
|
457 |
|
|
case 2:
|
458 |
|
|
global $data, $lang;
|
459 |
|
|
|
460 |
|
|
// Check inputs
|
461 |
|
|
if (trim($_REQUEST['field']) == '') {
|
462 |
|
|
$_REQUEST['stage'] = 1;
|
463 |
|
|
doProperties($lang['strcolneedsname']);
|
464 |
|
|
return;
|
465 |
|
|
}
|
466 |
|
|
|
467 |
|
|
$status = $data->alterColumn($_REQUEST['table'], $_REQUEST['column'], $_REQUEST['field'],
|
468 |
|
|
isset($_REQUEST['notnull']), isset($_REQUEST['oldnotnull']),
|
469 |
|
|
$_REQUEST['default'], $_REQUEST['olddefault'],
|
470 |
|
|
$_REQUEST['type'], $_REQUEST['length'], $_REQUEST['array'], $_REQUEST['oldtype'],
|
471 |
|
|
$_REQUEST['comment']);
|
472 |
|
|
if ($status == 0)
|
473 |
|
|
doDefault($lang['strcolumnaltered']);
|
474 |
|
|
else {
|
475 |
|
|
$_REQUEST['stage'] = 1;
|
476 |
|
|
doProperties($lang['strcolumnalteredbad']);
|
477 |
|
|
return;
|
478 |
|
|
}
|
479 |
|
|
break;
|
480 |
|
|
default:
|
481 |
|
|
echo "<p>{$lang['strinvalidparam']}</p>\n";
|
482 |
|
|
}
|
483 |
|
|
}
|
484 |
|
|
|
485 |
|
|
/**
|
486 |
|
|
* Show confirmation of drop column and perform actual drop
|
487 |
|
|
*/
|
488 |
|
|
function doDrop($confirm) {
|
489 |
|
|
global $data, $database, $misc;
|
490 |
|
|
global $PHP_SELF, $lang;
|
491 |
|
|
|
492 |
|
|
if ($confirm) {
|
493 |
|
|
$misc->printTrail('column');
|
494 |
|
|
$misc->printTitle($lang['strdrop'], 'pg.column.drop');
|
495 |
|
|
|
496 |
|
|
echo "<p>", sprintf($lang['strconfdropcolumn'], $misc->printVal($_REQUEST['column']),
|
497 |
|
|
$misc->printVal($_REQUEST['table'])), "</p>\n";
|
498 |
|
|
|
499 |
|
|
|
500 |
|
|
echo "<form action=\"$PHP_SELF\" method=\"post\">\n";
|
501 |
|
|
echo "<input type=\"hidden\" name=\"action\" value=\"drop\" />\n";
|
502 |
|
|
echo "<input type=\"hidden\" name=\"table\" value=\"", htmlspecialchars($_REQUEST['table']), "\" />\n";
|
503 |
|
|
echo "<input type=\"hidden\" name=\"column\" value=\"", htmlspecialchars($_REQUEST['column']), "\" />\n";
|
504 |
|
|
echo $misc->form;
|
505 |
|
|
// Show cascade drop option if supportd
|
506 |
|
|
if ($data->hasDropBehavior()) {
|
507 |
|
|
echo "<p><input type=\"checkbox\" name=\"cascade\"> {$lang['strcascade']}</p>\n";
|
508 |
|
|
}
|
509 |
|
|
echo "<input type=\"submit\" name=\"drop\" value=\"{$lang['strdrop']}\" />\n";
|
510 |
|
|
echo "<input type=\"submit\" name=\"cancel\" value=\"{$lang['strcancel']}\" />\n";
|
511 |
|
|
echo "</form>\n";
|
512 |
|
|
}
|
513 |
|
|
else {
|
514 |
|
|
$status = $data->dropColumn($_POST['table'], $_POST['column'], isset($_POST['cascade']));
|
515 |
|
|
if ($status == 0)
|
516 |
|
|
doDefault($lang['strcolumndropped']);
|
517 |
|
|
else
|
518 |
|
|
doDefault($lang['strcolumndroppedbad']);
|
519 |
|
|
}
|
520 |
|
|
|
521 |
|
|
}
|
522 |
|
|
|
523 |
|
|
/**
|
524 |
|
|
* Show default list of columns in the table
|
525 |
|
|
*/
|
526 |
|
|
function doDefault($msg = '') {
|
527 |
|
|
global $data, $conf, $misc;
|
528 |
|
|
global $PHP_SELF, $lang;
|
529 |
|
|
|
530 |
|
|
function attPre(&$rowdata) {
|
531 |
|
|
global $data;
|
532 |
|
|
$rowdata->f['+type'] = $data->formatType($rowdata->f['type'], $rowdata->f['atttypmod']);
|
533 |
|
|
}
|
534 |
|
|
|
535 |
|
|
$misc->printTrail('table');
|
536 |
|
|
$misc->printTabs('table','columns');
|
537 |
|
|
$misc->printMsg($msg);
|
538 |
|
|
|
539 |
|
|
// Get table
|
540 |
|
|
$tdata = $data->getTable($_REQUEST['table']);
|
541 |
|
|
// Get columns
|
542 |
|
|
$attrs = $data->getTableAttributes($_REQUEST['table']);
|
543 |
|
|
|
544 |
|
|
// Show comment if any
|
545 |
|
|
if ($tdata->f['relcomment'] !== null)
|
546 |
|
|
echo "<p class=\"comment\">", $misc->printVal($tdata->f['relcomment']), "</p>\n";
|
547 |
|
|
|
548 |
|
|
$columns = array(
|
549 |
|
|
'column' => array(
|
550 |
|
|
'title' => $lang['strcolumn'],
|
551 |
|
|
'field' => 'attname',
|
552 |
|
|
),
|
553 |
|
|
'type' => array(
|
554 |
|
|
'title' => $lang['strtype'],
|
555 |
|
|
'field' => '+type',
|
556 |
|
|
),
|
557 |
|
|
'notnull' => array(
|
558 |
|
|
'title' => $lang['strnotnull'],
|
559 |
|
|
'field' => 'attnotnull',
|
560 |
|
|
'type' => 'bool',
|
561 |
|
|
'params'=> array('true' => 'NOT NULL', 'false' => ''),
|
562 |
|
|
),
|
563 |
|
|
'default' => array(
|
564 |
|
|
'title' => $lang['strdefault'],
|
565 |
|
|
'field' => 'adsrc',
|
566 |
|
|
),
|
567 |
|
|
'actions' => array(
|
568 |
|
|
'title' => $lang['stractions'],
|
569 |
|
|
),
|
570 |
|
|
'comment' => array(
|
571 |
|
|
'title' => $lang['strcomment'],
|
572 |
|
|
'field' => 'comment',
|
573 |
|
|
),
|
574 |
|
|
);
|
575 |
|
|
|
576 |
|
|
$actions = array(
|
577 |
|
|
'alter' => array(
|
578 |
|
|
'title' => $lang['stralter'],
|
579 |
|
|
'url' => "{$PHP_SELF}?action=properties&{$misc->href}&table=".urlencode($_REQUEST['table'])."&",
|
580 |
|
|
'vars' => array('column' => 'attname'),
|
581 |
|
|
),
|
582 |
|
|
'drop' => array(
|
583 |
|
|
'title' => $lang['strdrop'],
|
584 |
|
|
'url' => "{$PHP_SELF}?action=confirm_drop&{$misc->href}&table=".urlencode($_REQUEST['table'])."&",
|
585 |
|
|
'vars' => array('column' => 'attname'),
|
586 |
|
|
),
|
587 |
|
|
);
|
588 |
|
|
|
589 |
|
|
if (!$data->hasDropColumn()) unset($actions['drop']);
|
590 |
|
|
|
591 |
|
|
$misc->printTable($attrs, $columns, $actions, null, 'attPre');
|
592 |
|
|
|
593 |
|
|
echo "<br />\n";
|
594 |
|
|
|
595 |
|
|
echo "<ul>\n";
|
596 |
|
|
$return_url = urlencode("tblproperties.php?{$misc->href}&table={$_REQUEST['table']}");
|
597 |
|
|
echo "\t<li><a href=\"display.php?{$misc->href}&table=", urlencode($_REQUEST['table']), "&subject=table&return_url={$return_url}&return_desc=",
|
598 |
|
|
urlencode($lang['strback']), "\">{$lang['strbrowse']}</a></li>\n";
|
599 |
|
|
echo "\t<li><a href=\"tables.php?action=confselectrows&{$misc->href}&table=", urlencode($_REQUEST['table']),"\">{$lang['strselect']}</a></li>\n";
|
600 |
|
|
echo "\t<li><a href=\"tables.php?action=confinsertrow&{$misc->href}&table=", urlencode($_REQUEST['table']),"\">{$lang['strinsert']}</a></li>\n";
|
601 |
|
|
echo "\t<li><a href=\"tables.php?action=confirm_empty&{$misc->href}&table=", urlencode($_REQUEST['table']),"\">{$lang['strempty']}</a></li>\n";
|
602 |
|
|
echo "\t<li><a href=\"tables.php?action=confirm_drop&{$misc->href}&table=", urlencode($_REQUEST['table']),"\">{$lang['strdrop']}</a></li>\n";
|
603 |
|
|
echo "\t<li><a href=\"{$PHP_SELF}?action=add_column&{$misc->href}&table=", urlencode($_REQUEST['table']),"\">{$lang['straddcolumn']}</a></li>\n";
|
604 |
|
|
echo "\t<li><a href=\"{$PHP_SELF}?action=confirm_alter&{$misc->href}&table=", urlencode($_REQUEST['table']),"\">{$lang['stralter']}</a></li>\n";
|
605 |
|
|
echo "</ul>\n";
|
606 |
|
|
}
|
607 |
|
|
|
608 |
|
|
$misc->printHeader($lang['strtables'] . ' - ' . $_REQUEST['table']);
|
609 |
|
|
$misc->printBody();
|
610 |
|
|
|
611 |
|
|
switch ($action) {
|
612 |
|
|
case 'alter':
|
613 |
|
|
if (isset($_POST['alter'])) doSaveAlter();
|
614 |
|
|
else doDefault();
|
615 |
|
|
break;
|
616 |
|
|
case 'confirm_alter':
|
617 |
|
|
doAlter();
|
618 |
|
|
break;
|
619 |
|
|
case 'import':
|
620 |
|
|
doImport();
|
621 |
|
|
break;
|
622 |
|
|
case 'export':
|
623 |
|
|
doExport();
|
624 |
|
|
break;
|
625 |
|
|
case 'add_column':
|
626 |
|
|
if (isset($_POST['cancel'])) doDefault();
|
627 |
|
|
else doAddColumn();
|
628 |
|
|
break;
|
629 |
|
|
case 'properties':
|
630 |
|
|
if (isset($_POST['cancel'])) doDefault();
|
631 |
|
|
else doProperties();
|
632 |
|
|
break;
|
633 |
|
|
case 'drop':
|
634 |
|
|
if (isset($_POST['drop'])) doDrop(false);
|
635 |
|
|
else doDefault();
|
636 |
|
|
break;
|
637 |
|
|
case 'confirm_drop':
|
638 |
|
|
doDrop(true);
|
639 |
|
|
break;
|
640 |
|
|
default:
|
641 |
|
|
doDefault();
|
642 |
|
|
break;
|
643 |
|
|
}
|
644 |
|
|
|
645 |
|
|
$misc->printFooter();
|
646 |
|
|
|
647 |
|
|
?>
|