From 1dda5fd8f9f006ad83c08311014d4a8e27365405 Mon Sep 17 00:00:00 2001 From: Lz Date: Mon, 18 Mar 2024 21:41:45 +0800 Subject: [PATCH 1/4] chore(devops): upgraded go modules --- go.mod | 2 +- go.sum | 4 ++-- migrate/migrator.go | 2 +- queryer_mapr_test.go | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index 3967e97..ffa9bf2 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ require ( github.com/mattn/go-sqlite3 v1.14.22 github.com/rs/zerolog v1.32.0 github.com/stretchr/testify v1.9.0 - github.com/yaitoo/async v1.0.3 + github.com/yaitoo/async v1.0.4 ) require ( diff --git a/go.sum b/go.sum index dc7d81e..ef59025 100644 --- a/go.sum +++ b/go.sum @@ -20,8 +20,8 @@ github.com/rs/zerolog v1.32.0 h1:keLypqrlIjaFsbmJOBdB/qvyF8KEtCWHwobLp5l/mQ0= github.com/rs/zerolog v1.32.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -github.com/yaitoo/async v1.0.3 h1:zBlE07xt/EkRqfrUU/zJSfIcsZJgnUDCOphRAvnT/Kk= -github.com/yaitoo/async v1.0.3/go.mod h1:IpSO7Ei7AxiqLxFqDjN4rJaVlt8wm4ZxMXyyQaWmM1g= +github.com/yaitoo/async v1.0.4 h1:u+SWuJcSckgBOcMjMYz9IviojeCatDrdni3YNGLCiHY= +github.com/yaitoo/async v1.0.4/go.mod h1:IpSO7Ei7AxiqLxFqDjN4rJaVlt8wm4ZxMXyyQaWmM1g= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= diff --git a/migrate/migrator.go b/migrate/migrator.go index eaf044e..68a440d 100644 --- a/migrate/migrator.go +++ b/migrate/migrator.go @@ -362,7 +362,7 @@ func (m *Migrator) Rotate(ctx context.Context) error { } var week int - _, week = now.ISOWeek() //1-53 week + _, week = now.ISOWeek() // 1-53 week next := now.AddDate(0, 0, 7) _, nextWeek := next.ISOWeek() diff --git a/queryer_mapr_test.go b/queryer_mapr_test.go index 4f0466b..60d5d69 100644 --- a/queryer_mapr_test.go +++ b/queryer_mapr_test.go @@ -801,7 +801,7 @@ func TestQueryLimit(t *testing.T) { return q.QueryLimit(context.Background(), New(). Select("users", "id"). SQL("ORDER BY id DESC"), func(i, j MRUser) bool { - //DESC + // DESC return j.ID < i.ID }, 16) }, From 6c089083d9f2d1399b906c273fb48807587ccb78 Mon Sep 17 00:00:00 2001 From: Lz Date: Mon, 18 Mar 2024 22:15:33 +0800 Subject: [PATCH 2/4] feat(db): added Duration support in Scanner/Valuer --- duration.go | 43 +++++++++++++++++++++++++++ duration_test.go | 75 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 118 insertions(+) create mode 100644 duration.go create mode 100644 duration_test.go diff --git a/duration.go b/duration.go new file mode 100644 index 0000000..bc5afd4 --- /dev/null +++ b/duration.go @@ -0,0 +1,43 @@ +package sqle + +import ( + "database/sql/driver" + "errors" + "time" +) + +type Duration time.Duration + +// Value implements the driver.Valuer interface, +// and turns the Duration into a VARCHAR field for MySQL storage. +func (d Duration) Value() (driver.Value, error) { + return time.Duration(d).String(), nil +} + +// Scan implements the sql.Scanner interface, +// and turns the VARCHAR field incoming from MySQL into a Duration +func (d *Duration) Scan(src interface{}) error { + if src == nil { + return nil + } + + var val string + + switch v := src.(type) { + case []byte: + val = string(v) + case string: + val = v + default: + return errors.New("bad duration type assertion") + } + + td, err := time.ParseDuration(val) + if err != nil { + return err + } + + *d = Duration(td) + + return nil +} diff --git a/duration_test.go b/duration_test.go new file mode 100644 index 0000000..ce42c71 --- /dev/null +++ b/duration_test.go @@ -0,0 +1,75 @@ +package sqle + +import ( + "database/sql" + "testing" + "time" + + "github.com/stretchr/testify/require" +) + +func TestDuration(t *testing.T) { + d, err := sql.Open("sqlite3", "file::memory:") + require.NoError(t, err) + + _, err = d.Exec("CREATE TABLE `users` (`id` id NOT NULL,`ttl` VARCHAR(20), PRIMARY KEY (`id`))") + require.NoError(t, err) + + d10 := Duration(10 * time.Second) + d11 := Duration(11 * time.Second) + d12 := Duration(12 * time.Second) + d13 := Duration(13 * time.Second) + + result, err := d.Exec("INSERT INTO `users`(`id`, `ttl`) VALUES(?, ?)", 10, d10) + require.NoError(t, err) + + rows, err := result.RowsAffected() + require.NoError(t, err) + require.Equal(t, int64(1), rows) + + result, err = d.Exec("INSERT INTO `users`(`id`, `ttl`) VALUES(?, ?)", 11, d11) + require.NoError(t, err) + + rows, err = result.RowsAffected() + require.NoError(t, err) + require.Equal(t, int64(1), rows) + + result, err = d.Exec("INSERT INTO `users`(`id`, `ttl`) VALUES(?, ?)", 12, d12) + require.NoError(t, err) + + rows, err = result.RowsAffected() + require.NoError(t, err) + require.Equal(t, int64(1), rows) + + result, err = d.Exec("INSERT INTO `users`(`id`, `ttl`) VALUES(?, ?)", 13, d13) + require.NoError(t, err) + + rows, err = result.RowsAffected() + require.NoError(t, err) + require.Equal(t, int64(1), rows) + + var b10 Duration + err = d.QueryRow("SELECT `ttl` FROM `users` WHERE id=?", 10).Scan(&b10) + require.NoError(t, err) + + require.EqualValues(t, d10, b10) + + var b11 Duration + err = d.QueryRow("SELECT `ttl` FROM `users` WHERE id=?", 11).Scan(&b11) + require.NoError(t, err) + + require.EqualValues(t, d11, b11) + + var b12 Duration + err = d.QueryRow("SELECT `ttl` FROM `users` WHERE id=?", 12).Scan(&b12) + require.NoError(t, err) + + require.EqualValues(t, d12, b12) + + var b13 Duration + err = d.QueryRow("SELECT `ttl` FROM `users` WHERE id=?", 13).Scan(&b13) + require.NoError(t, err) + + require.EqualValues(t, d13, b13) + +} From 25771e4d894aa2e11de67162c277df0d169d376d Mon Sep 17 00:00:00 2001 From: Lz Date: Mon, 18 Mar 2024 22:18:22 +0800 Subject: [PATCH 3/4] feat(db): added Duration support in Scanner/Valuer --- duration.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/duration.go b/duration.go index bc5afd4..987b864 100644 --- a/duration.go +++ b/duration.go @@ -8,6 +8,10 @@ import ( type Duration time.Duration +func (d Duration) Duration() time.Duration { + return time.Duration(d) +} + // Value implements the driver.Valuer interface, // and turns the Duration into a VARCHAR field for MySQL storage. func (d Duration) Value() (driver.Value, error) { From a0d01f362207dea7c11f999368b98d200bf1445a Mon Sep 17 00:00:00 2001 From: Lz Date: Tue, 19 Mar 2024 08:28:45 +0800 Subject: [PATCH 4/4] fix(tests): fixed tests for Duration --- bitbool.go | 4 ++-- duration.go | 6 +++--- duration_test.go | 14 +++++++++----- 3 files changed, 14 insertions(+), 10 deletions(-) diff --git a/bitbool.go b/bitbool.go index 415597d..f765b76 100644 --- a/bitbool.go +++ b/bitbool.go @@ -10,7 +10,7 @@ type BitBool bool // Value implements the driver.Valuer interface, // and turns the BitBool into a bit field (BIT(1)) for MySQL storage. -func (b BitBool) Value() (driver.Value, error) { +func (b BitBool) Value() (driver.Value, error) { // skipcq: GO-W1029 if b { return []byte{1}, nil } else { @@ -20,7 +20,7 @@ func (b BitBool) Value() (driver.Value, error) { // Scan implements the sql.Scanner interface, // and turns the bit field incoming from MySQL into a BitBool -func (b *BitBool) Scan(src interface{}) error { +func (b *BitBool) Scan(src interface{}) error { // skipcq: GO-W1029 if src == nil { return nil } diff --git a/duration.go b/duration.go index 987b864..63af8f5 100644 --- a/duration.go +++ b/duration.go @@ -8,19 +8,19 @@ import ( type Duration time.Duration -func (d Duration) Duration() time.Duration { +func (d Duration) Duration() time.Duration { // skipcq: GO-W1029 return time.Duration(d) } // Value implements the driver.Valuer interface, // and turns the Duration into a VARCHAR field for MySQL storage. -func (d Duration) Value() (driver.Value, error) { +func (d Duration) Value() (driver.Value, error) { // skipcq: GO-W1029 return time.Duration(d).String(), nil } // Scan implements the sql.Scanner interface, // and turns the VARCHAR field incoming from MySQL into a Duration -func (d *Duration) Scan(src interface{}) error { +func (d *Duration) Scan(src interface{}) error { // skipcq: GO-W1029 if src == nil { return nil } diff --git a/duration_test.go b/duration_test.go index ce42c71..b2cc1d6 100644 --- a/duration_test.go +++ b/duration_test.go @@ -12,7 +12,7 @@ func TestDuration(t *testing.T) { d, err := sql.Open("sqlite3", "file::memory:") require.NoError(t, err) - _, err = d.Exec("CREATE TABLE `users` (`id` id NOT NULL,`ttl` VARCHAR(20), PRIMARY KEY (`id`))") + _, err = d.Exec("CREATE TABLE `users` (`id` id NOT NULL,`ttl` VARCHAR(20), `b_ttl` VARBINARY, PRIMARY KEY (`id`))") require.NoError(t, err) d10 := Duration(10 * time.Second) @@ -20,7 +20,7 @@ func TestDuration(t *testing.T) { d12 := Duration(12 * time.Second) d13 := Duration(13 * time.Second) - result, err := d.Exec("INSERT INTO `users`(`id`, `ttl`) VALUES(?, ?)", 10, d10) + result, err := d.Exec("INSERT INTO `users`(`id`, `ttl`,`b_ttl`) VALUES(?, ?, ?)", 10, d10, d10) require.NoError(t, err) rows, err := result.RowsAffected() @@ -49,16 +49,20 @@ func TestDuration(t *testing.T) { require.Equal(t, int64(1), rows) var b10 Duration - err = d.QueryRow("SELECT `ttl` FROM `users` WHERE id=?", 10).Scan(&b10) + var b_b10 Duration + err = d.QueryRow("SELECT `ttl`, `b_ttl` FROM `users` WHERE id=?", 10).Scan(&b10, &b_b10) require.NoError(t, err) - require.EqualValues(t, d10, b10) + require.Equal(t, d10.Duration(), b10.Duration()) + require.Equal(t, d10.Duration(), b_b10.Duration()) var b11 Duration - err = d.QueryRow("SELECT `ttl` FROM `users` WHERE id=?", 11).Scan(&b11) + var b_b11 Duration + err = d.QueryRow("SELECT `ttl`, `b_ttl` FROM `users` WHERE id=?", 11).Scan(&b11, &b_b11) require.NoError(t, err) require.EqualValues(t, d11, b11) + require.Empty(t, b_b11) var b12 Duration err = d.QueryRow("SELECT `ttl` FROM `users` WHERE id=?", 12).Scan(&b12)