diff --git a/main.go b/main.go index e04b74f..66ad2ab 100644 --- a/main.go +++ b/main.go @@ -7,7 +7,7 @@ import ( func main() { // Initialize Index - index.CreateIndex() + index.InitIndex("default") // Start HTTP Server http.StartService() diff --git a/pkg/index/index.go b/pkg/index/index.go index 3a47584..11b0c13 100644 --- a/pkg/index/index.go +++ b/pkg/index/index.go @@ -2,6 +2,12 @@ package index import ( "bufio" + "bytes" + "encoding/gob" + "errors" + "fmt" + "log" + "os" "strings" ) @@ -13,7 +19,40 @@ var Index InvertedIndex var DocFreq DocumentFrequency var Documents []string -func CreateIndex() { +type SavedIndex struct { + Index InvertedIndex + DocFreq DocumentFrequency + Documents []string +} + +func InitIndex(name string) { + createIndex() + + // check if index as file exists + // if not, create one and save it + indexFilePath := "/tmp/" + name + ".db" + if _, err := os.Stat(indexFilePath); errors.Is(err, os.ErrNotExist) { + f, err := os.Create(indexFilePath) + if err != nil { + log.Fatal(err) + } + defer f.Close() + } else { + var savedIndex SavedIndex + + err = readStructFromFile(indexFilePath, &savedIndex) + if err != nil { + fmt.Println("Fehler beim Lesen:", err) + return + } + + Index = savedIndex.Index + DocFreq = savedIndex.DocFreq + Documents = savedIndex.Documents + } +} + +func createIndex() { index := make(InvertedIndex) docFreq := make(DocumentFrequency) var docs []string @@ -23,6 +62,21 @@ func CreateIndex() { DocFreq = docFreq } +func updateIndex(name string) { + savedIndex := SavedIndex{ + Index: Index, + DocFreq: DocFreq, + Documents: Documents, + } + + indexFilePath := "/tmp/" + name + ".db" + err := writeStructToFile(indexFilePath, savedIndex) + if err != nil { + fmt.Println("Fehler beim Schreiben:", err) + return + } +} + func AddDocToIndex(url string, content string) { Documents = append(Documents, url) @@ -46,4 +100,35 @@ func AddDocToIndex(url string, content string) { } } + updateIndex("default") +} + +func writeStructToFile(filename string, data interface{}) error { + var buf bytes.Buffer + enc := gob.NewEncoder(&buf) + err := enc.Encode(data) + if err != nil { + return fmt.Errorf("error when encoding the structs: %w", err) + } + + err = os.WriteFile(filename, buf.Bytes(), 0644) + if err != nil { + return fmt.Errorf("error when writing to the file: %w", err) + } + return nil +} + +func readStructFromFile(filename string, data interface{}) error { + content, err := os.ReadFile(filename) + if err != nil { + return fmt.Errorf("error reading the file: %w", err) + } + + buf := bytes.NewBuffer(content) + dec := gob.NewDecoder(buf) + err = dec.Decode(data) + if err != nil { + return fmt.Errorf("error when decoding the structs: %w", err) + } + return nil }