summaryrefslogtreecommitdiff
path: root/internal/storage
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2026-04-14 11:19:50 +0300
committerPaul Buetow <paul@buetow.org>2026-04-14 11:19:50 +0300
commit55593e14ee2a4225d1db1058da9d8d1f663225b6 (patch)
tree5fdd9830dd6411f348be28dbed2085e1806148ce /internal/storage
parent2bc4e64acf93f04c8871d964d75f041ada57f89d (diff)
refactor: use fs.FS for aggregate and DB import (ask v3)
Decouple Aggregator and ImportFromDir from direct os.Open by routing through io/fs: NewAggregatorFS, ImportFromFS, recordsdir.ListNonEmptyFilesFS. NewAggregator and ImportFromDir wrap os.DirFS for backward compatibility. Add fstest.MapFS tests for recordsdir, aggregate, and ImportFromFS. Made-with: Cursor
Diffstat (limited to 'internal/storage')
-rw-r--r--internal/storage/db.go18
1 files changed, 12 insertions, 6 deletions
diff --git a/internal/storage/db.go b/internal/storage/db.go
index fe789d6..45eb71a 100644
--- a/internal/storage/db.go
+++ b/internal/storage/db.go
@@ -5,6 +5,7 @@ import (
"context"
"database/sql"
"fmt"
+ "io/fs"
"os"
"codeberg.org/snonux/goprecords/internal/recordline"
@@ -63,10 +64,15 @@ func ResetRecords(ctx context.Context, db *sql.DB) error {
}
func ImportFromDir(ctx context.Context, db *sql.DB, statsDir string) error {
+ return ImportFromFS(ctx, db, os.DirFS(statsDir))
+}
+
+// ImportFromFS reads non-empty .records files from the root of fsys into the database.
+func ImportFromFS(ctx context.Context, db *sql.DB, fsys fs.FS) error {
if err := ResetRecords(ctx, db); err != nil {
return fmt.Errorf("reset records: %w", err)
}
- files, err := recordsdir.ListNonEmptyFiles(statsDir)
+ files, err := recordsdir.ListNonEmptyFilesFS(fsys, ".")
if err != nil {
return fmt.Errorf("read dir: %w", err)
}
@@ -81,7 +87,7 @@ func ImportFromDir(ctx context.Context, db *sql.DB, statsDir string) error {
}
defer insert.Close()
for _, f := range files {
- if err := importFile(ctx, insert, f.Path, f.Host); err != nil {
+ if err := importFile(ctx, insert, fsys, f.Path, f.Host); err != nil {
return err
}
}
@@ -119,10 +125,10 @@ func LoadRecords(ctx context.Context, db *sql.DB) ([]Record, error) {
return out, nil
}
-func importFile(ctx context.Context, insert *sql.Stmt, path, host string) error {
- f, err := os.Open(path)
+func importFile(ctx context.Context, insert *sql.Stmt, fsys fs.FS, relPath, host string) error {
+ f, err := fsys.Open(relPath)
if err != nil {
- return fmt.Errorf("open %s: %w", path, err)
+ return fmt.Errorf("open %s: %w", relPath, err)
}
defer f.Close()
sc := bufio.NewScanner(f)
@@ -141,7 +147,7 @@ func importFile(ctx context.Context, insert *sql.Stmt, path, host string) error
}
}
if err := sc.Err(); err != nil {
- return fmt.Errorf("scan %s: %w", path, err)
+ return fmt.Errorf("scan %s: %w", relPath, err)
}
return nil
}