2424
2525namespace OC \DB ;
2626
27+ use Doctrine \DBAL \DBALException ;
28+
2729class AdapterPgSql extends Adapter {
30+ protected $ compatModePre9_5 = null ;
31+
2832 public function lastInsertId ($ table ) {
2933 return $ this ->conn ->fetchColumn ('SELECT lastval() ' );
3034 }
@@ -40,12 +44,29 @@ public function fixupStatement($statement) {
4044 * @suppress SqlInjectionChecker
4145 */
4246 public function insertIgnoreConflict (string $ table ,array $ values ) : int {
47+ if ($ this ->isPre9_5CompatMode () === true ) {
48+ return parent ::insertIgnoreConflict ($ table , $ values );
49+ }
50+
51+ // "upsert" is only available since PgSQL 9.5, but the generic way
52+ // would leave error logs in the DB.
4353 $ builder = $ this ->conn ->getQueryBuilder ();
4454 $ builder ->insert ($ table );
45- foreach ($ values as $ key => $ value ) {
55+ foreach ($ values as $ key => $ value ) {
4656 $ builder ->setValue ($ key , $ builder ->createNamedParameter ($ value ));
4757 }
4858 $ queryString = $ builder ->getSQL () . ' ON CONFLICT DO NOTHING ' ;
4959 return $ this ->conn ->executeUpdate ($ queryString , $ builder ->getParameters (), $ builder ->getParameterTypes ());
5060 }
61+
62+ protected function isPre9_5CompatMode (): bool {
63+ if ($ this ->compatModePre9_5 !== null ) {
64+ return $ this ->compatModePre9_5 ;
65+ }
66+
67+ $ version = $ this ->conn ->fetchColumn ('SHOW SERVER_VERSION ' );
68+ $ this ->compatModePre9_5 = version_compare ($ version , '9.5 ' , '< ' );
69+
70+ return $ this ->compatModePre9_5 ;
71+ }
5172}
0 commit comments