$rows = [ $rows ];
}
- $affectedRowCount = 0;
- foreach ( $rows as $row ) {
- // Delete rows which collide with this one
- $indexWhereClauses = [];
- foreach ( $uniqueIndexes as $index ) {
- $indexColumns = (array)$index;
- $indexRowValues = array_intersect_key( $row, array_flip( $indexColumns ) );
- if ( count( $indexRowValues ) != count( $indexColumns ) ) {
- throw new DBUnexpectedError(
- $this,
- 'New record does not provide all values for unique key (' .
+ $useTrx = !$this->trxLevel;
+ if ( $useTrx ) {
+ $this->begin( $fname, self::TRANSACTION_INTERNAL );
+ }
+ try {
+ $affectedRowCount = 0;
+ foreach ( $rows as $row ) {
+ // Delete rows which collide with this one
+ $indexWhereClauses = [];
+ foreach ( $uniqueIndexes as $index ) {
+ $indexColumns = (array)$index;
+ $indexRowValues = array_intersect_key( $row, array_flip( $indexColumns ) );
+ if ( count( $indexRowValues ) != count( $indexColumns ) ) {
+ throw new DBUnexpectedError(
+ $this,
+ 'New record does not provide all values for unique key (' .
implode( ', ', $indexColumns ) . ')'
- );
- } elseif ( in_array( null, $indexRowValues, true ) ) {
- throw new DBUnexpectedError(
- $this,
- 'New record has a null value for unique key (' .
+ );
+ } elseif ( in_array( null, $indexRowValues, true ) ) {
+ throw new DBUnexpectedError(
+ $this,
+ 'New record has a null value for unique key (' .
implode( ', ', $indexColumns ) . ')'
- );
+ );
+ }
+ $indexWhereClauses[] = $this->makeList( $indexRowValues, LIST_AND );
}
- $indexWhereClauses[] = $this->makeList( $indexRowValues, LIST_AND );
- }
- if ( $indexWhereClauses ) {
- $this->delete( $table, $this->makeList( $indexWhereClauses, LIST_OR ), $fname );
+ if ( $indexWhereClauses ) {
+ $this->delete( $table, $this->makeList( $indexWhereClauses, LIST_OR ), $fname );
+ $affectedRowCount += $this->affectedRows();
+ }
+
+ // Now insert the row
+ $this->insert( $table, $row, $fname );
$affectedRowCount += $this->affectedRows();
}
-
- // Now insert the row
- $this->insert( $table, $row, $fname );
- $affectedRowCount += $this->affectedRows();
+ } catch ( Exception $e ) {
+ if ( $useTrx ) {
+ $this->rollback( $fname, self::FLUSHING_INTERNAL );
+ }
+ throw $e;
+ }
+ if ( $useTrx ) {
+ $this->commit( $fname, self::FLUSHING_INTERNAL );
}
$this->affectedRowCount = $affectedRowCount;
'uniqueIndexes' => [ 'field' ],
'rows' => [ 'field' => 'text', 'field2' => 'text2' ],
],
- "DELETE FROM replace_table " .
+ "BEGIN; DELETE FROM replace_table " .
"WHERE (field = 'text'); " .
"INSERT INTO replace_table " .
"(field,field2) " .
- "VALUES ('text','text2')"
+ "VALUES ('text','text2'); COMMIT"
],
[
[
'md_deps' => 'deps',
],
],
- "DELETE FROM module_deps " .
+ "BEGIN; DELETE FROM module_deps " .
"WHERE (md_module = 'module' AND md_skin = 'skin'); " .
"INSERT INTO module_deps " .
"(md_module,md_skin,md_deps) " .
- "VALUES ('module','skin','deps')"
+ "VALUES ('module','skin','deps'); COMMIT"
],
[
[
],
],
],
- "DELETE FROM module_deps " .
+ "BEGIN; DELETE FROM module_deps " .
"WHERE (md_module = 'module' AND md_skin = 'skin'); " .
"INSERT INTO module_deps " .
"(md_module,md_skin,md_deps) " .
"WHERE (md_module = 'module2' AND md_skin = 'skin2'); " .
"INSERT INTO module_deps " .
"(md_module,md_skin,md_deps) " .
- "VALUES ('module2','skin2','deps2')"
+ "VALUES ('module2','skin2','deps2'); COMMIT"
],
[
[
],
],
],
- "DELETE FROM module_deps " .
+ "BEGIN; DELETE FROM module_deps " .
"WHERE (md_module = 'module') OR (md_skin = 'skin'); " .
"INSERT INTO module_deps " .
"(md_module,md_skin,md_deps) " .
"WHERE (md_module = 'module2') OR (md_skin = 'skin2'); " .
"INSERT INTO module_deps " .
"(md_module,md_skin,md_deps) " .
- "VALUES ('module2','skin2','deps2')"
+ "VALUES ('module2','skin2','deps2'); COMMIT"
],
[
[
'md_deps' => 'deps',
],
],
- "INSERT INTO module_deps " .
+ "BEGIN; INSERT INTO module_deps " .
"(md_module,md_skin,md_deps) " .
- "VALUES ('module','skin','deps')"
+ "VALUES ('module','skin','deps'); COMMIT"
],
];
}