package main import ( "database/sql" "fmt" "html/template" "log" _ "modernc.org/sqlite" "net/http" "strings" "os" ) type Database struct { DB *sql.DB } type Entry struct { os string name string section int path string } func (d *Database) GetOS() (*sql.Rows, error) { return d.DB.Query("SELECT DISTINCT os FROM manpages;") } func (d *Database) GetOptionOS(w http.ResponseWriter, r *http.Request) { rows, err := d.GetOS() if err != nil { log.Println(err) ErrorPage(w, 500) return } defer rows.Close() for rows.Next() { var osName string if err := rows.Scan(&osName); err != nil { log.Println(err) ErrorPage(w, 500) return } fmt.Fprintf(w, "", osName, osName) } } func (d *Database) Search(w http.ResponseWriter, r *http.Request) { query := r.URL.Query() log.Println("Request for:", r.URL.String()) name := query["name"][0] section := query["section"][0] osName := query["os"][0] log.Println(name) rows, err := d.DB.Query("SELECT * FROM manpages WHERE name == ? AND section == ? AND os == ?;", name, section, osName) if err != nil { log.Println(err) ErrorPage(w, 500) return } defer rows.Close() var entries []Entry for rows.Next() { var entry Entry if err := rows.Scan(&entry.os, &entry.name, &entry.section, &entry.path); err != nil { log.Println(err) ErrorPage(w, 500) return } entries = append(entries, entry) } if len(entries) > 0 { fmt.Fprintf(w, "
") for _, e := range entries { data, err := os.ReadFile(e.path) if err != nil { log.Println(err) ErrorPage(w, 500) return } fmt.Fprintf(w, "%s", data) } fmt.Fprintf(w, "
") } else { fmt.Fprintf(w, "

No results found for %s %s(%s)

", osName, name, section) } } func (d *Database) Index(w http.ResponseWriter, r *http.Request) { url := r.URL.String() osName, _ := strings.CutPrefix(url, "/") rows, err := d.DB.Query("SELECT * FROM manpages WHERE os == ? ORDER BY section, name", osName) if err != nil { log.Println(err) ErrorPage(w, 500) return } links := []string{ "

" + osName + "

" } for rows.Next() { var entry Entry if err := rows.Scan(&entry.os, &entry.name, &entry.section, &entry.path); err != nil { log.Println(err) ErrorPage(w, 500) return } eUrl, _ := strings.CutPrefix(entry.path, "static") link := fmt.Sprintf("
  • %s(%d)
  • ", eUrl, entry.name, entry.section) links = append(links, link) } links = append(links, "
    ") if len(links) > 2 { t := template.Must(template.ParseFiles("templates/template.html")) t.Execute(w, template.HTML(strings.Join(links, ""))) } } func (d *Database) IndexLinks(w http.ResponseWriter, r *http.Request) { rows, err := d.GetOS() if err != nil { log.Println(err) ErrorPage(w, 500) return } fmt.Fprintf(w, "
  • home
  • ") for rows.Next() { var osName string if err := rows.Scan(&osName); err != nil { log.Println(err) ErrorPage(w, 500) return } fmt.Fprintf(w, "
  • %s
  • ", osName, osName) } }