Search moodle.org's
Developer Documentation


  • Bug fixes for general core bugs in 2.8.x ended 9 November 2015 (12 months).
  • Bug fixes for security issues in 2.8.x ended 9 May 2016 (18 months).
  • minimum PHP 5.4.4 (always use latest PHP 5.4.x or 5.5.x on Windows - http://windows.php.net/download/), PHP 7 is NOT supported
  • Differences Between: [Versions 28 and 34] [Versions 28 and 35] [Versions 28 and 36] [Versions 28 and 37]

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

    Search This Site: