Skip to content

Commit 6e2cde3

Browse files
Saeid Saeideea631807682
authored andcommitted
feat: ErrForeignKeyViolated implemented
1 parent d4e1e83 commit 6e2cde3

File tree

4 files changed

+55
-7
lines changed

4 files changed

+55
-7
lines changed

error_translator.go

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,9 @@ import (
77
)
88

99
// The error codes to map mssql errors to gorm errors, here is a reference about error codes for mssql https://learn.microsoft.com/en-us/sql/relational-databases/errors-events/database-engine-events-and-errors?view=sql-server-ver16
10-
var errCodes = map[string]int32{
11-
"uniqueConstraint": 2627,
10+
var errCodes = map[int32]error{
11+
2627: gorm.ErrDuplicatedKey,
12+
547: gorm.ErrForeignKeyViolated,
1213
}
1314

1415
type ErrMessage struct {
@@ -19,9 +20,10 @@ type ErrMessage struct {
1920
// Translate it will translate the error to native gorm errors.
2021
func (dialector Dialector) Translate(err error) error {
2122
if mssqlErr, ok := err.(mssql.Error); ok {
22-
if mssqlErr.Number == errCodes["uniqueConstraint"] {
23-
return gorm.ErrDuplicatedKey
23+
if translatedErr, found := errCodes[mssqlErr.Number]; found {
24+
return translatedErr
2425
}
26+
return err
2527
}
2628

2729
return err

error_translator_test.go

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package sqlserver
2+
3+
import (
4+
"errors"
5+
"testing"
6+
7+
"gorm.io/gorm"
8+
9+
"github.com/microsoft/go-mssqldb"
10+
)
11+
12+
func TestDialector_Translate(t *testing.T) {
13+
type fields struct {
14+
Config *Config
15+
}
16+
type args struct {
17+
err error
18+
}
19+
tests := []struct {
20+
name string
21+
fields fields
22+
args args
23+
want error
24+
}{
25+
{
26+
name: "it should return ErrDuplicatedKey error if the error number is 2627",
27+
args: args{err: mssql.Error{Number: 2627}},
28+
want: gorm.ErrDuplicatedKey,
29+
},
30+
{
31+
name: "it should return ErrForeignKeyViolated the error number is 547",
32+
args: args{err: mssql.Error{Number: 547}},
33+
want: gorm.ErrForeignKeyViolated,
34+
},
35+
}
36+
for _, tt := range tests {
37+
t.Run(tt.name, func(t *testing.T) {
38+
dialector := Dialector{
39+
Config: tt.fields.Config,
40+
}
41+
if err := dialector.Translate(tt.args.err); !errors.Is(err, tt.want) {
42+
t.Errorf("Translate() expected error = %v, got error %v", err, tt.want)
43+
}
44+
})
45+
}
46+
}

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,5 @@ go 1.14
44

55
require (
66
github.com/microsoft/go-mssqldb v1.1.0
7-
gorm.io/gorm v1.25.1
7+
gorm.io/gorm v1.25.2-0.20230610234218-206613868439
88
)

go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,5 +96,5 @@ gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
9696
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
9797
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
9898
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
99-
gorm.io/gorm v1.25.1 h1:nsSALe5Pr+cM3V1qwwQ7rOkw+6UeLrX5O4v3llhHa64=
100-
gorm.io/gorm v1.25.1/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k=
99+
gorm.io/gorm v1.25.2-0.20230610234218-206613868439 h1:LerZWOlV0e/6u9dEoVhe7Ehg+o7QvQKIxrI4Ccb2aV8=
100+
gorm.io/gorm v1.25.2-0.20230610234218-206613868439/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k=

0 commit comments

Comments
 (0)