Files
be.ems/lib/dborm/dborm.go
2023-08-14 17:02:50 +08:00

1413 lines
42 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package dborm
import (
"database/sql"
"encoding/json"
"errors"
"fmt"
"strconv"
"time"
"strings"
"ems.agt/lib/log"
"ems.agt/lib/oauth"
_ "github.com/go-sql-driver/mysql"
"xorm.io/xorm"
)
const (
TableNameMeasureTask = "measure_task"
TableNameNeInfo = "ne_info"
)
type Menu struct {
Id int `json:"id"`
Title string `json:"title"`
Icon string `json:"icon"`
Href string `json:"href"`
ParentId int `json:"parent_id`
Remark int `json:"remark"`
}
type DatabaseClient struct {
dbType string
dbUrl string
dbConnMaxLifetime time.Duration
dbMaxIdleConns int
dbMaxOpenConns int
IsShowSQL bool
XEngine *xorm.Engine
}
var DbClient DatabaseClient
func InitDbClient(dbType, dbUser, dbPassword, dbHost, dbPort, dbName string) error {
DbClient.dbUrl = fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8&parseTime=true&loc=Local",
dbUser, dbPassword, dbHost, dbPort, dbName)
DbClient.dbType = dbType
DbClient.dbConnMaxLifetime = 0
DbClient.dbMaxIdleConns = 0
DbClient.dbMaxOpenConns = 0
if log.GetLevel() == log.LOG_TRACE {
DbClient.IsShowSQL = true
}
log.Debugf("dbType:%s dbUrl:%s:******@tcp(%s:%s)/%s??charset=utf8&parseTime=true&loc=Local",
dbType, dbUser, dbHost, dbPort, dbName)
var err error
DbClient.XEngine, err = xorm.NewEngine(DbClient.dbType, DbClient.dbUrl)
if err != nil {
log.Error("Failed to connet database:", err)
return err
}
DbClient.XEngine.SetConnMaxLifetime(DbClient.dbConnMaxLifetime)
DbClient.XEngine.SetMaxIdleConns(DbClient.dbMaxIdleConns)
DbClient.XEngine.SetMaxOpenConns(DbClient.dbMaxOpenConns)
if DbClient.IsShowSQL {
DbClient.XEngine.ShowSQL(true)
}
xEngine = DbClient.XEngine
return nil
}
// func InitDbClient() error {
// db := config.GetYamlConfig().Database
// DbClient.dbUrl = fmt.Sprintf("%s:%s@tcp(%s:%s)/%s", db.User, db.Password, db.Host, db.Port, db.Name)
// DbClient.dbType = db.Type
// DbClient.dbConnMaxLifetime = 0
// DbClient.dbMaxIdleConns = 0
// DbClient.dbMaxOpenConns = 0
// if log.GetLevel() == log.LOG_TRACE {
// DbClient.IsShowSQL = true
// }
// log.Debugf("dbType:%s dbUrl:%s:******@tcp(%s:%s)/%s", DbClient.dbType, db.User, db.Host, db.Port, db.Name)
// var err error
// DbClient.XEngine, err = xorm.NewEngine(DbClient.dbType, DbClient.dbUrl)
// if err != nil {
// log.Error("Failed to connet database:", err)
// return err
// }
// DbClient.XEngine.SetConnMaxLifetime(DbClient.dbConnMaxLifetime)
// DbClient.XEngine.SetMaxIdleConns(DbClient.dbMaxIdleConns)
// DbClient.XEngine.SetMaxOpenConns(DbClient.dbMaxOpenConns)
// if DbClient.IsShowSQL {
// DbClient.XEngine.ShowSQL(true)
// }
// xEngine = DbClient.XEngine
// return nil
// }
var xEngine *xorm.Engine
func XormConnectDatabase(dbType, dbUser, dbPassword, dbHost, dbPort, dbName string) (*xorm.Engine, error) {
sqlStr := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8&parseTime=true&loc=Local",
dbUser, dbPassword, dbHost, dbPort, dbName)
log.Debugf("dbType:%s Connect to:%s:******@tcp(%s:%s)/%s?charset=utf8&parseTime=true&loc=Local",
dbType, dbUser, dbHost, dbPort, dbName)
var err error
xEngine, err = xorm.NewEngine(dbType, sqlStr) //1、Create xorm engine
if err != nil {
log.Error("Failed to connect database:", err)
return nil, err
}
if log.GetLevel() == log.LOG_TRACE {
xEngine.ShowSQL(true)
}
return xEngine, nil
}
func ConstructInsertSQL(tableName string, insertData interface{}) (string, []string) {
log.Debug("ConstructInsertSQL processing... ")
log.Debug("Request insertData:", insertData)
var sql []string
var dataTag string
for t, d := range insertData.(map[string]interface{}) {
log.Tracef("t: %v d: %v", t, d)
dataTag = t
for i, r := range d.([]interface{}) {
var cl, vl string
log.Tracef("i: %v r: %v", i, r)
for c, v := range r.(map[string]interface{}) {
log.Tracef("c: %v v: %v", c, v)
if cl == "" {
cl = fmt.Sprintf("%s", c)
} else {
cl = fmt.Sprintf("%s, %s", cl, c)
}
if vl == "" {
vl = fmt.Sprintf("'%v'", v)
} else {
vl = fmt.Sprintf("%s, '%v'", vl, v)
}
log.Tracef("cl: %s vl: %s", cl, vl)
}
sql = append(sql, "insert into "+tableName+"("+cl+")"+" values("+vl+")")
}
log.Debug("sql:", sql)
}
return dataTag, sql
}
func InsertDataWithJson(insertData interface{}) (int64, error) {
log.Debug("InsertDataWithJson processing... ")
var data map[string]interface{}
var tableName string
for k, v := range insertData.(map[string]interface{}) {
log.Tracef("k: %v v: %v", k, v)
tableName = k
data = v.(map[string]interface{})
}
log.Tracef("data: %v", data)
xSession := xEngine.NewSession()
defer xSession.Close()
affected, err := xSession.Insert(data, tableName)
xSession.Commit()
return affected, err
}
type NeInfo struct {
Id int `json:"id" xorm:"pk 'id' autoincr"`
NeType string `json:"neType" xorm:"ne_type"`
NeId string `json:"neId" xorm:"ne_id"` // neUID/rmUID 网元唯一标识
RmUID string `json:"rmUID" xorm:"rm_uid"` // neUID/rmUID网元UID
NeName string `json:"neName" xorm:"ne_name"` // NeName/UserLabel 网元名称/网元设备友好名称
Ip string `json:"ip" xorm:"ip"`
Port string `json:"port" xorm:"port"`
PvFlag string `json:"pvFlag" xorm:"pv_flag"` // 网元虚实性标识 VNF/PNF: 虚拟/物理
NeAddress string `json:"neAddress" xorm:"ne_address"` // 只对PNF
Province string `json:"province" xorm:"province"` // 网元所在省份
VendorName string `json:"vendorName" xorm:"vendor_name"` // 厂商名称
Dn string `json:"dn" xorm:"dn"` // 网络标识
Status int `json:"status" xorm:"status"`
UpdateTime string `json:"-" xorm:"-"`
}
func XormGetNeInfo(neType string, neId string) (*NeInfo, error) {
log.Debug("XormGetNeInfo processing... ")
neInfo := new(NeInfo)
has, err := xEngine.Where("status='0' and ne_type=? and ne_id=?", strings.ToUpper(neType), neId).Get(neInfo)
if err != nil {
log.Error("Failed to get table ne_info from database:", err)
return nil, err
} else if has == false {
log.Infof("Not found ne_info from database, status='0', neType=%s, neId=%s", neType, neId)
return nil, nil
}
log.Debug("NE Info:", neInfo)
return neInfo, nil
}
func XormGetNeInfoByRmUID(neType string, rmUID string) (*NeInfo, error) {
log.Debug("XormGetNeInfoByRmUID processing... ")
neInfo := new(NeInfo)
has, err := xEngine.Where("status='0' and ne_type=? and rm_uid=?", strings.ToUpper(neType), rmUID).Get(neInfo)
if err != nil {
log.Error("Failed to get table ne_info from database:", err)
return nil, err
} else if has == false {
log.Infof("Not found ne_info from database, status='0', neType=%s, neId=%s", neType, rmUID)
return nil, nil
}
log.Debug("NE Info:", neInfo)
return neInfo, nil
}
func XormGetAllNeInfo(nes *[]NeInfo) (*[]NeInfo, error) {
log.Debug("XormGetAllNeInfo processing... ")
ne := new(NeInfo)
rows, err := xEngine.Table("ne_info").Where("status='0'").Rows(ne)
if err != nil {
log.Error("Failed to get table ne_info from database:", err)
return nil, err
}
defer rows.Close()
for rows.Next() {
err := rows.Scan(ne)
if err != nil {
log.Error("Failed to get table ne_info from database:", err)
return nil, err
}
*nes = append(*nes, *ne)
}
log.Debug("nes:", nes)
return nes, nil
}
func XormGetNeInfoByNeType(neType string, nes *[]NeInfo) error {
log.Debug("XormGetNeInfoByNeType processing... ")
ne := new(NeInfo)
rows, err := xEngine.Table("ne_info").Where("status='0' and ne_type=?", neType).Rows(ne)
if err != nil {
log.Error("Failed to get table ne_info from database:", err)
return err
}
defer rows.Close()
for rows.Next() {
err := rows.Scan(ne)
if err != nil {
log.Error("Failed to get table ne_info from database:", err)
return err
}
*nes = append(*nes, *ne)
}
log.Debug("nes:", nes)
return nil
}
func XormInsertNeInfo(neInfo *NeInfo) (int64, error) {
log.Debug("XormInsertNeInfo processing... ")
var affected int64 = 0
var err error = nil
xSession := xEngine.NewSession()
defer xSession.Close()
ex, _ := xEngine.Table("ne_info").Where("status = '1' and ne_type = ? and ne_id = ?", neInfo.NeType, neInfo.NeId).Exist()
if ex == true {
neInfo.Status = 0
affected, err = xSession.Where("ne_type = ? and ne_id = ?", neInfo.NeType, neInfo.NeId).Update(neInfo)
} else {
affected, err = xSession.InsertOne(neInfo)
}
xSession.Commit()
return affected, err
}
func XormUpdateNeInfo(neInfo *NeInfo) (int64, error) {
log.Debug("XormUpdateNeInfo processing... ")
xSession := xEngine.NewSession()
defer xSession.Close()
affected, err := xSession.ID(neInfo.Id).Update(neInfo)
xSession.Commit()
return affected, err
}
func XormDeleteNeInfo(neInfo *NeInfo) (int64, error) {
log.Debug("XormDeleteNeInfo processing... ")
xSession := xEngine.NewSession()
defer xSession.Close()
affected, err := xSession.Where("ne_type = ? and ne_id = ?", neInfo.NeType, neInfo.NeId).Delete(neInfo)
xSession.Commit()
return affected, err
}
func XormParseResult(body []byte) ([]NeInfo, error) {
log.Debug("XormParseResult processing... ")
data := make(map[string]interface{})
err := json.Unmarshal(body, &data)
if err != nil {
return nil, err
}
var neInfo []NeInfo
var re interface{}
if data["data"] == nil {
return nil, errors.New("The data is Not found")
}
for _, d := range data["data"].([]interface{}) {
if d == nil {
return nil, errors.New("The data is Not found")
}
for _, re = range d.(map[string]interface{}) {
if re == nil {
return nil, errors.New("The data is Not found")
}
for _, rc := range re.([]interface{}) {
if rc == nil {
return nil, errors.New("The data is Not found")
}
var s NeInfo
record := rc.(map[string]interface{})
s.NeName = fmt.Sprintf("%v", record["ne_name"])
s.NeId = fmt.Sprintf("%v", record["ne_id"])
s.NeType = fmt.Sprintf("%v", strings.ToLower(record["ne_type"].(string)))
s.Ip = fmt.Sprintf("%v", record["ip"])
s.Port = fmt.Sprintf("%v", record["port"])
s.PvFlag = fmt.Sprintf("%v", record["pv_flag"])
neInfo = append(neInfo, s)
}
}
}
log.Debug("neInfo:", neInfo)
return neInfo, nil
}
type ParamConfig struct {
// Id int `json:"id" xorm:"pk 'id' autoincr"`
NeType string `json:"neType"`
NeId string `json:"neId"`
TopTag string `json:"topTag"`
TopDisplay string `json:"topDisplay"`
ParamJson string `json:"paramJson"`
}
func XormInsertParamConfig(mapJson *map[string]interface{}) (int64, error) {
var affected, a int64
var err error
paramConfig := new(ParamConfig)
for n, d := range *mapJson {
if d == nil {
break
}
log.Debugf("n: %s", n)
for t, p := range d.(map[string]interface{}) {
if p == nil {
break
}
log.Debug("t:", t)
log.Debug("p:", p)
for k, v := range p.(map[string]interface{}) {
log.Debug("k, v: ", k, v)
if k == "display" {
paramConfig.TopDisplay = fmt.Sprintf("%v", v)
} else {
pc, _ := json.Marshal(v)
paramConfig.ParamJson = fmt.Sprintf("{\"%v\":%v}", k, string(pc))
}
}
paramConfig.NeType = strings.ToUpper(n)
paramConfig.NeId = ""
paramConfig.TopTag = t
// paramConfig.TopDisplay = p["display"]
// paramConfig.ParamJson = p.(string)
log.Debug("paramConfig:", paramConfig)
xSession := xEngine.NewSession()
defer xSession.Close()
_, err = xSession.Table("param_config").Where("ne_type = ? and top_tag = ?", paramConfig.NeType, paramConfig.TopTag).Delete()
if err != nil {
log.Error("Failed to insert param_config:", err)
}
a, err = xSession.Insert(paramConfig)
if err != nil {
log.Error("Failed to insert param_config:", err)
}
affected += a
xSession.Commit()
}
}
return affected, err
}
func ConstructUpdateSQLArray(tableName string, updateData interface{}, whereCondition string) (string, []string) {
log.Debug("ConstructUpdateSQL processing... ")
log.Debug("Request updateData:", updateData)
var sql []string
var tblName string
for t, d := range updateData.(map[string]interface{}) {
log.Tracef("t: %v d: %v", t, d)
tblName = t
for i, r := range d.([]interface{}) {
var cv string
log.Tracef("i: %v r: %v", i, r)
for c, v := range r.(map[string]interface{}) {
log.Tracef("c: %v v: %v", c, v)
if cv == "" {
cv = fmt.Sprintf("`%s`='%s'", c, v)
} else {
cv = fmt.Sprintf("%s,`%s`='%s'", cv, c, v)
}
log.Tracef("cv: %s", cv)
}
sql = append(sql, "UPDATE "+tableName+" SET "+cv+" WHERE "+whereCondition)
}
log.Debug("sql:", sql)
}
return tblName, sql
}
func ConstructUpdateSQL(tableName string, updateData interface{}, whereCondition string) (string, []string) {
log.Debug("ConstructUpdateSQL processing... ")
log.Debug("Request updateData:", updateData)
var sql []string
var tblName string
for t, d := range updateData.(map[string]interface{}) {
log.Tracef("t: %v d: %v", t, d)
tblName = t
var cv string
for c, v := range d.(map[string]interface{}) {
log.Tracef("c: %v v: %v", c, v)
if cv == "" {
//cv = fmt.Sprintf("`%s`=%s", c, v)
cv = fmt.Sprintf("`%s`='%s'", c, v)
} else {
//cv = fmt.Sprintf("%s,`%s`=%s", cv, c, v)
cv = fmt.Sprintf("%s,`%s`='%s'", cv, c, v)
}
log.Tracef("cv: %s", cv)
}
sql = append(sql, "UPDATE "+tableName+" SET "+cv+" WHERE "+whereCondition)
log.Debug("sql:", sql)
}
return tblName, sql
}
func ConstructDeleteSQL(tableName string, whereCondition string) string {
log.Debug("ConstructDeleteSQL processing... ")
var sql string
sql = "DELETE from " + tableName + " WHERE " + whereCondition
log.Debug("sql:", sql)
return sql
}
type TaskStatus string
const (
MeasureTaskStatusInactive = "Inactive"
MeasureTaskStatusActive = "Active"
MeasureTaskStatusSuspend = "Suspend"
MeasureTaskStatusDeleted = "Deleted"
)
type MTask struct {
Id int `json:"id" xorm:"pk 'id' autoincr"`
NeSet struct {
NEs []string `json:"nes"`
} `json:"neSet" xorm:"ne_set"`
KpiSet struct {
Code string `json:"Code"`
KPIs []string `json:"KPIs`
} `json:"kpiSet" xorm:"kpi_set"`
StartTime string `json:"startTime" xorm:"start_time"`
EndTime string `json:"endTime" xorm:"end_time"`
Periods []struct {
Start string `json:"start"`
End string `json:"end"`
} `json:"Periods" xorm:"periods`
Schedule struct {
Type string `json:"type"`
Days []int `json:"days"`
} `json:"schedule" xorm:"schedule"`
GranulOption string `json:"granulOption" xorm:"granul_option"`
Status string `json:"status" xorm:"status"`
CreateTime string `json:"createTime" xorm:"create_time"`
UpdateTime string `json:"updateTime" xorm:"update_time"`
DeleteTime string `json:"deleteTime xorm:"delete_time"`
}
type ScheduleJ struct {
Type string `json:"Type"`
Days []int `json:"Days"`
}
type Period struct {
Start string `json:"Start"`
End string `json:"End"`
}
type KpiSetJ struct {
Code string `json:"Code"` // 统计编码 如SMFHA01
KPIs []string `json:"KPIs` // 指标项集合 ["SMF.AttCreatePduSession", "SMF.AttCreatePduSession._Dnn"]
}
type MeasureTask struct {
Id int `json:"id" xorm:"pk 'id' autoincr"`
NeType string `json:"neType" xorm:"ne_type"`
NeIds []string `json:"neIds" xorm:"ne_ids"`
KpiSet []KpiSetJ `json:"KPISet" xorm:"kpi_set"`
StartTime string `json:"startTime" xorm:"start_time"`
EndTime string `json:"endTime" xorm:"end_time"`
Periods []Period `json:"Periods" xorm:"periods`
Schedule []ScheduleJ `json:"Schedule" xorm:"schedule"`
GranulOption string `json:"granulOption" xorm:"granul_option"`
Status string `json:"status" xorm:"status"`
CreateTime string `json:"createTime" xorm:"create_time"`
UpdateTime string `json:"updateTime" xorm:"update_time"`
DeleteTime string `json:"deleteTime xorm:"delete_time"`
}
func GetMeasureTask(taskId int) (*MeasureTask, error) {
log.Debug("GetMeasureTask processing... ")
measureTask := new(MeasureTask)
has, err := xEngine.Table("measure_task").Where("id=?", taskId).Get(measureTask)
if err != nil || has == false {
log.Error("Failed to get table measure_task from database:", err)
return nil, err
}
log.Debug("Measure Task:", measureTask)
return measureTask, nil
}
func XormGetActiveMeasureTask(measureTasks *[]MeasureTask) (*[]MeasureTask, error) {
log.Debug("XormGetActiveMeasureTask processing... ")
measureTask := new(MeasureTask)
rows, err := xEngine.Table("measure_task").Where("status='Active'").Rows(measureTask)
if err != nil {
log.Error("Failed to get table measure_task:", err)
return nil, err
}
defer rows.Close()
for rows.Next() {
err := rows.Scan(measureTask)
if err != nil {
log.Error("Failed to get table measure_task from database:", err)
return nil, err
}
*measureTasks = append(*measureTasks, *measureTask)
}
log.Debug("measureTasks:", measureTasks)
return measureTasks, nil
}
func GetTableByWhere(whereCondition string, tableName string) (*[]interface{}, error) {
log.Debug("GetTableByWhere processing... ")
rows := new([]interface{})
has, err := xEngine.Table(tableName).Where(whereCondition).Get(rows)
if err != nil {
log.Errorf("Failed to get table %s from database:%v", tableName, err)
return nil, err
} else if has == false {
log.Infof("Not found table %s from database:where=%d", tableName, whereCondition)
return nil, nil
}
log.Debugf("%s:%v", tableName, rows)
return rows, nil
}
func GetTableById(id int, tableName string) (*[]interface{}, error) {
log.Debug("GetTableById processing... ")
rows := new([]interface{})
has, err := xEngine.Table(tableName).ID(id).Get(rows)
if err != nil {
log.Errorf("Failed to get table %s from database:id=%d, %v", tableName, id, err)
return nil, err
} else if has == false {
log.Infof("Not found table %s from database:id=%d", tableName, id)
return nil, nil
}
log.Debugf("%s:%v", tableName, rows)
return rows, nil
}
func XormUpdateTableById(id int, tableName string, tbInfo interface{}) (int64, error) {
log.Debug("XormUpdateTableById processing...id: ", id)
affected, err := xEngine.Table(tableName).ID(id).Update(tbInfo)
if err != nil {
log.Errorf("Failed to update table %s from database:%v", tableName, err)
return 0, err
}
return affected, nil
}
func XormUpdateTableByWhere(whereCondition string, tableName string, tbInfo interface{}) (int64, error) {
log.Debug("UpdateTableByWhere processing... ")
affected, err := xEngine.Table(tableName).Where(whereCondition).Update(tbInfo)
if err != nil {
log.Errorf("Failed to update table %s from database:%v", tableName, err)
return 0, err
}
return affected, nil
}
type User struct {
Id int `json:"id" xorm:"pk 'id' autoincr"`
AccountId string `json:"accountId"`
Name string `json:"name" xorm:"name"`
Sn string `json:"sn"`
Gender string `json:"gender"`
Description string `json:"description"`
TelephoneNumber string `json:"telephoneNumber" xorm:"telephone_number"`
Mobile string `json:"mobile"`
Email string `json:"email" xorm:"email"`
StartTime string `json:"startTime" xorm:"start_time"`
EndTime string `json:"endTime" xorm:"end_time"`
IdCardNumber string `json:"idCardNumber"`
EmployeeNumber string `json:"employeeNumber"`
Organize string `json:"organize"`
EmployeeType string `json:"employeeType"`
SupporterCorpName string `json:"supporterCorpName"`
RealName string `json:"realName" xorm:"real_name"`
Password string `json:"password" xorm:"password"`
PasswordSha512 string `json:"passwordSha512"`
ChangePasswordFlag int `json:"changePasswordFlag"`
PasswordExpiration string `json:"passwordExpiration"`
Status string `json:"status"`
UserExpiration string `json:"userExpiration"`
GroupName string `json:"groupId" xorm:"group_name"`
Profile string `json:"profile" xorm:"-"`
Phone string `json:"phone" xorm:"phone"`
CreateTime string `json:"createTime" xorm:"create_time"`
UpdateTime string `json:"updateTime" xorm:"update_time"`
}
func XormCheckLoginUser(name, password, cryptArgo string) (bool, *User, error) {
log.Info("XormCheckLoginUser processing... ")
user := new(User)
// has, err := xEngine.Table("user").Where("name='%s' and password=PASSWORD('%s')", name, password).Get(user)
switch cryptArgo {
case "mysql":
has, err := xEngine.SQL("select * from user where status='Active' and account_id=? and password=PASSWORD(?)", name, password).Exist()
if err != nil || has == false {
log.Error("Failed to check user from database:", err)
return false, nil, err
}
case "md5":
has, err := xEngine.
SQL("select * from user where status='Active' and account_id=? and password=MD5(?)", name, password).Exist()
if err != nil || has == false {
log.Error("Failed to check user from database:", err)
return false, nil, err
}
case "bcrypt":
has, err := xEngine.Table("user").Where("status='Active' and account_id=?", name).Get(user)
if err != nil || has == false {
log.Error("Failed to get user from database:", err)
return false, nil, err
}
if oauth.BcryptCompare(user.Password, password) != nil {
err := errors.New("Incorrect login name or password")
log.Error(err)
return false, nil, err
}
default:
err := errors.New("Incorrect crypt algoritmo")
log.Error("crypt:%s", err)
return false, nil, err
}
return true, user, nil
}
func XormGetConfigValue(moduleName, configTag string) (string, error) {
var value string
_, err := xEngine.Table("config").
Where("module_name=? and config_tag=?", moduleName, configTag).
Cols("value").
Get(&value)
if err != nil {
log.Error("Failed to get config:", err)
return "", err
}
return value, nil
}
type Session struct {
Id int `json:"id" xorm:"pk 'id' autoincr"`
AccountId string `json:"accountId" xorm:"account_id"`
Name string `json:"name" xorm:"name"`
Host string `json:"host" xorm:"host"`
AccessToken string `json:"accessToken" xorm:"access_token"`
Expires uint32 `json:"expires" xorm:"expires"`
Status string `json:"status" xorm:"status"`
LoginTime string `json:"loginTime" xorm:"-"`
ShakeTime sql.NullTime `son:"shakeTime" xorm:"shake_time"`
LogoutTime sql.NullTime `json:"logoutTime" xorm:"logout_time"`
}
// XormInsertSession create session
func XormInsertSession(name, host, token string, expires uint32, sessionFlag string) (int64, error) {
log.Info("XormInsertSession processing... ")
var affected int64 = 0
var err error = nil
currentTime := time.Now()
timeValue := currentTime.Local()
nullTime := sql.NullTime{Valid: true, Time: timeValue}
value, err := XormGetConfigValue("Security", "sessionExpires")
if err != nil {
return affected, err
}
if value != "" {
intValue, _ := strconv.Atoi(value)
expires = uint32(intValue)
log.Debugf("intValue=%d, expires=%d", intValue, expires)
}
session := Session{AccountId: name,
Name: name, Host: host, AccessToken: token,
Status: "online", Expires: expires,
ShakeTime: nullTime,
}
//session.ShakeTime.Time
xSession := xEngine.NewSession()
defer xSession.Close()
if strings.ToLower(sessionFlag) == "multiple" {
exist, err := xEngine.Table("session").Where("status = 'online' and account_id = ? and host = ?", name, host).Exist()
if err != nil {
return affected, err
}
if exist == true {
affected, err = xSession.Table("session").Where("account_id = ? and host = ?", name, host).Update(session)
} else {
affected, err = xSession.InsertOne(session)
}
} else { // single session for a user
exist, err := xEngine.Table("session").Where("status = 'online' and account_id = ?", name).Exist()
if err != nil {
return affected, err
}
if exist == true {
// todo...
err := errors.New("user is logged in")
return -1, err
} else {
affected, err = xSession.InsertOne(session)
}
}
xSession.Commit()
return affected, err
}
// XormUpdateSession update session
func XormLogoutUpdateSession(token string) (int64, error) {
log.Info("XormLogoutUpdateSession processing... ")
session := Session{Status: "offline", AccessToken: token}
session.LogoutTime.Valid = true
session.LogoutTime.Time = time.Now()
xSession := xEngine.NewSession()
defer xSession.Close()
affected, err := xSession.Table("session").Where("access_token = ?", token).Update(session)
xSession.Commit()
return affected, err
}
// XormUpdateSessionShakeTime create session
func XormUpdateSessionShakeTime(token string) (int64, error) {
log.Debug("XormUpdateSessionShakeTime processing... ")
session := Session{AccessToken: token}
session.ShakeTime.Valid = true
session.ShakeTime.Time = time.Now()
xSession := xEngine.NewSession()
defer xSession.Close()
affected, err := xSession.Table("session").Where("access_token = ?", token).Update(session)
xSession.Commit()
return affected, err
}
func XormExistValidToken(token string, expires uint32) bool {
log.Info("XormExistValidToken processing... ")
exist, err := xEngine.Table("session").
Where("status = 'online' and access_token = ? and DATE_ADD(shake_time, INTERVAL expires SECOND) > NOW()", token).
Exist()
if err != nil {
return false
}
return exist
}
/*
type NorthboundPm struct {
Id int `json:"id" xorm:"pk 'id' autoincr"`
Date string `json:"date" xorm:"date"`
Index int `json:"index"`
StartTime string `json:"startTime" xorm:"start_time"`
TimeZone string `json:"timeZone" xorm:"time_zone"`
NEName string `json:"neName" xorm:"ne_name"`
PmVersion string `json:"pmVersion" xorm:"pm_version"`
Period string `json:"period" xorm:"pevalue"
RmUid string `json:"rmUid" xorm:"rm_uid"`
NEType string `json:"neType" xorm:"ne_type"`
Dn string `json:"neType" xorm:"ne_type"`
ObjectType string `json:"objectType" xorm:"object_type"`
PmName string `json:"pmName" xorm:"pm_name"`
PmExt string `json:"pmExt" xorm:"pm_ext"`
Value int `json:"value" xorm:"value"`
Timestamp string `json:"timestamp" xorm:"timestamp"`
}
*/
type NorthboundPm struct {
Id int `json:"-" xorm:"pk 'id' autoincr"`
Date string `json:"Date" xorm:"date"`
Index int `json:"Index" xorm:"index"` // 1天中测量时间粒度(如15分钟)的切片索引: 0~95
Timestamp string `json:"-" xorm:"-"`
NeName string `json:"NeName" xorm:"ne_name"` // UserLabel
RmUID string `json:"RmUID" xorm:"rm_uid"`
NeType string `json:"NeType" xorm:"ne_type"` // 网元类型
PmVersion string `json:"PmVersion" xorm:"pm_version"` // 性能数据版本号
Dn string `json:"Dn" xorm:"dn"` // (???)网元标识, 如:RJN-CMZJ-TZ,SubNetwork=5GC88,ManagedElement=SMF53456,SmfFunction=53456
Period string `json:"Period" xorm:"period"` // 测量时间粒度选项5/15/30/60
TimeZone string `json:"TimeZone" xorm:"time_zone"`
StartTime string `json:"StartTime" xorm:"start_time"`
Datas []struct {
ObjectType string `json:"ObjectType" xorm:"object_type"` // 网络资源类别名称, Pm指标项列表中为空间粒度 如SmfFunction
PmDatas []struct {
PmName string `json:"KPIID" xorm:"pm_name"` // 指标项, 如: SMF.AttCreatePduSession._Dnn
SubDatas []struct {
SN string `json:"Name" xorm:"sn"` // 单个的写"Total", 或者指标项有多个测量项如Dnn的名称写对应的Dnn"cmnet"/"ims"
SV int64 `json:"Value" xorm:"sv"`
} `json:"KPIValues" xorm:"sub_datas"`
} `json:"KPIs" xorm:"pm_datas"`
} `json:"Datas" xorm:"datas"`
}
type Alarm struct {
AlarmSeq int `json:"alarmSeq"`
AlarmId string `json:"alarmId" xorm:"alarm_id"`
NeId string `json:"neId"`
AlarmCode int `json:"alarmCode"`
AlarmTitle string `json:"alarmTitle"`
EventTime string `json:"eventTime"`
AlarmType string `json:"alarmType"`
OrigSeverity string `json:"origSeverity"`
PVFlag string `json:"pvFlag" xorm:"pv_flag"`
NeName string `json:"neName"`
NeType string `json:"neType"`
ObjectName string `json:"objectName" xorm:"object_name"`
LocationInfo string `json:"locationInfo"`
Province string `json:"province"`
AlarmStatus int `json:"alarmStatus"`
SpecificProblem string `json:"specificProblem"`
SpecificProblemID string `json:"specificProblemID" xorm:"specific_problem_id"`
AddInfo string `json:"addInfo"`
// AckState int `json:"ackState" xorm:"-"`
// AckTime string `json:"ackTime" xorm:"-"`
ClearType int `json:"clearType" xorm:"-"` // 0: Unclear, 1: Auto clear, 2: Manual clear
ClearTime string `json:"clearTime" xorm:"-"`
}
func XormGetAlarmByAlarmId(alarmId string, alarms *[]Alarm) (*[]Alarm, error) {
log.Debug("XormGetAlarmByAlarmId processing... ")
alarm := new(Alarm)
rows, err := xEngine.Table("alarm").Where("alarm_id=?", alarmId).Rows(alarm)
if err != nil {
log.Error("Failed to get table alarm from database:", err)
return nil, err
}
defer rows.Close()
for rows.Next() {
err := rows.Scan(alarm)
if err != nil {
log.Error("Failed to get table alarm from database:", err)
return nil, err
}
*alarms = append(*alarms, *alarm)
}
log.Trace("alarms:", alarms)
return alarms, nil
}
func XormSQLGetStringValue(querySQL string) (string, error) {
log.Debug("XormSQLGetStringValue processing... ")
row := make(map[string]interface{})
_, err := xEngine.SQL(querySQL).Get(&row)
if err != nil {
log.Errorf("Failed to get by SQL=%s:%v", querySQL, err)
return "", err
}
for _, v := range row {
return fmt.Sprintf("%v", v), nil
}
return "", nil
}
func XormGetSingleCol(table, col, where string) (string, error) {
log.Debug("XormGetSingleCol processing... ")
row := make(map[string]interface{})
_, err := xEngine.Table(table).Where(where).Cols(col).Get(&row)
if err != nil {
log.Errorf("Failed to get %s from table %s:%v", col, table, err)
return "", err
}
for _, v := range row {
return fmt.Sprintf("%v", v), nil
}
return "", nil
}
func XormGetSingleColStringArrayByIn(table, col, incol string, conditions []string, cols *[]string) error {
log.Debug("XormGetSingleColStringArrayByIn processing... ")
err := xEngine.Table(table).In(incol, conditions).Cols(col).Distinct().Find(cols)
if err != nil {
log.Errorf("Failed to get %s from table %s:%v", col, table, err)
return err
}
return nil
}
func XormGetColStringArrayByWhere(table, coln, where string, colv *[]string) error {
log.Debug("XormGetColStringArrayByWhere processing... ")
_, err := xEngine.Table(table).Where(where).Cols(coln).Get(colv)
if err != nil {
log.Errorf("Failed to Get %s from table %s:%v", coln, table, err)
return err
}
return nil
}
func XormFindColStringArrayByWhere(table, col, where string, cols *[]string) error {
log.Debug("XormFindColStringArrayByWhere processing... ")
err := xEngine.Table(table).Where(where).Cols(col).Distinct().Find(cols)
if err != nil {
log.Errorf("Failed to Find %s from table %s:%v", col, table, err)
return err
}
return nil
}
func XormGetSingleColStringByWhere(table, col, where string) (string, error) {
log.Info("XormFindSingleColStringByWhere processing... ")
var colv string
_, err := xEngine.Table(table).Where(where).Cols(col).Get(&colv)
if err != nil {
log.Errorf("Failed to Find %s from table %s:%v", col, table, err)
return colv, err
}
return colv, nil
}
func XormGetSingleColStringArrayByID(table, col string, id int, cols *[]string) error {
log.Debug("XormGetSingleColStringArrayByID processing... ")
err := xEngine.Table(table).ID(id).Cols(col).Find(cols)
if err != nil {
log.Errorf("Failed to Find %s from table %s:%v", col, table, err)
return err
}
return nil
}
func XormGetStringValue(table, col string, id int) (string, error) {
log.Debug("XormGetStringValue processing... ")
row := make(map[string]interface{})
_, err := xEngine.ID(id).Table(table).Cols(col).Get(&row)
if err != nil {
log.Errorf("Failed to get %s from table %s:%v", col, table, err)
return "", err
}
for _, v := range row {
return fmt.Sprintf("%v", v), nil
}
return "", nil
}
type NeBackup struct {
Id int `json:"id" xorm:"pk 'id' autoincr"`
NeType string `json:"neType" xorm:"ne_type"`
NeId string `json:"neId" xorm:"ne_id"`
FileName string `json:"neName" xorm:"file_name"`
Path string `json:"path"`
Md5Sum string `json:"md5Sum" xorm:"md5_sum"`
CreateTime string `json:"createTime" xorm:"-" `
}
// XormInsertSession create session
func XormInsertTableOne(tableName string, tbInfo interface{}) (int64, error) {
log.Debug("XormInsertTableOne processing... ")
var affected int64 = 0
var err error = nil
xSession := xEngine.NewSession()
defer xSession.Close()
affected, err = xSession.Table(tableName).InsertOne(tbInfo)
xSession.Commit()
return affected, err
}
// XormExistTableOne create session
func XormExistTableOne(tableName string, where string) (bool, error) {
log.Debug("XormExistTableOne processing... ")
has, err := xEngine.Table(tableName).Where(where).Exist()
return has, err
}
func XormGetTableRows(tableName string, where string, tbInfo *[]interface{}) (*[]interface{}, error) {
log.Debug("XormGetTableRows processing... ")
row := make(map[string]interface{})
rows, err := xEngine.Table(tableName).Where(where).Rows(row)
if err != nil {
log.Errorf("Failed to Rows table %s from database: %v", tableName, err)
return nil, err
}
defer rows.Close()
for rows.Next() {
err := rows.Scan(row)
if err != nil {
log.Errorf("Failed to Scan table %s from database: %v", tableName, err)
return nil, err
}
*tbInfo = append(*tbInfo, row)
}
log.Debug("tbInfo:", tbInfo)
return tbInfo, nil
}
type MeasureThreshold struct {
Id int `json:"id" xorm:"pk 'id' autoincr"`
NeType string `json:"neType" xorm:"ne_type"`
KpiSet []string `json:"kpiSet" xorm:"kpi_set"`
Threshold int64 `json:"threshold"`
Status string `json:"md5Sum" xorm:"md5_sum"`
OrigSeverity string `json:"createTime" xorm:"orig_severity"`
AlarmId string `json:"alarmId" xorm:"alarm_id"`
}
type NeSoftware struct {
Id int `json:"id" xorm:"pk 'id' autoincr"`
NeType string `json:"neType" xorm:"ne_type"`
FileName string `json:"neName" xorm:"file_name"`
Path string `json:"path"`
Version string `json:"version"`
Md5Sum string `json:"md5Sum" xorm:"md5_sum"`
Comment string `json:"comment"`
// Status string `json:"status"`
UpdateTime string `json:"createTime" xorm:"-" `
}
type NeVersion struct {
Id int `json:"id" xorm:"pk 'id' autoincr"`
NeType string `json:"neType" xorm:"ne_type"`
NeId string `json:"neId" xorm:"ne_id"`
Version string `json:"version"`
FilePath string `json:"filePath" xorm:"file_path"`
NewVersion string `json:"newVersion" xorm:"new_version"`
NewFile string `json:"newFile" xorm:"new_file"`
PreVersion string `json:"preVersion" xorm:"pre_version"`
PreFile string `json:"preFile" xorm:"pre_file"`
Status string `json:"status"`
UpdateTime string `json:"createTime" xorm:"-" `
}
func XormGetDataBySQL(sql string) (*[]map[string]string, error) {
log.Debug("XormGetDataBySQL processing... ")
rows := make([]map[string]string, 0)
rows, err := DbClient.XEngine.QueryString(sql)
if err != nil {
log.Errorf("Failed to QueryString:", err)
return nil, err
}
return &rows, nil
}
func XormDeleteDataByWhere(where, table string) (int64, error) {
log.Debug("XormDeleteDataByWhere processing... ")
xSession := DbClient.XEngine.NewSession()
defer xSession.Close()
affected, err := xSession.Table(table).Where(where).Delete()
if err != nil {
log.Errorf("Failed to Delete:", err)
return 0, err
}
xSession.Commit()
return affected, nil
}
func XormDeleteDataById(id int, table string) (int64, error) {
log.Debug("XormDeleteDataByWhere processing... ")
xSession := DbClient.XEngine.NewSession()
defer xSession.Close()
affected, err := xSession.Table(table).ID(id).Delete()
if err != nil {
log.Error("Failed to Delete:", err)
return 0, err
}
xSession.Commit()
return affected, nil
}
type ColOutput struct {
Name string `json:"name"`
Display string `json:"display"`
Length int `json:"length"`
Alias []string `json:"Alias"`
}
type ColInput struct {
Name string `json:"name"`
Alias string `json:"Alias"`
Type string `json:"type"`
Length int `json:"length"`
Value any `json:"value"`
}
type MmlInput struct {
BodyFmt string `json:"bodyFmt"`
BodyKey string `json:"bodyKey"`
Cols []ColInput `json:"cols"`
}
type MmlOutput struct {
RetFmt string `json:"retFmt"`
RetMsg string `json:"retMsg"`
ErrMsg string `json:"errMsg"`
Title string `json:"title"`
SingleList bool `json:"singleList"`
SepSpaceNum int `json:"sepSpaceNum"`
AlignmentM string `json:"alignmentM"`
AlignmentSN string `json:"alignmentSN"`
AlignmentSV string `json:"alignmentSV"`
Cols []ColOutput `json:"cols"`
End string `json:"end"`
}
type MmlHttpMap struct {
ID int `json:"-" xorm:"id"`
NeType string `json:"neType" xorm:"ne_type"`
Operation string `json:"operation"`
Object string `json:"object"`
Method string `json:"method"`
URI string `json:"uri" xorm:"uri"`
ExtUri string `json:"extUri"`
ParamTag string `json:"paramTag"`
Params string `json:"params"`
Input string `json:"input"`
Output string `json:"output"`
}
func XormGetMmlHttpMap(table, where string) (*MmlHttpMap, error) {
mmlMap := new(MmlHttpMap)
_, err := DbClient.XEngine.Table(table).Where(where).Get(mmlMap)
if err != nil {
log.Error("Failed to Get:", err)
return nil, err
}
return mmlMap, nil
}
type MmlCommand struct {
ID int `json:"-" xorm:"id"`
NeType string `json:"neType" xorm:"ne_type"`
Category string `json:"category"`
CatDisplay string `json:"catDisplay"`
Operation string `json:"operation"`
Object string `json:"object" xorm:"object"`
MmlDisplay string `json:"mmlDisplay"`
ParamJson []struct {
Name string `json:"name"`
Alias string `json:"alias"`
Type string `json:"type"`
Optional string `json:"optional"`
Apostr string `json:"apostr"`
Loc string `json:"loc"`
Filter string `json:"filter"`
Display string `json:"display"`
Comment string `json:"comment"`
} `json:"paramJson"`
}
func XormGetMmlCommand(table, where string) (*MmlCommand, error) {
mmlCmd := new(MmlCommand)
_, err := DbClient.XEngine.Table(table).Where(where).Get(mmlCmd)
if err != nil {
log.Error("Failed to Get:", err)
return nil, err
}
return mmlCmd, nil
}
type AlarmOMCConfig struct {
ID int `json:"-" xorm:"id"`
ModuleName string `json:"moduleName"`
ConfigTag string `json:"configTag"`
Value string `json:"value"`
ValueJson string `json:"valueJson"`
}
type ValueJson struct {
AlarmStatus string `json:"alarm_status"`
AlarmType string `json:"alarm_type"`
OrigSeverity string `json:"orig_severity"`
AckUser string `json:"ack_user"`
}
type AlarmForwardToUsers struct {
Interface string `json:"interface"`
ToUser []string `json:"to_user"`
}
func XormGetAAConfig() (*ValueJson, error) {
aaConfig := new(AlarmOMCConfig)
_, err := DbClient.XEngine.Table("config").
Where("module_name=? and config_tag=?", "Alarm", "autoAlarmAck").
Cols("value", "value_json").
Get(aaConfig)
if err != nil {
log.Error("Failed to Get:", err)
return nil, err
}
log.Debug("aaConfig:", aaConfig)
valueJson := new(ValueJson)
err = json.Unmarshal([]byte(aaConfig.ValueJson), valueJson)
if err != nil {
log.Error("Failed to Unmarshal:", err)
return nil, err
}
log.Debug("valueJson:", valueJson)
return valueJson, nil
}
func XormGetAlarmForward(interfaceName string) (*[]string, error) {
alarmForwardConfig := new(AlarmOMCConfig)
_, err := DbClient.XEngine.Table("config").
Where("module_name=? and config_tag=?", "Alarm", "forwardAlarm").
Cols("value", "value_json").
Get(alarmForwardConfig)
if err != nil {
log.Error("Failed to Get:", err)
return nil, err
}
log.Debug("alarmForwardConfig:", alarmForwardConfig)
alarmForwardToUsers := new([]AlarmForwardToUsers)
err = json.Unmarshal([]byte(alarmForwardConfig.ValueJson), alarmForwardToUsers)
if err != nil {
log.Error("Failed to Unmarshal:", err)
return nil, err
}
log.Debug("alarmForwardToUsers:", alarmForwardToUsers)
for _, a := range *alarmForwardToUsers {
if a.Interface == interfaceName {
return &(a.ToUser), nil
}
}
return nil, nil
}
type AlarmForwardLog struct {
ID int `json:"-" xorm:"pk 'id' autoincr"`
NeType string `json:"neType" xorm:"ne_type"`
NeID string `json:"neID" xorm:"ne_id"`
AlarmID string `json:"alarmID" xorm:"alarm_id"`
AlarmTitle string `json:"alarmTitle" xorm:"alarm_title"`
AlarmSeq int `json:"alarmSeq" xorm:"alarm_seq"`
EventTime string `json:"eventTime" xorm:"event_time"`
ToUser string `json:"toUser" xorm:"to_user"`
OperResult string `json:"operResult" xorm:"oper_result"`
LogTime string `json:"-" xorm:"-"`
}
func XormInsertAlarmForwardLog(logData *AlarmForwardLog) (int64, error) {
log.Debug("XormInsertAlarmForwardLog processing... ")
xSession := xEngine.NewSession()
defer xSession.Close()
affected, err := xSession.Insert(logData)
xSession.Commit()
return affected, err
}
type SystemLog struct {
ID int `json:"-" xorm:"pk 'id' autoincr"`
User string `json:"user" xorm:"user"`
ProcessName string `json:"process_name" xorm:"process_name"`
ProcessID int32 `json:"process_id" xorm:"process_id"`
Operation string `json:"operation" xorm:"operation"`
ProcessTime string `json:"process_time" `
LogTime string `json:"-" xorm:"-"`
}
func XormInsertSystemLog(logData *SystemLog) (int64, error) {
log.Info("XormInsertSystemLog processing... ")
xSession := xEngine.NewSession()
defer xSession.Close()
affected, err := xSession.Insert(logData)
xSession.Commit()
return affected, err
}
type permission struct {
ID int `json:"-" xorm:"pk 'id' autoincr"`
PermissionName string `json:"permissionName"`
Method string `json:"method"`
Element string `json:"element"`
Object string `json:"object"`
}
func IsPermissionDeny(token, method, dbname, tbname string) (bool, error) {
log.Info("IsPermissionDeny processing... ")
exist, err := xEngine.Table("permission").
Join("INNER", "role_permission", "permission.permission_name = role_permission.p_name").
Join("INNER", "user_role", "role_permission.r_name = user_role.r_name").
Join("INNER", "session", "user_role.u_name = session.account_id and session.access_token=?", token).
Where("method in ('*',?) and element in ('*',?) and object in ('*',?)", method, dbname, tbname).
//Where("method=? and element=?", method, dbname).
Exist()
if err != nil {
return false, err
}
return exist, nil
}