view lsserver.go @ 0:615a15029602 default tip

first commit.
author pyon@macmini
date Sun, 10 Nov 2019 08:39:41 +0900
parents
children
line wrap: on
line source

/*
 server.go  : server-program.
 Version    : 0.1
 Last Change: 2019-11-08 金 17:47:26.
*/
package main

import (
	"bufio"
	"fmt"
	"log"
    "net/http"
	"os"
	"strconv"
	"strings"
)

const (
	version = "0.1"

	userdb  = "user.gz.txt"
	hhsdb   = "hhsdb.gz.txt"
	indexdb = "indexdb.gz.txt"
)

var (
	server string

	userhash map[string]user
	hhshash map[string]hhs
)

type user struct {
	id string
	group int
	name string
}

type hhs struct {
    no string
	name string
    kana string
	addr string
	birth string
	sex string
	dates []string
}

func (h *hhs) Info() string {
	dates := ""
	for _, d := range h.dates {
		dates += ":" + d
	}
	s := []string{h.name, h.addr, dates}
    return strings.Join(s, ",")
}

func init() {
	server = "localhost:80"
}

func main() {
	load_user()
	load_hhs()
	load_index()

	// start Web-server
	fmt.Println("Le:Searcher-Server start [", server, "] ( version", version, ")")
	http.HandleFunc("/auth/",   auth_handler)
	http.HandleFunc("/search/", search_handler)
	http.HandleFunc("/index/",  index_handler)
	log.Fatal(http.ListenAndServe(server, nil))
}

// DB-Load Functions
func load_user() error {
	// userid:n
	userhash = make(map[string]user)

	f, err := os.OpenFile(userdb, os.O_RDONLY, 0644)
	if err != nil {
		return err
	}
	scanner := bufio.NewScanner(f)
	for scanner.Scan() {
        s := strings.Split(scanner.Text(), ":")
		g, _ := strconv.Atoi(s[1])
		u := user{id: s[0], group: g, name: s[2]}
		userhash[s[0]] = u
	}
	if err := scanner.Err(); err != nil {
		fmt.Fprintln(os.Stderr, "reading userdb", err)
	}
	if err := f.Close(); err != nil {
		return err
	}
	return nil
}

func load_hhs() error {
	hhshash = make(map[string]hhs)

	f, err := os.OpenFile(hhsdb, os.O_RDONLY, 0644)
	if err != nil {
		return err
	}
	scanner := bufio.NewScanner(f)
	for scanner.Scan() {
        s := strings.Split(scanner.Text(), ",")
		h := hhs{no: s[0], name: s[1]}
		hhshash[s[0]] = h
	}
	if err := scanner.Err(); err != nil {
		fmt.Fprintln(os.Stderr, "reading hhsdb", err)
	}
	if err := f.Close(); err != nil {
		return err
	}
	return nil
}

func load_index() error {
	// hhsno:date
	f, err := os.OpenFile(indexdb, os.O_RDONLY, 0644)
	if err != nil {
		return err
	}
	scanner := bufio.NewScanner(f)
	for scanner.Scan() {
        s := strings.Split(scanner.Text(), ":")
		h := hhshash[s[0]]
		h.dates = append(h.dates, s[1])
		hhshash[s[0]] = h
	}
	if err := scanner.Err(); err != nil {
		fmt.Fprintln(os.Stderr, "reading indexdb", err)
	}
	if err := f.Close(); err != nil {
		return err
	}
	return nil
}

// HTTP Handlers
func auth_handler(w http.ResponseWriter, r *http.Request) {
	// Toggle Le:Searcher-Client menu
	// userid : UpdateDB, Index, M&M, BPrint, UserMng
	// 7moon  : 1, 1, 1, 1, 1 => manager :0
	// kaigo  : 0, 1, 1, 1, 0 => staff   :1 # acl by IPaddress
	// chosha : 0, 0, 0, 0, 0 => chosa   :2
	fmt.Println("auth")

	id := r.URL.Path[len("/auth/"):]
	fmt.Println(id)
	g := 0
	switch g {
	case 0:
		w.Write([]byte("0"))
	case 1:
		w.Write([]byte("1"))
	default:
		w.Write([]byte("2"))
	}
}

func search_handler(w http.ResponseWriter, r *http.Request) {
	// /search/userid:hhsno:date
	// n=00000000 -> name & address & dates
	// n>00000000 -> tif image
	fmt.Println("search")

	p := r.URL.Path[len("/search/"):]
	s := strings.Split(p, ":")
	if false {	// invalid user
		http.NotFound(w, r)
		return
	}
	if strings.Compare(s[1], "00000000") == 0 {
		h := hhshash[s[1]]
		w.Write([]byte(h.Info()))
		return
	}

}

func index_handler(w http.ResponseWriter, r *http.Request) {
	fmt.Println("index")
}