From fe4c19304539024cc86299b400923f3701454560 Mon Sep 17 00:00:00 2001 From: Ben Murden Date: Tue, 5 Apr 2011 17:10:04 +0100 Subject: [PATCH 1/3] Added logic for use with defined schema in Oracle A "schema" key can be used in the database config when you want to access a different schema without having to always use the dot syntax. This also improves efficiency when you only use tables from one schema. --- cake/libs/model/datasources/dbo/dbo_oracle.php | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/cake/libs/model/datasources/dbo/dbo_oracle.php b/cake/libs/model/datasources/dbo/dbo_oracle.php index 38fb0338278..229ff5e3d3f 100644 --- a/cake/libs/model/datasources/dbo/dbo_oracle.php +++ b/cake/libs/model/datasources/dbo/dbo_oracle.php @@ -187,6 +187,9 @@ function connect() { if (!empty($config['nls_comp'])) { $this->execute('ALTER SESSION SET NLS_COMP='.$config['nls_comp']); } + if (!empty($config['schema'])) { + $this->execute('ALTER SESSION SET CURRENT_SCHEMA='.$config['schema']); + } $this->execute("ALTER SESSION SET NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS'"); } else { $this->connected = false; @@ -463,11 +466,17 @@ function createTrigger($table) { * @access public */ function listSources() { + $config = $this->config; $cache = parent::listSources(); if ($cache != null) { return $cache; } - $sql = 'SELECT view_name AS name FROM all_views UNION SELECT table_name AS name FROM all_tables'; + + if (!empty($config['schema'])) { + $sql = 'SELECT view_name AS name FROM all_views WHERE owner = \'' . $config['schema'] . '\' UNION SELECT table_name AS name FROM all_tables WHERE owner = \'' . $config['schema'] . '\''; + } else { + $sql = 'SELECT view_name AS name FROM all_views UNION SELECT table_name AS name FROM all_tables'; + } if (!$this->execute($sql)) { return false; From f7f097b5ddf2a4463bfaa9890cd211f1daaa65c6 Mon Sep 17 00:00:00 2001 From: Ben Murden Date: Wed, 6 Apr 2011 10:02:41 +0100 Subject: [PATCH 2/3] Added tablePrefix to described sequences This avoids conflicts with separate sequences used in test suite fixtures, for example. --- cake/libs/model/datasources/dbo/dbo_oracle.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cake/libs/model/datasources/dbo/dbo_oracle.php b/cake/libs/model/datasources/dbo/dbo_oracle.php index 229ff5e3d3f..5d72466e89f 100644 --- a/cake/libs/model/datasources/dbo/dbo_oracle.php +++ b/cake/libs/model/datasources/dbo/dbo_oracle.php @@ -503,7 +503,7 @@ function describe(&$model) { if (!empty($model->sequence)) { $this->_sequenceMap[$table] = $model->sequence; } elseif (!empty($model->table)) { - $this->_sequenceMap[$table] = $model->table . '_seq'; + $this->_sequenceMap[$table] = $model->tablePrefix . $model->table . '_seq'; } $cache = parent::describe($model); From 61a511a2e25edc32bde22938c557de6526debff8 Mon Sep 17 00:00:00 2001 From: Ben Murden Date: Wed, 6 Apr 2011 12:46:30 +0100 Subject: [PATCH 3/3] Fix lastInsertId in Oracle when persistModel is used The persistModel switch in controllers means describe is not always called, so the sequenceMap is not generated. This patch addresses that by checking the associated model for relevant information when the sequenceMap data is not available. --- cake/libs/model/datasources/dbo/dbo_oracle.php | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/cake/libs/model/datasources/dbo/dbo_oracle.php b/cake/libs/model/datasources/dbo/dbo_oracle.php index 5d72466e89f..d95e79c10ff 100644 --- a/cake/libs/model/datasources/dbo/dbo_oracle.php +++ b/cake/libs/model/datasources/dbo/dbo_oracle.php @@ -906,7 +906,18 @@ function value($data, $column = null, $safe = false) { * @access public */ function lastInsertId($source) { - $sequence = $this->_sequenceMap[$source]; + if (empty($this->_sequenceMap[$source])) { + + $model = ClassRegistry::init($source); + + if (!empty($model->sequence)) { + $sequence = $model->sequence; + } elseif (!empty($model->table)) { + $sequence = $model->tablePrefix . $model->table . '_seq'; + } + } else { + $sequence = $this->_sequenceMap[$source]; + } $sql = "SELECT $sequence.currval FROM dual"; if (!$this->execute($sql)) {