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; }