From f7d4d9a6c94c42f442834f3df685b2af1fadb4ee Mon Sep 17 00:00:00 2001 From: pavel-raykov Date: Wed, 1 Oct 2025 13:05:14 +0200 Subject: [PATCH 1/4] Minor. --- pkg/types/interval.go | 58 ++++++++++++++++++++++++++++++++++++ pkg/types/interval_test.go | 61 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 119 insertions(+) create mode 100644 pkg/types/interval.go create mode 100644 pkg/types/interval_test.go diff --git a/pkg/types/interval.go b/pkg/types/interval.go new file mode 100644 index 0000000000..03e67424f6 --- /dev/null +++ b/pkg/types/interval.go @@ -0,0 +1,58 @@ +package types + +import ( + "database/sql/driver" + "time" + + "github.com/pkg/errors" +) + +// Interval represents a time.Duration stored as a Postgres interval type +type Interval time.Duration + +// NewInterval creates Interval for specified duration +func NewInterval(d time.Duration) *Interval { + i := new(Interval) + *i = Interval(d) + return i +} + +func (i Interval) Duration() time.Duration { + return time.Duration(i) +} + +// MarshalText implements the text.Marshaler interface. +func (i Interval) MarshalText() ([]byte, error) { + return []byte(time.Duration(i).String()), nil +} + +// UnmarshalText implements the text.Unmarshaler interface. +func (i *Interval) UnmarshalText(input []byte) error { + v, err := time.ParseDuration(string(input)) + if err != nil { + return err + } + *i = Interval(v) + return nil +} + +func (i *Interval) Scan(v interface{}) error { + if v == nil { + *i = Interval(time.Duration(0)) + return nil + } + asInt64, is := v.(int64) + if !is { + return errors.Errorf("models.Interval#Scan() wanted int64, got %T", v) + } + *i = Interval(time.Duration(asInt64) * time.Nanosecond) + return nil +} + +func (i Interval) Value() (driver.Value, error) { + return time.Duration(i).Nanoseconds(), nil +} + +func (i Interval) IsZero() bool { + return time.Duration(i) == time.Duration(0) +} diff --git a/pkg/types/interval_test.go b/pkg/types/interval_test.go new file mode 100644 index 0000000000..f1d99d92e9 --- /dev/null +++ b/pkg/types/interval_test.go @@ -0,0 +1,61 @@ +package types + +import ( + "testing" + "time" + + "github.com/stretchr/testify/require" +) + +func TestNewInterval(t *testing.T) { + t.Parallel() + + duration := 33 * time.Second + interval := NewInterval(duration) + + require.Equal(t, duration, interval.Duration()) +} + +func TestInterval_IsZero(t *testing.T) { + t.Parallel() + + i := NewInterval(0) + require.NotNil(t, i) + require.True(t, i.IsZero()) + + i = NewInterval(1) + require.NotNil(t, i) + require.False(t, i.IsZero()) +} + +func TestInterval_Scan_Value(t *testing.T) { + t.Parallel() + + i := NewInterval(100) + require.NotNil(t, i) + + val, err := i.Value() + require.NoError(t, err) + + iNew := NewInterval(0) + err = iNew.Scan(val) + require.NoError(t, err) + + require.Equal(t, i, iNew) +} + +func TestInterval_MarshalText_UnmarshalText(t *testing.T) { + t.Parallel() + + i := NewInterval(100) + require.NotNil(t, i) + + txt, err := i.MarshalText() + require.NoError(t, err) + + iNew := NewInterval(0) + err = iNew.UnmarshalText(txt) + require.NoError(t, err) + + require.Equal(t, i, iNew) +} From 28a090681bc83a7a36ef29d832dc729545647171 Mon Sep 17 00:00:00 2001 From: pavel-raykov Date: Wed, 1 Oct 2025 13:06:54 +0200 Subject: [PATCH 2/4] Minor. --- go.mod | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 9fcffb365f..a4f9856785 100644 --- a/go.mod +++ b/go.mod @@ -32,6 +32,7 @@ require ( github.com/marcboeker/go-duckdb v1.8.5 github.com/pelletier/go-toml v1.9.5 github.com/pelletier/go-toml/v2 v2.2.4 + github.com/pkg/errors v0.9.1 github.com/prometheus/client_golang v1.22.0 github.com/santhosh-tekuri/jsonschema/v5 v5.3.1 github.com/scylladb/go-reflectx v1.0.1 @@ -129,7 +130,6 @@ require ( github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/oklog/run v1.2.0 // indirect github.com/pierrec/lz4/v4 v4.1.22 // indirect - github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/prometheus/client_model v0.6.2 // indirect github.com/prometheus/common v0.65.0 // indirect From 34ff689c75b110640d852cbb6e99a371d4cca1cc Mon Sep 17 00:00:00 2001 From: pavel-raykov Date: Wed, 1 Oct 2025 16:11:53 +0200 Subject: [PATCH 3/4] Minor. --- pkg/{types => sqlutil}/interval.go | 7 +++---- pkg/{types => sqlutil}/interval_test.go | 2 +- 2 files changed, 4 insertions(+), 5 deletions(-) rename pkg/{types => sqlutil}/interval.go (91%) rename pkg/{types => sqlutil}/interval_test.go (98%) diff --git a/pkg/types/interval.go b/pkg/sqlutil/interval.go similarity index 91% rename from pkg/types/interval.go rename to pkg/sqlutil/interval.go index 03e67424f6..1491b2986b 100644 --- a/pkg/types/interval.go +++ b/pkg/sqlutil/interval.go @@ -1,10 +1,9 @@ -package types +package sqlutil import ( "database/sql/driver" + "fmt" "time" - - "github.com/pkg/errors" ) // Interval represents a time.Duration stored as a Postgres interval type @@ -43,7 +42,7 @@ func (i *Interval) Scan(v interface{}) error { } asInt64, is := v.(int64) if !is { - return errors.Errorf("models.Interval#Scan() wanted int64, got %T", v) + return fmt.Errorf("models.Interval#Scan() wanted int64, got %T", v) } *i = Interval(time.Duration(asInt64) * time.Nanosecond) return nil diff --git a/pkg/types/interval_test.go b/pkg/sqlutil/interval_test.go similarity index 98% rename from pkg/types/interval_test.go rename to pkg/sqlutil/interval_test.go index f1d99d92e9..32b6b0c432 100644 --- a/pkg/types/interval_test.go +++ b/pkg/sqlutil/interval_test.go @@ -1,4 +1,4 @@ -package types +package sqlutil import ( "testing" From fc5c5e477459d74638ea7806047d100bdc188054 Mon Sep 17 00:00:00 2001 From: pavel-raykov Date: Wed, 1 Oct 2025 16:34:02 +0200 Subject: [PATCH 4/4] Minor. --- go.mod | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go.mod b/go.mod index a4f9856785..9fcffb365f 100644 --- a/go.mod +++ b/go.mod @@ -32,7 +32,6 @@ require ( github.com/marcboeker/go-duckdb v1.8.5 github.com/pelletier/go-toml v1.9.5 github.com/pelletier/go-toml/v2 v2.2.4 - github.com/pkg/errors v0.9.1 github.com/prometheus/client_golang v1.22.0 github.com/santhosh-tekuri/jsonschema/v5 v5.3.1 github.com/scylladb/go-reflectx v1.0.1 @@ -130,6 +129,7 @@ require ( github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/oklog/run v1.2.0 // indirect github.com/pierrec/lz4/v4 v4.1.22 // indirect + github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/prometheus/client_model v0.6.2 // indirect github.com/prometheus/common v0.65.0 // indirect