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)
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]
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 {
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)
}
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) {