From de1215f9906544a1b4c8d3f5f5393a18f870a151 Mon Sep 17 00:00:00 2001 From: Saeid Saeidee Date: Mon, 12 Jun 2023 22:46:28 +0200 Subject: [PATCH] feat: ErrForeignKeyViolated implemented --- error_translator.go | 10 +++++---- error_translator_test.go | 46 ++++++++++++++++++++++++++++++++++++++++ go.mod | 2 +- go.sum | 4 ++-- 4 files changed, 55 insertions(+), 7 deletions(-) create mode 100644 error_translator_test.go diff --git a/error_translator.go b/error_translator.go index 07e7d2e..a4243cd 100644 --- a/error_translator.go +++ b/error_translator.go @@ -7,8 +7,9 @@ import ( ) // 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 -var errCodes = map[string]int32{ - "uniqueConstraint": 2627, +var errCodes = map[int32]error{ + 2627: gorm.ErrDuplicatedKey, + 547: gorm.ErrForeignKeyViolated, } type ErrMessage struct { @@ -19,9 +20,10 @@ type ErrMessage struct { // Translate it will translate the error to native gorm errors. func (dialector Dialector) Translate(err error) error { if mssqlErr, ok := err.(mssql.Error); ok { - if mssqlErr.Number == errCodes["uniqueConstraint"] { - return gorm.ErrDuplicatedKey + if translatedErr, found := errCodes[mssqlErr.Number]; found { + return translatedErr } + return err } return err diff --git a/error_translator_test.go b/error_translator_test.go new file mode 100644 index 0000000..44b0c42 --- /dev/null +++ b/error_translator_test.go @@ -0,0 +1,46 @@ +package sqlserver + +import ( + "errors" + "testing" + + "gorm.io/gorm" + + "github.com/microsoft/go-mssqldb" +) + +func TestDialector_Translate(t *testing.T) { + type fields struct { + Config *Config + } + type args struct { + err error + } + tests := []struct { + name string + fields fields + args args + want error + }{ + { + name: "it should return ErrDuplicatedKey error if the error number is 2627", + args: args{err: mssql.Error{Number: 2627}}, + want: gorm.ErrDuplicatedKey, + }, + { + name: "it should return ErrForeignKeyViolated the error number is 547", + args: args{err: mssql.Error{Number: 547}}, + want: gorm.ErrForeignKeyViolated, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + dialector := Dialector{ + Config: tt.fields.Config, + } + if err := dialector.Translate(tt.args.err); !errors.Is(err, tt.want) { + t.Errorf("Translate() expected error = %v, got error %v", err, tt.want) + } + }) + } +} diff --git a/go.mod b/go.mod index 2e30eba..4cd70a0 100644 --- a/go.mod +++ b/go.mod @@ -4,5 +4,5 @@ go 1.14 require ( github.com/microsoft/go-mssqldb v1.1.0 - gorm.io/gorm v1.25.1 + gorm.io/gorm v1.25.2-0.20230610234218-206613868439 ) diff --git a/go.sum b/go.sum index 6cf4652..6a4f839 100644 --- a/go.sum +++ b/go.sum @@ -96,5 +96,5 @@ gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gorm.io/gorm v1.25.1 h1:nsSALe5Pr+cM3V1qwwQ7rOkw+6UeLrX5O4v3llhHa64= -gorm.io/gorm v1.25.1/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k= +gorm.io/gorm v1.25.2-0.20230610234218-206613868439 h1:LerZWOlV0e/6u9dEoVhe7Ehg+o7QvQKIxrI4Ccb2aV8= +gorm.io/gorm v1.25.2-0.20230610234218-206613868439/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k=