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