comparison src/kaigo/horori/searcher/server/searcher.go @ 48:ca00c4a85b98

small changes.
author pyon@macmini
date Wed, 22 Apr 2020 19:00:50 +0900
parents 169936fed61b
children 8384ca56f1b4
comparison
equal deleted inserted replaced
47:169936fed61b 48:ca00c4a85b98
1 /* 1 /*
2 Last Change: 2020-04-21 火 13:59:52. 2 Last Change: 2020-04-22 水 17:23:42.
3 */ 3 */
4 4
5 package main 5 package main
6 6
7 import ( 7 import (
8 "bufio"
8 "bytes" 9 "bytes"
9 "compress/gzip" 10 "compress/gzip"
10 "encoding/csv" 11 "encoding/csv"
11 "fmt" 12 "fmt"
12 "io" 13 "io"
14 "log" 15 "log"
15 "net" 16 "net"
16 "net/http" 17 "net/http"
17 "os" 18 "os"
18 "path/filepath" 19 "path/filepath"
20 "sort"
19 "strconv" 21 "strconv"
20 "strings" 22 "strings"
21 ) 23 )
22 24
23 type hhs struct { 25 type hhs struct {
46 48
47 var ( 49 var (
48 server string 50 server string
49 port string 51 port string
50 hhsdb string 52 hhsdb string
51 img_root string 53 indexdb string
54 server_root string
52 hhash map[string]hhs 55 hhash map[string]hhs
53 iymdhash map[string]string 56 iymdhash map[string]string
54 iyhash map[string]string 57 iyhash map[string]string
55 ) 58 )
56 59
57 func init() { 60 func init() {
58 port = ":3910" 61 port = ":3910"
59 hhsdb = "hhsdb.csv" 62 hhsdb = "hhsdb.csv"
60 img_root = "./images" 63 indexdb = "index.csv"
61 hhash = make(map[string]hhs)
62 iymdhash = make(map[string]string)
63 iyhash = make(map[string]string)
64 } 64 }
65 65
66 func main() { 66 func main() {
67 server_root = filepath.Dir(os.Args[0])
68 hhsdb = filepath.Join(server_root, hhsdb)
69 indexdb = filepath.Join(server_root, indexdb)
67 70
68 // setting IP-Address & Port 71 // setting IP-Address & Port
69 addrs, err := net.InterfaceAddrs() 72 addrs, err := net.InterfaceAddrs()
70 if err != nil { 73 if err != nil {
71 log.Fatal(err) 74 log.Fatal(err)
84 if err := loadDB(); err != nil { 87 if err := loadDB(); err != nil {
85 log.Fatal(err) 88 log.Fatal(err)
86 } 89 }
87 90
88 // Http-Handler 91 // Http-Handler
89 http.HandleFunc("/h/", hhs_handler) // Get /h/0800012345 -> name:addr:20200101#20210701#... 92 http.HandleFunc("/h/", hhs_handler) // Get /h/0800012345 -> name:addr:20200101#20210701#...
90 http.HandleFunc("/hn/", hhsnm_handler) // Get /h/0800012345:0800098765:... -> name1:name2:... 93 http.HandleFunc("/hn/", hhsnm_handler) // Get /h/0800012345:0800098765:... -> name1:name2:...
91 http.HandleFunc("/ht/", hhstm_handler) // Get /ht/ -> 2020-03-14 12:34 94 http.HandleFunc("/ht/", hhstm_handler) // Get /ht/ -> 2020-03-14 12:34 (2020-04-02)
92 http.HandleFunc("/ha/", hhsdb_handler) // Get /ha/ -> hhsdb.csv for Mover 95 http.HandleFunc("/ha/", hhsdb_handler) // Get /ha/ -> hhsdb.csv for Mover
93 http.HandleFunc("/i/", image_handler) // Get /i/20200110/0800012345.tgz 96 http.HandleFunc("/i/", image_handler) // Get /i/20200110/0800012345.tgz
94 http.HandleFunc("/r/", recent_handler) // Get /r/0800012345:0800067890:0800099999:... -> 0800012345,name1,20200101:0800067890,name2,20210405:... 97 http.HandleFunc("/r/", recent_handler) // Get /r/0800012345:0800067890:0800099999:... -> 0800012345,name1,20200101:0800067890,name2,20210405:...
95 http.HandleFunc("/d/", index_handler) // Get /d/20xx -> 20xx0401:2020xx0408:... , /d/20xx0401 -> 0800012345:0800098765:... 98 http.HandleFunc("/d/", index_handler) // Get /d/20xx -> 20xx0401:20xx0408:... , /d/20xx0401 -> 0800012345:0800098765:...
96 http.HandleFunc("/u/", uphhsdb_handler) // POST /u/ 99 http.HandleFunc("/dt/", indextm_handler) // Get /dt/ -> 2020-03-14 12:34 (2020-04-02)
97 http.HandleFunc("/ui/", upimage_handler) // POST /ui/20200401/0800012345.tgz 100 http.HandleFunc("/ud/", upidx_handler) // Get /ud/20200402
101 http.HandleFunc("/u/", uphhsdb_handler) // POST /u/
102 http.HandleFunc("/ui/", upimage_handler) // POST /ui/20200401/0800012345.tgz
103 http.HandleFunc("/ci/", climage_handler) // Get /ci/20200402
98 104
99 log.Fatal(http.ListenAndServe(server, nil)) 105 log.Fatal(http.ListenAndServe(server, nil))
100 } 106 }
101 107
108 /** FUNCTIONS **/
102 func loadDB() error { 109 func loadDB() error {
110 hhash = make(map[string]hhs)
111 iymdhash = make(map[string]string)
112 iyhash = make(map[string]string)
113
103 b, err := ioutil.ReadFile(hhsdb) 114 b, err := ioutil.ReadFile(hhsdb)
104 if err != nil { 115 if err != nil {
105 return err 116 return err
106 } 117 }
107 r := csv.NewReader(strings.NewReader(string(b))) 118 r := csv.NewReader(strings.NewReader(string(b)))
112 } 123 }
113 if err != nil { 124 if err != nil {
114 return err 125 return err
115 } 126 }
116 h := hhs{ 127 h := hhs{
117 No: record[0], 128 No: record[0], //Birth: record[1],
118 //Birth: record[1], 129 Name: record[2], //Kana: record[3],
119 Name: record[2], 130 Addr: record[4], //Sex: record[5],
120 //Kana: record[3],
121 Addr: record[4],
122 //Sex: record[5],
123 } 131 }
124 hhash[record[0]] = h 132 hhash[record[0]] = h
125 } 133 }
126 134
127 b, err = ioutil.ReadFile("index.csv") 135 b, err = ioutil.ReadFile(indexdb)
128 if err != nil { 136 if err != nil {
129 return err 137 return err
130 } 138 }
131 r = csv.NewReader(strings.NewReader(string(b))) 139 r = csv.NewReader(strings.NewReader(string(b)))
132 for { 140 for {
155 } 163 }
156 164
157 return nil 165 return nil
158 } 166 }
159 167
168 /** HTTP HANDLERS **/
160 /* Get /h/0800012345 -> name:addr:20200101#20210701#... */ 169 /* Get /h/0800012345 -> name:addr:20200101#20210701#... */
161 func hhs_handler(w http.ResponseWriter, r *http.Request) { 170 func hhs_handler(w http.ResponseWriter, r *http.Request) {
162 hno := r.URL.Path[len("/h/"):] 171 hno := r.URL.Path[len("/h/"):]
163 s := "" 172 s := ""
164 if h, ok := hhash[hno]; ok { 173 if h, ok := hhash[hno]; ok {
179 buf = append(buf, n) 188 buf = append(buf, n)
180 } 189 }
181 w.Write([]byte(strings.Join(buf, ":"))) 190 w.Write([]byte(strings.Join(buf, ":")))
182 } 191 }
183 192
184 /* Get /ht/ -> 2020-03-14 12:34 */ 193 /* Get /ht/ -> 2020-03-14 12:34 (2020-04-02) */
185 func hhstm_handler(w http.ResponseWriter, r *http.Request) { 194 func hhstm_handler(w http.ResponseWriter, r *http.Request) {
186 date := "" 195 date := ""
187 if fi, err := os.Stat(hhsdb); err == nil { 196 if fi, err := os.Stat(hhsdb); err == nil {
188 t := fi.ModTime() 197 t := fi.ModTime()
189 date = t.Format("2006-01-02 15:04") 198 latest := "0000000001"
199
200 f, _ := os.Open(hhsdb)
201 defer f.Close()
202 input := bufio.NewScanner(f)
203 for input.Scan() {
204 s := strings.Split(input.Text(), ",")
205 if (strings.Compare(s[0], latest) > 0) {
206 latest = s[0]
207 }
208 }
209
210 latest = "(" + latest + ")"
211 date = t.Format("2006-01-02 15:04 ") + latest
190 } 212 }
191 w.Write([]byte(date)) 213 w.Write([]byte(date))
192 } 214 }
193 215
194 /* Get /ha/ -> hhsdb.csv for Mover */ 216 /* Get /ha/ -> hhsdb.csv for Mover */
198 } 220 }
199 221
200 /* Get /i/20200110/0800012345.tgz */ 222 /* Get /i/20200110/0800012345.tgz */
201 func image_handler(w http.ResponseWriter, r *http.Request) { 223 func image_handler(w http.ResponseWriter, r *http.Request) {
202 file := r.URL.Path[len("/i/"):] 224 file := r.URL.Path[len("/i/"):]
203 file = filepath.Join(img_root, filepath.FromSlash(file)) 225 file = filepath.Join(server_root, "images", filepath.FromSlash(file))
204 226
205 f, err := os.Open(file) 227 f, err := os.Open(file)
206 if err != nil { 228 if err != nil {
207 http.NotFound(w, r) 229 http.NotFound(w, r)
208 return 230 return
231 buf = append(buf, s) 253 buf = append(buf, s)
232 } 254 }
233 w.Write([]byte(strings.Join(buf, ":"))) 255 w.Write([]byte(strings.Join(buf, ":")))
234 } 256 }
235 257
236 /* Get /d/20xx -> 20xx0401:2020xx0408:... , /d/20xx0401 -> 0800012345:0800098765:... */ 258 /* Get /d/20xx -> 20xx0401:20xx0408:... , /d/20xx0401 -> 0800012345:0800098765:... */
237 func index_handler(w http.ResponseWriter, r *http.Request) { 259 func index_handler(w http.ResponseWriter, r *http.Request) {
238 var buf string 260 var buf string
239 ymd := r.URL.Path[len("/d/"):] 261 ymd := r.URL.Path[len("/d/"):]
240 if len(ymd) == 4 { 262 if len(ymd) == 4 {
241 buf = iyhash[ymd] 263 buf = iyhash[ymd]
251 if r.Method != http.MethodPost { 273 if r.Method != http.MethodPost {
252 http.NotFound(w, r) 274 http.NotFound(w, r)
253 return 275 return
254 } 276 }
255 277
256 server_root := filepath.Dir(os.Args[0])
257 file := filepath.Join(server_root, hhsdb) 278 file := filepath.Join(server_root, hhsdb)
258 f, err := os.Create(file) 279 f, err := os.Create(file)
259 if err != nil { 280 if err != nil {
260 http.NotFound(w, r) 281 http.NotFound(w, r)
261 return 282 return
296 317
297 uri := r.URL.Path[len("/ui/"):] 318 uri := r.URL.Path[len("/ui/"):]
298 ymd := uri[0:8] 319 ymd := uri[0:8]
299 tgz := uri[9:] 320 tgz := uri[9:]
300 321
301 server_root := filepath.Dir(os.Args[0])
302 dir := filepath.Join(server_root, "images", ymd) 322 dir := filepath.Join(server_root, "images", ymd)
303 323
304 if _, err := os.Stat(dir); os.IsNotExist(err) { 324 if _, err := os.Stat(dir); os.IsNotExist(err) {
305 os.Mkdir(dir, 0644) 325 os.Mkdir(dir, 0644)
306 } 326 }
319 return 339 return
320 } 340 }
321 w.Write([]byte(fmt.Sprintf("%d bytes are recieved.\n", n))) 341 w.Write([]byte(fmt.Sprintf("%d bytes are recieved.\n", n)))
322 } 342 }
323 343
344 /* Get /dt/ -> 2020-03-14 12:34 (2020-04-02) */
345 func indextm_handler(w http.ResponseWriter, r *http.Request) {
346 date := ""
347 if fi, err := os.Stat(indexdb); err == nil {
348 t := fi.ModTime()
349 latest := "20200101"
350
351 f, _ := os.Open(indexdb)
352 defer f.Close()
353 input := bufio.NewScanner(f)
354 for input.Scan() {
355 s := strings.Split(input.Text(), ",")
356 if (strings.Compare(s[1], latest) > 0) {
357 latest = s[1]
358 }
359 }
360
361 latest = "(" + latest[0:4] + "-" + latest[4:6] + "-" + latest[6:] + ")"
362 date = t.Format("2006-01-02 15:04 ") + latest
363 }
364 w.Write([]byte(date))
365 }
366
367 /* Get /ud/20200402 */
368 func upidx_handler(w http.ResponseWriter, r *http.Request) {
369 date := r.URL.Path[len("/ud/"):]
370 var buf []string
371
372 f, _ := os.Open(indexdb)
373 input := bufio.NewScanner(f)
374 for input.Scan() {
375 if !strings.HasSuffix(input.Text(), date) {
376 buf = append(buf, input.Text())
377 }
378 }
379 f.Close()
380
381 imgdir := filepath.Join(server_root, "images", date)
382 files, _ := ioutil.ReadDir(imgdir)
383 for _, file := range files {
384 i := file.Name()[0:10] + "," + date
385 buf = append(buf, i)
386 }
387 sort.Sort(sort.Reverse(sort.StringSlice(buf)))
388
389 os.Remove(indexdb)
390
391 s := strings.Join(buf, "\n")
392 ioutil.WriteFile(indexdb, []byte(s), 0644)
393
394 loadDB();
395 w.Write([]byte("update index done."))
396 }
397
398 /* Get /ci/20200402 */
399 func climage_handler(w http.ResponseWriter, r *http.Request) {
400 date := r.URL.Path[len("/ci/"):]
401 dir := filepath.Join(server_root, "images", date)
402 os.RemoveAll(dir)
403 }
404