diff --git a/README.md b/README.md index 8ab95d2..b56c405 100644 --- a/README.md +++ b/README.md @@ -26,10 +26,10 @@ godb is a project that is still young and evolving. The API is almost stable, bu - Define model struct name to db table naming with `db.SetDefaultTableNamer(yourFn)`. Supported types are: Plural,Snake,SnakePlural. You can also define `TableName() string` method to for your struct and return whatever table name will be. - BlackListing or WhiteListing columns for struct based inserts and updates. - Could by used with - - SQLite - - PostgreSQL - - MySQL / MariaDB - - MS SQL Server + - [SQLite](github.com/mattn/go-sqlite3) + - [PostgreSQL](github.com/lib/pq) + - [MySQL / MariaDB](github.com/go-sql-driver/mysql) + - [MS SQL Server](github.com/denisenkom/go-mssqldb) - other compatible database if you write an adapter. I made tests of godb on differents architectures and operating systems : OSX, Windows, Linux, ARM (Cortex A7) and Intel x64. @@ -119,6 +119,7 @@ import ( "github.com/samonzeweb/godb" "github.com/samonzeweb/godb/adapters/sqlite" + _ "github.com/mattn/go-sqlite" // must include preferred driver "log" "os" ) diff --git a/adapters/mssql/mssql.go b/adapters/mssql/mssql.go index e070bae..0c19b3c 100644 --- a/adapters/mssql/mssql.go +++ b/adapters/mssql/mssql.go @@ -8,8 +8,6 @@ import ( "github.com/samonzeweb/godb/adapters" "github.com/samonzeweb/godb/dberror" "github.com/samonzeweb/godb/dbreflect" - - _ "github.com/denisenkom/go-mssqldb" ) // init registers types of mssql package corresponding to fields values @@ -99,6 +97,7 @@ func (MSSQL) ParseError(err error) error { if err == nil { return nil } + if e, ok := err.(ErrorWithNumber); ok { switch e.SQLErrorNumber() { case 2601: diff --git a/adapters/mysql/mysql.go b/adapters/mysql/mysql.go index 1396e1e..83eb849 100644 --- a/adapters/mysql/mysql.go +++ b/adapters/mysql/mysql.go @@ -1,8 +1,8 @@ package mysql import ( - "github.com/go-sql-driver/mysql" "github.com/samonzeweb/godb/dberror" + "strings" ) type MySQL struct{} @@ -21,13 +21,13 @@ func (MySQL) ParseError(err error) error { if err == nil { return nil } - if e, ok := err.(*mysql.MySQLError); ok { - switch e.Number { - case 1062: - return dberror.UniqueConstraint{Message: e.Error(), Field: dberror.ExtractStr(e.Message, "key '", "'"), Err: e} - case 1452: - return dberror.CheckConstraint{Message: e.Error(), Field: dberror.ExtractStr(e.Message, "CONSTRAINT `", "`"), Err: e} - } + errMsg := err.Error() + + switch { + case strings.Contains(errMsg, "Error 1062:"): + return dberror.UniqueConstraint{Message: errMsg, Field: dberror.ExtractStr(errMsg, "key '", "'"), Err: err} + case strings.Contains(errMsg, "Error 1452:"): + return dberror.CheckConstraint{Message: errMsg, Field: dberror.ExtractStr(errMsg, "CONSTRAINT `", "`"), Err: err} } return err diff --git a/adapters/postgresql/postgresql.go b/adapters/postgresql/postgresql.go index 6d9b918..4c715c3 100644 --- a/adapters/postgresql/postgresql.go +++ b/adapters/postgresql/postgresql.go @@ -5,7 +5,6 @@ import ( "strconv" "strings" - pq "github.com/lib/pq" "github.com/samonzeweb/godb/adapters" "github.com/samonzeweb/godb/dberror" ) @@ -53,11 +52,11 @@ func (p PostgreSQL) ReturningBuild(columns []string) string { } func (p PostgreSQL) FormatForNewValues(columns []string) []string { - formatedColumns := make([]string, 0, len(columns)) + formattedColumns := make([]string, 0, len(columns)) for _, column := range columns { - formatedColumns = append(formatedColumns, p.Quote(column)) + formattedColumns = append(formattedColumns, p.Quote(column)) } - return formatedColumns + return formattedColumns } func (p PostgreSQL) GetReturningPosition() adapters.ReturningPosition { @@ -69,15 +68,15 @@ func (p PostgreSQL) ParseError(err error) error { return nil } - if e, ok := err.(*pq.Error); ok { - switch e.Code { - case "23505": - return dberror.UniqueConstraint{Message: e.Error(), Field: dberror.ExtractStr(e.Message, "constraint \"", "\""), Err: e} - case "23503": - return dberror.ForeignKeyConstraint{Message: e.Error(), Field: dberror.ExtractStr(e.Message, "constraint \"", "\""), Err: e} - case "23514": - return dberror.CheckConstraint{Message: e.Error(), Field: dberror.ExtractStr(e.Message, "constraint \"", "\""), Err: e} - } + errMsg := err.Error() + + switch { + case strings.Contains(errMsg, "duplicate key value violates unique constraint") || strings.Contains(errMsg, "(SQLSTATE 23505)"): + return dberror.UniqueConstraint{Message: errMsg, Field: dberror.ExtractStr(errMsg, "constraint \"", "\""), Err: err} + case strings.Contains(errMsg, "violates foreign key constraint") || strings.Contains(errMsg, "(SQLSTATE 23503)"): + return dberror.ForeignKeyConstraint{Message: errMsg, Field: dberror.ExtractStr(errMsg, "constraint \"", "\""), Err: err} + case strings.Contains(errMsg, "violates check constraint") || strings.Contains(errMsg, "(SQLSTATE 23514)"): + return dberror.CheckConstraint{Message: errMsg, Field: dberror.ExtractStr(errMsg, "constraint \"", "\""), Err: err} } return err diff --git a/adapters/sqlite/sqlite.go b/adapters/sqlite/sqlite.go index a2ddcd1..3835d6c 100644 --- a/adapters/sqlite/sqlite.go +++ b/adapters/sqlite/sqlite.go @@ -4,8 +4,6 @@ import ( "strings" "github.com/samonzeweb/godb/dberror" - - sqlite3 "github.com/mattn/go-sqlite3" ) type SQLite struct{} @@ -25,13 +23,14 @@ func (SQLite) ParseError(err error) error { return nil } - e, _ := err.(sqlite3.Error) - switch e.ExtendedCode { - case sqlite3.ErrConstraintUnique: - return dberror.UniqueConstraint{Message: e.Error(), Field: strings.Split(strings.Split(e.Error(), "failed: ")[1], ".")[1], Err: e} - case sqlite3.ErrConstraintCheck: - return dberror.CheckConstraint{Message: e.Error(), Field: strings.Split(strings.Split(e.Error(), "failed: ")[1], ".")[1], Err: e} - default: - return err + errMsg := err.Error() + + switch { + case strings.Contains(errMsg, "constraint failed") && strings.Contains(errMsg, "foreign key "): + return dberror.UniqueConstraint{Message: errMsg, Field: strings.Split(strings.Split(errMsg, "failed: ")[1], ".")[1], Err: err} + case strings.Contains(errMsg, "constraint failed"): + return dberror.CheckConstraint{Message: errMsg, Field: strings.Split(strings.Split(errMsg, "failed: ")[1], ".")[1], Err: err} } + + return err } diff --git a/go.mod b/go.mod index c4727f0..d3ee10d 100644 --- a/go.mod +++ b/go.mod @@ -3,12 +3,11 @@ module github.com/samonzeweb/godb go 1.12 require ( - github.com/denisenkom/go-mssqldb v0.0.0-20200910202707-1e08a3fab204 - github.com/go-sql-driver/mysql v1.5.0 + github.com/denisenkom/go-mssqldb v0.10.0 + github.com/go-sql-driver/mysql v1.6.0 github.com/gopherjs/gopherjs v0.0.0-20200217142428-fce0ec30dd00 // indirect - github.com/lib/pq v1.8.0 - github.com/mattn/go-sqlite3 v2.0.3+incompatible + github.com/lib/pq v1.10.2 + github.com/mattn/go-sqlite3 v1.14.7 github.com/smartystreets/assertions v1.2.0 // indirect github.com/smartystreets/goconvey v1.6.4 - golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0 // indirect ) diff --git a/go.sum b/go.sum index b3a4b49..0d8908e 100644 --- a/go.sum +++ b/go.sum @@ -1,7 +1,7 @@ -github.com/denisenkom/go-mssqldb v0.0.0-20200910202707-1e08a3fab204 h1:tI48fqaIkxxYuIylVv1tdDfBp6836GKSfmmzgSyP1CY= -github.com/denisenkom/go-mssqldb v0.0.0-20200910202707-1e08a3fab204/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= -github.com/go-sql-driver/mysql v1.5.0 h1:ozyZYNQW3x3HtqT1jira07DN2PArx2v7/mN66gGcHOs= -github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/denisenkom/go-mssqldb v0.10.0 h1:QykgLZBorFE95+gO3u9esLd0BmbvpWp0/waNNZfHBM8= +github.com/denisenkom/go-mssqldb v0.10.0/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= +github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE= +github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe h1:lXe2qZdvpiX5WZkZR4hgp4KJVfY3nMkvmwbVkpv1rVY= github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= @@ -9,26 +9,19 @@ github.com/gopherjs/gopherjs v0.0.0-20200217142428-fce0ec30dd00 h1:l5lAOZEym3oK3 github.com/gopherjs/gopherjs v0.0.0-20200217142428-fce0ec30dd00/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/lib/pq v1.8.0 h1:9xohqzkUwzR4Ga4ivdTcawVS89YSDVxXMa3xJX3cGzg= -github.com/lib/pq v1.8.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/mattn/go-sqlite3 v2.0.3+incompatible h1:gXHsfypPkaMZrKbD5209QV9jbUTJKjyR5WD3HYQSd+U= -github.com/mattn/go-sqlite3 v2.0.3+incompatible/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= +github.com/lib/pq v1.10.2 h1:AqzbZs4ZoCBp+GtejcpCpcxM3zlSMx29dXbUSeVtJb8= +github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/mattn/go-sqlite3 v1.14.7 h1:fxWBnXkxfM6sRiuH3bqJ4CfzZojMOLVc0UTsTglEghA= +github.com/mattn/go-sqlite3 v1.14.7/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/assertions v1.2.0 h1:42S6lae5dvLc7BrLu/0ugRtcFVjoJNMC/N3yZFZkDFs= github.com/smartystreets/assertions v1.2.0/go.mod h1:tcbTF8ujkAEcZ8TElKY+i30BzYlVhC/LOxJk7iOWnoo= github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c h1:Vj5n4GlwjmQteupaxJ9+0FNOmBrHfq7vN4btdGoDZgI= golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0 h1:hb9wdF1z5waM+dSIICn1l0DkLVDT3hqhhQsDNUmHPRE= -golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3 h1:0GoQqolDA55aaLxZyTzK/Y2ePZzZTUrRacwib7cNsYQ= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190412213103-97732733099d h1:+R4KGOnez64A81RvjARKc4UT5/tI9ujCIVX+P5KiHuI= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/tools v0.0.0-20190328211700-ab21143f2384 h1:TFlARGu6Czu1z7q93HTxcP1P+/ZFC/IKythI5RzrnRg= golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= diff --git a/mssql_test.go b/mssql_test.go index 44441a3..2662b43 100644 --- a/mssql_test.go +++ b/mssql_test.go @@ -6,6 +6,7 @@ import ( "testing" "time" + _ "github.com/denisenkom/go-mssqldb" "github.com/samonzeweb/godb" "github.com/samonzeweb/godb/adapters/mssql" "github.com/samonzeweb/godb/dbtests/common" diff --git a/mysql_test.go b/mysql_test.go index a734492..fe1359b 100644 --- a/mysql_test.go +++ b/mysql_test.go @@ -1,12 +1,12 @@ package godb_test import ( - "os" - "testing" - + _ "github.com/go-sql-driver/mysql" "github.com/samonzeweb/godb" "github.com/samonzeweb/godb/adapters/mysql" "github.com/samonzeweb/godb/dbtests/common" + "os" + "testing" . "github.com/smartystreets/goconvey/convey" ) diff --git a/postgresql_test.go b/postgresql_test.go index 1d3208a..44935e3 100644 --- a/postgresql_test.go +++ b/postgresql_test.go @@ -1,13 +1,13 @@ package godb_test import ( - "os" - "testing" - "time" - + _ "github.com/lib/pq" "github.com/samonzeweb/godb" "github.com/samonzeweb/godb/adapters/postgresql" "github.com/samonzeweb/godb/dbtests/common" + "os" + "testing" + "time" . "github.com/smartystreets/goconvey/convey" ) diff --git a/sqlite_test.go b/sqlite_test.go index 81c0894..fd30d67 100644 --- a/sqlite_test.go +++ b/sqlite_test.go @@ -4,10 +4,10 @@ import ( "os" "testing" + _ "github.com/mattn/go-sqlite3" "github.com/samonzeweb/godb" "github.com/samonzeweb/godb/adapters/sqlite" "github.com/samonzeweb/godb/dbtests/common" - . "github.com/smartystreets/goconvey/convey" )