代码拉取完成,页面将自动刷新
package mdb
import (
"database/sql"
"fmt"
"github.com/goccy/go-json"
"github.com/gomodule/redigo/redis"
"github.com/joho/godotenv"
"gopkg.in/yaml.v3"
"log"
"os"
"strings"
"time"
)
type DbManager struct {
Db *sql.DB
Rdb *redis.Pool
Ssdb *redis.Pool
}
// DbHandler 数据库句柄池
var DbHandler = DbManager{}
type Redis struct {
Host string
Port string
Db string
Init int
MaxCon int `yaml:"maxCon"`
Idle int
Psw string
}
type Database struct {
Adapter string
User string
Pass string
Host string
Port string
Db string
Prefix string
}
type DbConfig struct {
Database *Database
Redis, Ssdb *Redis
}
func InitAsyncTask(funMap map[string]IAsync) {
execTask := func(tid, r []uint8) {
var p = &DelayObj{}
err := json.Unmarshal(r, p)
if err != nil {
println(err.Error())
}
log.Println("async start:", p.Params)
if nr, ok := funMap[p.Name]; ok {
nr.AsyncStart(p)
}
rds := DbHandler.GetRds(9)
defer rds.Close()
rds.Send("del", tid)
rds.Send("zrem", START_QUEUE_NAME, tid)
err = rds.Flush()
if err != nil {
println("async del error:", err.Error())
}
}
go func() {
s := `local qname='` + DEFAULT_QUEUE_NAME + `'
local r=redis.call('zrangebyscore', qname,'-inf',KEYS[1],'limit',0,1);
if #r==1 then
local id=r[1]
if redis.call('zrem',qname,id)==1 then
redis.call('zadd','` + START_QUEUE_NAME + `', KEYS[1],id)
return {id,redis.call('get',id)}
end;
end
`
var (
rds redis.Conn
r1 any
err error
lsleep = time.Millisecond * 20000
fsleep = time.Second
sc = redis.NewScript(1, s)
)
link := func() {
time.Sleep(fsleep)
if rds != nil {
rds.Close()
}
rds = DbHandler.GetRds(9)
}
link()
s = ""
for {
//-- 解锁
r1, err = sc.Do(rds, time.Now().Unix())
if err != nil {
println("async read error:", err.Error())
link()
continue
}
if r1 != nil {
switch r1.(type) {
case []any:
r := r1.([]any)
go execTask(r[0].([]uint8), r[1].([]uint8))
time.Sleep(fsleep)
continue
default:
println("async read unknown type")
}
}
time.Sleep(lsleep)
}
}()
}
func ParseDbConfigAndInit(path string) bool {
file, err := os.ReadFile(path)
if err != nil {
fmt.Println(err.Error())
return false
}
err = godotenv.Load()
if err != nil {
fmt.Println(err.Error())
}
dc := &DbConfig{}
err = yaml.Unmarshal(file, dc)
if err != nil {
fmt.Println(err.Error())
return false
}
if dc.Database.Host[0] == '@' {
host := os.Getenv("database.host")
if host == "" {
sp := strings.Split(dc.Database.Host, " ")
dc.Database.Host = sp[1]
} else {
dc.Database.Host = host
}
}
err = DbHandler.InitDb(dc.Database)
if err != nil {
return false
}
if dc.Redis.Host[0] == '@' {
sp := strings.Split(dc.Redis.Host, " ")
host := os.Getenv(sp[0][1:])
if host == "" {
if len(sp) > 1 {
dc.Redis.Host = sp[1]
}
} else {
dc.Redis.Host = host
}
}
if !DbHandler.InitRds(dc.Redis) {
return false
}
if dc.Ssdb.Host[0] == '@' {
sp := strings.Split(dc.Ssdb.Host, " ")
host := os.Getenv(sp[0][1:])
if host == "" {
if len(sp) > 0 {
dc.Ssdb.Host = sp[1]
}
} else {
dc.Ssdb.Host = host
}
}
if !DbHandler.InitSsdb(dc.Ssdb) {
return false
}
TABLE_PREFIX = dc.Database.Prefix
murphy()
return true
}
func murphy() {
p, _ := os.ReadFile("murphy.logo")
v, _ := os.ReadFile("ver")
fmt.Println(fmt.Sprintf(string(p), string(v)))
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。