Skip to content

Commit

Permalink
Feature: Error translator for Dialector
Browse files Browse the repository at this point in the history
  • Loading branch information
re-cheid authored and glebarez committed Jun 23, 2023
1 parent 1accfe1 commit be4a7dd
Show file tree
Hide file tree
Showing 3 changed files with 64 additions and 2 deletions.
2 changes: 1 addition & 1 deletion go.mod
Expand Up @@ -5,6 +5,7 @@ go 1.18
require (
github.com/glebarez/go-sqlite v1.21.1
gorm.io/gorm v1.25.0
modernc.org/sqlite v1.21.1
)

require (
Expand All @@ -18,5 +19,4 @@ require (
modernc.org/libc v1.22.3 // indirect
modernc.org/mathutil v1.5.0 // indirect
modernc.org/memory v1.5.0 // indirect
modernc.org/sqlite v1.21.1 // indirect
)
16 changes: 15 additions & 1 deletion sqlite.go
Expand Up @@ -8,7 +8,8 @@ import (

"gorm.io/gorm/callbacks"

_ "github.com/glebarez/go-sqlite"
gosqlite "github.com/glebarez/go-sqlite"
sqlite3 "modernc.org/sqlite/lib"

"gorm.io/gorm"
"gorm.io/gorm/clause"
Expand Down Expand Up @@ -197,6 +198,19 @@ func (dialectopr Dialector) RollbackTo(tx *gorm.DB, name string) error {
return nil
}

func (dialector Dialector) Translate(err error) error {
switch terr := err.(type) {
case *gosqlite.Error:
switch terr.Code() {
case sqlite3.SQLITE_CONSTRAINT_UNIQUE:
return gorm.ErrDuplicatedKey
case sqlite3.SQLITE_CONSTRAINT_PRIMARYKEY:
return gorm.ErrDuplicatedKey
}
}
return err
}

func compareVersion(version1, version2 string) int {
n, m := len(version1), len(version2)
i, j := 0, 0
Expand Down
48 changes: 48 additions & 0 deletions sqlite_error_translator_test.go
@@ -0,0 +1,48 @@
package sqlite

import (
"testing"

"gorm.io/gorm"
"gorm.io/gorm/logger"
)

func TestErrorTranslator(t *testing.T) {
// This is the DSN of the in-memory SQLite database for these tests.
const InMemoryDSN = "file:testdatabase?mode=memory&cache=shared"

// This is the example object for testing the unique constraint error
type Article struct {
ArticleNumber string `gorm:"unique"`
}

db, err := gorm.Open(&Dialector{DSN: InMemoryDSN}, &gorm.Config{
Logger: logger.Default.LogMode(logger.Silent),
TranslateError: true})

if err != nil {
t.Errorf("Expected Open to succeed; got error: %v", err)
}
if db == nil {
t.Errorf("Expected db to be non-nil.")
}

err = db.AutoMigrate(&Article{})
if err != nil {
t.Errorf("Expected to migrate database models to succeed: %v", err)
}

err = db.Create(&Article{ArticleNumber: "A00000XX"}).Error
if err != nil {
t.Errorf("Expected first create to succeed: %v", err)
}

err = db.Create(&Article{ArticleNumber: "A00000XX"}).Error
if err == nil {
t.Errorf("Expected second create to fail.")
}

if err != gorm.ErrDuplicatedKey {
t.Errorf("Expected error from second create to be gorm.ErrDuplicatedKey: %v", err)
}
}

0 comments on commit be4a7dd

Please sign in to comment.