internal/search/index_meta.go (view raw)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 | package search import ( "encoding/json" "log/slog" "os" "searchix/internal/file" "github.com/pkg/errors" ) const CurrentSchemaVersion = 1 type IndexMeta struct { path string SchemaVersion int } func createMeta(path string) (*IndexMeta, error) { exists, err := file.Exists(path) if err != nil { return nil, errors.WithMessage(err, "could not check for existence of index metadata") } if exists { return nil, errors.New("index metadata already exists") } return &IndexMeta{ path: path, SchemaVersion: CurrentSchemaVersion, }, nil } func openMeta(path string) (*IndexMeta, error) { j, err := os.ReadFile(path) if err != nil { return nil, errors.WithMessage(err, "could not open index metadata file") } var meta IndexMeta err = json.Unmarshal(j, &meta) if err != nil { return nil, errors.WithMessage(err, "index metadata is corrupt, try replacing the index") } meta.checkSchemaVersion() return &meta, nil } func (i *IndexMeta) checkSchemaVersion() { if i.SchemaVersion < CurrentSchemaVersion { slog.Warn( "Index schema version out of date, suggest re-indexing", "schema_version", i.SchemaVersion, "latest_version", CurrentSchemaVersion, ) } } func (i *IndexMeta) Save() error { j, err := json.Marshal(i) if err != nil { return errors.WithMessage(err, "could not prepare index metadata for saving") } err = os.WriteFile(i.path, j, 0o600) if err != nil { return errors.WithMessage(err, "could not save index metadata") } return nil } |