about summary refs log tree commit diff stats
path: root/internal/search/index_meta.go
diff options
context:
space:
mode:
authorAlan Pearce2024-05-11 14:43:01 +0200
committerAlan Pearce2024-05-11 14:43:01 +0200
commit76f18d677b9b0bb70f701824e715f2ed10aeb8a0 (patch)
tree3ff2dadebde49f2042535c40f5832ebfa93d1b0b /internal/search/index_meta.go
parentdbe952d1df63522e5c32b4ef3e59c43886ba9257 (diff)
downloadsearchix-76f18d677b9b0bb70f701824e715f2ed10aeb8a0.tar.lz
searchix-76f18d677b9b0bb70f701824e715f2ed10aeb8a0.tar.zst
searchix-76f18d677b9b0bb70f701824e715f2ed10aeb8a0.zip
feat: version search index mapping schema and warn if outdated
Diffstat (limited to 'internal/search/index_meta.go')
-rw-r--r--internal/search/index_meta.go73
1 files changed, 73 insertions, 0 deletions
diff --git a/internal/search/index_meta.go b/internal/search/index_meta.go
new file mode 100644
index 0000000..bb7e69f
--- /dev/null
+++ b/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
+}