]> git.mjollnir.org Git - moodle.git/commitdiff
adding support for alter columns
authorstronk7 <stronk7>
Sat, 23 Sep 2006 21:24:51 +0000 (21:24 +0000)
committerstronk7 <stronk7>
Sat, 23 Sep 2006 21:24:51 +0000 (21:24 +0000)
(not finished yet)

lib/ddllib.php
lib/xmldb/classes/XMLDBTable.class.php
lib/xmldb/classes/generators/XMLDBGenerator.class.php

index 30b60c8714bff84bf97925a1bf340c196802686f..345952bf8170b2ef2e71dfc2146680fbe780d7eb 100644 (file)
@@ -390,4 +390,97 @@ function drop_field($table, $field, $continue=true, $feedback=true) {
     return execute_sql_arr($sqlarr, $continue, $feedback);
 }
 
+/**
+ * This function will change the precision of the field in the table passed as arguments
+ *
+ * @uses $CFG, $db
+ * @param XMLDBTable table object (just the name is mandatory)
+ * @param XMLDBField field object (full specs are required)
+ * @param boolean continue to specify if must continue on error (true) or stop (false)
+ * @param boolean feedback to specify to show status info (true) or not (false)
+ * @return boolean true on success, false on error
+ */
+function change_field_precision($table, $field, $continue=true, $feedback=true) {
+
+    global $CFG, $db;
+
+    $status = true;
+
+    if (strtolower(get_class($table)) != 'xmldbtable') {
+        return false;
+    }
+    if (strtolower(get_class($field)) != 'xmldbfield') {
+        return false;
+    }
+
+    if(!$sqlarr = $table->getAlterFieldSQL($CFG->dbtype, $CFG->prefix, $field, false)) {
+        return false;
+    }
+
+    return execute_sql_arr($sqlarr, $continue, $feedback);
+}
+
+/**
+ * This function will change the unsigned/signed of the field in the table passed as arguments
+ *
+ * @uses $CFG, $db
+ * @param XMLDBTable table object (just the name is mandatory)
+ * @param XMLDBField field object (full specs are required)
+ * @param boolean continue to specify if must continue on error (true) or stop (false)
+ * @param boolean feedback to specify to show status info (true) or not (false)
+ * @return boolean true on success, false on error
+ */
+function change_field_unsigned($table, $field, $continue=true, $feedback=true) {
+
+/// Just a wrapper over change_field_precision. Does exactly the same processing
+    return change_field_precision($table, $field, $continue, $feedback);
+}
+
+/**
+ * This function will change the nullability of the field in the table passed as arguments
+ *
+ * @uses $CFG, $db
+ * @param XMLDBTable table object (just the name is mandatory)
+ * @param XMLDBField field object (full specs are required)
+ * @param boolean continue to specify if must continue on error (true) or stop (false)
+ * @param boolean feedback to specify to show status info (true) or not (false)
+ * @return boolean true on success, false on error
+ */
+function change_field_notnull($table, $field, $continue=true, $feedback=true) {
+
+/// Just a wrapper over change_field_precision. Does exactly the same processing
+    return change_field_precision($table, $field, $continue, $feedback);
+}
+
+/**
+ * This function will change the default of the field in the table passed as arguments
+ * One null value in the default field means delete the default
+ *
+ * @uses $CFG, $db
+ * @param XMLDBTable table object (just the name is mandatory)
+ * @param XMLDBField field object (full specs are required)
+ * @param boolean continue to specify if must continue on error (true) or stop (false)
+ * @param boolean feedback to specify to show status info (true) or not (false)
+ * @return boolean true on success, false on error
+ */
+function change_field_default($table, $field, $continue=true, $feedback=true) {
+
+    global $CFG, $db;
+
+    $status = true;
+
+    if (strtolower(get_class($table)) != 'xmldbtable') {
+        return false;
+    }
+    if (strtolower(get_class($field)) != 'xmldbfield') {
+        return false;
+    }
+
+    if(!$sqlarr = $table->getModifyDefaultSQL($CFG->dbtype, $CFG->prefix, $field, false)) {
+        return false;
+    }
+
+    return execute_sql_arr($sqlarr, $continue, $feedback);
+}
+
 ?>
index 83fadb9c022e6869af20c167a1ca1cb8fddbc16f..14be97380316673ce96967ab5268ea4b5ae2225b 100644 (file)
@@ -873,6 +873,42 @@ class XMLDBTable extends XMLDBObject {
         return $results;
     }
 
+    /**
+     * This function will return the SQL code needed to alter one field in the table for the specified DB and
+     * prefix. Just one simple wrapper over generators.
+     */
+    function getAlterFieldSQL ($dbtype, $prefix, $xmldb_field, $statement_end=true) {
+
+        $results = array();
+
+        $classname = 'XMLDB' . $dbtype;
+        $generator = new $classname();
+        $generator->setPrefix($prefix);
+        $results = $generator->getAlterFieldSQL($this, $xmldb_field);
+        if ($statement_end) {
+            $results = $generator->getEndedStatements($results);
+        }
+        return $results;
+    }
+
+    /**
+     * This function will return the SQL code needed to modify the default of one field in the table for the specified DB and
+     * prefix. Just one simple wrapper over generators.
+     */
+    function getModifyDefaultSQL ($dbtype, $prefix, $xmldb_field, $statement_end=true) {
+
+        $results = array();
+
+        $classname = 'XMLDB' . $dbtype;
+        $generator = new $classname();
+        $generator->setPrefix($prefix);
+        $results = $generator->getModifyDefaultSQL($this, $xmldb_field);
+        if ($statement_end) {
+            $results = $generator->getEndedStatements($results);
+        }
+        return $results;
+    }
+
 }
 
 ?>
index 36d59b390a3708ca61d2e8de34dfede932098c25..9a8c7f1c1781cf336640128757c7c7ec3e9eaa8c 100644 (file)
@@ -93,6 +93,10 @@ class XMLDBgenerator {
 
     var $drop_table_extra_code = false; //Does the generatos need to add code after table drop
 
+    var $alter_column_sql = 'ALTER TABLE TABLENAME ALTER COLUMN COLUMNSPECS'; //The SQL template to alter columns
+
+    var $alter_column_skip_default = false; //The generator will skip the default clause on alter columns
+
     var $prefix;         // Prefix to be used for all the DB objects
 
     var $reserved_words; // List of reserved words (in order to quote them properly)
@@ -293,7 +297,7 @@ class XMLDBgenerator {
     /**
      * Given one correct XMLDBField, returns the complete SQL line to create it
      */
-    function getFieldSQL($xmldb_field) {
+    function getFieldSQL($xmldb_field, $skip_default_clause = false)  {
 
     /// First of all, convert integers to numbers if defined
         if ($this->integer_to_number) {
@@ -335,7 +339,11 @@ class XMLDBgenerator {
             }
         }
     /// Calculate the default clause
-        $default = $this->getDefaultClause($xmldb_field);
+        if (!$skip_default_clause) { //Only if we don't want to skip it
+            $default = $this->getDefaultClause($xmldb_field);
+        } else {
+            $default = '';
+        }
     /// Based on default_after_null, set both clauses properly
         if ($this->default_after_null) {
             $field .= $notnull . $default;
@@ -522,6 +530,51 @@ class XMLDBgenerator {
         return $results;
     }
 
+    /**
+     * Given one XMLDBTable and one XMLDBField, return the SQL statements needded to alter the field in the table
+     */
+    function getAlterFieldSQL($xmldb_table, $xmldb_field) {
+
+        $results = array();
+
+    /// Get the quoted name of the table and field
+        $tablename = $this->getEncQuoted($this->prefix . $xmldb_table->getName());
+        $fieldname = $this->getEncQuoted($xmldb_field->getName());
+
+    /// Build de alter sentence using the alter_column_sql template
+        $alter = str_replace('TABLENAME', $this->getEncQuoted($this->prefix . $xmldb_table->getName()), $this->alter_column_sql);
+        $alter = str_replace('COLUMNSPECS', $this->getFieldSQL($xmldb_field, $this->alter_column_skip_default), $alter);
+
+    /// Build the standard alter table modify
+        $results[] = $alter;
+
+    /// Add the after clause if necesary
+        if ($this->add_after_clause && $xmldb_field->getPrevious()) {
+            $altertable .= ' after ' . $this->getEncQuoted($xmldb_field->getPrevious());
+        }
+
+        return $results;
+    }
+
+    /**
+     * Given one XMLDBTable and one XMLDBField, return the SQL statements needded to modify the default of the field in the table
+     */
+    function getModifyDefaultSQL($xmldb_table, $xmldb_field) {
+
+        $results = array();
+
+    /// Get the quoted name of the table and field
+        $tablename = $this->getEncQuoted($this->prefix . $xmldb_table->getName());
+        $fieldname = $this->getEncQuoted($xmldb_field->getName());
+
+    /// Decide if we are going to create/modify or to drop the default
+        if ($xmldb_field->getDefault() === null) {
+            return $this->getDropDefaultSQL($xmldb_table, $xmldb_field); //Drop
+        } else {
+            return $this->getCreateDefaultSQL($xmldb_table, $xmldb_field); //Create/modify
+        }
+    }
+
     /**
      * Given three strings (table name, list of fields (comma separated) and suffix), create the proper object name
      * quoting it if necessary