Add more checks for unique constraint violations

This commit is contained in:
Till Faelligen 2022-09-11 09:25:30 +02:00
parent af9a204cc0
commit 240d00e2b6
No known key found for this signature in database
GPG key ID: 3DF82D8AB9211D4E
3 changed files with 34 additions and 9 deletions

View file

@ -155,5 +155,10 @@ func InsertMigration(ctx context.Context, db *sql.DB, migrationName string) erro
time.Now().Format(time.RFC3339), time.Now().Format(time.RFC3339),
internal.VersionString(), internal.VersionString(),
) )
// If the migration was already executed, we'll get a unique constraint error,
// return nil instead, to avoid unnecessary logging.
if IsUniqueConstraintViolationErr(err) {
return nil
}
return err return err
} }

View file

@ -12,12 +12,27 @@
// See the License for the specific language governing permissions and // See the License for the specific language governing permissions and
// limitations under the License. // limitations under the License.
//go:build wasm //go:build !wasm
// +build wasm // +build !wasm
package sqlutil package sqlutil
// IsUniqueConstraintViolationErr no-ops for this architecture import (
"github.com/lib/pq"
"github.com/mattn/go-sqlite3"
)
// IsUniqueConstraintViolationErr returns true if the error is an unique_violation error
func IsUniqueConstraintViolationErr(err error) bool { func IsUniqueConstraintViolationErr(err error) bool {
switch e := err.(type) {
case *pq.Error:
return e.Code == "23505"
case pq.Error:
return e.Code == "23505"
case *sqlite3.Error:
return e.Code == sqlite3.ErrConstraint
case sqlite3.Error:
return e.Code == sqlite3.ErrConstraint
}
return false return false
} }

View file

@ -12,15 +12,20 @@
// See the License for the specific language governing permissions and // See the License for the specific language governing permissions and
// limitations under the License. // limitations under the License.
//go:build !wasm //go:build wasm
// +build !wasm // +build wasm
package sqlutil package sqlutil
import "github.com/lib/pq" import "github.com/mattn/go-sqlite3"
// IsUniqueConstraintViolationErr returns true if the error is a postgresql unique_violation error // IsUniqueConstraintViolationErr returns true if the error is an unique_violation error
func IsUniqueConstraintViolationErr(err error) bool { func IsUniqueConstraintViolationErr(err error) bool {
pqErr, ok := err.(*pq.Error) switch e := err.(type) {
return ok && pqErr.Code == "23505" case *sqlite3.Error:
return e.Code == sqlite3.ErrConstraint
case sqlite3.Error:
return e.Code == sqlite3.ErrConstraint
}
return false
} }