Add sequence support for upsert in DatabaseOracle
authorumherirrender <umherirrender_de.wp@web.de>
Tue, 4 Feb 2014 18:35:10 +0000 (19:35 +0100)
committerUmherirrender <umherirrender_de.wp@web.de>
Sat, 15 Feb 2014 15:43:00 +0000 (15:43 +0000)
In the same way as in selectInsert

Bug: 53710
Change-Id: I26f891da808ecdc932e29eebda71df4c17a29617

includes/db/DatabaseOracle.php

index d304444..81907ba 100644 (file)
@@ -641,8 +641,12 @@ class DatabaseOracle extends DatabaseBase {
                        } else {
                                $first = false;
                        }
-
-                       $sql .= $this->fieldBindStatement( $table, $col, $val );
+                       if ( $this->isQuotedIdentifier( $val ) ) {
+                               $sql .= $this->removeIdentifierQuotes( $val );
+                               unset( $row[$col] );
+                       } else {
+                               $sql .= $this->fieldBindStatement( $table, $col, $val );
+                       }
                }
                $sql .= ')';
 
@@ -773,6 +777,30 @@ class DatabaseOracle extends DatabaseBase {
                return $retval;
        }
 
+       public function upsert( $table, array $rows, array $uniqueIndexes, array $set,
+               $fname = __METHOD__
+       ) {
+               if ( !count( $rows ) ) {
+                       return true; // nothing to do
+               }
+
+               if ( !is_array( reset( $rows ) ) ) {
+                       $rows = array( $rows );
+               }
+
+               $sequenceData = $this->getSequenceData( $table );
+               if ( $sequenceData !== false ) {
+                       // add sequence column to each list of columns, when not set
+                       foreach ( $rows as &$row ) {
+                               if ( !isset( $row[$sequenceData['column']] ) ) {
+                                       $row[$sequenceData['column']] = $this->addIdentifierQuotes('GET_SEQUENCE_VALUE(\'' . $sequenceData['sequence'] . '\')');
+                               }
+                       }
+               }
+
+               return parent::upsert( $table, $rows, $uniqueIndexes, $set, $fname );
+       }
+
        function tableName( $name, $format = 'quoted' ) {
                /*
                Replace reserved words with better ones