Mercurial > mercurial > hgweb_golang.cgi
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 |