From daaddbb56bdb480256e151aebbfaa7f04264125c Mon Sep 17 00:00:00 2001 From: ChaoticByte Date: Tue, 27 Aug 2024 14:48:46 +0200 Subject: [PATCH] Preload all entries into memory on server startup --- database.go | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++ main.go | 31 +++++++++---------------------- 2 files changed, 62 insertions(+), 22 deletions(-) create mode 100644 database.go diff --git a/database.go b/database.go new file mode 100644 index 0000000..40b226d --- /dev/null +++ b/database.go @@ -0,0 +1,53 @@ +package main + +import ( + "io/fs" + "log" + "os" + "strings" +) + +type Entry struct { + Name string // from filename + Content string // from content +} + +type Database struct { + Entries []Entry +} + +func (db *Database) TOC() []string { + var names []string + for _, e := range db.Entries { + names = append(names, e.Name) + } + return names +} + +func (db *Database) Entry(name string) string { + // returns empty string if not found + result := "" + for _, e := range db.Entries { + if e.Name == name { + result = e.Content + } + } + return result +} + +func BuildDB(directory string) Database { + logger := log.Default() + logger.Println("Building database") + var entries []Entry + // get files in directory and read them + directory = strings.TrimRight(directory, "/") // we don't need that last / -> if '/' is used as directory, you are dumb. + entriesDirFs := os.DirFS(directory) + files, err := fs.Glob(entriesDirFs, "*") + if err != nil { logger.Panicln(err) } + for _, f := range files { + contentB, err := os.ReadFile(directory + "/" + f) + if err != nil { logger.Panicln(err) } + entries = append(entries, Entry{Name: f, Content: string(contentB)}) + } + return Database{Entries: entries} +} diff --git a/main.go b/main.go index 93b8ff2..5fd7fd7 100644 --- a/main.go +++ b/main.go @@ -2,7 +2,6 @@ package main import ( "html/template" - "io/fs" "log" "net/http" "os" @@ -11,6 +10,7 @@ import ( var logger *log.Logger var appTemplate *template.Template = template.New("app") +var db Database type TemplateData struct { TOC []string @@ -21,23 +21,10 @@ type TemplateData struct { func loadTemplate() { data, err := os.ReadFile(TemplateFile) - if err != nil { logger.Panic(err) } + if err != nil { logger.Panicln(err) } appTemplate.Parse(string(data)) } -func getTOC() []string { - entriesDirFs := os.DirFS(EntriesDirectory) - m, err := fs.Glob(entriesDirFs, "*") - if err != nil { logger.Panic(err) } - return m -} - -func getEntry(name string) (string, error) { - data, err := os.ReadFile(strings.TrimRight(EntriesDirectory, "/") + "/" + name) - if err != nil { return "", err } - return string(data), err -} - func handleApplication(w http.ResponseWriter, req *http.Request) { var entry string var err error @@ -50,13 +37,11 @@ func handleApplication(w http.ResponseWriter, req *http.Request) { return } // load entry - entry, err = getEntry(entryName) - if err != nil { - logger.Println("Couldn't open entry", entryName) - w.WriteHeader(http.StatusNotFound) - } + entry = db.Entry(entryName) } - err = appTemplate.ExecuteTemplate(w, "app", TemplateData{TOC: getTOC(), Entry: entry, Title: MainTitle, EntryTitle: entryName}) + err = appTemplate.ExecuteTemplate( + w, "app", + TemplateData{TOC: db.TOC(), Entry: entry, Title: MainTitle, EntryTitle: entryName}) if err != nil { logger.Println(err) } } @@ -65,6 +50,8 @@ func main() { logger = log.Default() // load template loadTemplate() + // build db + db = BuildDB(EntriesDirectory) // handle static files staticHandler := http.StripPrefix("/static/", http.FileServer(http.Dir(StaticDirectory))) http.Handle("/static/", staticHandler) @@ -73,5 +60,5 @@ func main() { // start server logger.Println("Starting server on", ServerListen) err := http.ListenAndServe(ServerListen, nil) - if err != nil { logger.Panic(err) } + if err != nil { logger.Panicln(err) } }