Skip to content

Commit 99cf77a

Browse files
refactor(store): move shared scan/helper functions to helpers.go
Move scanJob, scanJobRow, scanOutboxMessage, and nilIfEmpty to internal/store/helpers.go for better code organization. These functions are shared between SQLite and Postgres implementations. Co-authored-by: MinecraftFuns <25814618+MinecraftFuns@users.noreply.github.com>
1 parent a6df69f commit 99cf77a

3 files changed

Lines changed: 81 additions & 72 deletions

File tree

internal/store/helpers.go

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
package store
2+
3+
import (
4+
"database/sql"
5+
"fmt"
6+
)
7+
8+
// nilIfEmpty returns nil if s is empty, otherwise returns s.
9+
// Used for nullable database columns.
10+
func nilIfEmpty(s string) interface{} {
11+
if s == "" {
12+
return nil
13+
}
14+
return s
15+
}
16+
17+
// scanJob scans a Job from sql.Rows.
18+
func scanJob(rows *sql.Rows) (Job, error) {
19+
var j Job
20+
var payloadJSON, lastError, dedupeKey sql.NullString
21+
var lockedAt sql.NullTime
22+
err := rows.Scan(
23+
&j.ID, &j.Kind, &j.RunAt, &payloadJSON, &j.Status, &j.Attempt, &j.MaxAttempts,
24+
&lastError, &lockedAt, &dedupeKey, &j.CreatedAt, &j.UpdatedAt,
25+
)
26+
if err != nil {
27+
return j, fmt.Errorf("scan job failed: %w", err)
28+
}
29+
j.PayloadJSON = payloadJSON.String
30+
j.LastError = lastError.String
31+
j.DedupeKey = dedupeKey.String
32+
if lockedAt.Valid {
33+
j.LockedAt = &lockedAt.Time
34+
}
35+
return j, nil
36+
}
37+
38+
// scanJobRow scans a Job from a single sql.Row.
39+
func scanJobRow(row *sql.Row) (Job, error) {
40+
var j Job
41+
var payloadJSON, lastError, dedupeKey sql.NullString
42+
var lockedAt sql.NullTime
43+
err := row.Scan(
44+
&j.ID, &j.Kind, &j.RunAt, &payloadJSON, &j.Status, &j.Attempt, &j.MaxAttempts,
45+
&lastError, &lockedAt, &dedupeKey, &j.CreatedAt, &j.UpdatedAt,
46+
)
47+
if err != nil {
48+
return j, err
49+
}
50+
j.PayloadJSON = payloadJSON.String
51+
j.LastError = lastError.String
52+
j.DedupeKey = dedupeKey.String
53+
if lockedAt.Valid {
54+
j.LockedAt = &lockedAt.Time
55+
}
56+
return j, nil
57+
}
58+
59+
// scanOutboxMessage scans an OutboxMessage from sql.Rows.
60+
func scanOutboxMessage(rows *sql.Rows) (OutboxMessage, error) {
61+
var m OutboxMessage
62+
var payloadJSON, dedupeKey, lastError sql.NullString
63+
var nextAttemptAt, lockedAt sql.NullTime
64+
err := rows.Scan(
65+
&m.ID, &m.ParticipantID, &m.Kind, &payloadJSON, &m.Status, &m.Attempts,
66+
&nextAttemptAt, &dedupeKey, &lockedAt, &lastError, &m.CreatedAt, &m.UpdatedAt,
67+
)
68+
if err != nil {
69+
return m, fmt.Errorf("scan outbox message failed: %w", err)
70+
}
71+
m.PayloadJSON = payloadJSON.String
72+
m.DedupeKey = dedupeKey.String
73+
m.LastError = lastError.String
74+
if nextAttemptAt.Valid {
75+
m.NextAttemptAt = &nextAttemptAt.Time
76+
}
77+
if lockedAt.Valid {
78+
m.LockedAt = &lockedAt.Time
79+
}
80+
return m, nil
81+
}

internal/store/job_sqlite.go

Lines changed: 0 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -164,52 +164,3 @@ func (s *SQLiteStore) GetJob(id string) (*Job, error) {
164164
}
165165
return &j, nil
166166
}
167-
168-
// scanJob scans a Job from sql.Rows.
169-
func scanJob(rows *sql.Rows) (Job, error) {
170-
var j Job
171-
var payloadJSON, lastError, dedupeKey sql.NullString
172-
var lockedAt sql.NullTime
173-
err := rows.Scan(
174-
&j.ID, &j.Kind, &j.RunAt, &payloadJSON, &j.Status, &j.Attempt, &j.MaxAttempts,
175-
&lastError, &lockedAt, &dedupeKey, &j.CreatedAt, &j.UpdatedAt,
176-
)
177-
if err != nil {
178-
return j, fmt.Errorf("scan job failed: %w", err)
179-
}
180-
j.PayloadJSON = payloadJSON.String
181-
j.LastError = lastError.String
182-
j.DedupeKey = dedupeKey.String
183-
if lockedAt.Valid {
184-
j.LockedAt = &lockedAt.Time
185-
}
186-
return j, nil
187-
}
188-
189-
// scanJobRow scans a Job from a single sql.Row.
190-
func scanJobRow(row *sql.Row) (Job, error) {
191-
var j Job
192-
var payloadJSON, lastError, dedupeKey sql.NullString
193-
var lockedAt sql.NullTime
194-
err := row.Scan(
195-
&j.ID, &j.Kind, &j.RunAt, &payloadJSON, &j.Status, &j.Attempt, &j.MaxAttempts,
196-
&lastError, &lockedAt, &dedupeKey, &j.CreatedAt, &j.UpdatedAt,
197-
)
198-
if err != nil {
199-
return j, err
200-
}
201-
j.PayloadJSON = payloadJSON.String
202-
j.LastError = lastError.String
203-
j.DedupeKey = dedupeKey.String
204-
if lockedAt.Valid {
205-
j.LockedAt = &lockedAt.Time
206-
}
207-
return j, nil
208-
}
209-
210-
func nilIfEmpty(s string) interface{} {
211-
if s == "" {
212-
return nil
213-
}
214-
return s
215-
}

internal/store/outbox_sqlite.go

Lines changed: 0 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -121,26 +121,3 @@ func (s *SQLiteStore) RequeueStaleSendingMessages(staleBefore time.Time) (int, e
121121
}
122122
return int(n), nil
123123
}
124-
125-
func scanOutboxMessage(rows *sql.Rows) (OutboxMessage, error) {
126-
var m OutboxMessage
127-
var payloadJSON, dedupeKey, lastError sql.NullString
128-
var nextAttemptAt, lockedAt sql.NullTime
129-
err := rows.Scan(
130-
&m.ID, &m.ParticipantID, &m.Kind, &payloadJSON, &m.Status, &m.Attempts,
131-
&nextAttemptAt, &dedupeKey, &lockedAt, &lastError, &m.CreatedAt, &m.UpdatedAt,
132-
)
133-
if err != nil {
134-
return m, fmt.Errorf("scan outbox message failed: %w", err)
135-
}
136-
m.PayloadJSON = payloadJSON.String
137-
m.DedupeKey = dedupeKey.String
138-
m.LastError = lastError.String
139-
if nextAttemptAt.Valid {
140-
m.NextAttemptAt = &nextAttemptAt.Time
141-
}
142-
if lockedAt.Valid {
143-
m.LockedAt = &lockedAt.Time
144-
}
145-
return m, nil
146-
}

0 commit comments

Comments
 (0)