mirror of
https://github.com/kamilwylegala/cakephp2-php8.git
synced 2024-11-15 03:18:26 +00:00
Update schema reflection for postgres.
Use the schema reflection query from 3.x to provide access to the serial column attributes. These attributes give a more reliable way to access primary key data than comparing the primary key of the model. The old approach failed when schema was generated and concrete model's were missing. Refs #10356
This commit is contained in:
parent
e285df4f82
commit
0b6c23d04f
2 changed files with 39 additions and 20 deletions
|
@ -198,14 +198,26 @@ class Postgres extends DboSource {
|
||||||
$fields = parent::describe($table);
|
$fields = parent::describe($table);
|
||||||
$this->_sequenceMap[$table] = array();
|
$this->_sequenceMap[$table] = array();
|
||||||
$cols = null;
|
$cols = null;
|
||||||
|
$hasPrimary = false;
|
||||||
|
|
||||||
if ($fields === null) {
|
if ($fields === null) {
|
||||||
$cols = $this->_execute(
|
$cols = $this->_execute(
|
||||||
"SELECT DISTINCT table_schema AS schema, column_name AS name, data_type AS type, is_nullable AS null,
|
'SELECT DISTINCT table_schema AS schema,
|
||||||
column_default AS default, ordinal_position AS position, character_maximum_length AS char_length,
|
column_name AS name,
|
||||||
character_octet_length AS oct_length FROM information_schema.columns
|
data_type AS type,
|
||||||
WHERE table_name = ? AND table_schema = ? ORDER BY position",
|
is_nullable AS null,
|
||||||
array($table, $this->config['schema'])
|
column_default AS default,
|
||||||
|
ordinal_position AS position,
|
||||||
|
character_maximum_length AS char_length,
|
||||||
|
character_octet_length AS oct_length,
|
||||||
|
pg_get_serial_sequence(attr.attrelid::regclass::text, attr.attname) IS NOT NULL AS has_serial
|
||||||
|
FROM information_schema.columns c
|
||||||
|
INNER JOIN pg_catalog.pg_namespace ns ON (ns.nspname = table_schema)
|
||||||
|
INNER JOIN pg_catalog.pg_class cl ON (cl.relnamespace = ns.oid AND cl.relname = table_name)
|
||||||
|
LEFT JOIN pg_catalog.pg_attribute attr ON (cl.oid = attr.attrelid AND column_name = attr.attname)
|
||||||
|
WHERE table_name = ? AND table_schema = ? AND table_catalog = ?
|
||||||
|
ORDER BY ordinal_position',
|
||||||
|
array($table, $this->config['schema'], $this->config['database'])
|
||||||
);
|
);
|
||||||
|
|
||||||
// @codingStandardsIgnoreStart
|
// @codingStandardsIgnoreStart
|
||||||
|
@ -238,17 +250,25 @@ class Postgres extends DboSource {
|
||||||
"$1",
|
"$1",
|
||||||
preg_replace('/::.*/', '', $c->default)
|
preg_replace('/::.*/', '', $c->default)
|
||||||
),
|
),
|
||||||
'length' => $length
|
'length' => $length,
|
||||||
);
|
);
|
||||||
if ($model instanceof Model) {
|
|
||||||
if ($c->name === $model->primaryKey) {
|
// Serial columns are primary integer keys
|
||||||
$fields[$c->name]['key'] = 'primary';
|
if ($c->has_serial) {
|
||||||
if (
|
$fields[$c->name]['key'] = 'primary';
|
||||||
$fields[$c->name]['type'] !== 'string' &&
|
$fields[$c->name]['length'] = 11;
|
||||||
$fields[$c->name]['type'] !== 'uuid'
|
$hasPrimary = true;
|
||||||
) {
|
}
|
||||||
$fields[$c->name]['length'] = 11;
|
if ($hasPrimary === false &&
|
||||||
}
|
$model instanceof Model &&
|
||||||
|
$c->name === $model->primaryKey
|
||||||
|
) {
|
||||||
|
$fields[$c->name]['key'] = 'primary';
|
||||||
|
if (
|
||||||
|
$fields[$c->name]['type'] !== 'string' &&
|
||||||
|
$fields[$c->name]['type'] !== 'uuid'
|
||||||
|
) {
|
||||||
|
$fields[$c->name]['length'] = 11;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (
|
if (
|
||||||
|
|
|
@ -688,7 +688,6 @@ class CakeSchemaTest extends CakeTestCase {
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function testSchemaReadWithNonConventionalPrimaryKey() {
|
public function testSchemaReadWithNonConventionalPrimaryKey() {
|
||||||
$this->skipIf($this->db instanceof Postgres, 'Cannot test on Postgres');
|
|
||||||
$db = ConnectionManager::getDataSource('test');
|
$db = ConnectionManager::getDataSource('test');
|
||||||
$fixture = new NonConventionalPrimaryKeyFixture();
|
$fixture = new NonConventionalPrimaryKeyFixture();
|
||||||
$fixture->create($db);
|
$fixture->create($db);
|
||||||
|
@ -700,14 +699,14 @@ class CakeSchemaTest extends CakeTestCase {
|
||||||
));
|
));
|
||||||
$fixture->drop($db);
|
$fixture->drop($db);
|
||||||
|
|
||||||
$hasTable = isset($read['tables']['non_conventional']);
|
$this->assertArrayHasKey('non_conventional', $read['tables']);
|
||||||
$this->assertTrue($hasTable, 'non_conventional table should appear');
|
|
||||||
$versionIdHasKey = isset($read['tables']['non_conventional']['version_id']['key']);
|
$versionIdHasKey = isset($read['tables']['non_conventional']['version_id']['key']);
|
||||||
$this->assertTrue($versionIdHasKey, 'version_id key should be set');
|
$this->assertTrue($versionIdHasKey, 'version_id key should be set');
|
||||||
$versionIdKeyIsPrimary = $read['tables']['non_conventional']['version_id']['key'] === 'primary';
|
$versionIdKeyIsPrimary = $read['tables']['non_conventional']['version_id']['key'] === 'primary';
|
||||||
$this->assertTrue($versionIdKeyIsPrimary, 'version_id key should be primary');
|
$this->assertTrue($versionIdKeyIsPrimary, 'version_id key should be primary');
|
||||||
$idHasNoKey = !isset($read['tables']['non_conventional']['id']['key']);
|
|
||||||
$this->assertTrue($idHasNoKey, 'id key should not be set');
|
$idHasKey = isset($read['tables']['non_conventional']['id']['key']);
|
||||||
|
$this->assertFalse($idHasKey, 'id key should not be set');
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in a new issue