Preload all entries into memory on server startup

This commit is contained in:
ChaoticByte 2024-08-27 14:48:46 +02:00
parent b67e14bb57
commit daaddbb56b
No known key found for this signature in database
2 changed files with 62 additions and 22 deletions

53
database.go Normal file
View file

@ -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}
}

31
main.go
View file

@ -2,7 +2,6 @@ package main
import ( import (
"html/template" "html/template"
"io/fs"
"log" "log"
"net/http" "net/http"
"os" "os"
@ -11,6 +10,7 @@ import (
var logger *log.Logger var logger *log.Logger
var appTemplate *template.Template = template.New("app") var appTemplate *template.Template = template.New("app")
var db Database
type TemplateData struct { type TemplateData struct {
TOC []string TOC []string
@ -21,23 +21,10 @@ type TemplateData struct {
func loadTemplate() { func loadTemplate() {
data, err := os.ReadFile(TemplateFile) data, err := os.ReadFile(TemplateFile)
if err != nil { logger.Panic(err) } if err != nil { logger.Panicln(err) }
appTemplate.Parse(string(data)) 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) { func handleApplication(w http.ResponseWriter, req *http.Request) {
var entry string var entry string
var err error var err error
@ -50,13 +37,11 @@ func handleApplication(w http.ResponseWriter, req *http.Request) {
return return
} }
// load entry // load entry
entry, err = getEntry(entryName) entry = db.Entry(entryName)
if err != nil {
logger.Println("Couldn't open entry", entryName)
w.WriteHeader(http.StatusNotFound)
}
} }
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) } if err != nil { logger.Println(err) }
} }
@ -65,6 +50,8 @@ func main() {
logger = log.Default() logger = log.Default()
// load template // load template
loadTemplate() loadTemplate()
// build db
db = BuildDB(EntriesDirectory)
// handle static files // handle static files
staticHandler := http.StripPrefix("/static/", http.FileServer(http.Dir(StaticDirectory))) staticHandler := http.StripPrefix("/static/", http.FileServer(http.Dir(StaticDirectory)))
http.Handle("/static/", staticHandler) http.Handle("/static/", staticHandler)
@ -73,5 +60,5 @@ func main() {
// start server // start server
logger.Println("Starting server on", ServerListen) logger.Println("Starting server on", ServerListen)
err := http.ListenAndServe(ServerListen, nil) err := http.ListenAndServe(ServerListen, nil)
if err != nil { logger.Panic(err) } if err != nil { logger.Panicln(err) }
} }