From 45ba1a9258991ab3e3d71d8321e833f7b4e0848b Mon Sep 17 00:00:00 2001 From: Jacob Hoffman-Andrews Date: Thu, 13 Jun 2024 15:38:50 -0700 Subject: [PATCH 1/9] apply TypeConverter to args, not just fields This allows using custom types in query parameters. It also allows performing custom transformations on standard types (like rounding times to the second). --- db.go | 69 +++++++++++++++++++++++++++++++++++++++ gorp_test.go | 92 +++++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 160 insertions(+), 1 deletion(-) diff --git a/db.go b/db.go index d6e50a8..9598098 100644 --- a/db.go +++ b/db.go @@ -597,9 +597,28 @@ func (m *DbMap) Select(ctx context.Context, i interface{}, query string, args .. expandSliceArgs(&query, args...) } + args, err := m.convertArgs(args...) + if err != nil { + return nil, err + } + return hookedselect(ctx, m, m, i, query, args...) } +func (m *DbMap) convertArgs(args ...interface{}) ([]interface{}, error) { + if m.TypeConverter == nil { + return args, nil + } + for i, arg := range args { + converted, err := m.TypeConverter.ToDb(arg) + if err != nil { + return nil, err + } + args[i] = converted + } + return args, nil +} + // Exec runs an arbitrary SQL statement. args represent the bind parameters. // This is equivalent to running: ExecContext() using database/sql func (m *DbMap) ExecContext(ctx context.Context, query string, args ...interface{}) (sql.Result, error) { @@ -607,6 +626,11 @@ func (m *DbMap) ExecContext(ctx context.Context, query string, args ...interface expandSliceArgs(&query, args...) } + args, err := m.convertArgs(args...) + if err != nil { + return nil, err + } + if m.logger != nil { now := time.Now() defer m.trace(now, query, args...) @@ -620,6 +644,11 @@ func (m *DbMap) SelectInt(ctx context.Context, query string, args ...interface{} expandSliceArgs(&query, args...) } + args, err := m.convertArgs(args...) + if err != nil { + return 0, err + } + return SelectInt(ctx, m, query, args...) } @@ -629,6 +658,11 @@ func (m *DbMap) SelectNullInt(ctx context.Context, query string, args ...interfa expandSliceArgs(&query, args...) } + args, err := m.convertArgs(args...) + if err != nil { + return sql.NullInt64{}, err + } + return SelectNullInt(ctx, m, query, args...) } @@ -638,6 +672,11 @@ func (m *DbMap) SelectFloat(ctx context.Context, query string, args ...interface expandSliceArgs(&query, args...) } + args, err := m.convertArgs(args...) + if err != nil { + return 0, err + } + return SelectFloat(ctx, m, query, args...) } @@ -647,6 +686,11 @@ func (m *DbMap) SelectNullFloat(ctx context.Context, query string, args ...inter expandSliceArgs(&query, args...) } + args, err := m.convertArgs(args...) + if err != nil { + return sql.NullFloat64{}, err + } + return SelectNullFloat(ctx, m, query, args...) } @@ -656,6 +700,11 @@ func (m *DbMap) SelectStr(ctx context.Context, query string, args ...interface{} expandSliceArgs(&query, args...) } + args, err := m.convertArgs(args...) + if err != nil { + return "", err + } + return SelectStr(ctx, m, query, args...) } @@ -665,6 +714,11 @@ func (m *DbMap) SelectNullStr(ctx context.Context, query string, args ...interfa expandSliceArgs(&query, args...) } + args, err := m.convertArgs(args...) + if err != nil { + return sql.NullString{}, err + } + return SelectNullStr(ctx, m, query, args...) } @@ -674,6 +728,11 @@ func (m *DbMap) SelectOne(ctx context.Context, holder interface{}, query string, expandSliceArgs(&query, args...) } + args, err := m.convertArgs(args...) + if err != nil { + return err + } + return SelectOne(ctx, m, m, holder, query, args...) } @@ -798,6 +857,11 @@ func (m *DbMap) QueryRowContext(ctx context.Context, query string, args ...inter expandSliceArgs(&query, args...) } + args, err := m.convertArgs(args...) + if err != nil { + return nil + } + if m.logger != nil { now := time.Now() defer m.trace(now, query, args...) @@ -811,6 +875,11 @@ func (m *DbMap) QueryContext(ctx context.Context, q string, args ...interface{}) expandSliceArgs(&q, args...) } + args, err := m.convertArgs(args...) + if err != nil { + return nil, err + } + if m.logger != nil { now := time.Now() defer m.trace(now, q, args...) diff --git a/gorp_test.go b/gorp_test.go index 668ab51..dd16e7f 100644 --- a/gorp_test.go +++ b/gorp_test.go @@ -1744,10 +1744,100 @@ func TestTypeConversionExample(t *testing.T) { t.Errorf("tc3 %v != %v", expected, tc3) } + // Test that the Person argument to Select goes through the + // type converter + var holder TypeConversionExample + personJSON := Person{FName: "Jane", LName: "Doe"} + _, err := dbmap.Select(context.Background(), + holder, + "select * from type_conv_test where personjson = ?", + personJSON, + ) + if err != nil { + t.Errorf("Select failed: %s", err) + } + + err = dbmap.SelectOne(context.Background(), + &holder, + "select * from type_conv_test where personjson = ?", + personJSON) + if err != nil { + t.Errorf("Select failed: %s", err) + } + + _, err = dbmap.SelectInt(context.Background(), + "select id from type_conv_test where personjson = ?", + personJSON) + if err != nil { + t.Errorf("Select failed: %s", err) + } + + _, err = dbmap.SelectInt(context.Background(), + "select id from type_conv_test where personjson = ?", + personJSON) + if err != nil { + t.Errorf("Select failed: %s", err) + } + + _, err = dbmap.SelectNullInt(context.Background(), + "select id from type_conv_test where personjson = ?", + personJSON) + if err != nil { + t.Errorf("Select failed: %s", err) + } + + _, err = dbmap.SelectFloat(context.Background(), + "select id * 1.2 from type_conv_test where personjson = ?", + personJSON) + if err != nil { + t.Errorf("Select failed: %s", err) + } + + _, err = dbmap.SelectNullFloat(context.Background(), + "select id * 1.2 from type_conv_test where personjson = ?", + personJSON) + if err != nil { + t.Errorf("Select failed: %s", err) + } + + _, err = dbmap.SelectStr(context.Background(), + "select name from type_conv_test where personjson = ?", + personJSON) + if err != nil { + t.Errorf("Select failed: %s", err) + } + + _, err = dbmap.SelectNullStr(context.Background(), + "select name from type_conv_test where personjson = ?", + personJSON) + if err != nil { + t.Errorf("Select failed: %s", err) + } + + _, err = dbmap.QueryContext(context.Background(), + "select name from type_conv_test where personjson = ?", + personJSON) + if err != nil { + t.Errorf("Select failed: %s", err) + } + + row := dbmap.QueryRowContext(context.Background(), + "select name from type_conv_test where personjson = ?", + personJSON) + if row == nil || row.Err() != nil { + t.Errorf("QueryRowContext failed: %s", row.Err()) + } + + _, err = dbmap.ExecContext(context.Background(), + "select name from type_conv_test where personjson = ?", + personJSON) + if err != nil { + t.Errorf("Select failed: %s", err) + } + if _del(dbmap, tc) != 1 { t.Errorf("Did not delete row with Id: %d", tc.Id) } - } func TestWithEmbeddedStruct(t *testing.T) { From 4c8b0db719966ca2b8431d68951914a0d95ef40d Mon Sep 17 00:00:00 2001 From: Jacob Hoffman-Andrews Date: Thu, 13 Jun 2024 17:15:16 -0700 Subject: [PATCH 2/9] Use two args --- gorp_test.go | 44 ++++++++++++++++++++++---------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/gorp_test.go b/gorp_test.go index dd16e7f..60fbe82 100644 --- a/gorp_test.go +++ b/gorp_test.go @@ -1734,7 +1734,8 @@ func TestTypeConversionExample(t *testing.T) { t.Errorf("tc2 %v != %v", expected, tc2) } - tc2.Name = CustomStringType("hi2") + hi2 := CustomStringType("hi2") + tc2.Name = hi2 tc2.PersonJSON = Person{FName: "Jane", LName: "Doe"} _update(dbmap, tc2) @@ -1750,73 +1751,72 @@ func TestTypeConversionExample(t *testing.T) { personJSON := Person{FName: "Jane", LName: "Doe"} _, err := dbmap.Select(context.Background(), holder, - "select * from type_conv_test where personjson = ?", - personJSON, - ) + "select * from type_conv_test where personjson = ? and name = ?", + personJSON, hi2) if err != nil { t.Errorf("Select failed: %s", err) } err = dbmap.SelectOne(context.Background(), &holder, - "select * from type_conv_test where personjson = ?", - personJSON) + "select * from type_conv_test where personjson = ? and name = ?", + personJSON, hi2) if err != nil { t.Errorf("Select failed: %s", err) } _, err = dbmap.SelectInt(context.Background(), - "select id from type_conv_test where personjson = ?", - personJSON) + "select id from type_conv_test where personjson = ? and name = ?", + personJSON, hi2) if err != nil { t.Errorf("Select failed: %s", err) } _, err = dbmap.SelectInt(context.Background(), - "select id from type_conv_test where personjson = ?", - personJSON) + "select id from type_conv_test where personjson = ? and name = ?", + personJSON, hi2) if err != nil { t.Errorf("Select failed: %s", err) } _, err = dbmap.SelectNullInt(context.Background(), - "select id from type_conv_test where personjson = ?", - personJSON) + "select id from type_conv_test where personjson = ? and name = ?", + personJSON, hi2) if err != nil { t.Errorf("Select failed: %s", err) } _, err = dbmap.SelectFloat(context.Background(), - "select id * 1.2 from type_conv_test where personjson = ?", - personJSON) + "select id * 1.2 from type_conv_test where personjson = ? and name = ?", + personJSON, hi2) if err != nil { t.Errorf("Select failed: %s", err) } _, err = dbmap.SelectNullFloat(context.Background(), - "select id * 1.2 from type_conv_test where personjson = ?", - personJSON) + "select id * 1.2 from type_conv_test where personjson = ? and name = ?", + personJSON, hi2) if err != nil { t.Errorf("Select failed: %s", err) } _, err = dbmap.SelectStr(context.Background(), - "select name from type_conv_test where personjson = ?", - personJSON) + "select name from type_conv_test where personjson = ? and name = ?", + personJSON, hi2) if err != nil { t.Errorf("Select failed: %s", err) } _, err = dbmap.SelectNullStr(context.Background(), - "select name from type_conv_test where personjson = ?", - personJSON) + "select name from type_conv_test where personjson = ? and name = ?", + personJSON, hi2) if err != nil { t.Errorf("Select failed: %s", err) } _, err = dbmap.QueryContext(context.Background(), - "select name from type_conv_test where personjson = ?", - personJSON) + "select name from type_conv_test where personjson = ? and name = ?", + personJSON, hi2) if err != nil { t.Errorf("Select failed: %s", err) } From 3c30239d68b0a7fd3f3381a9b5ea7f027bc0fa1b Mon Sep 17 00:00:00 2001 From: Jacob Hoffman-Andrews Date: Fri, 14 Jun 2024 10:58:19 -0700 Subject: [PATCH 3/9] Make test work on postgres --- gorp_test.go | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/gorp_test.go b/gorp_test.go index 60fbe82..71ec137 100644 --- a/gorp_test.go +++ b/gorp_test.go @@ -1751,7 +1751,7 @@ func TestTypeConversionExample(t *testing.T) { personJSON := Person{FName: "Jane", LName: "Doe"} _, err := dbmap.Select(context.Background(), holder, - "select * from type_conv_test where personjson = ? and name = ?", + "select * from type_conv_test where personjson = "+dbmap.Dialect.BindVar(0)+" and name = "+dbmap.Dialect.BindVar(1), personJSON, hi2) if err != nil { t.Errorf("Select failed: %s", err) @@ -1759,78 +1759,78 @@ func TestTypeConversionExample(t *testing.T) { err = dbmap.SelectOne(context.Background(), &holder, - "select * from type_conv_test where personjson = ? and name = ?", + "select * from type_conv_test where personjson = "+dbmap.Dialect.BindVar(0)+" and name = "+dbmap.Dialect.BindVar(1), personJSON, hi2) if err != nil { t.Errorf("Select failed: %s", err) } _, err = dbmap.SelectInt(context.Background(), - "select id from type_conv_test where personjson = ? and name = ?", + "select id from type_conv_test where personjson = "+dbmap.Dialect.BindVar(0)+" and name = "+dbmap.Dialect.BindVar(1), personJSON, hi2) if err != nil { t.Errorf("Select failed: %s", err) } _, err = dbmap.SelectInt(context.Background(), - "select id from type_conv_test where personjson = ? and name = ?", + "select id from type_conv_test where personjson = "+dbmap.Dialect.BindVar(0)+" and name = "+dbmap.Dialect.BindVar(1), personJSON, hi2) if err != nil { t.Errorf("Select failed: %s", err) } _, err = dbmap.SelectNullInt(context.Background(), - "select id from type_conv_test where personjson = ? and name = ?", + "select id from type_conv_test where personjson = "+dbmap.Dialect.BindVar(0)+" and name = "+dbmap.Dialect.BindVar(1), personJSON, hi2) if err != nil { t.Errorf("Select failed: %s", err) } _, err = dbmap.SelectFloat(context.Background(), - "select id * 1.2 from type_conv_test where personjson = ? and name = ?", + "select id * 1.2 from type_conv_test where personjson = "+dbmap.Dialect.BindVar(0)+" and name = "+dbmap.Dialect.BindVar(1), personJSON, hi2) if err != nil { t.Errorf("Select failed: %s", err) } _, err = dbmap.SelectNullFloat(context.Background(), - "select id * 1.2 from type_conv_test where personjson = ? and name = ?", + "select id * 1.2 from type_conv_test where personjson = "+dbmap.Dialect.BindVar(0)+" and name = "+dbmap.Dialect.BindVar(1), personJSON, hi2) if err != nil { t.Errorf("Select failed: %s", err) } _, err = dbmap.SelectStr(context.Background(), - "select name from type_conv_test where personjson = ? and name = ?", + "select name from type_conv_test where personjson = "+dbmap.Dialect.BindVar(0)+" and name = "+dbmap.Dialect.BindVar(1), personJSON, hi2) if err != nil { t.Errorf("Select failed: %s", err) } _, err = dbmap.SelectNullStr(context.Background(), - "select name from type_conv_test where personjson = ? and name = ?", + "select name from type_conv_test where personjson = "+dbmap.Dialect.BindVar(0)+" and name = "+dbmap.Dialect.BindVar(1), personJSON, hi2) if err != nil { t.Errorf("Select failed: %s", err) } _, err = dbmap.QueryContext(context.Background(), - "select name from type_conv_test where personjson = ? and name = ?", + "select name from type_conv_test where personjson = "+dbmap.Dialect.BindVar(0)+" and name = "+dbmap.Dialect.BindVar(1), personJSON, hi2) if err != nil { t.Errorf("Select failed: %s", err) } row := dbmap.QueryRowContext(context.Background(), - "select name from type_conv_test where personjson = ?", - personJSON) + "select name from type_conv_test where personjson = "+dbmap.Dialect.BindVar(0)+" and name = "+dbmap.Dialect.BindVar(1), + personJSON, hi2) if row == nil || row.Err() != nil { t.Errorf("QueryRowContext failed: %s", row.Err()) } _, err = dbmap.ExecContext(context.Background(), - "select name from type_conv_test where personjson = ?", - personJSON) + "select name from type_conv_test where personjson = "+dbmap.Dialect.BindVar(0)+" and name = "+dbmap.Dialect.BindVar(1), + personJSON, hi2) if err != nil { t.Errorf("Select failed: %s", err) } From c2d6015743790b9a1968a8c1c9e6cd962f0b5982 Mon Sep 17 00:00:00 2001 From: Jacob Hoffman-Andrews Date: Fri, 14 Jun 2024 14:21:05 -0700 Subject: [PATCH 4/9] Use proper casing for column names --- gorp_test.go | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/gorp_test.go b/gorp_test.go index 71ec137..46328b0 100644 --- a/gorp_test.go +++ b/gorp_test.go @@ -1751,7 +1751,7 @@ func TestTypeConversionExample(t *testing.T) { personJSON := Person{FName: "Jane", LName: "Doe"} _, err := dbmap.Select(context.Background(), holder, - "select * from type_conv_test where personjson = "+dbmap.Dialect.BindVar(0)+" and name = "+dbmap.Dialect.BindVar(1), + "select * from type_conv_test where PersonJSON = "+dbmap.Dialect.BindVar(0)+" and Name = "+dbmap.Dialect.BindVar(1), personJSON, hi2) if err != nil { t.Errorf("Select failed: %s", err) @@ -1759,77 +1759,77 @@ func TestTypeConversionExample(t *testing.T) { err = dbmap.SelectOne(context.Background(), &holder, - "select * from type_conv_test where personjson = "+dbmap.Dialect.BindVar(0)+" and name = "+dbmap.Dialect.BindVar(1), + "select * from type_conv_test where PersonJSON = "+dbmap.Dialect.BindVar(0)+" and Name = "+dbmap.Dialect.BindVar(1), personJSON, hi2) if err != nil { t.Errorf("Select failed: %s", err) } _, err = dbmap.SelectInt(context.Background(), - "select id from type_conv_test where personjson = "+dbmap.Dialect.BindVar(0)+" and name = "+dbmap.Dialect.BindVar(1), + "select id from type_conv_test where PersonJSON = "+dbmap.Dialect.BindVar(0)+" and Name = "+dbmap.Dialect.BindVar(1), personJSON, hi2) if err != nil { t.Errorf("Select failed: %s", err) } _, err = dbmap.SelectInt(context.Background(), - "select id from type_conv_test where personjson = "+dbmap.Dialect.BindVar(0)+" and name = "+dbmap.Dialect.BindVar(1), + "select id from type_conv_test where PersonJSON = "+dbmap.Dialect.BindVar(0)+" and Name = "+dbmap.Dialect.BindVar(1), personJSON, hi2) if err != nil { t.Errorf("Select failed: %s", err) } _, err = dbmap.SelectNullInt(context.Background(), - "select id from type_conv_test where personjson = "+dbmap.Dialect.BindVar(0)+" and name = "+dbmap.Dialect.BindVar(1), + "select id from type_conv_test where PersonJSON = "+dbmap.Dialect.BindVar(0)+" and Name = "+dbmap.Dialect.BindVar(1), personJSON, hi2) if err != nil { t.Errorf("Select failed: %s", err) } _, err = dbmap.SelectFloat(context.Background(), - "select id * 1.2 from type_conv_test where personjson = "+dbmap.Dialect.BindVar(0)+" and name = "+dbmap.Dialect.BindVar(1), + "select id * 1.2 from type_conv_test where PersonJSON = "+dbmap.Dialect.BindVar(0)+" and Name = "+dbmap.Dialect.BindVar(1), personJSON, hi2) if err != nil { t.Errorf("Select failed: %s", err) } _, err = dbmap.SelectNullFloat(context.Background(), - "select id * 1.2 from type_conv_test where personjson = "+dbmap.Dialect.BindVar(0)+" and name = "+dbmap.Dialect.BindVar(1), + "select id * 1.2 from type_conv_test where PersonJSON = "+dbmap.Dialect.BindVar(0)+" and Name = "+dbmap.Dialect.BindVar(1), personJSON, hi2) if err != nil { t.Errorf("Select failed: %s", err) } _, err = dbmap.SelectStr(context.Background(), - "select name from type_conv_test where personjson = "+dbmap.Dialect.BindVar(0)+" and name = "+dbmap.Dialect.BindVar(1), + "select name from type_conv_test where PersonJSON = "+dbmap.Dialect.BindVar(0)+" and Name = "+dbmap.Dialect.BindVar(1), personJSON, hi2) if err != nil { t.Errorf("Select failed: %s", err) } _, err = dbmap.SelectNullStr(context.Background(), - "select name from type_conv_test where personjson = "+dbmap.Dialect.BindVar(0)+" and name = "+dbmap.Dialect.BindVar(1), + "select name from type_conv_test where PersonJSON = "+dbmap.Dialect.BindVar(0)+" and Name = "+dbmap.Dialect.BindVar(1), personJSON, hi2) if err != nil { t.Errorf("Select failed: %s", err) } _, err = dbmap.QueryContext(context.Background(), - "select name from type_conv_test where personjson = "+dbmap.Dialect.BindVar(0)+" and name = "+dbmap.Dialect.BindVar(1), + "select name from type_conv_test where PersonJSON = "+dbmap.Dialect.BindVar(0)+" and Name = "+dbmap.Dialect.BindVar(1), personJSON, hi2) if err != nil { t.Errorf("Select failed: %s", err) } row := dbmap.QueryRowContext(context.Background(), - "select name from type_conv_test where personjson = "+dbmap.Dialect.BindVar(0)+" and name = "+dbmap.Dialect.BindVar(1), + "select name from type_conv_test where PersonJSON = "+dbmap.Dialect.BindVar(0)+" and Name = "+dbmap.Dialect.BindVar(1), personJSON, hi2) if row == nil || row.Err() != nil { t.Errorf("QueryRowContext failed: %s", row.Err()) } _, err = dbmap.ExecContext(context.Background(), - "select name from type_conv_test where personjson = "+dbmap.Dialect.BindVar(0)+" and name = "+dbmap.Dialect.BindVar(1), + "select name from type_conv_test where PersonJSON = "+dbmap.Dialect.BindVar(0)+" and Name = "+dbmap.Dialect.BindVar(1), personJSON, hi2) if err != nil { t.Errorf("Select failed: %s", err) From 80c09d0c6b60dd0ef85cd39510633f68568815b1 Mon Sep 17 00:00:00 2001 From: Jacob Hoffman-Andrews Date: Fri, 14 Jun 2024 14:55:11 -0700 Subject: [PATCH 5/9] Title case id --- gorp_test.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/gorp_test.go b/gorp_test.go index 46328b0..3fb679f 100644 --- a/gorp_test.go +++ b/gorp_test.go @@ -1766,21 +1766,21 @@ func TestTypeConversionExample(t *testing.T) { } _, err = dbmap.SelectInt(context.Background(), - "select id from type_conv_test where PersonJSON = "+dbmap.Dialect.BindVar(0)+" and Name = "+dbmap.Dialect.BindVar(1), + "select Id from type_conv_test where PersonJSON = "+dbmap.Dialect.BindVar(0)+" and Name = "+dbmap.Dialect.BindVar(1), personJSON, hi2) if err != nil { t.Errorf("Select failed: %s", err) } _, err = dbmap.SelectInt(context.Background(), - "select id from type_conv_test where PersonJSON = "+dbmap.Dialect.BindVar(0)+" and Name = "+dbmap.Dialect.BindVar(1), + "select Id from type_conv_test where PersonJSON = "+dbmap.Dialect.BindVar(0)+" and Name = "+dbmap.Dialect.BindVar(1), personJSON, hi2) if err != nil { t.Errorf("Select failed: %s", err) } _, err = dbmap.SelectNullInt(context.Background(), - "select id from type_conv_test where PersonJSON = "+dbmap.Dialect.BindVar(0)+" and Name = "+dbmap.Dialect.BindVar(1), + "select Id from type_conv_test where PersonJSON = "+dbmap.Dialect.BindVar(0)+" and Name = "+dbmap.Dialect.BindVar(1), personJSON, hi2) if err != nil { t.Errorf("Select failed: %s", err) From 84c09a29bd11ecb0aaecf3d1fb6819583ad998a6 Mon Sep 17 00:00:00 2001 From: Jacob Hoffman-Andrews Date: Fri, 14 Jun 2024 14:58:25 -0700 Subject: [PATCH 6/9] Update go versions --- .github/workflows/go.yml | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml index 470a1bb..8ffd290 100644 --- a/.github/workflows/go.yml +++ b/.github/workflows/go.yml @@ -16,8 +16,8 @@ jobs: strategy: matrix: containerGoVer: - - "1.20" - - "1.21-rc" + - "1.21" + - "1.22" runs-on: ubuntu-latest container: golang:${{ matrix.containerGoVer }} services: @@ -57,8 +57,8 @@ jobs: strategy: matrix: containerGoVer: - - "1.20" - - "1.21-rc" + - "1.21" + - "1.22" runs-on: ubuntu-latest container: golang:${{ matrix.containerGoVer }} steps: @@ -76,8 +76,7 @@ jobs: strategy: matrix: containerGoVer: - - "1.20" - - "1.21-rc" + - "latest" runs-on: ubuntu-latest container: golang:${{ matrix.containerGoVer }} steps: From 49f5b9aa5c1d1562f421d3d37d6c17082c0ade60 Mon Sep 17 00:00:00 2001 From: Jacob Hoffman-Andrews Date: Fri, 14 Jun 2024 15:02:15 -0700 Subject: [PATCH 7/9] Title case more ids --- gorp_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gorp_test.go b/gorp_test.go index 3fb679f..e81c192 100644 --- a/gorp_test.go +++ b/gorp_test.go @@ -1787,14 +1787,14 @@ func TestTypeConversionExample(t *testing.T) { } _, err = dbmap.SelectFloat(context.Background(), - "select id * 1.2 from type_conv_test where PersonJSON = "+dbmap.Dialect.BindVar(0)+" and Name = "+dbmap.Dialect.BindVar(1), + "select Id * 1.2 from type_conv_test where PersonJSON = "+dbmap.Dialect.BindVar(0)+" and Name = "+dbmap.Dialect.BindVar(1), personJSON, hi2) if err != nil { t.Errorf("Select failed: %s", err) } _, err = dbmap.SelectNullFloat(context.Background(), - "select id * 1.2 from type_conv_test where PersonJSON = "+dbmap.Dialect.BindVar(0)+" and Name = "+dbmap.Dialect.BindVar(1), + "select Id * 1.2 from type_conv_test where PersonJSON = "+dbmap.Dialect.BindVar(0)+" and Name = "+dbmap.Dialect.BindVar(1), personJSON, hi2) if err != nil { t.Errorf("Select failed: %s", err) From 51a7e65e543c0aedcc38852686e5238a3d29dd4a Mon Sep 17 00:00:00 2001 From: Jacob Hoffman-Andrews Date: Fri, 14 Jun 2024 15:17:23 -0700 Subject: [PATCH 8/9] Use QuoteField --- gorp_test.go | 55 +++++++++++++++++++++++++++++----------------------- 1 file changed, 31 insertions(+), 24 deletions(-) diff --git a/gorp_test.go b/gorp_test.go index e81c192..b135fff 100644 --- a/gorp_test.go +++ b/gorp_test.go @@ -1745,94 +1745,101 @@ func TestTypeConversionExample(t *testing.T) { t.Errorf("tc3 %v != %v", expected, tc3) } + d := dbmap.Dialect + pj := d.QuoteField("PersonJSON") + id := d.QuoteField("Id") + name := d.QuoteField("Name") + bv0 := d.BindVar(0) + bv1 := d.BindVar(1) + // Test that the Person argument to Select goes through the // type converter var holder TypeConversionExample personJSON := Person{FName: "Jane", LName: "Doe"} _, err := dbmap.Select(context.Background(), holder, - "select * from type_conv_test where PersonJSON = "+dbmap.Dialect.BindVar(0)+" and Name = "+dbmap.Dialect.BindVar(1), + `select * from type_conv_test where `+pj+`=`+bv0+` and `+name+`=`+bv1, personJSON, hi2) if err != nil { - t.Errorf("Select failed: %s", err) + t.Errorf(`Select failed: %s`, err) } err = dbmap.SelectOne(context.Background(), &holder, - "select * from type_conv_test where PersonJSON = "+dbmap.Dialect.BindVar(0)+" and Name = "+dbmap.Dialect.BindVar(1), + `select * from type_conv_test where `+pj+`=`+bv0+` and `+name+`=`+bv1, personJSON, hi2) if err != nil { - t.Errorf("Select failed: %s", err) + t.Errorf(`Select failed: %s`, err) } _, err = dbmap.SelectInt(context.Background(), - "select Id from type_conv_test where PersonJSON = "+dbmap.Dialect.BindVar(0)+" and Name = "+dbmap.Dialect.BindVar(1), + `select `+id+` from type_conv_test where `+pj+`=`+bv0+` and `+name+`=`+bv1, personJSON, hi2) if err != nil { - t.Errorf("Select failed: %s", err) + t.Errorf(`Select failed: %s`, err) } _, err = dbmap.SelectInt(context.Background(), - "select Id from type_conv_test where PersonJSON = "+dbmap.Dialect.BindVar(0)+" and Name = "+dbmap.Dialect.BindVar(1), + `select `+id+` from type_conv_test where `+pj+`=`+bv0+` and `+name+`=`+bv1, personJSON, hi2) if err != nil { - t.Errorf("Select failed: %s", err) + t.Errorf(`Select failed: %s`, err) } _, err = dbmap.SelectNullInt(context.Background(), - "select Id from type_conv_test where PersonJSON = "+dbmap.Dialect.BindVar(0)+" and Name = "+dbmap.Dialect.BindVar(1), + `select `+id+` from type_conv_test where `+pj+`=`+bv0+` and `+name+`=`+bv1, personJSON, hi2) if err != nil { - t.Errorf("Select failed: %s", err) + t.Errorf(`Select failed: %s`, err) } _, err = dbmap.SelectFloat(context.Background(), - "select Id * 1.2 from type_conv_test where PersonJSON = "+dbmap.Dialect.BindVar(0)+" and Name = "+dbmap.Dialect.BindVar(1), + `select `+id+` from type_conv_test where `+pj+`=`+bv0+` and `+name+`=`+bv1, personJSON, hi2) if err != nil { - t.Errorf("Select failed: %s", err) + t.Errorf(`Select failed: %s`, err) } _, err = dbmap.SelectNullFloat(context.Background(), - "select Id * 1.2 from type_conv_test where PersonJSON = "+dbmap.Dialect.BindVar(0)+" and Name = "+dbmap.Dialect.BindVar(1), + `select `+id+` from type_conv_test where `+pj+`=`+bv0+` and `+name+`=`+bv1, personJSON, hi2) if err != nil { - t.Errorf("Select failed: %s", err) + t.Errorf(`Select failed: %s`, err) } _, err = dbmap.SelectStr(context.Background(), - "select name from type_conv_test where PersonJSON = "+dbmap.Dialect.BindVar(0)+" and Name = "+dbmap.Dialect.BindVar(1), + `select `+name+` from type_conv_test where `+pj+`=`+bv0+` and `+name+`=`+bv1, personJSON, hi2) if err != nil { - t.Errorf("Select failed: %s", err) + t.Errorf(`Select failed: %s`, err) } _, err = dbmap.SelectNullStr(context.Background(), - "select name from type_conv_test where PersonJSON = "+dbmap.Dialect.BindVar(0)+" and Name = "+dbmap.Dialect.BindVar(1), + `select `+name+` from type_conv_test where `+pj+`=`+bv0+` and `+name+`=`+bv1, personJSON, hi2) if err != nil { - t.Errorf("Select failed: %s", err) + t.Errorf(`Select failed: %s`, err) } _, err = dbmap.QueryContext(context.Background(), - "select name from type_conv_test where PersonJSON = "+dbmap.Dialect.BindVar(0)+" and Name = "+dbmap.Dialect.BindVar(1), + `select `+name+` from type_conv_test where `+pj+`=`+bv0+` and `+name+`=`+bv1, personJSON, hi2) if err != nil { - t.Errorf("Select failed: %s", err) + t.Errorf(`Select failed: %s`, err) } row := dbmap.QueryRowContext(context.Background(), - "select name from type_conv_test where PersonJSON = "+dbmap.Dialect.BindVar(0)+" and Name = "+dbmap.Dialect.BindVar(1), + `select `+name+` from type_conv_test where `+pj+`=`+bv0+` and `+name+`=`+bv1, personJSON, hi2) if row == nil || row.Err() != nil { - t.Errorf("QueryRowContext failed: %s", row.Err()) + t.Errorf(`QueryRowContext failed: %s`, row.Err()) } _, err = dbmap.ExecContext(context.Background(), - "select name from type_conv_test where PersonJSON = "+dbmap.Dialect.BindVar(0)+" and Name = "+dbmap.Dialect.BindVar(1), + `select `+name+` from type_conv_test where `+pj+`=`+bv0+` and `+name+`=`+bv1, personJSON, hi2) if err != nil { - t.Errorf("Select failed: %s", err) + t.Errorf(`Select failed: %s`, err) } if _del(dbmap, tc) != 1 { From 42ea7ed790029a8a759dd3b9153eeb3165112bd1 Mon Sep 17 00:00:00 2001 From: Jacob Hoffman-Andrews Date: Fri, 14 Jun 2024 15:23:46 -0700 Subject: [PATCH 9/9] Move convertArgs --- db.go | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/db.go b/db.go index 9598098..c29bfca 100644 --- a/db.go +++ b/db.go @@ -605,20 +605,6 @@ func (m *DbMap) Select(ctx context.Context, i interface{}, query string, args .. return hookedselect(ctx, m, m, i, query, args...) } -func (m *DbMap) convertArgs(args ...interface{}) ([]interface{}, error) { - if m.TypeConverter == nil { - return args, nil - } - for i, arg := range args { - converted, err := m.TypeConverter.ToDb(arg) - if err != nil { - return nil, err - } - args[i] = converted - } - return args, nil -} - // Exec runs an arbitrary SQL statement. args represent the bind parameters. // This is equivalent to running: ExecContext() using database/sql func (m *DbMap) ExecContext(ctx context.Context, query string, args ...interface{}) (sql.Result, error) { @@ -898,6 +884,22 @@ func (m *DbMap) trace(started time.Time, query string, args ...interface{}) { } } +// convertArgs passes each argument through the TypeConverter, if any, +// and returns the result (which may be identical to the input). +func (m *DbMap) convertArgs(args ...interface{}) ([]interface{}, error) { + if m.TypeConverter == nil { + return args, nil + } + for i, arg := range args { + converted, err := m.TypeConverter.ToDb(arg) + if err != nil { + return nil, err + } + args[i] = converted + } + return args, nil +} + type stringer interface { ToStringSlice() []string }