diff options
Diffstat (limited to 'lib/schema.php')
-rw-r--r-- | lib/schema.php | 58 |
1 files changed, 56 insertions, 2 deletions
diff --git a/lib/schema.php b/lib/schema.php index db2f49a78..624765eb2 100644 --- a/lib/schema.php +++ b/lib/schema.php @@ -47,15 +47,65 @@ if (!defined('LACONICA')) { class Schema { - protected $db = null; + static $_single = null; + protected $conn = null; - static function get() + protected function __construct() { + // XXX: there should be an easier way to do this. + $user = new User(); + $this->conn = $user->getDatabaseConnection(); + $user->free(); + unset($user); + } + static function get() + { + if (empty(self::$_single)) { + self::$_single = new Schema(); + } + return self::$_single; } public function getTableDef($name) { + $res =& $this->conn->query('DESCRIBE ' . $name); + + if (PEAR::isError($res)) { + throw new Exception($res->getMessage()); + } + + $td = new TableDef(); + + $td->name = $name; + $td->columns = array(); + + $row = array(); + + while ($res->fetchInto($row, DB_FETCHMODE_ASSOC)) { + + $cd = new ColumnDef(); + + $cd->name = $row['Field']; + + $packed = $row['Type']; + + if (preg_match('/^(\w+)\((\d+)\)$/', $packed, $match)) { + $cd->type = $match[1]; + $cd->size = $match[2]; + } else { + $cd->type = $packed; + } + + $cd->nullable = ($row['Null'] == 'YES') ? true : false; + $cd->key = $row['Key']; + $cd->default = $row['Default']; + $cd->extra = $row['Extra']; + + $td->columns[] = $cd; + } + + return $td; } public function getColumnDef($table, $column) @@ -114,6 +164,10 @@ class ColumnDef public $name; public $type; public $size; + public $nullable; + public $key; + public $default; + public $extra; } class IndexDef |