Mercurial > mercurial > hgweb_golang.cgi
view src/kaigo/horori/searcher/server/searcher.go @ 45:20b42e2deae1
add alloc, (new)mover, merger & (new)searcher.
author | pyon@macmini |
---|---|
date | Thu, 16 Apr 2020 20:59:35 +0900 |
parents | |
children | 6ec28d3c3e00 |
line wrap: on
line source
/* Last Change: 2020-04-16 木 17:15:49. */ package main import ( "encoding/csv" "fmt" "io" "io/ioutil" "log" "net" "net/http" "os" "path/filepath" "strconv" "strings" ) type hhs struct { No string //Birth string Name string //Kana string Addr string //Sex string Ccn []string } func (h *hhs) GetData() string { s := strings.Join(h.Ccn, "#") s = strings.Join([]string{h.Name, h.Addr, s}, ":") return s } func (h *hhs) GetRecent() string { ccn := "" if len(h.Ccn) > 0 { ccn = h.Ccn[0] } return strings.Join([]string{h.No, h.Name, ccn}, ",") } var ( server string port string hhsdb string img_root string hhash map[string]hhs iymdhash map[string]string iyhash map[string]string ) func init() { port = ":3910" hhsdb = "hhsdb.csv" img_root = "./images" hhash = make(map[string]hhs) iymdhash = make(map[string]string) iyhash = make(map[string]string) } func main() { // setting IP-Address & Port addrs, err := net.InterfaceAddrs() if err != nil { log.Fatal(err) } for _, a := range addrs { if ipnet, ok := a.(*net.IPNet); ok && !ipnet.IP.IsLoopback() { if strings.HasPrefix(ipnet.IP.String(), "169.254") { continue } if ipnet.IP.To4() != nil { server = ipnet.IP.String() + port } } } if err := loadDB(); err != nil { log.Fatal(err) } // Http-Handler http.HandleFunc("/h/", hhs_handler) http.HandleFunc("/ha/", hhsdb_handler) http.HandleFunc("/u/", uphhsdb_handler) http.HandleFunc("/i/", image_handler) http.HandleFunc("/r/", recent_handler) http.HandleFunc("/d/", index_handler) log.Fatal(http.ListenAndServe(server, nil)) } func loadDB() error { b, err := ioutil.ReadFile(hhsdb) if err != nil { return err } r := csv.NewReader(strings.NewReader(string(b))) for { record, err := r.Read() if err == io.EOF { break } if err != nil { return err } h := hhs{ No: record[0], //Birth: record[1], Name: record[2], //Kana: record[3], Addr: record[4], //Sex: record[5], } hhash[record[0]] = h } b, err = ioutil.ReadFile("index.csv") if err != nil { return err } r = csv.NewReader(strings.NewReader(string(b))) for { record, err := r.Read() if err == io.EOF { break } if err != nil { return err } h := hhash[record[0]] ccn := h.Ccn h.Ccn = append(ccn, record[1]) hhash[record[0]] = h iymdhash[record[1]] += ":" + record[0] } for ymd, _ := range iymdhash { y := ymd[0:4] if ymd[4:6] == "01" || ymd[4:6] == "02" || ymd[4:6] == "03" { yy, _ := strconv.Atoi(y) y = fmt.Sprintf("%d", yy - 1) } iyhash[y] += ":" + ymd } return nil } /* Get /h/0800012345 -> name:addr:ymd1#ymd2#... */ func hhs_handler(w http.ResponseWriter, r *http.Request) { hno := r.URL.Path[len("/h/"):] s := "" if h, ok := hhash[hno]; ok { s = h.GetData() } w.Write([]byte(s)) } /* Get /ha/ -> hhsdb.csv for Mover */ func hhsdb_handler(w http.ResponseWriter, r *http.Request) { b, _ := ioutil.ReadFile(hhsdb) w.Write(b) } /* Get /i/20200110/0800012345.tgz */ func image_handler(w http.ResponseWriter, r *http.Request) { file := r.URL.Path[len("/i/"):] file = filepath.Join(img_root, filepath.FromSlash(file)) f, err := os.Open(file) if err != nil { http.NotFound(w, r) return } defer f.Close() fi, _ := f.Stat() w.Header().Set("Content-Type", "rsearcher/octet-stream") w.Header().Set("Content-Length", fmt.Sprintf("%d", fi.Size())) io.Copy(w, f) } /* Get /r/0800012345:0800067890:0800099999:... */ func recent_handler(w http.ResponseWriter, r *http.Request) { hnolist := strings.Split(r.URL.Path[len("/r/"):], ":") var buf []string for _, hno := range hnolist { s := hno + ",," if h, ok := hhash[hno]; ok { s = h.GetRecent() if h.No == "" { s = hno + s } } buf = append(buf, s) } w.Write([]byte(strings.Join(buf, ":"))) } /* Get /d/20xx -> 20xx0401:2020xx0408:... , /d/20xx0401 -> 0800012345:0800098765:... */ func index_handler(w http.ResponseWriter, r *http.Request) { var buf string ymd := r.URL.Path[len("/d/"):] if len(ymd) == 4 { buf = iyhash[ymd] } if len(ymd) == 8 { buf = iymdhash[ymd] } w.Write([]byte(buf[1:])) } func uphhsdb_handler(w http.ResponseWriter, r *http.Request) { server_root := filepath.Dir(os.Args[0]) file := filepath.Join(server_root, "db", hhsdb) f, err := os.Create(file) if err != nil { http.NotFound(w, r) return } n, err := io.Copy(f, r.Body) if err != nil { http.NotFound(w, r) return } f.Close() w.Write([]byte(fmt.Sprintf("%d bytes are recieved.\n", n))) }