all repos — searchix @ 76f18d677b9b0bb70f701824e715f2ed10aeb8a0

Search engine for NixOS, nix-darwin, home-manager and NUR users

feat: version search index mapping schema and warn if outdated

Alan Pearce
commit

76f18d677b9b0bb70f701824e715f2ed10aeb8a0

parent

dbe952d1df63522e5c32b4ef3e59c43886ba9257

1 file changed, 73 insertions(+), 0 deletions(-)

changed files
A internal/search/index_meta.go
@@ -0,0 +1,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 +}