chore: 并入 iotlcm-admin-svr 历史到 admin-svr/(原提交 49818c6)

This commit is contained in:
MiFaZhan
2026-11-02 13:27:59 +08:00
1250 changed files with 154111 additions and 0 deletions
@@ -0,0 +1,175 @@
package memorydb
import (
"context"
"errors"
"git.5iot.com/iotlcm-public/iotlcm-admin-svr/internal/cmd/inithttp"
"git.5iot.com/iotlcm-public/iotlcm-admin-svr/internal/library/mcache"
"git.5iot.com/iotlcm-public/iotlcm-admin-svr/internal/model"
"git.5iot.com/iotlcm-public/iotlcm-admin-svr/internal/service"
"sort"
"sync"
"time"
"github.com/gogf/gf/v2/database/gdb"
"github.com/gogf/gf/v2/errors/gerror"
"github.com/gogf/gf/v2/frame/g"
)
var (
db gdb.DB
cacheUpdates sync.Mutex
)
type rebuildSourceContextKey struct{}
func sourceContext(ctx context.Context) context.Context {
if source, ok := ctx.Value(rebuildSourceContextKey{}).(context.Context); ok {
return source
}
return ctx
}
type memDB interface {
Init(ctx context.Context) error
EventHandler(ctx context.Context) error
TableName(ctx context.Context) string
CreateTable(ctx context.Context) error
LoadData(ctx context.Context, pk int64) error
DeleteData(ctx context.Context, ids []int64) error
}
var memDBMap = make(map[string]memDB)
func RegisterMemDB(name string, memDB memDB) {
memDBMap[name] = memDB
}
type sMemoryDB struct {
rebuildMu sync.Mutex
}
func NewMemoryDB() *sMemoryDB {
return &sMemoryDB{}
}
func init() {
service.RegisterMemoryDB(NewMemoryDB())
inithttp.RegisterHttpInitFunc("memorydb", func(ctx context.Context) error {
return service.MemoryDB().Init(ctx)
})
}
func (s *sMemoryDB) Init(ctx context.Context) error {
target, err := newMemoryDB(ctx)
if err != nil {
return err
}
if target == nil {
return nil
}
db = target
for _, name := range registeredMemoryDBNames() {
if err = memDBMap[name].Init(ctx); err != nil {
return err
}
}
g.Log().Debug(ctx, "sMemoryDB.Init end.", target.GetConfig())
return nil
}
// Rebuild replaces all cached tables in one SQLite transaction. The single
// connection keeps readers from observing partially loaded tables, and any
// failure rolls the entire rebuild back.
func (s *sMemoryDB) Rebuild(ctx context.Context) error {
s.rebuildMu.Lock()
defer s.rebuildMu.Unlock()
cacheUpdates.Lock()
defer cacheUpdates.Unlock()
target := db
if target == nil {
return errors.New("memory database is unavailable")
}
if err := target.Transaction(ctx, func(txCtx context.Context, _ gdb.TX) error {
txCtx = context.WithValue(txCtx, rebuildSourceContextKey{}, ctx)
for _, name := range registeredMemoryDBNames() {
if err := memDBMap[name].CreateTable(txCtx); err != nil {
return gerror.Wrapf(err, "rebuild memory database table failed: %s", name)
}
}
return nil
}); err != nil {
return err
}
if err := mcache.Clear(ctx); err != nil {
return gerror.Wrap(err, "clear derived memory cache failed")
}
g.Log().Infof(ctx, "memory database rebuilt, tables: %d", len(memDBMap))
return nil
}
func newMemoryDB(ctx context.Context) (gdb.DB, error) {
link := g.Cfg().MustGet(ctx, "database.memorydb.link", "").String()
debug := g.Cfg().MustGet(ctx, "database.memorydb.debug", "false").Bool()
if link == "" {
g.Log().Warning(ctx, "memory database link is empty; queries will use the primary database")
return nil, nil
}
g.Log().Debug(ctx, "memory database link", link)
target, err := gdb.New(gdb.ConfigNode{
Link: link,
MaxIdleConnCount: 1,
MaxOpenConnCount: 1,
MaxConnLifeTime: 24 * 3650 * time.Hour,
Debug: debug,
})
if err != nil {
return nil, err
}
if target == nil {
return nil, errors.New("memory database is unavailable")
}
return target, nil
}
func registeredMemoryDBNames() []string {
names := make([]string, 0, len(memDBMap))
for name := range memDBMap {
names = append(names, name)
}
sort.Strings(names)
return names
}
func (s *sMemoryDB) EventHandler(ctx context.Context, chg *model.BroadcastDbChgCache) error {
cacheUpdates.Lock()
defer cacheUpdates.Unlock()
memDB, ok := memDBMap[chg.TableName]
if !ok {
return nil
}
if chg.Type == "add" || chg.Type == "edit" {
for _, pk := range chg.PK {
if err := memDB.LoadData(ctx, pk); err != nil {
return err
}
}
} else if chg.Type == "del" {
return memDB.DeleteData(ctx, chg.PK)
}
return nil
}
func (s *sMemoryDB) DB(ctx context.Context) gdb.DB {
link := g.Cfg().MustGet(ctx, "database.memorydb.link", "sqlite::@file(:memory:)").String()
if link == "" {
return g.DB()
}
return db
}
func (s *sMemoryDB) Ctx(ctx context.Context) gdb.DB {
return s.DB(ctx).Ctx(ctx)
}
@@ -0,0 +1,104 @@
package memorydb
import (
"context"
"errors"
"testing"
"git.5iot.com/iotlcm-public/iotlcm-admin-svr/internal/library/mcache"
_ "github.com/gogf/gf/contrib/drivers/sqlite/v2"
"github.com/gogf/gf/v2/database/gdb"
)
type rebuildTestTable struct {
name string
value string
fail bool
initEvents int
}
func (t *rebuildTestTable) Init(context.Context) error {
t.initEvents++
return nil
}
func (t *rebuildTestTable) EventHandler(context.Context) error { return nil }
func (t *rebuildTestTable) TableName(context.Context) string { return t.name }
func (t *rebuildTestTable) LoadData(context.Context, int64) error {
return nil
}
func (t *rebuildTestTable) DeleteData(context.Context, []int64) error {
return nil
}
func (t *rebuildTestTable) CreateTable(ctx context.Context) error {
if _, err := db.Exec(ctx, "DROP TABLE IF EXISTS "+t.name); err != nil {
return err
}
if t.fail {
return errors.New("source load failed")
}
if _, err := db.Exec(ctx, "CREATE TABLE "+t.name+" (value TEXT)"); err != nil {
return err
}
_, err := db.Exec(ctx, "INSERT INTO "+t.name+" (value) VALUES (?)", t.value)
return err
}
func TestRebuildRollsBackAndDoesNotRegisterEventsAgain(t *testing.T) {
ctx := context.Background()
previousDB, previousMap := db, memDBMap
t.Cleanup(func() { db, memDBMap = previousDB, previousMap })
var err error
db, err = gdb.New(gdb.ConfigNode{Link: "sqlite::@file(:memory:)", MaxOpenConnCount: 1})
if err != nil {
t.Fatal(err)
}
t.Cleanup(func() { _ = db.Close(ctx) })
first := &rebuildTestTable{name: "cache_a", value: "new"}
second := &rebuildTestTable{name: "cache_b", value: "new", fail: true}
memDBMap = map[string]memDB{first.name: first, second.name: second}
for _, name := range registeredMemoryDBNames() {
if _, err := db.Exec(ctx, "CREATE TABLE "+name+" (value TEXT)"); err != nil {
t.Fatal(err)
}
if _, err := db.Exec(ctx, "INSERT INTO "+name+" (value) VALUES ('old')"); err != nil {
t.Fatal(err)
}
}
cache := NewMemoryDB()
if err := cache.Rebuild(ctx); err == nil {
t.Fatal("expected rebuild failure")
}
for _, name := range registeredMemoryDBNames() {
var result struct {
Value string `json:"value"`
}
if err := db.Model(name).Scan(&result); err != nil || result.Value != "old" {
t.Fatalf("%s was not rolled back: value=%q err=%v", name, result.Value, err)
}
}
second.fail = false
if err := mcache.Set(ctx, "rebuild-test-key", "stale", 0); err != nil {
t.Fatal(err)
}
if err := cache.Rebuild(ctx); err != nil {
t.Fatal(err)
}
for _, name := range registeredMemoryDBNames() {
var result struct {
Value string `json:"value"`
}
if err := db.Model(name).Scan(&result); err != nil || result.Value != "new" {
t.Fatalf("%s was not reloaded: value=%q err=%v", name, result.Value, err)
}
}
if first.initEvents != 0 || second.initEvents != 0 {
t.Fatal("rebuild registered event handlers")
}
if mcache.Instance().MustContains(ctx, "rebuild-test-key") {
t.Fatal("derived cache was not cleared")
}
}
@@ -0,0 +1,200 @@
package memorydb
import (
"context"
"git.5iot.com/iotlcm-public/iotlcm-admin-svr/internal/consts"
"git.5iot.com/iotlcm-public/iotlcm-admin-svr/internal/dao"
"git.5iot.com/iotlcm-public/iotlcm-admin-svr/internal/library/event"
"git.5iot.com/iotlcm-public/iotlcm-admin-svr/internal/model"
"git.5iot.com/iotlcm-public/iotlcm-admin-svr/internal/model/entity"
"git.5iot.com/iotlcm-public/iotlcm-admin-svr/internal/service"
"git.5iot.com/iotlcm-public/iotlcm-admin-svr/utility/queue"
"github.com/gogf/gf/v2/frame/g"
)
type sMemDBSysConfig struct {
}
var instanceMemDBSysConfig *sMemDBSysConfig
func NewMemDBSysConfig() *sMemDBSysConfig {
if instanceMemDBSysConfig != nil {
return instanceMemDBSysConfig
}
instanceMemDBSysConfig = &sMemDBSysConfig{}
initLoadMemoryDB := g.Cfg().MustGet(context.TODO(), "server.initLoadMemoryDB").Bool()
if initLoadMemoryDB {
instanceMemDBSysConfig.Init(context.TODO())
}
return instanceMemDBSysConfig
}
func init() {
s := NewMemDBSysConfig()
service.RegisterMemDBSysConfig(s)
RegisterMemDB(s.TableName(context.TODO()), s)
}
func (s *sMemDBSysConfig) Init(ctx context.Context) error {
err := s.CreateTable(ctx)
if err != nil {
return err
}
err = s.EventHandler(ctx)
if err != nil {
return err
}
return nil
}
func (s *sMemDBSysConfig) EventHandler(ctx context.Context) error {
eventList := []string{
consts.EventKeyDBSysConfigCreate,
consts.EventKeyDBSysConfigUpdate,
consts.EventKeyDBSysConfigDelete,
}
event.EventsInstance().Register(eventList, func(ctx context.Context, eventKey string, args ...interface{}) {
if len(args) < 1 {
g.Log().Errorf(ctx, "memorydb/sys_config.go event args error. eventKey: %s, args: %+v", eventKey, args)
return
}
pkList, ok := args[0].([]int64)
if !ok {
pk, ok := args[0].(int64)
if !ok {
g.Log().Errorf(ctx, "sMemDBSysConfig.EventHandler event args error. eventKey: %s, args: %+v", eventKey, args)
return
}
pkList = []int64{pk}
}
if len(pkList) == 0 {
g.Log().Errorf(ctx, "sMemDBSysConfig.EventHandler event args error. eventKey: %s, args: %+v", eventKey, args)
return
}
changeType := "edit"
if eventKey == consts.EventKeyDBSysConfigDelete {
changeType = "del"
}
if err := service.MemoryDB().EventHandler(ctx, &model.BroadcastDbChgCache{
TableName: s.TableName(ctx), PK: pkList, Type: changeType,
}); err != nil {
g.Log().Errorf(ctx, "refresh memory config failed: %v", err)
return
}
dbType := "edit"
if eventKey == consts.EventKeyDBSysConfigCreate {
dbType = "add"
} else if eventKey == consts.EventKeyDBSysConfigDelete {
dbType = "del"
} else {
dbType = "edit"
}
queue.Push(ctx, consts.BroadcastDbChg, &model.BroadcastDbChgCache{
TableName: s.TableName(ctx),
PK: pkList,
Type: dbType,
Data: nil,
})
})
return nil
}
func (s *sMemDBSysConfig) TableName(ctx context.Context) string {
return dao.SysConfig.Table()
}
func (s *sMemDBSysConfig) CreateTable(ctx context.Context) error {
_, err := db.Exec(ctx, "DROP TABLE IF EXISTS "+s.TableName(ctx))
if err != nil {
g.Log().Errorf(ctx, "sMemDBSysConfig.CreateTable delete table err: %v", err)
return err
}
total, err := db.Ctx(ctx).Model("sqlite_master").Where("type", "table").Where("name", dao.SysConfig.Table()).Count()
if err != nil {
g.Log().Errorf(ctx, "sMemDBSysConfig.CreateTable count err: %v", err)
return err
}
if total == 0 {
g.Log().Debug(ctx, "sMemDBSysConfig.List create table ", s.TableName(ctx))
res, err := db.Exec(ctx, `
CREATE TABLE "sys_config" (
"config_id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
"tenant_id" TEXT DEFAULT '000000' CHECK(length("tenant_id") <= 20),
"config_name" TEXT DEFAULT '' CHECK(length("config_name") <= 100),
"config_key" TEXT DEFAULT '' CHECK(length("config_key") <= 100),
"config_value" TEXT DEFAULT '' CHECK(length("config_value") <= 1024),
"config_type" TEXT DEFAULT 'N',
"created_dept" INTEGER,
"created_by" INTEGER,
"created_at" TEXT,
"updated_by" INTEGER,
"updated_at" TEXT,
"remark" TEXT CHECK(length("remark") <= 500)
);
`)
if err != nil {
g.Log().Errorf(ctx, "sMemDBSysConfig.CreateTable create table err: %v", err)
return err
}
g.Log().Debug(ctx, "sMemDBSysConfig.CreateTable create table success", res)
// 加载数据
return s.LoadData(ctx, 0)
}
return nil
}
func (s *sMemDBSysConfig) LoadData(ctx context.Context, pk int64) error {
count := 0
if pk == 0 {
maxConfigId := int64(0)
for {
page := 1
pageSize := 500
dataList := make([]*entity.SysConfig, 0)
if err := dao.SysConfig.Ctx(sourceContext(ctx)).Page(page, pageSize).WhereGT(dao.SysConfig.Columns().ConfigId, maxConfigId).
OrderAsc(dao.SysConfig.Columns().ConfigId).Scan(&dataList); err != nil {
return err
}
if len(dataList) == 0 {
break
}
count += len(dataList)
_, err := db.Ctx(ctx).Model(dao.SysConfig.Table()).Data(dataList).OnConflict(dao.SysConfig.Columns().ConfigId).Save()
if err != nil {
g.Log().Errorf(ctx, "sMemDBSysConfig.Load data insert err: %v", err)
return err
}
maxConfigId = dataList[len(dataList)-1].ConfigId
if len(dataList) < pageSize {
break
}
}
} else {
dataList := make([]*entity.SysConfig, 0)
if err := dao.SysConfig.Ctx(sourceContext(ctx)).Where(dao.SysConfig.Columns().ConfigId, pk).Scan(&dataList); err != nil {
return err
}
_, err := db.Ctx(ctx).Model(dao.SysConfig.Table()).Data(dataList).OnConflict(dao.SysConfig.Columns().ConfigId).Save()
if err != nil {
g.Log().Errorf(ctx, "sMemDBSysConfig.Load data insert err: %v", err)
return err
}
}
g.Log().Debugf(ctx, "sMemDBSysConfig.LoadData load data success, total: %d, pk: %d", count, pk)
return nil
}
func (s *sMemDBSysConfig) DeleteData(ctx context.Context, ids []int64) error {
_, err := db.Ctx(ctx).Model(dao.SysConfig.Table()).WhereIn(dao.SysConfig.Columns().ConfigId, ids).Delete()
if err != nil {
g.Log().Errorf(ctx, "sMemDBSysConfig.DeleteData err: %v", err)
return err
}
g.Log().Debugf(ctx, "sMemDBSysConfig.DeleteData delete data success, total: %d, ids: %+v", len(ids), ids)
return nil
}
@@ -0,0 +1,211 @@
package memorydb
import (
"context"
"git.5iot.com/iotlcm-public/iotlcm-admin-svr/internal/consts"
"git.5iot.com/iotlcm-public/iotlcm-admin-svr/internal/dao"
"git.5iot.com/iotlcm-public/iotlcm-admin-svr/internal/library/event"
"git.5iot.com/iotlcm-public/iotlcm-admin-svr/internal/model"
"git.5iot.com/iotlcm-public/iotlcm-admin-svr/internal/model/entity"
"git.5iot.com/iotlcm-public/iotlcm-admin-svr/internal/service"
"git.5iot.com/iotlcm-public/iotlcm-admin-svr/utility/queue"
"github.com/gogf/gf/v2/frame/g"
)
type sMemDBSysDept struct {
}
var instanceMemDBSysDept *sMemDBSysDept
func NewMemDBSysDept() *sMemDBSysDept {
if instanceMemDBSysDept != nil {
return instanceMemDBSysDept
}
instanceMemDBSysDept = &sMemDBSysDept{}
initLoadMemoryDB := g.Cfg().MustGet(context.TODO(), "server.initLoadMemoryDB").Bool()
if initLoadMemoryDB {
instanceMemDBSysDept.Init(context.TODO())
}
return instanceMemDBSysDept
}
func init() {
s := NewMemDBSysDept()
service.RegisterMemDBSysDept(s)
RegisterMemDB(s.TableName(context.TODO()), s)
}
func (s *sMemDBSysDept) Init(ctx context.Context) error {
err := s.CreateTable(ctx)
if err != nil {
return err
}
err = s.EventHandler(ctx)
if err != nil {
return err
}
return nil
}
func (s *sMemDBSysDept) EventHandler(ctx context.Context) error {
eventList := []string{
consts.EventKeyDBSysDeptCreate,
consts.EventKeyDBSysDeptUpdate,
consts.EventKeyDBSysDeptDelete,
}
event.EventsInstance().Register(eventList, func(ctx context.Context, eventKey string, args ...interface{}) {
if len(args) < 1 {
g.Log().Errorf(ctx, "sMemDBSysDept.EventHandler event args error. eventKey: %s, args: %+v", eventKey, args)
return
}
pkList, ok := args[0].([]int64)
if !ok {
pk, ok := args[0].(int64)
if !ok {
g.Log().Errorf(ctx, "sMemDBSysDept.EventHandler event args error. eventKey: %s, args: %+v", eventKey, args)
return
}
pkList = []int64{pk}
}
if len(pkList) == 0 {
g.Log().Errorf(ctx, "sMemDBSysDept.EventHandler event args error. eventKey: %s, args: %+v", eventKey, args)
return
}
changeType := "edit"
if eventKey == consts.EventKeyDBSysDeptDelete {
changeType = "del"
}
if err := service.MemoryDB().EventHandler(ctx, &model.BroadcastDbChgCache{
TableName: s.TableName(ctx), PK: pkList, Type: changeType,
}); err != nil {
g.Log().Errorf(ctx, "refresh memory dept failed: %v", err)
return
}
dbType := "edit"
if eventKey == consts.EventKeyDBSysDeptCreate {
dbType = "add"
} else if eventKey == consts.EventKeyDBSysDeptDelete {
dbType = "del"
} else {
dbType = "edit"
}
queue.Push(ctx, consts.BroadcastDbChg, &model.BroadcastDbChgCache{
TableName: s.TableName(ctx),
PK: pkList,
Type: dbType,
Data: nil,
})
})
return nil
}
func (s *sMemDBSysDept) TableName(ctx context.Context) string {
return dao.SysDept.Table()
}
func (s *sMemDBSysDept) CreateTable(ctx context.Context) error {
_, err := db.Exec(ctx, "DROP TABLE IF EXISTS "+s.TableName(ctx))
if err != nil {
g.Log().Errorf(ctx, "sMemDBSysDept.CreateTable delete table err: %v", err)
return err
}
total, err := db.Ctx(ctx).Model("sqlite_master").Where("type", "table").Where("name", dao.SysDept.Table()).Count()
if err != nil {
g.Log().Errorf(ctx, "sMemDBSysDept.CreateTable count err: %v", err)
return err
}
if total == 0 {
g.Log().Debug(ctx, "sMemDBSysDept.List create table ", s.TableName(ctx))
res, err := db.Exec(ctx, `
CREATE TABLE "sys_dept" (
"dept_id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
"tenant_id" TEXT DEFAULT '000000' CHECK(length("tenant_id") <= 20),
"parent_id" INTEGER DEFAULT 0,
"ancestors" TEXT DEFAULT '' CHECK(length("ancestors") <= 500),
"dept_key" TEXT DEFAULT '' CHECK(length("dept_key") == 15 OR "dept_key" == '' OR "dept_key" IS NULL),
"dept_name" TEXT DEFAULT '' CHECK(length("dept_name") <= 30),
"dept_type" INTEGER DEFAULT 0,
"dept_category" TEXT CHECK(length("dept_category") <= 100),
"credit_code" TEXT CHECK(length("credit_code") == 18 OR "credit_code" == '' OR "credit_code" IS NULL),
"area_code" TEXT CHECK(length("area_code") == 12 OR "area_code" == '' OR "area_code" IS NULL),
"address" TEXT CHECK(length("address") <= 200),
"order_num" INTEGER DEFAULT 0,
"leader" INTEGER,
"phone" TEXT CHECK(length("phone") <= 11),
"email" TEXT CHECK(length("email") <= 50),
"status" TEXT DEFAULT '0' ,
"created_dept" INTEGER,
"created_by" INTEGER NOT NULL,
"created_at" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updated_by" INTEGER,
"updated_at" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
"deleted_by" INTEGER,
"deleted_at" DATETIME
);
`)
if err != nil {
g.Log().Errorf(ctx, "sMemDBSysDept.CreateTable create table err: %v", err)
return err
}
g.Log().Debug(ctx, "sMemDBSysDept.CreateTable create table success", res)
// 加载数据
return s.LoadData(ctx, 0)
}
return nil
}
func (s *sMemDBSysDept) LoadData(ctx context.Context, pk int64) error {
count := 0
if pk == 0 {
maxDeptId := int64(0)
for {
page := 1
pageSize := 100
dataList := make([]*entity.SysDept, 0)
if err := dao.SysDept.Ctx(sourceContext(ctx)).Page(page, pageSize).WhereGT(dao.SysDept.Columns().DeptId, maxDeptId).
OrderAsc(dao.SysDept.Columns().DeptId).Scan(&dataList); err != nil {
return err
}
if len(dataList) == 0 {
break
}
count += len(dataList)
_, err := db.Ctx(ctx).Model(dao.SysDept.Table()).Data(dataList).OnConflict(dao.SysDept.Columns().DeptId).Save()
if err != nil {
g.Log().Errorf(ctx, "sMemDBSysDept.Load data insert err: %v", err)
return err
}
maxDeptId = dataList[len(dataList)-1].DeptId
if len(dataList) < pageSize {
break
}
}
} else {
dataList := make([]*entity.SysDept, 0)
if err := dao.SysDept.Ctx(sourceContext(ctx)).Where(dao.SysDept.Columns().DeptId, pk).Scan(&dataList); err != nil {
return err
}
_, err := db.Ctx(ctx).Model(dao.SysDept.Table()).Data(dataList).OnConflict(dao.SysDept.Columns().DeptId).Save()
if err != nil {
g.Log().Errorf(ctx, "sMemDBSysDept.Load data insert err: %v", err)
return err
}
}
g.Log().Debugf(ctx, "sMemDBSysDept.LoadData load data success, total: %d, pk: %d", count, pk)
return nil
}
func (s *sMemDBSysDept) DeleteData(ctx context.Context, ids []int64) error {
_, err := db.Ctx(ctx).Model(dao.SysDept.Table()).WhereIn(dao.SysDept.Columns().DeptId, ids).Unscoped().Delete()
if err != nil {
g.Log().Errorf(ctx, "sMemDBSysDept.DeleteData err: %v", err)
return err
}
g.Log().Debugf(ctx, "sMemDBSysDept.DeleteData delete data success, total: %d, ids: %+v", len(ids), ids)
return nil
}
@@ -0,0 +1,202 @@
package memorydb
import (
"context"
"git.5iot.com/iotlcm-public/iotlcm-admin-svr/internal/consts"
"git.5iot.com/iotlcm-public/iotlcm-admin-svr/internal/dao"
"git.5iot.com/iotlcm-public/iotlcm-admin-svr/internal/library/event"
"git.5iot.com/iotlcm-public/iotlcm-admin-svr/internal/model"
"git.5iot.com/iotlcm-public/iotlcm-admin-svr/internal/model/entity"
"git.5iot.com/iotlcm-public/iotlcm-admin-svr/internal/service"
"git.5iot.com/iotlcm-public/iotlcm-admin-svr/utility/queue"
"github.com/gogf/gf/v2/frame/g"
)
type sMemDBSysDictData struct {
}
var instanceMemDBSysDictData *sMemDBSysDictData
func NewMemDBSysDictData() *sMemDBSysDictData {
if instanceMemDBSysDictData != nil {
return instanceMemDBSysDictData
}
instanceMemDBSysDictData = &sMemDBSysDictData{}
initLoadMemoryDB := g.Cfg().MustGet(context.TODO(), "server.initLoadMemoryDB").Bool()
if initLoadMemoryDB {
instanceMemDBSysDictData.Init(context.TODO())
}
return instanceMemDBSysDictData
}
func init() {
s := NewMemDBSysDictData()
service.RegisterMemDBSysDictData(s)
RegisterMemDB(s.TableName(context.TODO()), s)
}
func (s *sMemDBSysDictData) Init(ctx context.Context) error {
err := s.CreateTable(ctx)
if err != nil {
return err
}
err = s.EventHandler(ctx)
if err != nil {
return err
}
return nil
}
func (s *sMemDBSysDictData) EventHandler(ctx context.Context) error {
eventList := []string{
consts.EventKeyDBSysDictDataCreate,
consts.EventKeyDBSysDictDataUpdate,
consts.EventKeyDBSysDictDataDelete,
}
event.EventsInstance().Register(eventList, func(ctx context.Context, eventKey string, args ...interface{}) {
if len(args) < 1 {
g.Log().Errorf(ctx, "sMemDBSysDictData.EventHandler event args error. eventKey: %s, args: %+v", eventKey, args)
return
}
pkList, ok := args[0].([]int64)
if !ok {
pk, ok := args[0].(int64)
if !ok {
g.Log().Errorf(ctx, "sMemDBSysDictData.EventHandler event args error. eventKey: %s, args: %+v", eventKey, args)
return
}
pkList = []int64{pk}
}
if len(pkList) == 0 {
g.Log().Errorf(ctx, "sMemDBSysDictData.EventHandler event args error. eventKey: %s, args: %+v", eventKey, args)
return
}
changeType := "edit"
if eventKey == consts.EventKeyDBSysDictDataDelete {
changeType = "del"
}
if err := service.MemoryDB().EventHandler(ctx, &model.BroadcastDbChgCache{
TableName: s.TableName(ctx), PK: pkList, Type: changeType,
}); err != nil {
g.Log().Errorf(ctx, "refresh memory dict data failed: %v", err)
return
}
dbType := "edit"
if eventKey == consts.EventKeyDBSysDictDataCreate {
dbType = "add"
} else if eventKey == consts.EventKeyDBSysDictDataDelete {
dbType = "del"
} else {
dbType = "edit"
}
queue.Push(ctx, consts.BroadcastDbChg, &model.BroadcastDbChgCache{
TableName: s.TableName(ctx),
PK: pkList,
Type: dbType,
Data: nil,
})
})
return nil
}
func (s *sMemDBSysDictData) TableName(ctx context.Context) string {
return dao.SysDictData.Table()
}
func (s *sMemDBSysDictData) CreateTable(ctx context.Context) error {
_, err := db.Exec(ctx, "DROP TABLE IF EXISTS "+s.TableName(ctx))
if err != nil {
g.Log().Errorf(ctx, "sMemDBSysDictData.CreateTable delete table err: %v", err)
return err
}
total, err := db.Ctx(ctx).Model("sqlite_master").Where("type", "table").Where("name", dao.SysDictData.Table()).Count()
if err != nil {
g.Log().Errorf(ctx, "sMemDBSysDictData.CreateTable count err: %v", err)
return err
}
if total == 0 {
g.Log().Debug(ctx, "sMemDBSysDictData.List create table ", s.TableName(ctx))
res, err := db.Exec(ctx, `
CREATE TABLE "sys_dict_data" (
"dict_code" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
"tenant_id" TEXT DEFAULT '000000' CHECK(length("tenant_id") <= 20),
"dict_sort" INTEGER DEFAULT 0,
"dict_label" TEXT DEFAULT '' CHECK(length("dict_label") <= 100),
"dict_value" TEXT DEFAULT '' CHECK(length("dict_value") <= 100),
"dict_type" TEXT DEFAULT '' CHECK(length("dict_type") <= 100),
"css_class" TEXT CHECK(length("css_class") <= 100),
"list_class" TEXT CHECK(length("list_class") <= 100),
"is_default" TEXT DEFAULT 'N' ,
"created_dept" INTEGER,
"created_by" INTEGER,
"created_at" TEXT,
"updated_by" INTEGER,
"updated_at" TEXT,
"remark" TEXT CHECK(length("remark") <= 500)
);
`)
if err != nil {
g.Log().Errorf(ctx, "sMemDBSysDictData.CreateTable create table err: %v", err)
return err
}
g.Log().Debug(ctx, "sMemDBSysDictData.CreateTable create table success", res)
// 加载数据
return s.LoadData(ctx, 0)
}
return nil
}
func (s *sMemDBSysDictData) LoadData(ctx context.Context, pk int64) error {
count := 0
if pk == 0 {
maxDictCode := int64(0)
for {
page := 1
pageSize := 500
dataList := make([]*entity.SysDictData, 0)
if err := dao.SysDictData.Ctx(sourceContext(ctx)).Page(page, pageSize).WhereGT(dao.SysDictData.Columns().DictCode, maxDictCode).
OrderAsc(dao.SysDictData.Columns().DictCode).Scan(&dataList); err != nil {
return err
}
if len(dataList) == 0 {
break
}
count += len(dataList)
_, err := db.Ctx(ctx).Model(dao.SysDictData.Table()).Data(dataList).OnConflict(dao.SysDictData.Columns().DictCode).Save()
if err != nil {
g.Log().Errorf(ctx, "sMemDBSysDictData.Load data insert err: %v", err)
return err
}
maxDictCode = dataList[len(dataList)-1].DictCode
if len(dataList) < pageSize {
break
}
}
} else {
dataList := make([]*entity.SysDictData, 0)
if err := dao.SysDictData.Ctx(sourceContext(ctx)).Where(dao.SysDictData.Columns().DictCode, pk).Scan(&dataList); err != nil {
return err
}
_, err := db.Ctx(ctx).Model(dao.SysDictData.Table()).Data(dataList).OnConflict(dao.SysDictData.Columns().DictCode).Save()
if err != nil {
g.Log().Errorf(ctx, "sMemDBSysDictData.Load data insert err: %v", err)
return err
}
}
g.Log().Debugf(ctx, "sMemDBSysDictData.LoadData load data success, total: %d, pk: %d", count, pk)
return nil
}
func (s *sMemDBSysDictData) DeleteData(ctx context.Context, ids []int64) error {
_, err := db.Ctx(ctx).Model(dao.SysDictData.Table()).WhereIn(dao.SysDictData.Columns().DictCode, ids).Delete()
if err != nil {
g.Log().Errorf(ctx, "sMemDBSysDictData.DeleteData err: %v", err)
return err
}
g.Log().Debugf(ctx, "sMemDBSysDictData.DeleteData delete data success, total: %d, ids: %+v", len(ids), ids)
return nil
}
@@ -0,0 +1,198 @@
package memorydb
import (
"context"
"git.5iot.com/iotlcm-public/iotlcm-admin-svr/internal/consts"
"git.5iot.com/iotlcm-public/iotlcm-admin-svr/internal/dao"
"git.5iot.com/iotlcm-public/iotlcm-admin-svr/internal/library/event"
"git.5iot.com/iotlcm-public/iotlcm-admin-svr/internal/model"
"git.5iot.com/iotlcm-public/iotlcm-admin-svr/internal/model/entity"
"git.5iot.com/iotlcm-public/iotlcm-admin-svr/internal/service"
"git.5iot.com/iotlcm-public/iotlcm-admin-svr/utility/queue"
"github.com/gogf/gf/v2/frame/g"
)
type sMemDBSysDictType struct {
}
var instanceMemDBSysDictType *sMemDBSysDictType
func NewMemDBSysDictType() *sMemDBSysDictType {
if instanceMemDBSysDictType != nil {
return instanceMemDBSysDictType
}
instanceMemDBSysDictType = &sMemDBSysDictType{}
initLoadMemoryDB := g.Cfg().MustGet(context.TODO(), "server.initLoadMemoryDB").Bool()
if initLoadMemoryDB {
instanceMemDBSysDictType.Init(context.TODO())
}
return instanceMemDBSysDictType
}
func init() {
s := NewMemDBSysDictType()
service.RegisterMemDBSysDictType(s)
RegisterMemDB(s.TableName(context.TODO()), s)
}
func (s *sMemDBSysDictType) Init(ctx context.Context) error {
err := s.CreateTable(ctx)
if err != nil {
return err
}
err = s.EventHandler(ctx)
if err != nil {
return err
}
return nil
}
func (s *sMemDBSysDictType) EventHandler(ctx context.Context) error {
eventList := []string{
consts.EventKeyDBSysDictTypeCreate,
consts.EventKeyDBSysDictTypeUpdate,
consts.EventKeyDBSysDictTypeDelete,
}
event.EventsInstance().Register(eventList, func(ctx context.Context, eventKey string, args ...interface{}) {
if len(args) < 1 {
g.Log().Errorf(ctx, "sMemDBSysDictType.EventHandler event args error. eventKey: %s, args: %+v", eventKey, args)
return
}
pkList, ok := args[0].([]int64)
if !ok {
pk, ok := args[0].(int64)
if !ok {
g.Log().Errorf(ctx, "sMemDBSysDictType.EventHandler event args error. eventKey: %s, args: %+v", eventKey, args)
return
}
pkList = []int64{pk}
}
if len(pkList) == 0 {
g.Log().Errorf(ctx, "sMemDBSysDictType.EventHandler event args error. eventKey: %s, args: %+v", eventKey, args)
return
}
changeType := "edit"
if eventKey == consts.EventKeyDBSysDictTypeDelete {
changeType = "del"
}
if err := service.MemoryDB().EventHandler(ctx, &model.BroadcastDbChgCache{
TableName: s.TableName(ctx), PK: pkList, Type: changeType,
}); err != nil {
g.Log().Errorf(ctx, "refresh memory dict type failed: %v", err)
return
}
dbType := "edit"
if eventKey == consts.EventKeyDBSysDictTypeCreate {
dbType = "add"
} else if eventKey == consts.EventKeyDBSysDictTypeDelete {
dbType = "del"
} else {
dbType = "edit"
}
queue.Push(ctx, consts.BroadcastDbChg, &model.BroadcastDbChgCache{
TableName: s.TableName(ctx),
PK: pkList,
Type: dbType,
Data: nil,
})
})
return nil
}
func (s *sMemDBSysDictType) TableName(ctx context.Context) string {
return dao.SysDictType.Table()
}
func (s *sMemDBSysDictType) CreateTable(ctx context.Context) error {
_, err := db.Exec(ctx, "DROP TABLE IF EXISTS "+s.TableName(ctx))
if err != nil {
g.Log().Errorf(ctx, "sMemDBSysDictType.CreateTable delete table err: %v", err)
return err
}
total, err := db.Ctx(ctx).Model("sqlite_master").Where("type", "table").Where("name", dao.SysDictType.Table()).Count()
if err != nil {
g.Log().Errorf(ctx, "sMemDBSysDictType.CreateTable count err: %v", err)
return err
}
if total == 0 {
g.Log().Debug(ctx, "sMemDBSysDictType.List create table ", s.TableName(ctx))
res, err := db.Exec(ctx, `
CREATE TABLE "sys_dict_type" (
"dict_id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
"tenant_id" TEXT DEFAULT '000000' CHECK(length("tenant_id") <= 20),
"dict_name" TEXT DEFAULT '' CHECK(length("dict_name") <= 100),
"dict_type" TEXT DEFAULT '' CHECK(length("dict_type") <= 100),
"is_sys" TEXT DEFAULT '1' ,
"created_dept" INTEGER,
"created_by" INTEGER,
"created_at" TEXT,
"updated_by" INTEGER,
"updated_at" TEXT,
"remark" TEXT CHECK(length("remark") <= 500)
);
`)
if err != nil {
g.Log().Errorf(ctx, "sMemDBSysDictType.CreateTable create table err: %v", err)
return err
}
g.Log().Debug(ctx, "sMemDBSysDictType.CreateTable create table success", res)
// 加载数据
return s.LoadData(ctx, 0)
}
return nil
}
func (s *sMemDBSysDictType) LoadData(ctx context.Context, pk int64) error {
count := 0
if pk == 0 {
maxDictId := int64(0)
for {
page := 1
pageSize := 500
dataList := make([]*entity.SysDictType, 0)
if err := dao.SysDictType.Ctx(sourceContext(ctx)).Page(page, pageSize).WhereGT(dao.SysDictType.Columns().DictId, maxDictId).
OrderAsc(dao.SysDictType.Columns().DictId).Scan(&dataList); err != nil {
return err
}
if len(dataList) == 0 {
break
}
count += len(dataList)
_, err := db.Ctx(ctx).Model(dao.SysDictType.Table()).Data(dataList).OnConflict(dao.SysDictType.Columns().DictId).Save()
if err != nil {
g.Log().Errorf(ctx, "sMemDBSysDictType.Load data insert err: %v", err)
return err
}
maxDictId = dataList[len(dataList)-1].DictId
if len(dataList) < pageSize {
break
}
}
} else {
dataList := make([]*entity.SysDictType, 0)
if err := dao.SysDictType.Ctx(sourceContext(ctx)).Where(dao.SysDictType.Columns().DictId, pk).Scan(&dataList); err != nil {
return err
}
_, err := db.Ctx(ctx).Model(dao.SysDictType.Table()).Data(dataList).OnConflict(dao.SysDictType.Columns().DictId).Save()
if err != nil {
g.Log().Errorf(ctx, "sMemDBSysDictType.Load data insert err: %v", err)
return err
}
}
g.Log().Debugf(ctx, "sMemDBSysDictType.LoadData load data success, total: %d, pk: %d", count, pk)
return nil
}
func (s *sMemDBSysDictType) DeleteData(ctx context.Context, ids []int64) error {
_, err := db.Ctx(ctx).Model(dao.SysDictType.Table()).WhereIn(dao.SysDictType.Columns().DictId, ids).Delete()
if err != nil {
g.Log().Errorf(ctx, "sMemDBSysDictType.DeleteData err: %v", err)
return err
}
g.Log().Debugf(ctx, "sMemDBSysDictType.DeleteData delete data success, total: %d, ids: %+v", len(ids), ids)
return nil
}
@@ -0,0 +1,207 @@
package memorydb
import (
"context"
"git.5iot.com/iotlcm-public/iotlcm-admin-svr/internal/consts"
"git.5iot.com/iotlcm-public/iotlcm-admin-svr/internal/dao"
"git.5iot.com/iotlcm-public/iotlcm-admin-svr/internal/library/event"
"git.5iot.com/iotlcm-public/iotlcm-admin-svr/internal/model"
"git.5iot.com/iotlcm-public/iotlcm-admin-svr/internal/model/entity"
"git.5iot.com/iotlcm-public/iotlcm-admin-svr/internal/service"
"git.5iot.com/iotlcm-public/iotlcm-admin-svr/utility/queue"
"github.com/gogf/gf/v2/frame/g"
)
type sMemDBSysMenu struct {
}
var instanceMemDBSysMenu *sMemDBSysMenu
func NewMemDBSysMenu() *sMemDBSysMenu {
if instanceMemDBSysMenu != nil {
return instanceMemDBSysMenu
}
instanceMemDBSysMenu = &sMemDBSysMenu{}
initLoadMemoryDB := g.Cfg().MustGet(context.TODO(), "server.initLoadMemoryDB").Bool()
if initLoadMemoryDB {
instanceMemDBSysMenu.Init(context.TODO())
}
return instanceMemDBSysMenu
}
func init() {
s := NewMemDBSysMenu()
service.RegisterMemDBSysMenu(s)
RegisterMemDB(s.TableName(context.TODO()), s)
}
func (s *sMemDBSysMenu) Init(ctx context.Context) error {
err := s.CreateTable(ctx)
if err != nil {
return err
}
err = s.EventHandler(ctx)
if err != nil {
return err
}
return nil
}
func (s *sMemDBSysMenu) EventHandler(ctx context.Context) error {
eventList := []string{
consts.EventKeyDBSysMenuCreate,
consts.EventKeyDBSysMenuUpdate,
consts.EventKeyDBSysMenuDelete,
}
event.EventsInstance().Register(eventList, func(ctx context.Context, eventKey string, args ...interface{}) {
if len(args) < 1 {
g.Log().Errorf(ctx, "sMemDBSysMenu.EventHandler event args error. eventKey: %s, args: %+v", eventKey, args)
return
}
pkList, ok := args[0].([]int64)
if !ok {
pk, ok := args[0].(int64)
if !ok {
g.Log().Errorf(ctx, "sMemDBSysMenu.EventHandler event args error. eventKey: %s, args: %+v", eventKey, args)
return
}
pkList = []int64{pk}
}
if len(pkList) == 0 {
g.Log().Errorf(ctx, "sMemDBSysMenu.EventHandler event args error. eventKey: %s, args: %+v", eventKey, args)
return
}
changeType := "edit"
if eventKey == consts.EventKeyDBSysMenuDelete {
changeType = "del"
}
if err := service.MemoryDB().EventHandler(ctx, &model.BroadcastDbChgCache{
TableName: s.TableName(ctx), PK: pkList, Type: changeType,
}); err != nil {
g.Log().Errorf(ctx, "refresh memory menu failed: %v", err)
return
}
dbType := "edit"
if eventKey == consts.EventKeyDBSysMenuCreate {
dbType = "add"
} else if eventKey == consts.EventKeyDBSysMenuDelete {
dbType = "del"
} else {
dbType = "edit"
}
queue.Push(ctx, consts.BroadcastDbChg, &model.BroadcastDbChgCache{
TableName: s.TableName(ctx),
PK: pkList,
Type: dbType,
Data: nil,
})
})
return nil
}
func (s *sMemDBSysMenu) TableName(ctx context.Context) string {
return dao.SysMenu.Table()
}
func (s *sMemDBSysMenu) CreateTable(ctx context.Context) error {
_, err := db.Exec(ctx, "DROP TABLE IF EXISTS "+s.TableName(ctx))
if err != nil {
g.Log().Errorf(ctx, "sMemDBSysMenu.CreateTable delete table err: %v", err)
return err
}
total, err := db.Ctx(ctx).Model("sqlite_master").Where("type", "table").Where("name", dao.SysMenu.Table()).Count()
if err != nil {
g.Log().Errorf(ctx, "sMemDBSysMenu.CreateTable count err: %v", err)
return err
}
if total == 0 {
g.Log().Debug(ctx, "sMemDBSysMenu.List create table ", s.TableName(ctx))
res, err := db.Exec(ctx, `
CREATE TABLE "sys_menu" (
"menu_id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
"menu_name" TEXT NOT NULL CHECK(length("menu_name") <= 50),
"parent_id" INTEGER DEFAULT 0,
"level" INTEGER DEFAULT 1,
"tree" TEXT CHECK(length("tree") <= 255),
"order_num" INTEGER DEFAULT 0,
"path" TEXT DEFAULT '' CHECK(length("path") <= 200),
"component" TEXT CHECK(length("component") <= 255),
"query_param" TEXT CHECK(length("query_param") <= 255),
"is_frame" INTEGER DEFAULT 1 ,
"is_cache" INTEGER DEFAULT 0 ,
"menu_type" TEXT DEFAULT '' ,
"visible" TEXT DEFAULT '0',
"status" TEXT DEFAULT '0' ,
"perms" TEXT CHECK(length("perms") <= 100),
"icon" TEXT DEFAULT '#' CHECK(length("icon") <= 100),
"created_dept" INTEGER,
"created_by" INTEGER,
"created_at" TEXT,
"updated_by" INTEGER,
"updated_at" TEXT,
"remark" TEXT DEFAULT '' CHECK(length("remark") <= 500)
);
`)
if err != nil {
g.Log().Errorf(ctx, "sMemDBSysMenu.CreateTable create table err: %v", err)
return err
}
g.Log().Debug(ctx, "sMemDBSysMenu.CreateTable create table success", res)
return s.LoadData(ctx, 0)
}
return nil
}
func (s *sMemDBSysMenu) LoadData(ctx context.Context, pk int64) error {
count := 0
if pk == 0 {
maxMenuId := int64(0)
for {
page := 1
pageSize := 500
dataList := make([]*entity.SysMenu, 0)
if err := dao.SysMenu.Ctx(sourceContext(ctx)).Page(page, pageSize).WhereGT(dao.SysMenu.Columns().MenuId, maxMenuId).
OrderAsc(dao.SysMenu.Columns().MenuId).Scan(&dataList); err != nil {
return err
}
if len(dataList) == 0 {
break
}
count += len(dataList)
_, err := db.Ctx(ctx).Model(dao.SysMenu.Table()).Data(dataList).OnConflict(dao.SysMenu.Columns().MenuId).Save()
if err != nil {
g.Log().Errorf(ctx, "sMemDBSysMenu.Load data insert err: %v", err)
return err
}
maxMenuId = dataList[len(dataList)-1].MenuId
if len(dataList) < pageSize {
break
}
}
} else {
dataList := make([]*entity.SysMenu, 0)
if err := dao.SysMenu.Ctx(sourceContext(ctx)).Where(dao.SysMenu.Columns().MenuId, pk).Scan(&dataList); err != nil {
return err
}
_, err := db.Ctx(ctx).Model(dao.SysMenu.Table()).Data(dataList).OnConflict(dao.SysMenu.Columns().MenuId).Save()
if err != nil {
g.Log().Errorf(ctx, "sMemDBSysMenu.Load data insert err: %v", err)
return err
}
}
g.Log().Debugf(ctx, "sMemDBSysMenu.LoadData load data success, total: %d, pk: %d", count, pk)
return nil
}
func (s *sMemDBSysMenu) DeleteData(ctx context.Context, ids []int64) error {
_, err := db.Ctx(ctx).Model(dao.SysMenu.Table()).WhereIn(dao.SysMenu.Columns().MenuId, ids).Delete()
if err != nil {
g.Log().Errorf(ctx, "sMemDBSysMenu.DeleteData err: %v", err)
return err
}
g.Log().Debugf(ctx, "sMemDBSysMenu.DeleteData delete data success, total: %d, ids: %+v", len(ids), ids)
return nil
}
@@ -0,0 +1,202 @@
package memorydb
import (
"context"
"git.5iot.com/iotlcm-public/iotlcm-admin-svr/internal/consts"
"git.5iot.com/iotlcm-public/iotlcm-admin-svr/internal/dao"
"git.5iot.com/iotlcm-public/iotlcm-admin-svr/internal/library/event"
"git.5iot.com/iotlcm-public/iotlcm-admin-svr/internal/model"
"git.5iot.com/iotlcm-public/iotlcm-admin-svr/internal/model/entity"
"git.5iot.com/iotlcm-public/iotlcm-admin-svr/internal/service"
"git.5iot.com/iotlcm-public/iotlcm-admin-svr/utility/queue"
"github.com/gogf/gf/v2/frame/g"
)
type sMemDBSysPost struct {
}
var instanceMemDBSysPost *sMemDBSysPost
func NewMemDBSysPost() *sMemDBSysPost {
if instanceMemDBSysPost != nil {
return instanceMemDBSysPost
}
instanceMemDBSysPost = &sMemDBSysPost{}
initLoadMemoryDB := g.Cfg().MustGet(context.TODO(), "server.initLoadMemoryDB").Bool()
if initLoadMemoryDB {
instanceMemDBSysPost.Init(context.TODO())
}
return instanceMemDBSysPost
}
func init() {
s := NewMemDBSysPost()
service.RegisterMemDBSysPost(s)
RegisterMemDB(s.TableName(context.TODO()), s)
}
func (s *sMemDBSysPost) Init(ctx context.Context) error {
err := s.CreateTable(ctx)
if err != nil {
return err
}
err = s.EventHandler(ctx)
if err != nil {
return err
}
return nil
}
func (s *sMemDBSysPost) EventHandler(ctx context.Context) error {
eventList := []string{
consts.EventKeyDBSysPostCreate,
consts.EventKeyDBSysPostUpdate,
consts.EventKeyDBSysPostDelete,
}
event.EventsInstance().Register(eventList, func(ctx context.Context, eventKey string, args ...interface{}) {
if len(args) < 1 {
g.Log().Errorf(ctx, "sMemDBSysPost.EventHandler event args error. eventKey: %s, args: %+v", eventKey, args)
return
}
pkList, ok := args[0].([]int64)
if !ok {
pk, ok := args[0].(int64)
if !ok {
g.Log().Errorf(ctx, "sMemDBSysPost.EventHandler event args error. eventKey: %s, args: %+v", eventKey, args)
return
}
pkList = []int64{pk}
}
if len(pkList) == 0 {
g.Log().Errorf(ctx, "sMemDBSysPost.EventHandler event args error. eventKey: %s, args: %+v", eventKey, args)
return
}
changeType := "edit"
if eventKey == consts.EventKeyDBSysPostDelete {
changeType = "del"
}
if err := service.MemoryDB().EventHandler(ctx, &model.BroadcastDbChgCache{
TableName: s.TableName(ctx), PK: pkList, Type: changeType,
}); err != nil {
g.Log().Errorf(ctx, "refresh memory post failed: %v", err)
return
}
dbType := "edit"
if eventKey == consts.EventKeyDBSysPostCreate {
dbType = "add"
} else if eventKey == consts.EventKeyDBSysPostDelete {
dbType = "del"
} else {
dbType = "edit"
}
queue.Push(ctx, consts.BroadcastDbChg, &model.BroadcastDbChgCache{
TableName: s.TableName(ctx),
PK: pkList,
Type: dbType,
Data: nil,
})
})
return nil
}
func (s *sMemDBSysPost) TableName(ctx context.Context) string {
return dao.SysPost.Table()
}
func (s *sMemDBSysPost) CreateTable(ctx context.Context) error {
_, err := db.Exec(ctx, "DROP TABLE IF EXISTS "+s.TableName(ctx))
if err != nil {
g.Log().Errorf(ctx, "sMemDBSysPost.CreateTable delete table err: %v", err)
return err
}
total, err := db.Ctx(ctx).Model("sqlite_master").Where("type", "table").Where("name", dao.SysPost.Table()).Count()
if err != nil {
g.Log().Errorf(ctx, "sMemDBSysPost.CreateTable count err: %v", err)
return err
}
if total == 0 {
g.Log().Debug(ctx, "sMemDBSysPost.List create table ", s.TableName(ctx))
res, err := db.Exec(ctx, `
CREATE TABLE "sys_post" (
"post_id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
"tenant_id" TEXT DEFAULT '000000' CHECK(length("tenant_id") <= 20),
"dept_id" INTEGER NOT NULL,
"post_code" TEXT NOT NULL CHECK(length("post_code") <= 64),
"post_category" TEXT CHECK(length("post_category") <= 100),
"post_name" TEXT NOT NULL CHECK(length("post_name") <= 50),
"post_sort" INTEGER NOT NULL,
"status" TEXT NOT NULL ,
"created_dept" INTEGER,
"created_by" INTEGER NOT NULL,
"created_at" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updated_by" INTEGER,
"updated_at" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
"deleted_by" INTEGER,
"deleted_at" DATETIME,
"remark" TEXT CHECK(length("remark") <= 500)
);
`)
if err != nil {
g.Log().Errorf(ctx, "sMemDBSysPost.CreateTable create table err: %v", err)
return err
}
g.Log().Debug(ctx, "sMemDBSysPost.CreateTable create table success", res)
// 加载数据
return s.LoadData(ctx, 0)
}
return nil
}
func (s *sMemDBSysPost) LoadData(ctx context.Context, pk int64) error {
count := 0
if pk == 0 {
maxPostId := int64(0)
for {
page := 1
pageSize := 500
dataList := make([]*entity.SysPost, 0)
if err := dao.SysPost.Ctx(sourceContext(ctx)).Page(page, pageSize).WhereGT(dao.SysPost.Columns().PostId, maxPostId).
OrderAsc(dao.SysPost.Columns().PostId).Scan(&dataList); err != nil {
return err
}
if len(dataList) == 0 {
break
}
count += len(dataList)
_, err := db.Ctx(ctx).Model(dao.SysPost.Table()).Data(dataList).OnConflict(dao.SysPost.Columns().PostId).Save()
if err != nil {
g.Log().Errorf(ctx, "sMemDBSysPost.Load data insert err: %v", err)
return err
}
maxPostId = dataList[len(dataList)-1].PostId
if len(dataList) < pageSize {
break
}
}
} else {
dataList := make([]*entity.SysPost, 0)
if err := dao.SysPost.Ctx(sourceContext(ctx)).Where(dao.SysPost.Columns().PostId, pk).Scan(&dataList); err != nil {
return err
}
_, err := db.Ctx(ctx).Model(dao.SysPost.Table()).Data(dataList).OnConflict(dao.SysPost.Columns().PostId).Save()
if err != nil {
g.Log().Errorf(ctx, "sMemDBSysPost.Load data insert err: %v", err)
return err
}
}
g.Log().Debugf(ctx, "sMemDBSysPost.LoadData load data success, total: %d, pk: %d", count, pk)
return nil
}
func (s *sMemDBSysPost) DeleteData(ctx context.Context, ids []int64) error {
_, err := db.Ctx(ctx).Model(dao.SysPost.Table()).WhereIn(dao.SysPost.Columns().PostId, ids).Delete()
if err != nil {
g.Log().Errorf(ctx, "sMemDBSysPost.DeleteData err: %v", err)
return err
}
g.Log().Debugf(ctx, "sMemDBSysPost.DeleteData delete data success, total: %d, ids: %+v", len(ids), ids)
return nil
}
@@ -0,0 +1,213 @@
package memorydb
import (
"context"
"git.5iot.com/iotlcm-public/iotlcm-admin-svr/internal/consts"
"git.5iot.com/iotlcm-public/iotlcm-admin-svr/internal/dao"
"git.5iot.com/iotlcm-public/iotlcm-admin-svr/internal/library/event"
"git.5iot.com/iotlcm-public/iotlcm-admin-svr/internal/model"
"git.5iot.com/iotlcm-public/iotlcm-admin-svr/internal/model/entity"
"git.5iot.com/iotlcm-public/iotlcm-admin-svr/internal/service"
"git.5iot.com/iotlcm-public/iotlcm-admin-svr/utility/queue"
"github.com/gogf/gf/v2/frame/g"
)
type sMemDBSysRole struct {
}
var instanceMemDBSysRole *sMemDBSysRole
func NewMemDBSysRole() *sMemDBSysRole {
if instanceMemDBSysRole != nil {
return instanceMemDBSysRole
}
instanceMemDBSysRole = &sMemDBSysRole{}
initLoadMemoryDB := g.Cfg().MustGet(context.TODO(), "server.initLoadMemoryDB").Bool()
if initLoadMemoryDB {
instanceMemDBSysRole.Init(context.TODO())
}
return instanceMemDBSysRole
}
func init() {
s := NewMemDBSysRole()
service.RegisterMemDBSysRole(s)
RegisterMemDB(s.TableName(context.TODO()), s)
}
func (s *sMemDBSysRole) Init(ctx context.Context) error {
err := s.CreateTable(ctx)
if err != nil {
return err
}
err = s.EventHandler(ctx)
if err != nil {
return err
}
return nil
}
func (s *sMemDBSysRole) EventHandler(ctx context.Context) error {
eventList := []string{
consts.EventKeyDBSysRoleCreate,
consts.EventKeyDBSysRoleUpdate,
consts.EventKeyDBSysRoleDelete,
}
event.EventsInstance().Register(eventList, func(ctx context.Context, eventKey string, args ...interface{}) {
if len(args) < 1 {
g.Log().Errorf(ctx, "sMemDBSysRole.EventHandler event args error. eventKey: %s, args: %+v", eventKey, args)
return
}
pkList, ok := args[0].([]int64)
if !ok {
pk, ok := args[0].(int64)
if !ok {
g.Log().Errorf(ctx, "sMemDBSysRole.EventHandler event args error. eventKey: %s, args: %+v", eventKey, args)
return
}
pkList = []int64{pk}
}
if len(pkList) == 0 {
g.Log().Errorf(ctx, "sMemDBSysRole.EventHandler event args error. eventKey: %s, args: %+v", eventKey, args)
return
}
changeType := "edit"
if eventKey == consts.EventKeyDBSysRoleDelete {
changeType = "del"
}
if err := service.MemoryDB().EventHandler(ctx, &model.BroadcastDbChgCache{
TableName: s.TableName(ctx), PK: pkList, Type: changeType,
}); err != nil {
g.Log().Errorf(ctx, "refresh memory role failed: %v", err)
return
}
dbType := "edit"
if eventKey == consts.EventKeyDBSysRoleCreate {
dbType = "add"
} else if eventKey == consts.EventKeyDBSysRoleDelete {
dbType = "del"
} else {
dbType = "edit"
}
queue.Push(ctx, consts.BroadcastDbChg, &model.BroadcastDbChgCache{
TableName: s.TableName(ctx),
PK: pkList,
Type: dbType,
Data: nil,
})
})
return nil
}
func (s *sMemDBSysRole) TableName(ctx context.Context) string {
return dao.SysRole.Table()
}
func (s *sMemDBSysRole) CreateTable(ctx context.Context) error {
_, err := db.Exec(ctx, "DROP TABLE IF EXISTS "+s.TableName(ctx))
if err != nil {
g.Log().Errorf(ctx, "sMemDBSysRole.CreateTable delete table err: %v", err)
return err
}
total, err := db.Ctx(ctx).Model("sqlite_master").Where("type", "table").Where("name", dao.SysRole.Table()).Count()
if err != nil {
g.Log().Errorf(ctx, "sMemDBSysRole.CreateTable count err: %v", err)
return err
}
if total == 0 {
g.Log().Debug(ctx, "sMemDBSysRole.List create table ", s.TableName(ctx))
res, err := db.Exec(ctx, `
CREATE TABLE "sys_role" (
"role_id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
"tenant_id" TEXT DEFAULT '000000' CHECK(length("tenant_id") <= 20),
"dept_id" INTEGER DEFAULT 0,
"role_name" TEXT NOT NULL CHECK(length("role_name") <= 30),
"role_key" TEXT NOT NULL CHECK(length("role_key") <= 100),
"role_sort" INTEGER NOT NULL,
"data_scope" TEXT DEFAULT '1',
"menu_check_strictly" INTEGER DEFAULT 1,
"dept_check_strictly" INTEGER DEFAULT 1,
"is_pass" INTEGER NOT NULL DEFAULT 0,
"source_role_id" INTEGER NOT NULL DEFAULT 0,
"source_dept_id" INTEGER NOT NULL DEFAULT 0,
"status" TEXT NOT NULL ,
"created_dept" INTEGER,
"created_by" INTEGER NOT NULL,
"created_at" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updated_by" INTEGER,
"updated_at" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
"deleted_by" INTEGER,
"deleted_at" DATETIME,
"remark" TEXT CHECK(length("remark") <= 500)
);
`)
if err != nil {
g.Log().Errorf(ctx, "sMemDBSysRole.CreateTable create table err: %v", err)
return err
}
g.Log().Debug(ctx, "sMemDBSysRole.CreateTable create table success", res)
return s.LoadData(ctx, 0)
}
return nil
}
func (s *sMemDBSysRole) LoadData(ctx context.Context, pk int64) error {
count := 0
if pk == 0 {
maxRoleId := int64(0)
for {
page := 1
pageSize := 500
dataList := make([]*entity.SysRole, 0)
if err := dao.SysRole.Ctx(sourceContext(ctx)).Page(page, pageSize).WhereGT(dao.SysRole.Columns().RoleId, maxRoleId).
OrderAsc(dao.SysRole.Columns().RoleId).Scan(&dataList); err != nil {
return err
}
if len(dataList) == 0 {
break
}
count += len(dataList)
_, err := db.Ctx(ctx).Model(dao.SysRole.Table()).Data(dataList).OnConflict(dao.SysRole.Columns().RoleId).Save()
if err != nil {
g.Log().Errorf(ctx, "sMemDBSysRole.Load data insert err: %v", err)
return err
}
maxRoleId = dataList[len(dataList)-1].RoleId
if len(dataList) < pageSize {
break
}
}
} else {
dataList := make([]*entity.SysRole, 0)
if err := dao.SysRole.Ctx(sourceContext(ctx)).Where(dao.SysRole.Columns().RoleId, pk).Scan(&dataList); err != nil {
return err
}
_, err := db.Ctx(ctx).Model(dao.SysRole.Table()).Data(dataList).OnConflict(dao.SysRole.Columns().RoleId).Save()
if err != nil {
g.Log().Errorf(ctx, "sMemDBSysRole.Load data insert err: %v", err)
return err
}
}
g.Log().Debugf(ctx, "sMemDBSysRole.LoadData load data success, total: %d, pk: %d", count, pk)
return nil
}
func (s *sMemDBSysRole) DeleteData(ctx context.Context, ids []int64) error {
g.Log().Debugf(ctx, "sMemDBSysRole.DeleteData called with ids: %+v, len: %d", ids, len(ids))
if len(ids) == 0 {
g.Log().Warningf(ctx, "sMemDBSysRole.DeleteData called with empty ids")
return nil
}
// 使用 Unscoped() 来确保删除操作被执行
_, err := db.Ctx(ctx).Model(dao.SysRole.Table()).WhereIn(dao.SysRole.Columns().RoleId, ids).Unscoped().Delete()
if err != nil {
g.Log().Errorf(ctx, "sMemDBSysRole.DeleteData err: %v", err)
return err
}
g.Log().Debugf(ctx, "sMemDBSysRole.DeleteData delete data success, total: %d, ids: %+v", len(ids), ids)
return nil
}
@@ -0,0 +1,213 @@
package memorydb
import (
"context"
"git.5iot.com/iotlcm-public/iotlcm-admin-svr/internal/consts"
"git.5iot.com/iotlcm-public/iotlcm-admin-svr/internal/dao"
"git.5iot.com/iotlcm-public/iotlcm-admin-svr/internal/library/event"
"git.5iot.com/iotlcm-public/iotlcm-admin-svr/internal/model"
"git.5iot.com/iotlcm-public/iotlcm-admin-svr/internal/model/entity"
"git.5iot.com/iotlcm-public/iotlcm-admin-svr/internal/service"
"git.5iot.com/iotlcm-public/iotlcm-admin-svr/utility/queue"
"github.com/gogf/gf/v2/database/gdb"
"github.com/gogf/gf/v2/frame/g"
)
type sMemDBSysTenant struct {
}
var instanceMemDBSysTenant *sMemDBSysTenant
func NewMemDBSysTenant() *sMemDBSysTenant {
if instanceMemDBSysTenant != nil {
return instanceMemDBSysTenant
}
instanceMemDBSysTenant = &sMemDBSysTenant{}
initLoadMemoryDB := g.Cfg().MustGet(context.TODO(), "server.initLoadMemoryDB").Bool()
if initLoadMemoryDB {
instanceMemDBSysTenant.Init(context.TODO())
}
return instanceMemDBSysTenant
}
func init() {
s := NewMemDBSysTenant()
service.RegisterMemDBSysTenant(s)
RegisterMemDB(s.TableName(context.TODO()), s)
}
func (s *sMemDBSysTenant) Init(ctx context.Context) error {
err := s.CreateTable(ctx)
if err != nil {
return err
}
err = s.EventHandler(ctx)
if err != nil {
return err
}
return nil
}
func (s *sMemDBSysTenant) EventHandler(ctx context.Context) error {
eventList := []string{
consts.EventKeyDBSysTenantCreate,
consts.EventKeyDBSysTenantUpdate,
consts.EventKeyDBSysTenantDelete,
}
event.EventsInstance().Register(eventList, func(ctx context.Context, eventKey string, args ...interface{}) {
if len(args) < 1 {
g.Log().Errorf(ctx, "sMemDBSysTenant.EventHandler event args error. eventKey: %s, args: %+v", eventKey, args)
return
}
pkList, ok := args[0].([]int64)
if !ok {
pk, ok := args[0].(int64)
if !ok {
g.Log().Errorf(ctx, "sMemDBSysTenant.EventHandler event args error. eventKey: %s, args: %+v", eventKey, args)
return
}
pkList = []int64{pk}
}
if len(pkList) == 0 {
g.Log().Errorf(ctx, "sMemDBSysTenant.EventHandler event args error. eventKey: %s, args: %+v", eventKey, args)
return
}
changeType := "edit"
if eventKey == consts.EventKeyDBSysTenantDelete {
changeType = "del"
}
if err := service.MemoryDB().EventHandler(ctx, &model.BroadcastDbChgCache{
TableName: s.TableName(ctx), PK: pkList, Type: changeType,
}); err != nil {
g.Log().Errorf(ctx, "refresh memory tenant failed: %v", err)
return
}
dbType := "edit"
if eventKey == consts.EventKeyDBSysTenantCreate {
dbType = "add"
} else if eventKey == consts.EventKeyDBSysTenantDelete {
dbType = "del"
} else {
dbType = "edit"
}
queue.Push(ctx, consts.BroadcastDbChg, &model.BroadcastDbChgCache{
TableName: s.TableName(ctx),
PK: pkList,
Type: dbType,
Data: nil,
})
})
return nil
}
func (s *sMemDBSysTenant) DB(ctx context.Context) gdb.DB {
return db
}
func (s *sMemDBSysTenant) TableName(ctx context.Context) string {
return dao.SysTenant.Table()
}
func (s *sMemDBSysTenant) CreateTable(ctx context.Context) error {
_, err := db.Exec(ctx, "DROP TABLE IF EXISTS "+s.TableName(ctx))
if err != nil {
g.Log().Errorf(ctx, "sMemDBSysTenant.CreateTable delete table err: %v", err)
return err
}
total, err := db.Ctx(ctx).Model("sqlite_master").Where("type", "table").Where("name", dao.SysTenant.Table()).Count()
if err != nil {
g.Log().Errorf(ctx, "sMemDBSysTenant.CreateTable count err: %v", err)
return err
}
if total == 0 {
g.Log().Debug(ctx, "sMemDBSysTenant.List create table ", s.TableName(ctx))
res, err := db.Exec(ctx, `
CREATE TABLE "sys_tenant" (
"id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
"tenant_id" TEXT NOT NULL CHECK(length("tenant_id") <= 20),
"contact_user_name" TEXT CHECK(length("contact_user_name") <= 20),
"contact_phone" TEXT CHECK(length("contact_phone") <= 20),
"company_name" TEXT CHECK(length("company_name") <= 50),
"license_number" TEXT CHECK(length("license_number") <= 30),
"address" TEXT CHECK(length("address") <= 200),
"intro" TEXT CHECK(length("intro") <= 200),
"domain" TEXT CHECK(length("domain") <= 200),
"remark" TEXT CHECK(length("remark") <= 200),
"package_id" INTEGER,
"expire_time" TEXT,
"account_count" INTEGER DEFAULT -1,
"status" TEXT DEFAULT '0',
"created_dept" INTEGER,
"created_by" INTEGER NOT NULL,
"created_at" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updated_by" INTEGER,
"updated_at" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
"deleted_by" INTEGER,
"deleted_at" DATETIME,
CONSTRAINT "sys_tenant_tenant_id_unique" UNIQUE ("tenant_id")
);
`)
if err != nil {
g.Log().Errorf(ctx, "sMemDBSysTenant.CreateTable create table err: %v", err)
return err
}
g.Log().Debug(ctx, "sMemDBSysTenant.CreateTable create table success", res)
// 加载数据
return s.LoadData(ctx, 0)
}
return nil
}
func (s *sMemDBSysTenant) LoadData(ctx context.Context, pk int64) error {
count := 0
if pk == 0 {
maxId := int64(0)
for {
page := 1
pageSize := 500
dataList := make([]*entity.SysTenant, 0)
if err := dao.SysTenant.Ctx(sourceContext(ctx)).Page(page, pageSize).WhereGT(dao.SysTenant.Columns().Id, maxId).
OrderAsc(dao.SysTenant.Columns().Id).Scan(&dataList); err != nil {
return err
}
if len(dataList) == 0 {
break
}
count += len(dataList)
_, err := db.Ctx(ctx).Model(dao.SysTenant.Table()).Data(dataList).OnConflict(dao.SysTenant.Columns().Id).Save()
if err != nil {
g.Log().Errorf(ctx, "sMemDBSysTenant.Load data insert err: %v, dataList: %+v", err, dataList)
return err
}
maxId = dataList[len(dataList)-1].Id
if len(dataList) < pageSize {
break
}
}
} else {
dataList := make([]*entity.SysTenant, 0)
if err := dao.SysTenant.Ctx(sourceContext(ctx)).Where(dao.SysTenant.Columns().Id, pk).Scan(&dataList); err != nil {
return err
}
_, err := db.Ctx(ctx).Model(dao.SysTenant.Table()).Data(dataList).OnConflict(dao.SysTenant.Columns().Id).Save()
if err != nil {
g.Log().Errorf(ctx, "sMemDBSysTenant.Load data insert err: %v", err)
return err
}
}
g.Log().Debugf(ctx, "sMemDBSysTenant.LoadData load data success, total: %d, pk: %d", count, pk)
return nil
}
func (s *sMemDBSysTenant) DeleteData(ctx context.Context, ids []int64) error {
_, err := db.Ctx(ctx).Model(dao.SysTenant.Table()).WhereIn(dao.SysTenant.Columns().Id, ids).Delete()
if err != nil {
g.Log().Errorf(ctx, "sMemDBSysTenant.DeleteData err: %v, ids: %+v", err, ids)
return err
}
g.Log().Debugf(ctx, "sMemDBSysTenant.DeleteData delete data success, total: %d, ids: %+v", len(ids), ids)
return nil
}