X-Git-Url: https://git.giacomolli.uk/onechat/blobdiff_plain/522d7fd117285e4e4ce3ea5ec9b5a1722521b681..8707a09fee94c97e29d668d24fb9713373913e0b:/journal.go diff --git a/journal.go b/journal.go index bb1897c..d048913 100644 --- a/journal.go +++ b/journal.go @@ -38,13 +38,13 @@ type Journal struct { 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 { - 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) @@ -71,11 +71,27 @@ func (j *Journal) Write(day string, line []byte) (Position, error) { offset: j.size, length: uint32(len(line)), } + j.size += uint64(len(line)) 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] @@ -134,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 { - return err + return fmt.Errorf("parse day filename: %w", err) } if day < place.day { @@ -148,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 { - return err + return fmt.Errorf("scan day file: %w", err) } } 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) @@ -214,7 +215,12 @@ func journalScanFile(ctx context.Context, path string, day uint32, offset uint64 } 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) {