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:
committed by
David Grudl
parent
16b254fce1
commit
9001afe7ca
@@ -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,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user