about summary refs log tree commit diff stats
path: root/internal/index/index_meta.go
diff options
context:
space:
mode:
authorAlan Pearce2024-05-13 21:50:14 +0200
committerAlan Pearce2024-05-13 22:25:46 +0200
commit6b40e0c0fa90f11be14a93f1d6275779fd645cac (patch)
tree0df5bea87242450829ca441d235c077a0e09a149 /internal/index/index_meta.go
parent2722f24af87f437ed9fcb8cc743ad1784141fd3a (diff)
downloadsearchix-6b40e0c0fa90f11be14a93f1d6275779fd645cac.tar.lz
searchix-6b40e0c0fa90f11be14a93f1d6275779fd645cac.tar.zst
searchix-6b40e0c0fa90f11be14a93f1d6275779fd645cac.zip
refactor: combine import and web server into one binary
Diffstat (limited to 'internal/index/index_meta.go')
-rw-r--r--internal/index/index_meta.go73
1 files changed, 73 insertions, 0 deletions
diff --git a/internal/index/index_meta.go b/internal/index/index_meta.go
new file mode 100644
index 0000000..e24cd3b
--- /dev/null
+++ b/internal/index/index_meta.go
@@ -0,0 +1,73 @@
+package index
+
+import (
+	"encoding/json"
+	"log/slog"
+	"os"
+	"searchix/internal/file"
+
+	"github.com/pkg/errors"
+)
+
+const CurrentSchemaVersion = 1
+
+type Meta struct {
+	path          string
+	SchemaVersion int
+}
+
+func createMeta(path string) (*Meta, 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 &Meta{
+		path:          path,
+		SchemaVersion: CurrentSchemaVersion,
+	}, nil
+}
+
+func openMeta(path string) (*Meta, error) {
+	j, err := os.ReadFile(path)
+	if err != nil {
+		return nil, errors.WithMessage(err, "could not open index metadata file")
+	}
+	var meta Meta
+	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 *Meta) 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 *Meta) 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
+}