diff --git a/platform/view/services/db/driver/sql/common/binding.go b/platform/view/services/db/driver/sql/common/binding.go index 24e474ee2..901fdb7db 100644 --- a/platform/view/services/db/driver/sql/common/binding.go +++ b/platform/view/services/db/driver/sql/common/binding.go @@ -72,20 +72,17 @@ func (db *BindingPersistence) PutBinding(ephemeral, longTerm view.Identity) erro "INSERT INTO %s (ephemeral_hash, long_term_id) "+ "SELECT '%s', long_term_id FROM %s WHERE ephemeral_hash=$1", db.table, ephemeral.UniqueID(), db.table) - result, err := db.writeDB.Exec(query, longTerm.UniqueID()) - if err != nil { - return errors.Wrapf(err, "failed executing query [%s]", query) - } - rowsAffected, err := result.RowsAffected() - if err != nil { - return errors.Wrapf(err, "query failed: %s", query) - } - if rowsAffected > 1 { + if result, err := db.writeDB.Exec(query, longTerm.UniqueID()); err != nil && errors.Is(db.errorWrapper.WrapError(err), driver.UniqueKeyViolation) { + logger.Warnf("Tuple [%s,%s] already in db. Skipping...", ephemeral, longTerm) + return nil + } else if err != nil { + return errors.Wrapf(err, "failed executing query [%s]", query) + } else if rowsAffected, err := result.RowsAffected(); err != nil { + return errors.Wrapf(err, "failed fetching affected rows for query: %s", query) + } else if rowsAffected > 1 { panic("unexpected result") - } - - if rowsAffected == 1 { + } else if rowsAffected == 1 { logger.Debugf("New binding registered [%s:%s]", ephemeral, longTerm) return nil } @@ -96,11 +93,11 @@ func (db *BindingPersistence) PutBinding(ephemeral, longTerm view.Identity) erro // return errors.Wrapf(err, "failed inserting long-term id and ephemeral id") //} query = fmt.Sprintf("INSERT INTO %s (ephemeral_hash, long_term_id) VALUES ($1, $2)", db.table) - if _, err = db.writeDB.Exec(query, longTerm.UniqueID(), longTerm); err != nil { + if _, err := db.writeDB.Exec(query, longTerm.UniqueID(), longTerm); err != nil { return errors.Wrapf(err, "failed inserting long-term id and ephemeral id") } query = fmt.Sprintf("INSERT INTO %s (ephemeral_hash, long_term_id) VALUES ($1, $2)", db.table) - if _, err = db.writeDB.Exec(query, ephemeral.UniqueID(), longTerm); err != nil { + if _, err := db.writeDB.Exec(query, ephemeral.UniqueID(), longTerm); err != nil { return errors.Wrapf(err, "failed inserting long-term id and ephemeral id") } logger.Infof("Long-term and ephemeral ids registered [%s,%s]", longTerm, ephemeral)