0e1c8395354372e385f57e660aa5621b8c2f1378
[moodle.git] / admin / xmldb / actions / view_table_php / view_table_php.class.php
1 <?php
3 // This file is part of Moodle - http://moodle.org/
4 //
5 // Moodle is free software: you can redistribute it and/or modify
6 // it under the terms of the GNU General Public License as published by
7 // the Free Software Foundation, either version 3 of the License, or
8 // (at your option) any later version.
9 //
10 // Moodle is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 // GNU General Public License for more details.
14 //
15 // You should have received a copy of the GNU General Public License
16 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
18 /**
19  * @package   xmldb-editor
20  * @copyright 2003 onwards Eloy Lafuente (stronk7) {@link http://stronk7.com}
21  * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
22  */
24 /**
25  * This class will show the PHP needed (upgrade block) to perform
26  * the desired DDL action with the specified field/key/index
27  *
28  * @package   xmldb-editor
29  * @copyright 2003 onwards Eloy Lafuente (stronk7) {@link http://stronk7.com}
30  * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
31  */
32 class view_table_php extends XMLDBAction {
34     /**
35      * Init method, every subclass will have its own
36      */
37     function init() {
38         parent::init();
40     /// Set own custom attributes
41         $this->sesskey_protected = false; // This action doesn't need sesskey protection
43     /// Get needed strings
44         $this->loadStrings(array(
45             'selectaction' => 'xmldb',
46             'selectfieldkeyindex' => 'xmldb',
47             'view' => 'xmldb',
48             'table' => 'xmldb',
49             'selectonecommand' => 'xmldb',
50             'selectonefieldkeyindex' => 'xmldb',
51             'mustselectonefield' => 'xmldb',
52             'mustselectonekey' => 'xmldb',
53             'mustselectoneindex' => 'xmldb',
54             'back' => 'xmldb'
55         ));
56     }
58     /**
59      * Invoke method, every class will have its own
60      * returns true/false on completion, setting both
61      * errormsg and output as necessary
62      */
63     function invoke() {
64         parent::invoke();
66         $result = true;
68     /// Set own core attributes
69         $this->does_generate = ACTION_GENERATE_HTML;
71     /// These are always here
72         global $CFG, $XMLDB, $OUTPUT;
74     /// Do the job, setting result as needed
75     /// Get the dir containing the file
76         $dirpath = required_param('dir', PARAM_PATH);
77         $dirpath = $CFG->dirroot . $dirpath;
79     /// Get the correct dirs
80         if (!empty($XMLDB->dbdirs)) {
81             $dbdir =& $XMLDB->dbdirs[$dirpath];
82         } else {
83             return false;
84         }
85         if (!empty($XMLDB->editeddirs)) {
86             $editeddir =& $XMLDB->editeddirs[$dirpath];
87             $structure =& $editeddir->xml_file->getStructure();
88         }
89     /// ADD YOUR CODE HERE
91         $tableparam = required_param('table', PARAM_PATH);
93         $table =& $structure->getTable($tableparam);
94         $fields = $table->getFields();
95         $field = reset($fields);
96         $defaultfieldkeyindex = null;
97         if ($field) {
98             $defaultfieldkeyindex = 'f#' . $field->getName();
99         }
100         $keys = $table->getKeys();
101         $indexes = $table->getIndexes();
103     /// Get parameters
104         $commandparam = optional_param('command', 'add_field', PARAM_PATH);
105         $origfieldkeyindexparam = optional_param('fieldkeyindex', $defaultfieldkeyindex, PARAM_PATH);
106         $fieldkeyindexparam = preg_replace('/[fki]#/i', '', $origfieldkeyindexparam); ///Strip the initials
107         $fieldkeyindexinitial = substr($origfieldkeyindexparam, 0, 1); //To know what we have selected
109     /// The back to edit xml button
110         $b = ' <p class="centerpara buttons">';
111         $b .= '<a href="index.php?action=edit_table&amp;dir=' . urlencode(str_replace($CFG->dirroot, '', $dirpath)) . '&amp;table=' . $tableparam . '">[' . $this->str['back'] . ']</a>';
112         $b .= '</p>';
113         $o = $b;
115     /// The table currently being edited
116         $o .= '<h3 class="main">' . $this->str['table'] . ': ' . s($tableparam) . '</h3>';
118     /// To indent the menu selections
119         $optionspacer = '&nbsp;&nbsp;&nbsp;';
121     /// Calculate the popup of commands
122         $commands = array('Fields',
123                          $optionspacer . 'add_field',
124                          $optionspacer . 'drop_field',
125                          $optionspacer . 'rename_field',
126                          $optionspacer . 'change_field_type',
127                          $optionspacer . 'change_field_precision',
128                          $optionspacer . 'change_field_unsigned',
129                          $optionspacer . 'change_field_notnull',
130                          $optionspacer . 'change_field_default',
131                          $optionspacer . 'drop_enum_from_field', /// TODO: Moodle 2.1 - Drop drop_enum_from_field
132                          'Keys',
133                          $optionspacer . 'add_key',
134                          $optionspacer . 'drop_key',
135                          $optionspacer . 'rename_key',
136                          'Indexes',
137                          $optionspacer . 'add_index',
138                          $optionspacer . 'drop_index',
139                          $optionspacer . 'rename_index');
140         foreach ($commands as $command) {
141             $popcommands[str_replace($optionspacer, '', $command)] = str_replace('_', ' ', $command);
142         }
143     /// Calculate the popup of fields/keys/indexes
144         if ($fields) {
145             $popfields['fieldshead'] = 'Fields';
146             foreach ($fields as $field) {
147                 $popfields['f#' . $field->getName()] = $optionspacer . $field->getName();
148             }
149         }
150         if ($keys) {
151             $popfields['keyshead'] = 'Keys';
152             foreach ($keys as $key) {
153                 $popfields['k#' . $key->getName()] = $optionspacer . $key->getName();
154             }
155         }
156         if ($indexes) {
157             $popfields['indexeshead'] = 'Indexes';
158             foreach ($indexes as $index) {
159                 $popfields['i#' . $index->getName()] = $optionspacer . $index->getName();
160             }
161         }
163     /// Now build the form
164         $o.= '<form id="form" action="index.php" method="post">';
165         $o.= '<div>';
166         $o.= '    <input type="hidden" name ="dir" value="' . str_replace($CFG->dirroot, '', $dirpath) . '" />';
167         $o.= '    <input type="hidden" name ="table" value="' . s($tableparam) . '" />';
168         $o.= '    <input type="hidden" name ="action" value="view_table_php" />';
169         $o.= '    <table id="formelements" class="boxaligncenter" cellpadding="5">';
170         $o.= '      <tr><td><label for="action" accesskey="c">' . $this->str['selectaction'] .' </label>' . html_writer::select($popcommands, 'command', $commandparam, false) . '&nbsp;<label for="fieldkeyindex" accesskey="f">' . $this->str['selectfieldkeyindex'] . ' </label>' .html_writer::select($popfields, 'fieldkeyindex', $origfieldkeyindexparam, false) . '</td></tr>';
171         $o.= '      <tr><td colspan="2" align="center"><input type="submit" value="' .$this->str['view'] . '" /></td></tr>';
172         $o.= '    </table>';
173         $o.= '</div></form>';
175         $o.= '    <table id="phpcode" class="boxaligncenter" cellpadding="5">';
176         $o.= '      <tr><td><textarea cols="80" rows="32">';
177     /// Check we have selected some field/key/index from the popup
178         if ($fieldkeyindexparam == 'fieldshead' || $fieldkeyindexparam == 'keyshead' || $fieldkeyindexparam == 'indexeshead') {
179             $o.= s($this->str['selectonefieldkeyindex']);
180     /// Check we have selected some command from the popup
181         } else if ($commandparam == 'Fields' || $commandparam == 'Keys' || $commandparam == 'Indexes') {
182             $o.= s($this->str['selectonecommand']);
183         } else {
184         /// Based on current params, call the needed function
185             switch ($commandparam) {
186                 case 'add_field':
187                     if ($fieldkeyindexinitial == 'f') { //Only if we have got one field
188                         $o.= s($this->add_field_php($structure, $tableparam, $fieldkeyindexparam));
189                     } else {
190                         $o.= $this->str['mustselectonefield'];
191                     }
192                     break;
193                 case 'drop_field':
194                     if ($fieldkeyindexinitial == 'f') { //Only if we have got one field
195                         $o.= s($this->drop_field_php($structure, $tableparam, $fieldkeyindexparam));
196                     } else {
197                         $o.= $this->str['mustselectonefield'];
198                     }
199                     break;
200                 case 'rename_field':
201                     if ($fieldkeyindexinitial == 'f') { //Only if we have got one field
202                         $o.= s($this->rename_field_php($structure, $tableparam, $fieldkeyindexparam));
203                     } else {
204                         $o.= $this->str['mustselectonefield'];
205                     }
206                     break;
207                 case 'change_field_type':
208                     if ($fieldkeyindexinitial == 'f') { //Only if we have got one field
209                         $o.= s($this->change_field_type_php($structure, $tableparam, $fieldkeyindexparam));
210                     } else {
211                         $o.= $this->str['mustselectonefield'];
212                     }
213                     break;
214                 case 'change_field_precision':
215                     if ($fieldkeyindexinitial == 'f') { //Only if we have got one field
216                         $o.= s($this->change_field_precision_php($structure, $tableparam, $fieldkeyindexparam));
217                     } else {
218                         $o.= $this->str['mustselectonefield'];
219                     }
220                     break;
221                 case 'change_field_unsigned':
222                     if ($fieldkeyindexinitial == 'f') { //Only if we have got one field
223                         $o.= s($this->change_field_unsigned_php($structure, $tableparam, $fieldkeyindexparam));
224                     } else {
225                         $o.= $this->str['mustselectonefield'];
226                     }
227                     break;
228                 case 'change_field_notnull':
229                     if ($fieldkeyindexinitial == 'f') { //Only if we have got one field
230                         $o.= s($this->change_field_notnull_php($structure, $tableparam, $fieldkeyindexparam));
231                     } else {
232                         $o.= $this->str['mustselectonefield'];
233                     }
234                     break;
235                 case 'drop_enum_from_field': /// TODO: Moodle 2.1 - Drop drop_enum_from_field
236                     if ($fieldkeyindexinitial == 'f') { //Only if we have got one field
237                         $o.= s($this->drop_enum_from_field_php($structure, $tableparam, $fieldkeyindexparam));
238                     } else {
239                         $o.= $this->str['mustselectonefield'];
240                     }
241                     break;
242                 case 'change_field_default':
243                     if ($fieldkeyindexinitial == 'f') { //Only if we have got one field
244                         $o.= s($this->change_field_default_php($structure, $tableparam, $fieldkeyindexparam));
245                     } else {
246                         $o.= $this->str['mustselectonefield'];
247                     }
248                     break;
249                 case 'add_key':
250                     if ($fieldkeyindexinitial == 'k') { //Only if we have got one key
251                         $o.= s($this->add_key_php($structure, $tableparam, $fieldkeyindexparam));
252                     } else {
253                         $o.= $this->str['mustselectonekey'];
254                     }
255                     break;
256                 case 'drop_key':
257                     if ($fieldkeyindexinitial == 'k') { //Only if we have got one key
258                         $o.= s($this->drop_key_php($structure, $tableparam, $fieldkeyindexparam));
259                     } else {
260                         $o.= $this->str['mustselectonekey'];
261                     }
262                     break;
263                 case 'rename_key':
264                     if ($fieldkeyindexinitial == 'k') { //Only if we have got one key
265                         $o.= s($this->rename_key_php($structure, $tableparam, $fieldkeyindexparam));
266                     } else {
267                         $o.= $this->str['mustselectonekey'];
268                     }
269                     break;
270                 case 'add_index':
271                     if ($fieldkeyindexinitial == 'i') { //Only if we have got one index
272                         $o.= s($this->add_index_php($structure, $tableparam, $fieldkeyindexparam));
273                     } else {
274                         $o.= $this->str['mustselectoneindex'];
275                     }
276                     break;
277                 case 'drop_index':
278                     if ($fieldkeyindexinitial == 'i') { //Only if we have got one index
279                         $o.= s($this->drop_index_php($structure, $tableparam, $fieldkeyindexparam));
280                     } else {
281                         $o.= $this->str['mustselectoneindex'];
282                     }
283                     break;
284                 case 'rename_index':
285                     if ($fieldkeyindexinitial == 'i') { //Only if we have got one index
286                         $o.= s($this->rename_index_php($structure, $tableparam, $fieldkeyindexparam));
287                     } else {
288                         $o.= $this->str['mustselectoneindex'];
289                     }
290                     break;
291             }
292         }
293         $o.= '</textarea></td></tr>';
294         $o.= '    </table>';
296         $this->output = $o;
298     /// Launch postaction if exists (leave this here!)
299         if ($this->getPostAction() && $result) {
300             return $this->launch($this->getPostAction());
301         }
303     /// Return ok if arrived here
304         return $result;
305     }
307     /**
308      * This function will generate all the PHP code needed to
309      * create one field using XMLDB objects and functions
310      *
311      * @param xmldb_structure structure object containing all the info
312      * @param string table table name
313      * @param string field field name to be created
314      * @return string PHP code to be used to create the field
315      */
316     function add_field_php($structure, $table, $field) {
318         $result = '';
319     /// Validate if we can do it
320         if (!$table = $structure->getTable($table)) {
321             return false;
322         }
323         if (!$field = $table->getField($field)) {
324             return false;
325         }
326         if ($table->getAllErrors()) {
327             return false;
328         }
330     /// Add the standard PHP header
331         $result .= XMLDB_PHP_HEADER;
333     /// Add contents
334         $result .= XMLDB_LINEFEED;
335         $result .= '        // Define field ' . $field->getName() . ' to be added to ' . $table->getName() . XMLDB_LINEFEED;
336         $result .= '        $table = new xmldb_table(' . "'" . $table->getName() . "'" . ');' . XMLDB_LINEFEED;
337         $result .= '        $field = new xmldb_field(' . "'" . $field->getName() . "', " . $field->getPHP(true) . ');' . XMLDB_LINEFEED;
339     /// Launch the proper DDL
340         $result .= XMLDB_LINEFEED;
341         $result .= '        // Conditionally launch add field ' . $field->getName() . XMLDB_LINEFEED;
342         $result .= '        if (!$dbman->field_exists($table, $field)) {'. XMLDB_LINEFEED;
343         $result .= '            $dbman->add_field($table, $field);' . XMLDB_LINEFEED;
344         $result .= '        }'. XMLDB_LINEFEED;
346     /// Add the proper upgrade_xxxx_savepoint call
347         $result .= $this->upgrade_savepoint_php ($structure);
349     /// Add standard PHP footer
350         $result .= XMLDB_PHP_FOOTER;
352         return $result;
353     }
355     /**
356      * This function will generate all the PHP code needed to
357      * drop one field using XMLDB objects and functions
358      *
359      * @param xmldb_structure structure object containing all the info
360      * @param string table table name
361      * @param string field field name to be dropped
362      * @return string PHP code to be used to drop the field
363      */
364     function drop_field_php($structure, $table, $field) {
366         $result = '';
367     /// Validate if we can do it
368         if (!$table = $structure->getTable($table)) {
369             return false;
370         }
371         if (!$field = $table->getField($field)) {
372             return false;
373         }
374         if ($table->getAllErrors()) {
375             return false;
376         }
378     /// Add the standard PHP header
379         $result .= XMLDB_PHP_HEADER;
381     /// Add contents
382         $result .= XMLDB_LINEFEED;
383         $result .= '        // Define field ' . $field->getName() . ' to be dropped from ' . $table->getName() . XMLDB_LINEFEED;
384         $result .= '        $table = new xmldb_table(' . "'" . $table->getName() . "'" . ');' . XMLDB_LINEFEED;
385         $result .= '        $field = new xmldb_field(' . "'" . $field->getName() . "'" . ');' . XMLDB_LINEFEED;
387     /// Launch the proper DDL
388         $result .= XMLDB_LINEFEED;
389         $result .= '        // Conditionally launch drop field ' . $field->getName() . XMLDB_LINEFEED;
390         $result .= '        if ($dbman->field_exists($table, $field)) {' . XMLDB_LINEFEED;
391         $result .= '            $dbman->drop_field($table, $field);' . XMLDB_LINEFEED;
392         $result .= '        }' . XMLDB_LINEFEED;
394     /// Add the proper upgrade_xxxx_savepoint call
395         $result .= $this->upgrade_savepoint_php ($structure);
397     /// Add standard PHP footer
398         $result .= XMLDB_PHP_FOOTER;
400         return $result;
401     }
403     /**
404      * This function will generate all the PHP code needed to
405      * rename one field using XMLDB objects and functions
406      *
407      * @param xmldb_structure structure object containing all the info
408      * @param string table table name
409      * @param string field field name to be renamed
410      * @return string PHP code to be used to rename the field
411      */
412     function rename_field_php($structure, $table, $field) {
414         $result = '';
415     /// Validate if we can do it
416         if (!$table = $structure->getTable($table)) {
417             return false;
418         }
419         if (!$field = $table->getField($field)) {
420             return false;
421         }
422         if ($table->getAllErrors()) {
423             return false;
424         }
426     /// Add the standard PHP header
427         $result .= XMLDB_PHP_HEADER;
429     /// Add contents
430         $result .= XMLDB_LINEFEED;
431         $result .= '        // Rename field ' . $field->getName() . ' on table ' . $table->getName() . ' to NEWNAMEGOESHERE'. XMLDB_LINEFEED;
432         $result .= '        $table = new xmldb_table(' . "'" . $table->getName() . "'" . ');' . XMLDB_LINEFEED;
433         $result .= '        $field = new xmldb_field(' . "'" . $field->getName() . "', " . $field->getPHP(true) . ');' . XMLDB_LINEFEED;
435     /// Launch the proper DDL
436         $result .= XMLDB_LINEFEED;
437         $result .= '        // Launch rename field ' . $field->getName() . XMLDB_LINEFEED;
438         $result .= '        $dbman->rename_field($table, $field, ' . "'" . 'NEWNAMEGOESHERE' . "'" . ');' . XMLDB_LINEFEED;
440     /// Add the proper upgrade_xxxx_savepoint call
441         $result .= $this->upgrade_savepoint_php ($structure);
443     /// Add standard PHP footer
444         $result .= XMLDB_PHP_FOOTER;
446         return $result;
447     }
449     /**
450      * This function will generate all the PHP code needed to
451      * change the type of one field using XMLDB objects and functions.
452      * Currently these conversions are supported:
453      *     integer to char
454      *     char to integer
455      *     number to char
456      *     char to number
457      *     float to char
458      *     char to float
459      *
460      * @param xmldb_structure structure object containing all the info
461      * @param string table table name
462      * @param string field field name to change precision
463      */
464     function change_field_type_php($structure, $table, $field) {
466         $result = '';
467     /// Validate if we can do it
468         if (!$table = $structure->getTable($table)) {
469             return false;
470         }
471         if (!$field = $table->getField($field)) {
472             return false;
473         }
474         if ($table->getAllErrors()) {
475             return false;
476         }
478     /// Calculate the type tip text
479         $type = $field->getXMLDBTypeName($field->getType());
481     /// Add the standard PHP header
482         $result .= XMLDB_PHP_HEADER;
484     /// Add contents
485         $result .= XMLDB_LINEFEED;
486         $result .= '        // Changing type of field ' . $field->getName() . ' on table ' . $table->getName() . ' to ' . $type . XMLDB_LINEFEED;
487         $result .= '        $table = new xmldb_table(' . "'" . $table->getName() . "'" . ');' . XMLDB_LINEFEED;
488         $result .= '        $field = new xmldb_field(' . "'" . $field->getName() . "', " . $field->getPHP(true) . ');' . XMLDB_LINEFEED;
490     /// Launch the proper DDL
491         $result .= XMLDB_LINEFEED;
492         $result .= '        // Launch change of type for field ' . $field->getName() . XMLDB_LINEFEED;
493         $result .= '        $dbman->change_field_type($table, $field);' . XMLDB_LINEFEED;
495     /// Add the proper upgrade_xxxx_savepoint call
496         $result .= $this->upgrade_savepoint_php ($structure);
498     /// Add standard PHP footer
499         $result .= XMLDB_PHP_FOOTER;
501         return $result;
502     }
504     /**
505      * This function will generate all the PHP code needed to
506      * change the precision of one field using XMLDB objects and functions
507      *
508      * @param xmldb_structure structure object containing all the info
509      * @param string table table name
510      * @param string field field name to change precision
511      */
512     function change_field_precision_php($structure, $table, $field) {
514         $result = '';
515     /// Validate if we can do it
516         if (!$table = $structure->getTable($table)) {
517             return false;
518         }
519         if (!$field = $table->getField($field)) {
520             return false;
521         }
522         if ($table->getAllErrors()) {
523             return false;
524         }
526     /// Calculate the precision tip text
527         $precision = '(' . $field->getLength();
528         if ($field->getDecimals()) {
529             $precision .= ', ' . $field->getDecimals();
530         }
531         $precision .= ')';
533     /// Add the standard PHP header
534         $result .= XMLDB_PHP_HEADER;
536     /// Add contents
537         $result .= XMLDB_LINEFEED;
538         $result .= '        // Changing precision of field ' . $field->getName() . ' on table ' . $table->getName() . ' to ' . $precision . XMLDB_LINEFEED;
539         $result .= '        $table = new xmldb_table(' . "'" . $table->getName() . "'" . ');' . XMLDB_LINEFEED;
540         $result .= '        $field = new xmldb_field(' . "'" . $field->getName() . "', " .$field->getPHP(true) . ');' . XMLDB_LINEFEED;
542     /// Launch the proper DDL
543         $result .= XMLDB_LINEFEED;
544         $result .= '        // Launch change of precision for field ' . $field->getName() . XMLDB_LINEFEED;
545         $result .= '        $dbman->change_field_precision($table, $field);' . XMLDB_LINEFEED;
547     /// Add the proper upgrade_xxxx_savepoint call
548         $result .= $this->upgrade_savepoint_php ($structure);
550     /// Add standard PHP footer
551         $result .= XMLDB_PHP_FOOTER;
553         return $result;
554     }
556     /**
557      * This function will generate all the PHP code needed to
558      * change the unsigned/signed of one field using XMLDB objects and functions
559      *
560      * @param xmldb_structure structure object containing all the info
561      * @param string table table name
562      * @param string field field name to change unsigned/signed
563      */
564     function change_field_unsigned_php($structure, $table, $field) {
566         $result = '';
567     /// Validate if we can do it
568         if (!$table = $structure->getTable($table)) {
569             return false;
570         }
571         if (!$field = $table->getField($field)) {
572             return false;
573         }
574         if ($table->getAllErrors()) {
575             return false;
576         }
578     /// Calculate the unsigned tip text
579         $unsigned = $field->getUnsigned() ? 'unsigned' : 'signed';
581     /// Add the standard PHP header
582         $result .= XMLDB_PHP_HEADER;
584     /// Add contents
585         $result .= XMLDB_LINEFEED;
586         $result .= '        // Changing sign of field ' . $field->getName() . ' on table ' . $table->getName() . ' to ' . $unsigned . XMLDB_LINEFEED;
587         $result .= '        $table = new xmldb_table(' . "'" . $table->getName() . "'" . ');' . XMLDB_LINEFEED;
588         $result .= '        $field = new xmldb_field(' . "'" . $field->getName() . "', " . $field->getPHP(true) . ');' . XMLDB_LINEFEED;
590     /// Launch the proper DDL
591         $result .= XMLDB_LINEFEED;
592         $result .= '        // Launch change of sign for field ' . $field->getName() . XMLDB_LINEFEED;
593         $result .= '        $dbman->change_field_unsigned($table, $field);' . XMLDB_LINEFEED;
595     /// Add the proper upgrade_xxxx_savepoint call
596         $result .= $this->upgrade_savepoint_php ($structure);
598     /// Add standard PHP footer
599         $result .= XMLDB_PHP_FOOTER;
601         return $result;
602     }
604     /**
605      * This function will generate all the PHP code needed to
606      * change the nullability of one field using XMLDB objects and functions
607      *
608      * @param xmldb_structure structure object containing all the info
609      * @param string table table name
610      * @param string field field name to change null/not null
611      */
612     function change_field_notnull_php($structure, $table, $field) {
614         $result = '';
615     /// Validate if we can do it
616         if (!$table = $structure->getTable($table)) {
617             return false;
618         }
619         if (!$field = $table->getField($field)) {
620             return false;
621         }
622         if ($table->getAllErrors()) {
623             return false;
624         }
626     /// Calculate the notnull tip text
627         $notnull = $field->getNotnull() ? 'not null' : 'null';
629     /// Add the standard PHP header
630         $result .= XMLDB_PHP_HEADER;
632     /// Add contents
633         $result .= XMLDB_LINEFEED;
634         $result .= '        // Changing nullability of field ' . $field->getName() . ' on table ' . $table->getName() . ' to ' . $notnull . XMLDB_LINEFEED;
635         $result .= '        $table = new xmldb_table(' . "'" . $table->getName() . "'" . ');' . XMLDB_LINEFEED;
636         $result .= '        $field = new xmldb_field(' . "'" . $field->getName() . "', " . $field->getPHP(true) . ');' . XMLDB_LINEFEED;
638     /// Launch the proper DDL
639         $result .= XMLDB_LINEFEED;
640         $result .= '        // Launch change of nullability for field ' . $field->getName() . XMLDB_LINEFEED;
641         $result .= '        $dbman->change_field_notnull($table, $field);' . XMLDB_LINEFEED;
643     /// Add the proper upgrade_xxxx_savepoint call
644         $result .= $this->upgrade_savepoint_php ($structure);
646     /// Add standard PHP footer
647         $result .= XMLDB_PHP_FOOTER;
649         return $result;
650     }
652     /**
653      * This function will generate all the PHP code needed to
654      * drop the enum values (check constraint) of one field
655      * using XMLDB objects and functions
656      *
657      * Note this function is here as part of the process of
658      * dropping enums completely from Moodle 2.0: MDL-18577
659      * and will be out in Moodle 2.1
660      * TODO: Moodle 2.1 - Drop drop_enum_from_field_php
661      *
662      * @param xmldb_structure structure object containing all the info
663      * @param string table table name
664      * @param string field field name to change its enum
665      */
666     function drop_enum_from_field_php($structure, $table, $field) {
668         $result = '';
669     /// Validate if we can do it
670         if (!$table = $structure->getTable($table)) {
671             return false;
672         }
673         if (!$field = $table->getField($field)) {
674             return false;
675         }
676         if ($table->getAllErrors()) {
677             return false;
678         }
680     /// Add the standard PHP header
681         $result .= XMLDB_PHP_HEADER;
683     /// Add contents
684         $result .= XMLDB_LINEFEED;
685         $result .= '        // Drop list of values (enum) from field ' . $field->getName() . ' on table ' . $table->getName() . XMLDB_LINEFEED;
686         $result .= '        $table = new xmldb_table(' . "'" . $table->getName() . "'" . ');' . XMLDB_LINEFEED;
687         $result .= '        $field = new xmldb_field(' . "'" . $field->getName() . "', " . $field->getPHP(true) . ');' . XMLDB_LINEFEED;
689     /// Launch the proper DDL
690         $result .= XMLDB_LINEFEED;
691         $result .= '        // Launch drop of list of values from field ' . $field->getName() . XMLDB_LINEFEED;
692         $result .= '        $dbman->drop_enum_from_field($table, $field);' . XMLDB_LINEFEED;
694     /// Add the proper upgrade_xxxx_savepoint call
695         $result .= $this->upgrade_savepoint_php ($structure);
697     /// Add standard PHP footer
698         $result .= XMLDB_PHP_FOOTER;
700         return $result;
701     }
703     /**
704      * This function will generate all the PHP code needed to
705      * change the default of one field using XMLDB objects and functions
706      *
707      * @param xmldb_structure structure object containing all the info
708      * @param string table table name
709      * @param string field field name to change null/not null
710      */
711     function change_field_default_php($structure, $table, $field) {
713         $result = '';
714     /// Validate if we can do it
715         if (!$table = $structure->getTable($table)) {
716             return false;
717         }
718         if (!$field = $table->getField($field)) {
719             return false;
720         }
721         if ($table->getAllErrors()) {
722             return false;
723         }
725     /// Calculate the default tip text
726         $default = $field->getDefault() === null ? 'drop it' : $field->getDefault();
728     /// Add the standard PHP header
729         $result .= XMLDB_PHP_HEADER;
731     /// Add contents
732         $result .= XMLDB_LINEFEED;
733         $result .= '        // Changing the default of field ' . $field->getName() . ' on table ' . $table->getName() . ' to ' . $default . XMLDB_LINEFEED;
734         $result .= '        $table = new xmldb_table(' . "'" . $table->getName() . "'" . ');' . XMLDB_LINEFEED;
735         $result .= '        $field = new xmldb_field(' . "'" . $field->getName() . "', " . $field->getPHP(true) . ');' . XMLDB_LINEFEED;
737     /// Launch the proper DDL
738         $result .= XMLDB_LINEFEED;
739         $result .= '        // Launch change of default for field ' . $field->getName() . XMLDB_LINEFEED;
740         $result .= '        $dbman->change_field_default($table, $field);' . XMLDB_LINEFEED;
742     /// Add the proper upgrade_xxxx_savepoint call
743         $result .= $this->upgrade_savepoint_php ($structure);
745     /// Add standard PHP footer
746         $result .= XMLDB_PHP_FOOTER;
748         return $result;
749     }
751     /**
752      * This function will generate all the PHP code needed to
753      * create one key using XMLDB objects and functions
754      *
755      * @param xmldb_structure structure object containing all the info
756      * @param string table table name
757      * @param string key key name to be created
758      * @return string PHP code to be used to create the key
759      */
760     function add_key_php($structure, $table, $key) {
762         $result = '';
763     /// Validate if we can do it
764         if (!$table = $structure->getTable($table)) {
765             return false;
766         }
767         if (!$key = $table->getKey($key)) {
768             return false;
769         }
770         if ($table->getAllErrors()) {
771             return false;
772         }
774     /// Add the standard PHP header
775         $result .= XMLDB_PHP_HEADER;
777     /// Add contents
778         $result .= XMLDB_LINEFEED;
779         $result .= '        // Define key ' . $key->getName() . ' ('. $key->getXMLDBKeyName($key->getType()) . ') to be added to ' . $table->getName() . XMLDB_LINEFEED;
780         $result .= '        $table = new xmldb_table(' . "'" . $table->getName() . "'" . ');' . XMLDB_LINEFEED;
781         $result .= '        $key = new xmldb_key(' . "'" . $key->getName() . "', " . $key->getPHP(true) . ');' . XMLDB_LINEFEED;
783     /// Launch the proper DDL
784         $result .= XMLDB_LINEFEED;
785         $result .= '        // Launch add key ' . $key->getName() . XMLDB_LINEFEED;
786         $result .= '        $dbman->add_key($table, $key);' . XMLDB_LINEFEED;
788     /// Add the proper upgrade_xxxx_savepoint call
789         $result .= $this->upgrade_savepoint_php ($structure);
791     /// Add standard PHP footer
792         $result .= XMLDB_PHP_FOOTER;
794         return $result;
795     }
797     /**
798      * This function will generate all the PHP code needed to
799      * drop one key using XMLDB objects and functions
800      *
801      * @param xmldb_structure structure object containing all the info
802      * @param string table table name
803      * @param string key key name to be dropped
804      * @return string PHP code to be used to drop the key
805      */
806     function drop_key_php($structure, $table, $key) {
808         $result = '';
809     /// Validate if we can do it
810         if (!$table = $structure->getTable($table)) {
811             return false;
812         }
813         if (!$key = $table->getKey($key)) {
814             return false;
815         }
816         if ($table->getAllErrors()) {
817             return false;
818         }
820     /// Add the standard PHP header
821         $result .= XMLDB_PHP_HEADER;
823     /// Add contents
824         $result .= XMLDB_LINEFEED;
825         $result .= '        // Define key ' . $key->getName() . ' ('. $key->getXMLDBKeyName($key->getType()) . ') to be dropped form ' . $table->getName() . XMLDB_LINEFEED;
826         $result .= '        $table = new xmldb_table(' . "'" . $table->getName() . "'" . ');' . XMLDB_LINEFEED;
827         $result .= '        $key = new xmldb_key(' . "'" . $key->getName() . "', " . $key->getPHP(true) . ');' . XMLDB_LINEFEED;
829     /// Launch the proper DDL
830         $result .= XMLDB_LINEFEED;
831         $result .= '        // Launch drop key ' . $key->getName() . XMLDB_LINEFEED;
832         $result .= '        $dbman->drop_key($table, $key);' . XMLDB_LINEFEED;
834     /// Add the proper upgrade_xxxx_savepoint call
835         $result .= $this->upgrade_savepoint_php ($structure);
837     /// Add standard PHP footer
838         $result .= XMLDB_PHP_FOOTER;
840         return $result;
841     }
843     /**
844      * This function will generate all the PHP code needed to
845      * rename one key using XMLDB objects and functions
846      *
847      * @param xmldb_structure structure object containing all the info
848      * @param string table table name
849      * @param string key key name to be renamed
850      * @return string PHP code to be used to rename the key
851      */
852     function rename_key_php($structure, $table, $key) {
854         $result = '';
855     /// Validate if we can do it
856         if (!$table = $structure->getTable($table)) {
857             return false;
858         }
859         if (!$key = $table->getKey($key)) {
860             return false;
861         }
862         if ($table->getAllErrors()) {
863             return false;
864         }
866     /// Prepend warning. This function isn't usable!
867         $result .= 'DON\'T USE THIS FUNCTION (IT\'S ONLY EXPERIMENTAL). SOME DBs DON\'T SUPPORT IT!' . XMLDB_LINEFEED . XMLDB_LINEFEED;
869     /// Add the standard PHP header
870         $result .= XMLDB_PHP_HEADER;
872     /// Add contents
873         $result .= XMLDB_LINEFEED;
874         $result .= '        // Define key ' . $key->getName() . ' ('. $key->getXMLDBKeyName($key->getType()) . ') to be renamed to NEWNAMEGOESHERE' . XMLDB_LINEFEED;
875         $result .= '        $table = new xmldb_table(' . "'" . $table->getName() . "'" . ');' . XMLDB_LINEFEED;
876         $result .= '        $key = new xmldb_key(' . "'" . $key->getName() . "', " . $key->getPHP(true) . ');' . XMLDB_LINEFEED;
878     /// Launch the proper DDL
879         $result .= XMLDB_LINEFEED;
880         $result .= '        // Launch rename key ' . $key->getName() . XMLDB_LINEFEED;
881         $result .= '        $dbman->rename_key($table, $key, ' . "'" . 'NEWNAMEGOESHERE' . "'" . ');' . XMLDB_LINEFEED;
883     /// Add the proper upgrade_xxxx_savepoint call
884         $result .= $this->upgrade_savepoint_php ($structure);
886     /// Add standard PHP footer
887         $result .= XMLDB_PHP_FOOTER;
889         return $result;
890     }
892     /**
893      * This function will generate all the PHP code needed to
894      * create one index using XMLDB objects and functions
895      *
896      * @param xmldb_structure structure object containing all the info
897      * @param string table table name
898      * @param string index index name to be created
899      * @return string PHP code to be used to create the index
900      */
901     function add_index_php($structure, $table, $index) {
903         $result = '';
904     /// Validate if we can do it
905         if (!$table = $structure->getTable($table)) {
906             return false;
907         }
908         if (!$index = $table->getIndex($index)) {
909             return false;
910         }
911         if ($table->getAllErrors()) {
912             return false;
913         }
915     /// Add the standard PHP header
916         $result .= XMLDB_PHP_HEADER;
918     /// Add contents
919         $result .= XMLDB_LINEFEED;
920         $result .= '        // Define index ' . $index->getName() . ' ('. ($index->getUnique() ? 'unique' : 'not unique') . ') to be added to ' . $table->getName() . XMLDB_LINEFEED;
921         $result .= '        $table = new xmldb_table(' . "'" . $table->getName() . "'" . ');' . XMLDB_LINEFEED;
922         $result .= '        $index = new xmldb_index(' . "'" . $index->getName() . "', " . $index->getPHP(true) . ');' . XMLDB_LINEFEED;
924     /// Launch the proper DDL
925         $result .= XMLDB_LINEFEED;
926         $result .= '        // Conditionally launch add index ' . $index->getName() . XMLDB_LINEFEED;
927         $result .= '        if (!$dbman->index_exists($table, $index)) {' . XMLDB_LINEFEED;
928         $result .= '            $dbman->add_index($table, $index);' . XMLDB_LINEFEED;
929         $result .= '        }' . XMLDB_LINEFEED;
931     /// Add the proper upgrade_xxxx_savepoint call
932         $result .= $this->upgrade_savepoint_php ($structure);
934     /// Add standard PHP footer
935         $result .= XMLDB_PHP_FOOTER;
937         return $result;
938     }
940     /**
941      * This function will generate all the PHP code needed to
942      * drop one index using XMLDB objects and functions
943      *
944      * @param xmldb_structure structure object containing all the info
945      * @param string table table name
946      * @param string index index name to be dropped
947      * @return string PHP code to be used to drop the index
948      */
949     function drop_index_php($structure, $table, $index) {
951         $result = '';
952     /// Validate if we can do it
953         if (!$table = $structure->getTable($table)) {
954             return false;
955         }
956         if (!$index = $table->getIndex($index)) {
957             return false;
958         }
959         if ($table->getAllErrors()) {
960             return false;
961         }
963     /// Add the standard PHP header
964         $result .= XMLDB_PHP_HEADER;
966     /// Add contents
967         $result .= XMLDB_LINEFEED;
968         $result .= '        // Define index ' . $index->getName() . ' ('. ($index->getUnique() ? 'unique' : 'not unique') . ') to be dropped form ' . $table->getName() . XMLDB_LINEFEED;
969         $result .= '        $table = new xmldb_table(' . "'" . $table->getName() . "'" . ');' . XMLDB_LINEFEED;
970         $result .= '        $index = new xmldb_index(' . "'" . $index->getName() . "', " . $index->getPHP(true) . ');' . XMLDB_LINEFEED;
972     /// Launch the proper DDL
973         $result .= XMLDB_LINEFEED;
974         $result .= '        // Conditionally launch drop index ' . $index->getName() . XMLDB_LINEFEED;
975         $result .= '        if ($dbman->index_exists($table, $index)) {' . XMLDB_LINEFEED;
976         $result .= '            $dbman->drop_index($table, $index);' . XMLDB_LINEFEED;
977         $result .= '        }' . XMLDB_LINEFEED;
979     /// Add the proper upgrade_xxxx_savepoint call
980         $result .= $this->upgrade_savepoint_php ($structure);
982     /// Add standard PHP footer
983         $result .= XMLDB_PHP_FOOTER;
985         return $result;
986     }
988     /**
989      * This function will generate all the PHP code needed to
990      * rename one index using XMLDB objects and functions
991      *
992      * @param xmldb_structure structure object containing all the info
993      * @param string table table name
994      * @param string index index name to be renamed
995      * @return string PHP code to be used to rename the index
996      */
997     function rename_index_php($structure, $table, $index) {
999         $result = '';
1000     /// Validate if we can do it
1001         if (!$table = $structure->getTable($table)) {
1002             return false;
1003         }
1004         if (!$index = $table->getIndex($index)) {
1005             return false;
1006         }
1007         if ($table->getAllErrors()) {
1008             return false;
1009         }
1011     /// Prepend warning. This function isn't usable!
1012         $result .= 'DON\'T USE THIS FUNCTION (IT\'S ONLY EXPERIMENTAL). SOME DBs DON\'T SUPPORT IT!' . XMLDB_LINEFEED . XMLDB_LINEFEED;
1014     /// Add the standard PHP header
1015         $result .= XMLDB_PHP_HEADER;
1017     /// Add contents
1018         $result .= XMLDB_LINEFEED;
1019         $result .= '        // Define index ' . $index->getName() . ' ('. ($index->getUnique() ? 'unique' : 'not unique') . ') to be renamed to NEWNAMEGOESHERE' . XMLDB_LINEFEED;
1020         $result .= '        $table = new xmldb_table(' . "'" . $table->getName() . "'" . ');' . XMLDB_LINEFEED;
1021         $result .= '        $index = new xmldb_index(' . "'" . $index->getName() . "', " . $index->getPHP(true) . ');' . XMLDB_LINEFEED;
1023     /// Launch the proper DDL
1024         $result .= XMLDB_LINEFEED;
1025         $result .= '        // Launch rename index ' . $index->getName() . XMLDB_LINEFEED;
1026         $result .= '        $dbman->rename_index($table, $index, ' . "'" . 'NEWNAMEGOESHERE' . "'" . ');' . XMLDB_LINEFEED;
1028     /// Add the proper upgrade_xxxx_savepoint call
1029         $result .= $this->upgrade_savepoint_php ($structure);
1031     /// Add standard PHP footer
1032         $result .= XMLDB_PHP_FOOTER;
1034         return $result;
1035     }