1
0
mirror of https://github.com/dg/dibi.git synced 2025-08-05 05:37:39 +02:00

MSSQL2005 driver: autoincrement determination fixed

This commit is contained in:
Daniel Kouba
2012-12-21 10:53:16 +01:00
committed by David Grudl
parent 16b254fce1
commit 9001afe7ca

View File

@@ -57,32 +57,44 @@ class DibiMssql2005Reflector extends DibiObject implements IDibiReflector
*/ */
public function getColumns($table) public function getColumns($table)
{ {
$res = $this->driver->query("SELECT $res = $this->driver->query("
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 SELECT c.name as COLUMN_NAME, c.is_identity AS AUTO_INCREMENT
FROM sys.columns c
INNER JOIN sys.tables t ON c.object_id = t.object_id
WHERE t.name = {$this->driver->escape($table, dibi::TEXT)}
");
$autoIncrements = array();
while ($row = $res->fetch(TRUE)) {
$autoIncrements[$row['COLUMN_NAME']] = (bool) $row['AUTO_INCREMENT'];
}
$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 FROM INFORMATION_SCHEMA.COLUMNS As C
Outer Apply ( Outer Apply (
SELECT CCU.CONSTRAINT_NAME SELECT CCU.CONSTRAINT_NAME
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS As TC FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS As TC
Join INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE As CCU Join INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE As CCU
On CCU.CONSTRAINT_NAME = TC.CONSTRAINT_NAME On CCU.CONSTRAINT_NAME = TC.CONSTRAINT_NAME
WHERE TC.TABLE_SCHEMA = C.TABLE_SCHEMA WHERE TC.TABLE_SCHEMA = C.TABLE_SCHEMA
And TC.TABLE_NAME = C.TABLE_NAME And TC.TABLE_NAME = C.TABLE_NAME
And TC.CONSTRAINT_TYPE = 'PRIMARY KEY' And TC.CONSTRAINT_TYPE = 'PRIMARY KEY'
And CCU.COLUMN_NAME = C.COLUMN_NAME And CCU.COLUMN_NAME = C.COLUMN_NAME
) As Z ) As Z
WHERE C.TABLE_NAME = {$this->driver->escape($table, dibi::TEXT)}" WHERE C.TABLE_NAME = {$this->driver->escape($table, dibi::TEXT)}
); ");
$columns = array(); $columns = array();
while ($row = $res->fetch(TRUE)) { while ($row = $res->fetch(TRUE)) {
$columns[] = array( $columns[] = array(
'name' => $row['COLUMN_NAME'], 'name' => $row['COLUMN_NAME'],
'table' => $table, 'table' => $table,
'nativetype' => strtoupper($row['DATA_TYPE']), 'nativetype' => strtoupper($row['DATA_TYPE']),
'size' => $row['CHARACTER_MAXIMUM_LENGTH'] ? $row['CHARACTER_MAXIMUM_LENGTH'] : NULL, 'size' => $row['CHARACTER_MAXIMUM_LENGTH'],
'unsigned' => TRUE, 'unsigned' => TRUE,
'nullable' => $row['IS_NULLABLE'] === 'YES', 'nullable' => $row['IS_NULLABLE'] === 'YES',
'default' => $row['COLUMN_DEFAULT'], 'default' => $row['COLUMN_DEFAULT'],
'autoincrement' => (bool) $row['IsPartOfPrimaryKey'] && strtoupper($row['DATA_TYPE']) === 'INT', 'autoincrement' => $autoIncrements[$row['COLUMN_NAME']],
'vendor' => $row, 'vendor' => $row,
); );
} }