Preload all entries into memory on server startup
This commit is contained in:
parent
b67e14bb57
commit
daaddbb56b
2 changed files with 62 additions and 22 deletions
53
database.go
Normal file
53
database.go
Normal 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
31
main.go
|
@ -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) }
|
||||||
}
|
}
|
||||||
|
|
Reference in a new issue