1
|
<?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
|
?>
|