예제 #1
0
 /**
  * Given one correct xmldb_field, returns the complete SQL line to create it.
  *
  * @param xmldb_table $xmldb_table The table related to $xmldb_field.
  * @param xmldb_field $xmldb_field The instance of xmldb_field to create the SQL from.
  * @param string $skip_type_clause The type clause on alter columns, NULL by default.
  * @param string $skip_default_clause The default clause on alter columns, NULL by default.
  * @param string $skip_notnull_clause The null/notnull clause on alter columns, NULL by default.
  * @param string $specify_nulls_clause To force a specific null clause, NULL by default.
  * @param bool $specify_field_name Flag to specify fieldname in return.
  * @return string The field generating SQL statement.
  * @throws coding_exception Thrown when xmldb_field doesn't validate with the xmldb_table.
  */
 public function getFieldSQL($xmldb_table, $xmldb_field, $skip_type_clause = NULL, $skip_default_clause = NULL, $skip_notnull_clause = NULL, $specify_nulls_clause = NULL, $specify_field_name = true)
 {
     if ($error = $xmldb_field->validateDefinition($xmldb_table)) {
         throw new coding_exception($error);
     }
     $skip_type_clause = is_null($skip_type_clause) ? $this->alter_column_skip_type : $skip_type_clause;
     $skip_default_clause = is_null($skip_default_clause) ? $this->alter_column_skip_default : $skip_default_clause;
     $skip_notnull_clause = is_null($skip_notnull_clause) ? $this->alter_column_skip_notnull : $skip_notnull_clause;
     $specify_nulls_clause = is_null($specify_nulls_clause) ? $this->specify_nulls : $specify_nulls_clause;
     /// First of all, convert integers to numbers if defined
     if ($this->integer_to_number) {
         if ($xmldb_field->getType() == XMLDB_TYPE_INTEGER) {
             $xmldb_field->setType(XMLDB_TYPE_NUMBER);
         }
     }
     /// Same for floats
     if ($this->float_to_number) {
         if ($xmldb_field->getType() == XMLDB_TYPE_FLOAT) {
             $xmldb_field->setType(XMLDB_TYPE_NUMBER);
         }
     }
     $field = '';
     // Let's accumulate the whole expression based on params and settings
     /// The name
     if ($specify_field_name) {
         $field .= $this->getEncQuoted($xmldb_field->getName());
     }
     /// The type and length only if we don't want to skip it
     if (!$skip_type_clause) {
         /// The type and length
         $field .= ' ' . $this->getTypeSQL($xmldb_field->getType(), $xmldb_field->getLength(), $xmldb_field->getDecimals());
     }
     /// The unsigned if supported
     if ($this->unsigned_allowed && ($xmldb_field->getType() == XMLDB_TYPE_INTEGER || $xmldb_field->getType() == XMLDB_TYPE_NUMBER || $xmldb_field->getType() == XMLDB_TYPE_FLOAT)) {
         if ($xmldb_field->getUnsigned()) {
             $field .= ' unsigned';
         }
     }
     /// Calculate the not null clause
     $notnull = '';
     /// Only if we don't want to skip it
     if (!$skip_notnull_clause) {
         if ($xmldb_field->getNotNull()) {
             $notnull = ' NOT NULL';
         } else {
             if ($specify_nulls_clause) {
                 $notnull = ' NULL';
             }
         }
     }
     /// Calculate the default clause
     $default_clause = '';
     if (!$skip_default_clause) {
         //Only if we don't want to skip it
         $default_clause = $this->getDefaultClause($xmldb_field);
     }
     /// Based on default_after_null, set both clauses properly
     if ($this->default_after_null) {
         $field .= $notnull . $default_clause;
     } else {
         $field .= $default_clause . $notnull;
     }
     /// The sequence
     if ($xmldb_field->getSequence()) {
         if ($xmldb_field->getLength() <= 9 && $this->sequence_name_small) {
             $sequencename = $this->sequence_name_small;
         } else {
             $sequencename = $this->sequence_name;
         }
         $field .= ' ' . $sequencename;
         if ($this->sequence_only) {
             /// We only want the field name and sequence name to be printed
             /// so, calculate it and return
             $sql = $this->getEncQuoted($xmldb_field->getName()) . ' ' . $sequencename;
             return $sql;
         }
     }
     return $field;
 }