예제 #1
0
 public static function TableAsXML($table_name, $table = false)
 {
     if ($table === false) {
         $table = new XML('<table/>');
     }
     $table['name'] = $table_name;
     $indexes = self::GetIndexes($table_name);
     foreach ($indexes['index'] as $index_str) {
         $table->addChild('index', $index_str);
     }
     foreach ($indexes['unique'] as $index_str) {
         $table->addChild('unique', $index_str);
     }
     $table['primary_key'] = isset($indexes['primary']) ? $indexes['primary'] : false;
     $cols = DB::all("DESCRIBE " . DB::quoteField($table_name));
     foreach ($cols as $col) {
         $field = $table->addChild('field');
         $name = $col['Field'];
         $type = $col['Type'];
         $key = $col['Key'];
         $default = $col['Default'];
         $null = $col['Null'];
         $extra = $col['Extra'];
         $field['name'] = $name;
         // type, size
         if (preg_match('/^([a-z]+)\\(([0-9]+)\\) unsigned$/', $type, $match)) {
             $field['type'] = self::NormalizeType($match[1]);
             $field['size'] = $match[2];
             $field['signed'] = 'n';
         } elseif (preg_match('/^([a-z]+)\\(([0-9]+)\\)$/', $type, $match)) {
             $field['type'] = self::NormalizeType($match[1]);
             $field['size'] = $match[2];
         } elseif (preg_match('/^(decimal)\\(([0-9]+,[0-9]+)\\)$/', $type, $match)) {
             $field['type'] = self::NormalizeType($match[1]);
             $field['size'] = $match[2];
         } elseif (preg_match('/^(enum|set)\\((.+)\\)$/', $type, $match)) {
             $options = array();
             foreach (explode(',', $match[2]) as $option) {
                 if (preg_match("/^'(.+)'\$/", $option, $match2)) {
                     $options[] = $match2[1];
                 }
             }
             $field['type'] = self::NormalizeType($match[1]);
             $field['size'] = join(',', $options);
         } elseif (in_array($type, array('tinytext', 'text', 'blob', 'longblob'))) {
             $field['type'] = self::NormalizeType($type);
         } else {
             debug($type);
         }
         if ($field['type'] == 'int' && !isset($field['signed'])) {
             $field['signed'] = 'y';
         }
         // default
         if ($default !== NULL) {
             $field['default'] = $default;
         } else {
             $field['null'] = 'y';
         }
         if ($null == 'YES') {
             $field['null'] = 'y';
         } elseif ($null == 'NO') {
             $field['null'] = 'n';
         }
         // auto_increment
         if ($extra == 'auto_increment') {
             $field['auto_increment'] = 'y';
         } elseif ($extra) {
             debug($extra);
         }
     }
     return $table;
 }