Skip to content

Commit

Permalink
Fix USING TIMEOUT time generation
Browse files Browse the repository at this point in the history
Scylla does not support fractions.
We need to make sure that time is formatted the following way: XmYsZms
  • Loading branch information
dkropachev committed Jan 27, 2025
1 parent ab73391 commit 3e6319d
Show file tree
Hide file tree
Showing 3 changed files with 88 additions and 1 deletion.
2 changes: 1 addition & 1 deletion qb/using.go
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ func (u *using) writeCql(cql *bytes.Buffer) (names []string) {

if u.timeout != 0 {
writePreamble(cql)
fmt.Fprintf(cql, "TIMEOUT %s ", u.timeout)
fmt.Fprintf(cql, "TIMEOUT %s ", formatDuration(u.timeout))
} else if u.timeoutName != "" {
writePreamble(cql)
cql.WriteString("TIMEOUT ? ")
Expand Down
26 changes: 26 additions & 0 deletions qb/utils.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@ package qb

import (
"bytes"
"fmt"
"strings"
"time"
)

// placeholders returns a string with count ? placeholders joined with commas.
Expand All @@ -31,3 +34,26 @@ func (cols columns) writeCql(cql *bytes.Buffer) {
}
}
}

func formatDuration(d time.Duration) string {
// Round the duration to the nearest millisecond
// Extract hours, minutes, seconds, and milliseconds
minutes := d / time.Minute
d %= time.Minute
seconds := d / time.Second
d %= time.Second
milliseconds := d / time.Millisecond

// Format the duration string
var res []string
if minutes > 0 {
res = append(res, fmt.Sprintf("%dm", minutes))
}
if seconds > 0 {
res = append(res, fmt.Sprintf("%ds", seconds))
}
if milliseconds > 0 {
res = append(res, fmt.Sprintf("%dms", milliseconds))
}
return strings.Join(res, "")
}
61 changes: 61 additions & 0 deletions qb/utils_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
package qb

import (
"testing"
"time"
)

func TestFormatDuration(t *testing.T) {
tests := []struct {
name string
input time.Duration
expected string
}{
{
name: "Zero duration",
input: 0,
expected: "",
},
{
input: 500 * time.Millisecond,
expected: "500ms",
},
{
input: 10 * time.Second,
expected: "10s",
},
{
input: 3 * time.Minute,
expected: "3m",
},
{
input: (2 * time.Minute) + (30 * time.Second),
expected: "2m30s",
},
{
input: (15 * time.Second) + (250 * time.Millisecond),
expected: "15s250ms",
},
{
input: (1 * time.Minute) + (45 * time.Second) + (123 * time.Millisecond),
expected: "1m45s123ms",
},
{
input: (5 * time.Minute) + (1 * time.Second) + (999 * time.Millisecond),
expected: "5m1s999ms",
},
{
input: (2 * time.Second) + (1500 * time.Millisecond), // 3 seconds, 500ms
expected: "3s500ms",
},
}

for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
actual := formatDuration(tt.input)
if actual != tt.expected {
t.Errorf("got %q, want %q", actual, tt.expected)
}
})
}
}

0 comments on commit 3e6319d

Please sign in to comment.