apiserver/racs/racs.go

176 lines
4.6 KiB
Go

package racs
import (
"APIServer/cnf"
"database/sql"
"fmt"
"log"
"strings"
_ "github.com/go-sql-driver/mysql"
)
type RACS struct{}
func (r *RACS) Inbound(cfg cnf.Cfg, logger *log.Logger, addr string, uri string, params map[string]string) map[string]string {
rst := map[string]string{"Result": "OK", "ErrMsg": ""}
dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s",
cfg.MySQL.User,
cfg.MySQL.Password,
cfg.MySQL.Server,
cfg.MySQL.Port,
cfg.MySQL.Database,
)
dbo, err := sql.Open("mysql", dsn)
if err != nil {
rst["Result"] = "NG"
rst["ErrMsg"] = "racs.Inbound: " + err.Error()
logger.Printf("[ERR] %s; %s; %#v; %s\r\n", addr, uri, params, rst["ErrMsg"])
return rst
}
defer dbo.Close()
dml := fmt.Sprintf(`INSERT INTO %s
(usn,storage,update_time,mark1,mark2,mark3) VALUES ('%s','%s',%s,'%s','%s','%s')
ON DUPLICATE KEY UPDATE
storage = VALUES(storage),
update_time = NOW(),
mark1 = VALUES(mark1),
mark2 = VALUES(mark2),
mark3 = VALUES(mark3);`,
cfg.MySQL.StorageTable,
params["USN"],
"Inbound",
"NOW()",
params["MARK1"],
params["MARK2"],
params["MARK3"],
)
_, err = dbo.Exec(dml)
if err != nil {
rst["Result"] = "NG"
rst["ErrMsg"] = "racs.Inbound: " + err.Error()
logger.Printf("[ERR] %s; %s; %#v; %s\r\n", addr, uri, params, rst["ErrMsg"])
return rst
}
return rst
}
func (r *RACS) Outbound(cfg cnf.Cfg, logger *log.Logger, addr string, uri string, params map[string]string) map[string]string {
rst := map[string]string{"Result": "OK", "ErrMsg": ""}
dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s",
cfg.MySQL.User,
cfg.MySQL.Password,
cfg.MySQL.Server,
cfg.MySQL.Port,
cfg.MySQL.Database,
)
dbo, err := sql.Open("mysql", dsn)
if err != nil {
rst["Result"] = "NG"
rst["ErrMsg"] = "racs.Outbound: " + err.Error()
logger.Printf("[ERR] %s; %s; %#v; %s\r\n", addr, uri, params, rst["ErrMsg"])
return rst
}
defer dbo.Close()
dml := fmt.Sprintf(`INSERT INTO %s
(usn,storage,update_time,mark1,mark2,mark3) VALUES ('%s','%s',%s,'%s','%s','%s')
ON DUPLICATE KEY UPDATE
storage = VALUES(storage),
update_time = NOW(),
mark1 = VALUES(mark1),
mark2 = VALUES(mark2),
mark3 = VALUES(mark3);`,
cfg.MySQL.StorageTable,
params["USN"],
"Outbound",
"NOW()",
params["MARK1"],
params["MARK2"],
params["MARK3"],
)
_, err = dbo.Exec(dml)
if err != nil {
rst["Result"] = "NG"
rst["ErrMsg"] = "racs.Outbound: " + err.Error()
logger.Printf("[ERR] %s; %s; %#v; %s\r\n", addr, uri, params, rst["ErrMsg"])
return rst
}
return rst
}
func (r *RACS) GetFailList(cfg cnf.Cfg, logger *log.Logger, addr string, uri string, params map[string]string) map[string]interface{} {
rst := map[string]interface{}{"Result": "OK", "ErrMsg": ""}
dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s",
cfg.MySQL.User,
cfg.MySQL.Password,
cfg.MySQL.Server,
cfg.MySQL.Port,
cfg.MySQL.Database,
)
dbo, err := sql.Open("mysql", dsn)
if err != nil {
rst["Result"] = "NG"
rst["ErrMsg"] = "racs.GetFailList: " + err.Error()
logger.Printf("[ERR] %s; %s; %s\r\n", addr, uri, rst["ErrMsg"])
return rst
}
defer dbo.Close()
dml := cfg.MySQL.GetFailListSQL
if len(params) > 0 {
dml = dml + " WHERE "
for k, v := range params {
trans := false
for _, p := range cfg.MySQL.GetFailListParams {
if k == p.Param {
dml = dml + fmt.Sprintf("%s='%s' AND ", p.Column, v)
trans = true
break
}
}
if !trans {
dml = dml + fmt.Sprintf("%s='%s' AND ", k, v)
}
}
}
dml = strings.TrimSuffix(dml, " AND ")
qry, err := dbo.Query(dml)
if err != nil {
rst["Result"] = "NG"
rst["ErrMsg"] = "racs.GetFailList: " + err.Error()
logger.Printf("[ERR] %s; %s; %s\r\n", addr, uri, rst["ErrMsg"])
return rst
}
cols, err := qry.Columns()
if err != nil {
rst["Result"] = "NG"
rst["ErrMsg"] = "racs.GetFailList: " + err.Error()
logger.Printf("[ERR] %s; %s; %s\r\n", addr, uri, rst["ErrMsg"])
return rst
}
vals := make([][]byte, len(cols))
scans := make([]interface{}, len(cols))
for v := range vals {
scans[v] = &vals[v]
}
list := make([]map[string]string, 0)
for qry.Next() {
if err := qry.Scan(scans...); err != nil {
rst["Result"] = "NG"
rst["ErrMsg"] = "racs.GetFailList: " + err.Error()
logger.Printf("[ERR] %s; %s; %s\r\n", addr, uri, rst["ErrMsg"])
return rst
}
row := make(map[string]string)
for k, v := range vals {
key := cols[k]
row[key] = string(v)
}
list = append(list, row)
}
rst["List"] = list
return rst
}