From ddd69f392bc0c078761c6393b19891488b2a8b4c Mon Sep 17 00:00:00 2001 From: jfelder Date: Fri, 3 Oct 2014 09:38:49 -0400 Subject: [PATCH] adding newline to files, adding multiple insert support --- .travis.yml | 2 +- phpunit.xml | 2 +- .../OracleDB/Connectors/OracleConnector.php | 2 +- src/Jfelder/OracleDB/OCI_PDO/OCI.php | 2 +- src/Jfelder/OracleDB/OCI_PDO/OCIException.php | 8 ++- src/Jfelder/OracleDB/OCI_PDO/OCIStatement.php | 2 +- src/Jfelder/OracleDB/OracleConnection.php | 2 +- .../OracleDB/OracleDBServiceProvider.php | 8 +-- .../OracleDB/Query/Grammars/OracleGrammar.php | 49 ++++++++++++++++++- .../Query/Processors/OracleProcessor.php | 2 +- 10 files changed, 62 insertions(+), 17 deletions(-) diff --git a/.travis.yml b/.travis.yml index 447e2da..d7d1a76 100644 --- a/.travis.yml +++ b/.travis.yml @@ -19,4 +19,4 @@ after_script: matrix: allow_failures: - php: hhvm - fast_finish: true \ No newline at end of file + fast_finish: true diff --git a/phpunit.xml b/phpunit.xml index e89ac6d..3347b75 100644 --- a/phpunit.xml +++ b/phpunit.xml @@ -15,4 +15,4 @@ ./tests/ - \ No newline at end of file + diff --git a/src/Jfelder/OracleDB/Connectors/OracleConnector.php b/src/Jfelder/OracleDB/Connectors/OracleConnector.php index b2cafcf..023e374 100644 --- a/src/Jfelder/OracleDB/Connectors/OracleConnector.php +++ b/src/Jfelder/OracleDB/Connectors/OracleConnector.php @@ -70,4 +70,4 @@ protected function getDsn(array $config) return $rv; } -} \ No newline at end of file +} diff --git a/src/Jfelder/OracleDB/OCI_PDO/OCI.php b/src/Jfelder/OracleDB/OCI_PDO/OCI.php index 42527ff..d8acc58 100644 --- a/src/Jfelder/OracleDB/OCI_PDO/OCI.php +++ b/src/Jfelder/OracleDB/OCI_PDO/OCI.php @@ -427,4 +427,4 @@ public function setExecuteMode($mode) throw new OCIException($this->setErrorInfo('0A000', '9999', "Invalid commit mode specified: {$mode}")); } -} \ No newline at end of file +} diff --git a/src/Jfelder/OracleDB/OCI_PDO/OCIException.php b/src/Jfelder/OracleDB/OCI_PDO/OCIException.php index 000a443..b0349b6 100644 --- a/src/Jfelder/OracleDB/OCI_PDO/OCIException.php +++ b/src/Jfelder/OracleDB/OCI_PDO/OCIException.php @@ -8,10 +8,8 @@ class OCIException extends PDOException /** * Create a new query exception instance. * - * @param string $sql - * @param array $bindings - * @param array $previous - * @return void + * @param string $e + * */ public function __construct($e) { @@ -20,4 +18,4 @@ public function __construct($e) $this->message = "SQLSTATE[$e[0]] " . $e[2]; } -} \ No newline at end of file +} diff --git a/src/Jfelder/OracleDB/OCI_PDO/OCIStatement.php b/src/Jfelder/OracleDB/OCI_PDO/OCIStatement.php index 66e0e60..168f6c0 100644 --- a/src/Jfelder/OracleDB/OCI_PDO/OCIStatement.php +++ b/src/Jfelder/OracleDB/OCI_PDO/OCIStatement.php @@ -548,4 +548,4 @@ private function setErrorInfo($code=null, $error=null, $message = null) return $this->error; } -} \ No newline at end of file +} diff --git a/src/Jfelder/OracleDB/OracleConnection.php b/src/Jfelder/OracleDB/OracleConnection.php index 475ad04..05c2350 100644 --- a/src/Jfelder/OracleDB/OracleConnection.php +++ b/src/Jfelder/OracleDB/OracleConnection.php @@ -34,4 +34,4 @@ protected function getDefaultPostProcessor() return new Query\Processors\OracleProcessor; } -} \ No newline at end of file +} diff --git a/src/Jfelder/OracleDB/OracleDBServiceProvider.php b/src/Jfelder/OracleDB/OracleDBServiceProvider.php index fb0cbd1..db1b93c 100644 --- a/src/Jfelder/OracleDB/OracleDBServiceProvider.php +++ b/src/Jfelder/OracleDB/OracleDBServiceProvider.php @@ -24,9 +24,9 @@ public function boot() /** * Register the service provider. - * - * @return void - */ + * + * @throws \ErrorException + */ public function register() { $this->package('jfelder/oracledb'); @@ -73,4 +73,4 @@ public function provides() return array(); } -} \ No newline at end of file +} diff --git a/src/Jfelder/OracleDB/Query/Grammars/OracleGrammar.php b/src/Jfelder/OracleDB/Query/Grammars/OracleGrammar.php index 68ae39c..7ee8e7b 100644 --- a/src/Jfelder/OracleDB/Query/Grammars/OracleGrammar.php +++ b/src/Jfelder/OracleDB/Query/Grammars/OracleGrammar.php @@ -28,7 +28,54 @@ public function compileSelect(Builder $query) return trim($this->concatenate($components)); } - /** + + /** + * Compile an insert statement into SQL. + * + * @param \Illuminate\Database\Query\Builder $query + * @param array $values + * @return string + */ + public function compileInsert(Builder $query, array $values) + { + // Essentially we will force every insert to be treated as a batch insert which + // simply makes creating the SQL easier for us since we can utilize the same + // basic routine regardless of an amount of records given to us to insert. + $table = $this->wrapTable($query->from); + + if ( ! is_array(reset($values))) + { + $values = array($values); + } + + // If there is only one record being inserted, we will just use the usual query + // grammar insert builder because no special syntax is needed for the single + // row inserts in Oracle. However, if there are multiples, we'll continue. + $count = count($values); + + if ($count == 1) + { + return parent::compileInsert($query, reset($values)); + } + + $columns = $this->columnize(array_keys(reset($values))); + + $rows = array(); + + // Oracle requires us to build the multi-row insert as multiple inserts with + // a select statement at the end. So we'll build out this list of columns + // and then join them all together with select to complete the queries. + $parameters = $this->parameterize(reset($values)); + + for ($i=0; $i<$count; $i++) + { + $rows[] = "into {$table} ({$columns}) values ({$parameters}) "; + } + + return "insert all ".implode($rows)." select 1 from dual"; + } + + /** * Compile an insert and get ID statement into SQL. * * @param \Illuminate\Database\Query\Builder $query diff --git a/src/Jfelder/OracleDB/Query/Processors/OracleProcessor.php b/src/Jfelder/OracleDB/Query/Processors/OracleProcessor.php index 4e73f5f..408acf4 100644 --- a/src/Jfelder/OracleDB/Query/Processors/OracleProcessor.php +++ b/src/Jfelder/OracleDB/Query/Processors/OracleProcessor.php @@ -66,4 +66,4 @@ private function bindType($param) return $param; } -} \ No newline at end of file +}