]> git.giacomolli.uk - onechat/blobdiff - journal.go
Require consent and review for autosquash
[onechat] / journal.go
index 3fb8f649d7c6cdacfe89d40102f733c3a423433d..d048913b6e6c069b4c71a4b46b47087cd7d6dfd5 100644 (file)
@@ -38,13 +38,13 @@ type Journal struct {
 func (j *Journal) Write(day string, line []byte) (Position, error) {
        number, err := journalDayNumber(day)
        if err != nil {
 func (j *Journal) Write(day string, line []byte) (Position, error) {
        number, err := journalDayNumber(day)
        if err != nil {
-               return Position{}, err
+               return Position{}, fmt.Errorf("parse journal day: %w", err)
        }
 
        if number != j.day {
                err = j.closeWriter()
                if err != nil {
        }
 
        if number != j.day {
                err = j.closeWriter()
                if err != nil {
-                       return Position{}, err
+                       return Position{}, fmt.Errorf("close previous day writer: %w", err)
                }
 
                j.file, err = os.OpenFile(filepath.Join(j.dir, day+".jsonl"), os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0o600)
                }
 
                j.file, err = os.OpenFile(filepath.Join(j.dir, day+".jsonl"), os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0o600)
@@ -77,6 +77,21 @@ func (j *Journal) Write(day string, line []byte) (Position, error) {
        return place, nil
 }
 
        return place, nil
 }
 
+func (j *Journal) closeWriter() error {
+       if j.file == nil {
+               return nil
+       }
+
+       err := j.file.Close()
+       j.file = nil
+       j.day = 0
+       if err != nil {
+               return fmt.Errorf("close day file: %w", err)
+       }
+
+       return nil
+}
+
 // Read returns the line at place without its newline.
 func (j *Journal) Read(place Position) ([]byte, error) {
        reader, open := j.readers[place.day]
 // Read returns the line at place without its newline.
 func (j *Journal) Read(place Position) ([]byte, error) {
        reader, open := j.readers[place.day]
@@ -135,7 +150,7 @@ func (j *Journal) Scan(ctx context.Context, place Position, add func([]byte, Pos
        for n, path := range paths {
                day, err := journalDayNumber(strings.TrimSuffix(filepath.Base(path), ".jsonl"))
                if err != nil {
        for n, path := range paths {
                day, err := journalDayNumber(strings.TrimSuffix(filepath.Base(path), ".jsonl"))
                if err != nil {
-                       return err
+                       return fmt.Errorf("parse day filename: %w", err)
                }
 
                if day < place.day {
                }
 
                if day < place.day {
@@ -149,28 +164,13 @@ func (j *Journal) Scan(ctx context.Context, place Position, add func([]byte, Pos
 
                err = journalScanFile(ctx, path, day, offset, n == len(paths)-1, add)
                if err != nil {
 
                err = journalScanFile(ctx, path, day, offset, n == len(paths)-1, add)
                if err != nil {
-                       return err
+                       return fmt.Errorf("scan day file: %w", err)
                }
        }
 
        return nil
 }
 
                }
        }
 
        return nil
 }
 
-func (j *Journal) closeWriter() error {
-       if j.file == nil {
-               return nil
-       }
-
-       err := j.file.Close()
-       j.file = nil
-       j.day = 0
-       if err != nil {
-               return fmt.Errorf("close day file: %w", err)
-       }
-
-       return nil
-}
-
 // journalDayNumber returns the day YYYY-MM-DD as the number YYYYMMDD.
 func journalDayNumber(day string) (uint32, error) {
        number, err := strconv.ParseUint(strings.ReplaceAll(day, "-", ""), 10, 32)
 // journalDayNumber returns the day YYYY-MM-DD as the number YYYYMMDD.
 func journalDayNumber(day string) (uint32, error) {
        number, err := strconv.ParseUint(strings.ReplaceAll(day, "-", ""), 10, 32)
@@ -215,7 +215,12 @@ func journalScanFile(ctx context.Context, path string, day uint32, offset uint64
                }
 
                if errors.Is(err, io.EOF) && last {
                }
 
                if errors.Is(err, io.EOF) && last {
-                       return journalCutFile(path, offset)
+                       err = journalCutFile(path, offset)
+                       if err != nil {
+                               return fmt.Errorf("cut incomplete day line: %w", err)
+                       }
+
+                       return nil
                }
 
                if errors.Is(err, io.EOF) {
                }
 
                if errors.Is(err, io.EOF) {