From 06440ab6dca216379a8c0a24e9561d9a1989828c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miloslav=20H=C5=AFla?= Date: Fri, 17 Apr 2015 15:17:14 +0200 Subject: [PATCH 1/3] OracleDriver: shut-up oci_execute() The oci_execute() emits warnings e.g. on denied permissions when EXPLAIN. --- dibi/drivers/DibiOracleDriver.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dibi/drivers/DibiOracleDriver.php b/dibi/drivers/DibiOracleDriver.php index 145074a2..f4d17ae0 100644 --- a/dibi/drivers/DibiOracleDriver.php +++ b/dibi/drivers/DibiOracleDriver.php @@ -103,7 +103,7 @@ class DibiOracleDriver extends DibiObject implements IDibiDriver, IDibiResultDri { $res = oci_parse($this->connection, $sql); if ($res) { - oci_execute($res, $this->autocommit ? OCI_COMMIT_ON_SUCCESS : OCI_DEFAULT); + @oci_execute($res, $this->autocommit ? OCI_COMMIT_ON_SUCCESS : OCI_DEFAULT); $err = oci_error($res); if ($err) { throw new DibiDriverException($err['message'], $err['code'], $sql); From 64b3d0c6f42023abed16c521609af8f6fff054dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miloslav=20H=C5=AFla?= Date: Fri, 17 Apr 2015 15:21:21 +0200 Subject: [PATCH 2/3] Tracy panels: Oracle uses EXPLAIN PLAN FOR Warning 'ORA-00905: missing keyword' is emmited otherwise. --- dibi/bridges/Nette-2.1/DibiNettePanel.php | 2 +- dibi/bridges/Tracy/Panel.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/dibi/bridges/Nette-2.1/DibiNettePanel.php b/dibi/bridges/Nette-2.1/DibiNettePanel.php index f938a874..c8104d66 100644 --- a/dibi/bridges/Nette-2.1/DibiNettePanel.php +++ b/dibi/bridges/Nette-2.1/DibiNettePanel.php @@ -104,7 +104,7 @@ class DibiNettePanel extends DibiObject implements Nette\Diagnostics\IBarPanel try { $backup = array($event->connection->onEvent, dibi::$numOfQueries, dibi::$totalTime); $event->connection->onEvent = NULL; - $cmd = is_string($this->explain) ? $this->explain : ($event->connection->getConfig('driver') === 'oracle' ? 'EXPLAIN PLAN' : 'EXPLAIN'); + $cmd = is_string($this->explain) ? $this->explain : ($event->connection->getConfig('driver') === 'oracle' ? 'EXPLAIN PLAN FOR' : 'EXPLAIN'); $explain = dibi::dump($event->connection->nativeQuery("$cmd $event->sql"), TRUE); } catch (DibiException $e) {} list($event->connection->onEvent, dibi::$numOfQueries, dibi::$totalTime) = $backup; diff --git a/dibi/bridges/Tracy/Panel.php b/dibi/bridges/Tracy/Panel.php index 0115c957..dac19e4f 100644 --- a/dibi/bridges/Tracy/Panel.php +++ b/dibi/bridges/Tracy/Panel.php @@ -107,7 +107,7 @@ class Panel extends \DibiObject implements Tracy\IBarPanel try { $backup = array($event->connection->onEvent, dibi::$numOfQueries, dibi::$totalTime); $event->connection->onEvent = NULL; - $cmd = is_string($this->explain) ? $this->explain : ($event->connection->getConfig('driver') === 'oracle' ? 'EXPLAIN PLAN' : 'EXPLAIN'); + $cmd = is_string($this->explain) ? $this->explain : ($event->connection->getConfig('driver') === 'oracle' ? 'EXPLAIN PLAN FOR' : 'EXPLAIN'); $explain = dibi::dump($event->connection->nativeQuery("$cmd $event->sql"), TRUE); } catch (\DibiException $e) {} list($event->connection->onEvent, dibi::$numOfQueries, dibi::$totalTime) = $backup; From 999f51a7bd190463c7a8a070c03d2caf54bdfc42 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miloslav=20H=C5=AFla?= Date: Fri, 17 Apr 2015 15:22:45 +0200 Subject: [PATCH 3/3] OracleDriver: cast type NUMBER(p, 0) as an INTEGER In many cases, Oracle returns integers as a NUMBER(8,0). Type NUMBER is casted to (float) which is unnecessary in this case. --- dibi/drivers/DibiOracleDriver.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/dibi/drivers/DibiOracleDriver.php b/dibi/drivers/DibiOracleDriver.php index f4d17ae0..7ec760f6 100644 --- a/dibi/drivers/DibiOracleDriver.php +++ b/dibi/drivers/DibiOracleDriver.php @@ -365,11 +365,12 @@ class DibiOracleDriver extends DibiObject implements IDibiDriver, IDibiResultDri $count = oci_num_fields($this->resultSet); $columns = array(); for ($i = 1; $i <= $count; $i++) { + $type = oci_field_type($this->resultSet, $i); $columns[] = array( 'name' => oci_field_name($this->resultSet, $i), 'table' => NULL, 'fullname' => oci_field_name($this->resultSet, $i), - 'nativetype'=> oci_field_type($this->resultSet, $i), + 'nativetype' => $type === 'NUMBER' && oci_field_scale($this->resultSet, $i) === 0 ? 'INTEGER' : $type, ); } return $columns;