diff --git a/dibi/drivers/mssql2005.php b/dibi/drivers/mssql2005.php index c2b124d9..4cffc3a3 100644 --- a/dibi/drivers/mssql2005.php +++ b/dibi/drivers/mssql2005.php @@ -10,6 +10,9 @@ */ +require_once dirname(__FILE__) . '/mssql2005.reflector.php'; + + /** * The dibi driver for MS SQL Driver 2005 database. * @@ -198,7 +201,7 @@ class DibiMsSql2005Driver extends DibiObject implements IDibiDriver, IDibiResult */ public function getReflector() { - throw new DibiNotSupportedException; + return new DibiMssql2005Reflector($this); } diff --git a/dibi/drivers/mssql2005.reflector.php b/dibi/drivers/mssql2005.reflector.php new file mode 100644 index 00000000..1a292857 --- /dev/null +++ b/dibi/drivers/mssql2005.reflector.php @@ -0,0 +1,130 @@ +driver = $driver; + } + + + + /** + * Returns list of tables. + * @return array + */ + public function getTables() + { + $res = $this->driver->query('SELECT TABLE_NAME, TABLE_TYPE FROM INFORMATION_SCHEMA.TABLES'); + $tables = array(); + while ($row = $res->fetch(FALSE)) { + $tables[] = array( + 'name' => $row[0], + 'view' => isset($row[1]) && $row[1] === 'VIEW', + ); + } + return $tables; + } + + + + /** + * Returns metadata for all columns in a table. + * @param string + * @return array + */ + public function getColumns($table) + { + $res = $this->driver->query("SELECT + C.COLUMN_NAME, C.DATA_TYPE, C.CHARACTER_MAXIMUM_LENGTH, C.COLUMN_DEFAULT, C.NUMERIC_PRECISION, C.NUMERIC_SCALE, C.IS_NULLABLE, Case When Z.CONSTRAINT_NAME Is Null Then 0 Else 1 End As IsPartOfPrimaryKey + FROM INFORMATION_SCHEMA.COLUMNS As C + Outer Apply ( + SELECT CCU.CONSTRAINT_NAME + FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS As TC + Join INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE As CCU + On CCU.CONSTRAINT_NAME = TC.CONSTRAINT_NAME + WHERE TC.TABLE_SCHEMA = C.TABLE_SCHEMA + And TC.TABLE_NAME = C.TABLE_NAME + And TC.CONSTRAINT_TYPE = 'PRIMARY KEY' + And CCU.COLUMN_NAME = C.COLUMN_NAME + ) As Z + WHERE C.TABLE_NAME = '$table'" + ); + $columns = array(); + while ($row = $res->fetch(TRUE)) { + $columns[] = array( + 'name' => $row['COLUMN_NAME'], + 'table' => $table, + 'nativetype' => strtoupper($row['DATA_TYPE']), + 'size' => $row['CHARACTER_MAXIMUM_LENGTH'], + 'unsigned' => TRUE, + 'nullable' => $row['IS_NULLABLE'] === 'YES', + 'default' => $row['COLUMN_DEFAULT'], + 'autoincrement' => (bool) $row['IsPartOfPrimaryKey'] && strtoupper($row['DATA_TYPE']) === 'INT', + 'vendor' => $row, + ); + } + return $columns; + } + + + + /** + * Returns metadata for all indexes in a table. + * @param string + * @return array + */ + public function getIndexes($table) + { + $keyUsagesRes = $this->driver->query("SELECT * FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE TABLE_NAME = '$table'"); + $keyUsages = array(); + while( $row = $keyUsagesRes->fetch(TRUE) ) { + $keyUsages[$row['CONSTRAINT_NAME']][(int) $row['ORDINAL_POSITION'] - 1] = $row['COLUMN_NAME']; + } + + $res = $this->driver->query("SELECT * FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE TABLE_NAME = '$table'"); + $indexes = array(); + while ($row = $res->fetch(TRUE)) { + $indexes[$row['CONSTRAINT_NAME']]['name'] = $row['CONSTRAINT_NAME']; + $indexes[$row['CONSTRAINT_NAME']]['unique'] = $row['CONSTRAINT_TYPE'] === 'UNIQUE'; + $indexes[$row['CONSTRAINT_NAME']]['primary'] = $row['CONSTRAINT_TYPE'] === 'PRIMARY KEY'; + $indexes[$row['CONSTRAINT_NAME']]['columns'] = isset($keyUsages[$row['CONSTRAINT_NAME']]) ? $keyUsages[$row['CONSTRAINT_NAME']] : array(); + } + return array_values($indexes); + } + + + + /** + * Returns metadata for all foreign keys in a table. + * @param string + * @return array + */ + public function getForeignKeys($table) + { + throw new DibiNotImplementedException; + } + +}