Mercurial > mercurial > hgweb_golang.cgi
diff 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 diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/kaigo/horori/searcher/server/searcher.go Thu Apr 16 20:59:35 2020 +0900 @@ -0,0 +1,236 @@ + /* + 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))) +} +