feat(database): 将数据库连接池从 NutsDB 迁移到 SQLite
- 修改 server/ws/example.go 中的数据库连接池引用,将 m.nutsPool 替换为 m.sqlitePool - 更新 go.mod 文件中的 Go 版本从 1.24.3 升级到 1.25.0 - 移除 nutsdb 依赖项 github.com/nutsdb/nutsdb v1.1.0 - 移除其他间接依赖包括 github.com/antlabs/stl、github.com/antlabs/timer、 github.com/bwmarrin/snowflake、github.com/cespare/xxhash/v2 等 - 添加 SQLite 相关依赖 github.com/glebarez/go-sqlite 和 github.com/glebarez/sqlite - 更新 golang.org/x 相关包版本,包括 exp、sync、sys、text 等模块 - 在 go.sum 中同步更新所有依赖项的校验和变化main v1.0.1009
parent
bb0f3de20a
commit
c0629b4038
|
|
@ -0,0 +1,60 @@
|
||||||
|
package db
|
||||||
|
|
||||||
|
import (
|
||||||
|
"database/sql"
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"git.magicany.cc/black1552/gf-common/log"
|
||||||
|
"github.com/glebarez/sqlite"
|
||||||
|
"github.com/gogf/gf/v2/frame/g"
|
||||||
|
"github.com/gogf/gf/v2/os/gfile"
|
||||||
|
"gorm.io/gorm"
|
||||||
|
"gorm.io/gorm/schema"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
Type gorm.Dialector
|
||||||
|
Db *gorm.DB
|
||||||
|
err error
|
||||||
|
sqlDb *sql.DB
|
||||||
|
dns = gfile.Join(gfile.Pwd(), "db", "database.db")
|
||||||
|
)
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
if g.IsEmpty(dns) {
|
||||||
|
log.Error("gormDns未配置", "请检查配置文件")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
sqliteInit()
|
||||||
|
Db, err = gorm.Open(Type, &gorm.Config{
|
||||||
|
SkipDefaultTransaction: true,
|
||||||
|
// 命名策略:保持与模型一致,避免字段/表名转换问题
|
||||||
|
NamingStrategy: schema.NamingStrategy{
|
||||||
|
SingularTable: true, // 表名禁用复数形式(例如 User 对应 user 表,而非 users)
|
||||||
|
},
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
log.Error("数据库连接失败: ", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
sqlDb, err = Db.DB()
|
||||||
|
if err != nil {
|
||||||
|
log.Error("获取sqlDb失败", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if err = sqlDb.Ping(); err != nil {
|
||||||
|
log.Error("数据库未正常连接", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func sqliteInit() {
|
||||||
|
if !gfile.Exists(dns) {
|
||||||
|
_, err = gfile.Create(dns)
|
||||||
|
if err != nil {
|
||||||
|
log.Error("创建数据库文件失败: ", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Type = sqlite.Open(fmt.Sprintf("%s?cache=shared&mode=rwc&_busy_timeout=10000&_fk=1&_journal=WAL&_sync=FULL", dns))
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
package db
|
||||||
36
go.mod
36
go.mod
|
|
@ -1,9 +1,8 @@
|
||||||
module git.magicany.cc/black1552/gf-common
|
module git.magicany.cc/black1552/gf-common
|
||||||
|
|
||||||
go 1.24.3
|
go 1.25.0
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/dgraph-io/badger/v4 v4.9.1
|
|
||||||
github.com/duke-git/lancet/v2 v2.3.7
|
github.com/duke-git/lancet/v2 v2.3.7
|
||||||
github.com/eclipse/paho.mqtt.golang v1.5.1
|
github.com/eclipse/paho.mqtt.golang v1.5.1
|
||||||
github.com/gogf/gf/contrib/drivers/mysql/v2 v2.9.3
|
github.com/gogf/gf/contrib/drivers/mysql/v2 v2.9.3
|
||||||
|
|
@ -12,7 +11,6 @@ require (
|
||||||
github.com/gogf/gf/v2 v2.9.3
|
github.com/gogf/gf/v2 v2.9.3
|
||||||
github.com/gorilla/websocket v1.5.3
|
github.com/gorilla/websocket v1.5.3
|
||||||
github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646
|
github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646
|
||||||
github.com/nutsdb/nutsdb v1.1.0
|
|
||||||
github.com/xuri/excelize/v2 v2.9.1
|
github.com/xuri/excelize/v2 v2.9.1
|
||||||
google.golang.org/grpc v1.76.0
|
google.golang.org/grpc v1.76.0
|
||||||
gopkg.in/natefinch/lumberjack.v2 v2.2.1
|
gopkg.in/natefinch/lumberjack.v2 v2.2.1
|
||||||
|
|
@ -23,49 +21,40 @@ require (
|
||||||
require (
|
require (
|
||||||
filippo.io/edwards25519 v1.1.0 // indirect
|
filippo.io/edwards25519 v1.1.0 // indirect
|
||||||
github.com/BurntSushi/toml v1.5.0 // indirect
|
github.com/BurntSushi/toml v1.5.0 // indirect
|
||||||
github.com/antlabs/stl v0.0.2 // indirect
|
github.com/Sereal/Sereal/Go/sereal v0.0.0-20250307140414-035be09f1bc8 // indirect
|
||||||
github.com/antlabs/timer v0.1.4 // indirect
|
|
||||||
github.com/bwmarrin/snowflake v0.3.0 // indirect
|
|
||||||
github.com/cespare/xxhash/v2 v2.3.0 // indirect
|
|
||||||
github.com/clbanning/mxj/v2 v2.7.0 // indirect
|
github.com/clbanning/mxj/v2 v2.7.0 // indirect
|
||||||
github.com/coreos/go-semver v0.3.0 // indirect
|
github.com/coreos/go-semver v0.3.0 // indirect
|
||||||
github.com/coreos/go-systemd/v22 v22.3.2 // indirect
|
github.com/coreos/go-systemd/v22 v22.3.2 // indirect
|
||||||
github.com/davecgh/go-spew v1.1.1 // indirect
|
|
||||||
github.com/dgraph-io/ristretto/v2 v2.2.0 // indirect
|
|
||||||
github.com/dustin/go-humanize v1.0.1 // indirect
|
github.com/dustin/go-humanize v1.0.1 // indirect
|
||||||
github.com/edsrzf/mmap-go v1.2.0 // indirect
|
|
||||||
github.com/emirpasic/gods v1.18.1 // indirect
|
github.com/emirpasic/gods v1.18.1 // indirect
|
||||||
github.com/fatih/color v1.18.0 // indirect
|
github.com/fatih/color v1.18.0 // indirect
|
||||||
github.com/fsnotify/fsnotify v1.9.0 // indirect
|
github.com/fsnotify/fsnotify v1.9.0 // indirect
|
||||||
|
github.com/glebarez/go-sqlite v1.22.0 // indirect
|
||||||
|
github.com/glebarez/sqlite v1.11.0 // indirect
|
||||||
github.com/go-logr/logr v1.4.3 // indirect
|
github.com/go-logr/logr v1.4.3 // indirect
|
||||||
github.com/go-logr/stdr v1.2.2 // indirect
|
github.com/go-logr/stdr v1.2.2 // indirect
|
||||||
github.com/go-sql-driver/mysql v1.9.2 // indirect
|
github.com/go-sql-driver/mysql v1.9.2 // indirect
|
||||||
github.com/gofrs/flock v0.8.1 // indirect
|
|
||||||
github.com/gogf/gf/contrib/registry/file/v2 v2.9.3 // indirect
|
github.com/gogf/gf/contrib/registry/file/v2 v2.9.3 // indirect
|
||||||
github.com/gogo/protobuf v1.3.2 // indirect
|
github.com/gogo/protobuf v1.3.2 // indirect
|
||||||
github.com/golang/protobuf v1.5.4 // indirect
|
github.com/golang/protobuf v1.5.4 // indirect
|
||||||
github.com/google/flatbuffers v25.2.10+incompatible // indirect
|
|
||||||
github.com/google/uuid v1.6.0 // indirect
|
github.com/google/uuid v1.6.0 // indirect
|
||||||
github.com/grokify/html-strip-tags-go v0.1.0 // indirect
|
github.com/grokify/html-strip-tags-go v0.1.0 // indirect
|
||||||
github.com/jinzhu/inflection v1.0.0 // indirect
|
github.com/jinzhu/inflection v1.0.0 // indirect
|
||||||
github.com/jinzhu/now v1.1.5 // indirect
|
github.com/jinzhu/now v1.1.5 // indirect
|
||||||
github.com/klauspost/compress v1.18.0 // indirect
|
|
||||||
github.com/magiconair/properties v1.8.10 // indirect
|
github.com/magiconair/properties v1.8.10 // indirect
|
||||||
github.com/mattn/go-colorable v0.1.14 // indirect
|
github.com/mattn/go-colorable v0.1.14 // indirect
|
||||||
github.com/mattn/go-isatty v0.0.20 // indirect
|
github.com/mattn/go-isatty v0.0.20 // indirect
|
||||||
github.com/mattn/go-runewidth v0.0.16 // indirect
|
github.com/mattn/go-runewidth v0.0.16 // indirect
|
||||||
|
github.com/ncruces/go-strftime v1.0.0 // indirect
|
||||||
github.com/olekukonko/errors v1.1.0 // indirect
|
github.com/olekukonko/errors v1.1.0 // indirect
|
||||||
github.com/olekukonko/ll v0.0.9 // indirect
|
github.com/olekukonko/ll v0.0.9 // indirect
|
||||||
github.com/olekukonko/tablewriter v1.0.9 // indirect
|
github.com/olekukonko/tablewriter v1.0.9 // indirect
|
||||||
github.com/pkg/errors v0.9.1 // indirect
|
github.com/pkg/errors v0.9.1 // indirect
|
||||||
github.com/pmezard/go-difflib v1.0.0 // indirect
|
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect
|
||||||
github.com/richardlehane/mscfb v1.0.4 // indirect
|
github.com/richardlehane/mscfb v1.0.4 // indirect
|
||||||
github.com/richardlehane/msoleps v1.0.4 // indirect
|
github.com/richardlehane/msoleps v1.0.4 // indirect
|
||||||
github.com/rivo/uniseg v0.4.7 // indirect
|
github.com/rivo/uniseg v0.4.7 // indirect
|
||||||
github.com/stretchr/testify v1.10.0 // indirect
|
|
||||||
github.com/tidwall/btree v1.6.0 // indirect
|
|
||||||
github.com/tiendc/go-deepcopy v1.6.0 // indirect
|
github.com/tiendc/go-deepcopy v1.6.0 // indirect
|
||||||
github.com/xujiajun/utils v0.0.0-20220904132955-5f7c5b914235 // indirect
|
|
||||||
github.com/xuri/efp v0.0.1 // indirect
|
github.com/xuri/efp v0.0.1 // indirect
|
||||||
github.com/xuri/nfp v0.0.1 // indirect
|
github.com/xuri/nfp v0.0.1 // indirect
|
||||||
go.etcd.io/etcd/api/v3 v3.5.17 // indirect
|
go.etcd.io/etcd/api/v3 v3.5.17 // indirect
|
||||||
|
|
@ -80,13 +69,18 @@ require (
|
||||||
go.uber.org/multierr v1.6.0 // indirect
|
go.uber.org/multierr v1.6.0 // indirect
|
||||||
go.uber.org/zap v1.21.0 // indirect
|
go.uber.org/zap v1.21.0 // indirect
|
||||||
golang.org/x/crypto v0.42.0 // indirect
|
golang.org/x/crypto v0.42.0 // indirect
|
||||||
golang.org/x/exp v0.0.0-20221208152030-732eee02a75a // indirect
|
golang.org/x/exp v0.0.0-20260218203240-3dfff04db8fa // indirect
|
||||||
golang.org/x/net v0.44.0 // indirect
|
golang.org/x/net v0.44.0 // indirect
|
||||||
golang.org/x/sync v0.17.0 // indirect
|
golang.org/x/sync v0.19.0 // indirect
|
||||||
golang.org/x/sys v0.36.0 // indirect
|
golang.org/x/sys v0.41.0 // indirect
|
||||||
golang.org/x/text v0.29.0 // indirect
|
golang.org/x/text v0.34.0 // indirect
|
||||||
|
google.golang.org/appengine v1.6.8 // indirect
|
||||||
google.golang.org/genproto/googleapis/api v0.0.0-20250804133106-a7a43d27e69b // indirect
|
google.golang.org/genproto/googleapis/api v0.0.0-20250804133106-a7a43d27e69b // indirect
|
||||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20250804133106-a7a43d27e69b // indirect
|
google.golang.org/genproto/googleapis/rpc v0.0.0-20250804133106-a7a43d27e69b // indirect
|
||||||
google.golang.org/protobuf v1.36.7 // indirect
|
google.golang.org/protobuf v1.36.7 // indirect
|
||||||
gopkg.in/yaml.v3 v3.0.1 // indirect
|
gopkg.in/yaml.v3 v3.0.1 // indirect
|
||||||
|
modernc.org/libc v1.68.0 // indirect
|
||||||
|
modernc.org/mathutil v1.7.1 // indirect
|
||||||
|
modernc.org/memory v1.11.0 // indirect
|
||||||
|
modernc.org/sqlite v1.46.1 // indirect
|
||||||
)
|
)
|
||||||
|
|
|
||||||
108
go.sum
108
go.sum
|
|
@ -2,16 +2,18 @@ filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA=
|
||||||
filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4=
|
filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4=
|
||||||
github.com/BurntSushi/toml v1.5.0 h1:W5quZX/G/csjUnuI8SUYlsHs9M38FC7znL0lIO+DvMg=
|
github.com/BurntSushi/toml v1.5.0 h1:W5quZX/G/csjUnuI8SUYlsHs9M38FC7znL0lIO+DvMg=
|
||||||
github.com/BurntSushi/toml v1.5.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho=
|
github.com/BurntSushi/toml v1.5.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho=
|
||||||
github.com/antlabs/stl v0.0.2 h1:sna1AXR5yIkNE9lWhCcKbheFJSVfCa3vugnGyakI79s=
|
github.com/DataDog/zstd v1.4.1/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo=
|
||||||
github.com/antlabs/stl v0.0.2/go.mod h1:kKrO4xrn9cfS1mJVo+/BqePZjAYMXqD0amGF2Ouq7ac=
|
github.com/DataDog/zstd v1.5.2 h1:vUG4lAyuPCXO0TLbXvPv7EB7cNK1QV/luu55UHLrrn8=
|
||||||
github.com/antlabs/timer v0.1.4 h1:MHdE00MDnNfhJCmqSOdLXs35uGNwfkMwfbynxrGmQ1c=
|
github.com/DataDog/zstd v1.5.2/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw=
|
||||||
github.com/antlabs/timer v0.1.4/go.mod h1:mpw4zlD5KVjstEyUDp43DGLWsY076Mdo4bS78NTseRE=
|
github.com/Sereal/Sereal v0.0.0-20190618215532-0b8ac451a863/go.mod h1:D0JMgToj/WdxCgd30Kc1UcA9E+WdZoJqeVOuYW7iTBM=
|
||||||
|
github.com/Sereal/Sereal/Go/sereal v0.0.0-20250307140414-035be09f1bc8 h1:6+qQvLkethJZQLb6r+Jxh0qxa7TfeFPBHlCzF7Ml8CM=
|
||||||
|
github.com/Sereal/Sereal/Go/sereal v0.0.0-20250307140414-035be09f1bc8/go.mod h1:JwrycNnC8+sZPDyzM3MQ86LvaGzSpfxg885KOOwFRW4=
|
||||||
|
github.com/asdine/storm v2.1.2+incompatible h1:dczuIkyqwY2LrtXPz8ixMrU/OFgZp71kbKTHGrXYt/Q=
|
||||||
|
github.com/asdine/storm v2.1.2+incompatible/go.mod h1:RarYDc9hq1UPLImuiXK3BIWPJLdIygvV3PsInK0FbVQ=
|
||||||
|
github.com/asdine/storm/v3 v3.2.1 h1:I5AqhkPK6nBZ/qJXySdI7ot5BlXSZ7qvDY1zAn5ZJac=
|
||||||
|
github.com/asdine/storm/v3 v3.2.1/go.mod h1:LEpXwGt4pIqrE/XcTvCnZHT5MgZCV6Ub9q7yQzOFWr0=
|
||||||
github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8=
|
github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8=
|
||||||
github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
|
github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
|
||||||
github.com/bwmarrin/snowflake v0.3.0 h1:xm67bEhkKh6ij1790JB83OujPR5CzNe8QuQqAgISZN0=
|
|
||||||
github.com/bwmarrin/snowflake v0.3.0/go.mod h1:NdZxfVWX+oR6y2K0o6qAYv6gIOP9rjG0/E9WsDpxqwE=
|
|
||||||
github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
|
|
||||||
github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
|
||||||
github.com/clbanning/mxj/v2 v2.7.0 h1:WA/La7UGCanFe5NpHF0Q3DNtnCsVoxbPKuyBNHWRyME=
|
github.com/clbanning/mxj/v2 v2.7.0 h1:WA/La7UGCanFe5NpHF0Q3DNtnCsVoxbPKuyBNHWRyME=
|
||||||
github.com/clbanning/mxj/v2 v2.7.0/go.mod h1:hNiWqW14h+kc+MdF9C6/YoRfjEJoR3ou6tn/Qo+ve2s=
|
github.com/clbanning/mxj/v2 v2.7.0/go.mod h1:hNiWqW14h+kc+MdF9C6/YoRfjEJoR3ou6tn/Qo+ve2s=
|
||||||
github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM=
|
github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM=
|
||||||
|
|
@ -21,26 +23,24 @@ github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSV
|
||||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
github.com/dgraph-io/badger/v4 v4.9.1 h1:DocZXZkg5JJHJPtUErA0ibyHxOVUDVoXLSCV6t8NC8w=
|
github.com/dchest/siphash v1.2.3/go.mod h1:0NvQU092bT0ipiFN++/rXm69QG9tVxLAlQHIXMPAkHc=
|
||||||
github.com/dgraph-io/badger/v4 v4.9.1/go.mod h1:5/MEx97uzdPUHR4KtkNt8asfI2T4JiEiQlV7kWUo8c0=
|
github.com/dgryski/go-ddmin v0.0.0-20210904190556-96a6d69f1034/go.mod h1:zz4KxBkcXUWKjIcrc+uphJ1gPh/t18ymGm3PmQ+VGTk=
|
||||||
github.com/dgraph-io/ristretto/v2 v2.2.0 h1:bkY3XzJcXoMuELV8F+vS8kzNgicwQFAaGINAEJdWGOM=
|
|
||||||
github.com/dgraph-io/ristretto/v2 v2.2.0/go.mod h1:RZrm63UmcBAaYWC1DotLYBmTvgkrs0+XhBd7Npn7/zI=
|
|
||||||
github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da h1:aIftn67I1fkbMa512G+w+Pxci9hJPB8oMnkcP3iZF38=
|
|
||||||
github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw=
|
|
||||||
github.com/duke-git/lancet/v2 v2.3.7 h1:nnNBA9KyoqwbPm4nFmEFVIbXeAmpqf6IDCH45+HHHNs=
|
github.com/duke-git/lancet/v2 v2.3.7 h1:nnNBA9KyoqwbPm4nFmEFVIbXeAmpqf6IDCH45+HHHNs=
|
||||||
github.com/duke-git/lancet/v2 v2.3.7/go.mod h1:zGa2R4xswg6EG9I6WnyubDbFO/+A/RROxIbXcwryTsc=
|
github.com/duke-git/lancet/v2 v2.3.7/go.mod h1:zGa2R4xswg6EG9I6WnyubDbFO/+A/RROxIbXcwryTsc=
|
||||||
github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY=
|
github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY=
|
||||||
github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto=
|
github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto=
|
||||||
github.com/eclipse/paho.mqtt.golang v1.5.1 h1:/VSOv3oDLlpqR2Epjn1Q7b2bSTplJIeV2ISgCl2W7nE=
|
github.com/eclipse/paho.mqtt.golang v1.5.1 h1:/VSOv3oDLlpqR2Epjn1Q7b2bSTplJIeV2ISgCl2W7nE=
|
||||||
github.com/eclipse/paho.mqtt.golang v1.5.1/go.mod h1:1/yJCneuyOoCOzKSsOTUc0AJfpsItBGWvYpBLimhArU=
|
github.com/eclipse/paho.mqtt.golang v1.5.1/go.mod h1:1/yJCneuyOoCOzKSsOTUc0AJfpsItBGWvYpBLimhArU=
|
||||||
github.com/edsrzf/mmap-go v1.2.0 h1:hXLYlkbaPzt1SaQk+anYwKSRNhufIDCchSPkUD6dD84=
|
|
||||||
github.com/edsrzf/mmap-go v1.2.0/go.mod h1:19H/e8pUPLicwkyNgOykDXkJ9F0MHE+Z52B8EIth78Q=
|
|
||||||
github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc=
|
github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc=
|
||||||
github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ=
|
github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ=
|
||||||
github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM=
|
github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM=
|
||||||
github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU=
|
github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU=
|
||||||
github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k=
|
github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k=
|
||||||
github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0=
|
github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0=
|
||||||
|
github.com/glebarez/go-sqlite v1.22.0 h1:uAcMJhaA6r3LHMTFgP0SifzgXg46yJkgxqyuyec+ruQ=
|
||||||
|
github.com/glebarez/go-sqlite v1.22.0/go.mod h1:PlBIdHe0+aUEFn+r2/uthrWq4FxbzugL0L8Li6yQJbc=
|
||||||
|
github.com/glebarez/sqlite v1.11.0 h1:wSG0irqzP6VurnMEpFGer5Li19RpIRi2qvQz++w0GMw=
|
||||||
|
github.com/glebarez/sqlite v1.11.0/go.mod h1:h8/o8j5wiAsqSPoWELDUdJXhjAhsVliSn7bWZjOhrgQ=
|
||||||
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
|
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
|
||||||
github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI=
|
github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI=
|
||||||
github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
|
github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
|
||||||
|
|
@ -49,8 +49,6 @@ github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre
|
||||||
github.com/go-sql-driver/mysql v1.9.2 h1:4cNKDYQ1I84SXslGddlsrMhc8k4LeDVj6Ad6WRjiHuU=
|
github.com/go-sql-driver/mysql v1.9.2 h1:4cNKDYQ1I84SXslGddlsrMhc8k4LeDVj6Ad6WRjiHuU=
|
||||||
github.com/go-sql-driver/mysql v1.9.2/go.mod h1:qn46aNg1333BRMNU69Lq93t8du/dwxI64Gl8i5p1WMU=
|
github.com/go-sql-driver/mysql v1.9.2/go.mod h1:qn46aNg1333BRMNU69Lq93t8du/dwxI64Gl8i5p1WMU=
|
||||||
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
|
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
|
||||||
github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw=
|
|
||||||
github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU=
|
|
||||||
github.com/gogf/gf/contrib/drivers/mysql/v2 v2.9.3 h1:P4jrnp+Vmh3kDeaH/kyHPI6rfoMmQD+sPJa716aMbS0=
|
github.com/gogf/gf/contrib/drivers/mysql/v2 v2.9.3 h1:P4jrnp+Vmh3kDeaH/kyHPI6rfoMmQD+sPJa716aMbS0=
|
||||||
github.com/gogf/gf/contrib/drivers/mysql/v2 v2.9.3/go.mod h1:yEhfx78wgpxUJhH9C9bWJ7I3JLcVCzUg11A4ORYTKeg=
|
github.com/gogf/gf/contrib/drivers/mysql/v2 v2.9.3/go.mod h1:yEhfx78wgpxUJhH9C9bWJ7I3JLcVCzUg11A4ORYTKeg=
|
||||||
github.com/gogf/gf/contrib/registry/etcd/v2 v2.9.3 h1:4ztKAHfwtddPRwxlVRRfLdJMzp42Z+9K5tFHrPPZl1Q=
|
github.com/gogf/gf/contrib/registry/etcd/v2 v2.9.3 h1:4ztKAHfwtddPRwxlVRRfLdJMzp42Z+9K5tFHrPPZl1Q=
|
||||||
|
|
@ -63,10 +61,17 @@ github.com/gogf/gf/v2 v2.9.3 h1:qjN4s55FfUzxZ1AE8vUHNDX3V0eIOUGXhF2DjRTVZQ4=
|
||||||
github.com/gogf/gf/v2 v2.9.3/go.mod h1:w6rcfD13SmO7FKI80k9LSLiSMGqpMYp50Nfkrrc2sEE=
|
github.com/gogf/gf/v2 v2.9.3/go.mod h1:w6rcfD13SmO7FKI80k9LSLiSMGqpMYp50Nfkrrc2sEE=
|
||||||
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
|
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
|
||||||
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
|
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
|
||||||
|
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||||
|
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||||
|
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
|
||||||
|
github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
|
||||||
github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
|
github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
|
||||||
github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
|
github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
|
||||||
github.com/google/flatbuffers v25.2.10+incompatible h1:F3vclr7C3HpB1k9mxCGRMXq6FdUalZ6H/pNX4FP1v0Q=
|
github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
|
||||||
github.com/google/flatbuffers v25.2.10+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8=
|
github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM=
|
||||||
|
github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
|
||||||
|
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||||
|
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
|
||||||
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
|
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
|
||||||
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
|
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
|
||||||
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
|
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
|
||||||
|
|
@ -81,8 +86,6 @@ github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=
|
||||||
github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
|
github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
|
||||||
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
|
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
|
||||||
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
|
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
|
||||||
github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo=
|
|
||||||
github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ=
|
|
||||||
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
|
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
|
||||||
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
|
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
|
||||||
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
|
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
|
||||||
|
|
@ -98,10 +101,10 @@ github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWE
|
||||||
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
|
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
|
||||||
github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc=
|
github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc=
|
||||||
github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
|
github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
|
||||||
|
github.com/ncruces/go-strftime v1.0.0 h1:HMFp8mLCTPp341M/ZnA4qaf7ZlsbTc+miZjCLOFAw7w=
|
||||||
|
github.com/ncruces/go-strftime v1.0.0/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls=
|
||||||
github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 h1:zYyBkD/k9seD2A7fsi6Oo2LfFZAehjjQMERAvZLEDnQ=
|
github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 h1:zYyBkD/k9seD2A7fsi6Oo2LfFZAehjjQMERAvZLEDnQ=
|
||||||
github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8=
|
github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8=
|
||||||
github.com/nutsdb/nutsdb v1.1.0 h1:fNGFzBHGqF2mB5BF8Qk8W94c3/ZzwdCdKAH7azwx70Y=
|
|
||||||
github.com/nutsdb/nutsdb v1.1.0/go.mod h1:aKCtgSprZf2Mp1dIQD00Iya3DttoTErSSOnRx5ZtpAs=
|
|
||||||
github.com/olekukonko/errors v1.1.0 h1:RNuGIh15QdDenh+hNvKrJkmxxjV4hcS50Db478Ou5sM=
|
github.com/olekukonko/errors v1.1.0 h1:RNuGIh15QdDenh+hNvKrJkmxxjV4hcS50Db478Ou5sM=
|
||||||
github.com/olekukonko/errors v1.1.0/go.mod h1:ppzxA5jBKcO1vIpCXQ9ZqgDh8iwODz6OXIGKU8r5m4Y=
|
github.com/olekukonko/errors v1.1.0/go.mod h1:ppzxA5jBKcO1vIpCXQ9ZqgDh8iwODz6OXIGKU8r5m4Y=
|
||||||
github.com/olekukonko/ll v0.0.9 h1:Y+1YqDfVkqMWuEQMclsF9HUR5+a82+dxJuL1HHSRpxI=
|
github.com/olekukonko/ll v0.0.9 h1:Y+1YqDfVkqMWuEQMclsF9HUR5+a82+dxJuL1HHSRpxI=
|
||||||
|
|
@ -113,6 +116,8 @@ github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
|
||||||
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
|
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE=
|
||||||
|
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo=
|
||||||
github.com/richardlehane/mscfb v1.0.4 h1:WULscsljNPConisD5hR0+OyZjwK46Pfyr6mPu5ZawpM=
|
github.com/richardlehane/mscfb v1.0.4 h1:WULscsljNPConisD5hR0+OyZjwK46Pfyr6mPu5ZawpM=
|
||||||
github.com/richardlehane/mscfb v1.0.4/go.mod h1:YzVpcZg9czvAuhk9T+a3avCpcFPMUWm7gK3DypaEsUk=
|
github.com/richardlehane/mscfb v1.0.4/go.mod h1:YzVpcZg9czvAuhk9T+a3avCpcFPMUWm7gK3DypaEsUk=
|
||||||
github.com/richardlehane/msoleps v1.0.1/go.mod h1:BWev5JBpU9Ko2WAgmZEuiz4/u3ZYTKbjLycmwiWUfWg=
|
github.com/richardlehane/msoleps v1.0.1/go.mod h1:BWev5JBpU9Ko2WAgmZEuiz4/u3ZYTKbjLycmwiWUfWg=
|
||||||
|
|
@ -124,16 +129,20 @@ github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUc
|
||||||
github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ=
|
github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ=
|
||||||
github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc=
|
github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc=
|
||||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
|
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
|
||||||
|
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
|
||||||
|
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
||||||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
||||||
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||||
|
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||||
|
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
|
||||||
|
github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
|
||||||
github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
|
github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
|
||||||
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
|
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
|
||||||
github.com/tidwall/btree v1.6.0 h1:LDZfKfQIBHGHWSwckhXI0RPSXzlo+KYdjK7FWSqOzzg=
|
|
||||||
github.com/tidwall/btree v1.6.0/go.mod h1:twD9XRA5jj9VUQGELzDO4HPQTNJsoWWfYEL+EUQ2cKY=
|
|
||||||
github.com/tiendc/go-deepcopy v1.6.0 h1:0UtfV/imoCwlLxVsyfUd4hNHnB3drXsfle+wzSCA5Wo=
|
github.com/tiendc/go-deepcopy v1.6.0 h1:0UtfV/imoCwlLxVsyfUd4hNHnB3drXsfle+wzSCA5Wo=
|
||||||
github.com/tiendc/go-deepcopy v1.6.0/go.mod h1:toXoeQoUqXOOS/X4sKuiAoSk6elIdqc0pN7MTgOOo2I=
|
github.com/tiendc/go-deepcopy v1.6.0/go.mod h1:toXoeQoUqXOOS/X4sKuiAoSk6elIdqc0pN7MTgOOo2I=
|
||||||
github.com/xujiajun/utils v0.0.0-20220904132955-5f7c5b914235 h1:w0si+uee0iAaCJO9q86T6yrhdadgcsoNuh47LrUykzg=
|
github.com/vmihailenco/msgpack v4.0.4+incompatible h1:dSLoQfGFAo3F6OoNhwUmLwVgaUXK79GlxNBwueZn0xI=
|
||||||
github.com/xujiajun/utils v0.0.0-20220904132955-5f7c5b914235/go.mod h1:MR4+0R6A9NS5IABnIM3384FfOq8QFVnm7WDrBOhIaMU=
|
github.com/vmihailenco/msgpack v4.0.4+incompatible/go.mod h1:fy3FlTQTDXWkZ7Bh6AcGMlsjHatGryHQYUTf1ShIgkk=
|
||||||
github.com/xuri/efp v0.0.1 h1:fws5Rv3myXyYni8uwj2qKjVaRP30PdjeYe2Y6FDsCL8=
|
github.com/xuri/efp v0.0.1 h1:fws5Rv3myXyYni8uwj2qKjVaRP30PdjeYe2Y6FDsCL8=
|
||||||
github.com/xuri/efp v0.0.1/go.mod h1:ybY/Jr0T0GTCnYjKqmdwxyxn2BQf2RcQIIvex5QldPI=
|
github.com/xuri/efp v0.0.1/go.mod h1:ybY/Jr0T0GTCnYjKqmdwxyxn2BQf2RcQIIvex5QldPI=
|
||||||
github.com/xuri/excelize/v2 v2.9.1 h1:VdSGk+rraGmgLHGFaGG9/9IWu1nj4ufjJ7uwMDtj8Qw=
|
github.com/xuri/excelize/v2 v2.9.1 h1:VdSGk+rraGmgLHGFaGG9/9IWu1nj4ufjJ7uwMDtj8Qw=
|
||||||
|
|
@ -143,6 +152,10 @@ github.com/xuri/nfp v0.0.1/go.mod h1:WwHg+CVyzlv/TX9xqBFXEZAuxOPxn2k1GNHwG41IIUQ
|
||||||
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||||
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||||
github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
|
github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
|
||||||
|
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
|
||||||
|
go.etcd.io/bbolt v1.3.4/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ=
|
||||||
|
go.etcd.io/bbolt v1.4.3 h1:dEadXpI6G79deX5prL3QRNP6JB8UxVkqo4UPnHaNXJo=
|
||||||
|
go.etcd.io/bbolt v1.4.3/go.mod h1:tKQlpPaYCVFctUIgFKFnAlvbmB3tpy1vkTnDWohtc0E=
|
||||||
go.etcd.io/etcd/api/v3 v3.5.17 h1:cQB8eb8bxwuxOilBpMJAEo8fAONyrdXTHUNcMd8yT1w=
|
go.etcd.io/etcd/api/v3 v3.5.17 h1:cQB8eb8bxwuxOilBpMJAEo8fAONyrdXTHUNcMd8yT1w=
|
||||||
go.etcd.io/etcd/api/v3 v3.5.17/go.mod h1:d1hvkRuXkts6PmaYk2Vrgqbv7H4ADfAKhyJqHNLJCB4=
|
go.etcd.io/etcd/api/v3 v3.5.17/go.mod h1:d1hvkRuXkts6PmaYk2Vrgqbv7H4ADfAKhyJqHNLJCB4=
|
||||||
go.etcd.io/etcd/client/pkg/v3 v3.5.17 h1:XxnDXAWq2pnxqx76ljWwiQ9jylbpC4rvkAeRVOUKKVw=
|
go.etcd.io/etcd/client/pkg/v3 v3.5.17 h1:XxnDXAWq2pnxqx76ljWwiQ9jylbpC4rvkAeRVOUKKVw=
|
||||||
|
|
@ -173,66 +186,93 @@ go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw=
|
||||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||||
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||||
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||||
|
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
||||||
golang.org/x/crypto v0.42.0 h1:chiH31gIWm57EkTXpwnqf8qeuMUi0yekh6mT2AvFlqI=
|
golang.org/x/crypto v0.42.0 h1:chiH31gIWm57EkTXpwnqf8qeuMUi0yekh6mT2AvFlqI=
|
||||||
golang.org/x/crypto v0.42.0/go.mod h1:4+rDnOTJhQCx2q7/j6rAN5XDw8kPjeaXEUR2eL94ix8=
|
golang.org/x/crypto v0.42.0/go.mod h1:4+rDnOTJhQCx2q7/j6rAN5XDw8kPjeaXEUR2eL94ix8=
|
||||||
golang.org/x/exp v0.0.0-20221208152030-732eee02a75a h1:4iLhBPcpqFmylhnkbY3W0ONLUYYkDAW9xMFLfxgsvCw=
|
golang.org/x/exp v0.0.0-20221208152030-732eee02a75a h1:4iLhBPcpqFmylhnkbY3W0ONLUYYkDAW9xMFLfxgsvCw=
|
||||||
golang.org/x/exp v0.0.0-20221208152030-732eee02a75a/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc=
|
golang.org/x/exp v0.0.0-20221208152030-732eee02a75a/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc=
|
||||||
|
golang.org/x/exp v0.0.0-20260218203240-3dfff04db8fa h1:Zt3DZoOFFYkKhDT3v7Lm9FDMEV06GpzjG2jrqW+QTE0=
|
||||||
|
golang.org/x/exp v0.0.0-20260218203240-3dfff04db8fa/go.mod h1:K79w1Vqn7PoiZn+TkNpx3BUWUQksGO3JcVX6qIjytmA=
|
||||||
golang.org/x/image v0.25.0 h1:Y6uW6rH1y5y/LK1J8BPWZtr6yZ7hrsy6hFrXjgsc2fQ=
|
golang.org/x/image v0.25.0 h1:Y6uW6rH1y5y/LK1J8BPWZtr6yZ7hrsy6hFrXjgsc2fQ=
|
||||||
golang.org/x/image v0.25.0/go.mod h1:tCAmOEGthTtkalusGp1g3xa2gke8J6c2N565dTyl9Rs=
|
golang.org/x/image v0.25.0/go.mod h1:tCAmOEGthTtkalusGp1g3xa2gke8J6c2N565dTyl9Rs=
|
||||||
golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
||||||
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||||
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||||
golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||||
|
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
|
||||||
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||||
|
golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
|
||||||
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
|
golang.org/x/net v0.0.0-20191105084925-a882066a44e0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
||||||
|
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
||||||
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
|
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
|
||||||
|
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
|
||||||
golang.org/x/net v0.44.0 h1:evd8IRDyfNBMBTTY5XRF1vaZlD+EmWx6x8PkhR04H/I=
|
golang.org/x/net v0.44.0 h1:evd8IRDyfNBMBTTY5XRF1vaZlD+EmWx6x8PkhR04H/I=
|
||||||
golang.org/x/net v0.44.0/go.mod h1:ECOoLqd5U3Lhyeyo/QDCEVQ4sNgYsqvCZ722XogGieY=
|
golang.org/x/net v0.44.0/go.mod h1:ECOoLqd5U3Lhyeyo/QDCEVQ4sNgYsqvCZ722XogGieY=
|
||||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
|
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.17.0 h1:l60nONMj9l5drqw6jlhIELNv9I0A4OFgRsG9k2oT9Ug=
|
golang.org/x/sync v0.17.0 h1:l60nONMj9l5drqw6jlhIELNv9I0A4OFgRsG9k2oT9Ug=
|
||||||
golang.org/x/sync v0.17.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI=
|
golang.org/x/sync v0.17.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI=
|
||||||
|
golang.org/x/sync v0.19.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI=
|
||||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.36.0 h1:KVRy2GtZBrk1cBYA7MKu5bEZFxQk4NIDV6RLVcC8o0k=
|
golang.org/x/sys v0.41.0 h1:Ivj+2Cp/ylzLiEU89QhWblYnOE9zerudt9Ftecq2C6k=
|
||||||
golang.org/x/sys v0.36.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
|
golang.org/x/sys v0.41.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
|
||||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||||
|
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
||||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
|
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
|
||||||
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||||
|
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
|
||||||
|
golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ=
|
||||||
golang.org/x/text v0.29.0 h1:1neNs90w9YzJ9BocxfsQNHKuAT4pkghyXc4nhZ6sJvk=
|
golang.org/x/text v0.29.0 h1:1neNs90w9YzJ9BocxfsQNHKuAT4pkghyXc4nhZ6sJvk=
|
||||||
golang.org/x/text v0.29.0/go.mod h1:7MhJOA9CD2qZyOKYazxdYMF85OwPdEr9jTtBpO7ydH4=
|
golang.org/x/text v0.29.0/go.mod h1:7MhJOA9CD2qZyOKYazxdYMF85OwPdEr9jTtBpO7ydH4=
|
||||||
|
golang.org/x/text v0.34.0 h1:oL/Qq0Kdaqxa1KbNeMKwQq0reLCCaFtqu2eNuSeNHbk=
|
||||||
|
golang.org/x/text v0.34.0/go.mod h1:homfLqTYRFyVYemLBFl5GgL/DWEiH5wcsQ5gSh1yziA=
|
||||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||||
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
||||||
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||||
golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
|
golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
|
||||||
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
|
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
|
||||||
golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
|
golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
|
||||||
|
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
|
||||||
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk=
|
gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk=
|
||||||
gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E=
|
gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E=
|
||||||
|
google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
|
||||||
|
google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM=
|
||||||
|
google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds=
|
||||||
google.golang.org/genproto/googleapis/api v0.0.0-20250804133106-a7a43d27e69b h1:ULiyYQ0FdsJhwwZUwbaXpZF5yUE3h+RA+gxvBu37ucc=
|
google.golang.org/genproto/googleapis/api v0.0.0-20250804133106-a7a43d27e69b h1:ULiyYQ0FdsJhwwZUwbaXpZF5yUE3h+RA+gxvBu37ucc=
|
||||||
google.golang.org/genproto/googleapis/api v0.0.0-20250804133106-a7a43d27e69b/go.mod h1:oDOGiMSXHL4sDTJvFvIB9nRQCGdLP1o/iVaqQK8zB+M=
|
google.golang.org/genproto/googleapis/api v0.0.0-20250804133106-a7a43d27e69b/go.mod h1:oDOGiMSXHL4sDTJvFvIB9nRQCGdLP1o/iVaqQK8zB+M=
|
||||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20250804133106-a7a43d27e69b h1:zPKJod4w6F1+nRGDI9ubnXYhU9NSWoFAijkHkUXeTK8=
|
google.golang.org/genproto/googleapis/rpc v0.0.0-20250804133106-a7a43d27e69b h1:zPKJod4w6F1+nRGDI9ubnXYhU9NSWoFAijkHkUXeTK8=
|
||||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20250804133106-a7a43d27e69b/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A=
|
google.golang.org/genproto/googleapis/rpc v0.0.0-20250804133106-a7a43d27e69b/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A=
|
||||||
google.golang.org/grpc v1.76.0 h1:UnVkv1+uMLYXoIz6o7chp59WfQUYA2ex/BXQ9rHZu7A=
|
google.golang.org/grpc v1.76.0 h1:UnVkv1+uMLYXoIz6o7chp59WfQUYA2ex/BXQ9rHZu7A=
|
||||||
google.golang.org/grpc v1.76.0/go.mod h1:Ju12QI8M6iQJtbcsV+awF5a4hfJMLi4X0JLo94ULZ6c=
|
google.golang.org/grpc v1.76.0/go.mod h1:Ju12QI8M6iQJtbcsV+awF5a4hfJMLi4X0JLo94ULZ6c=
|
||||||
|
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
|
||||||
|
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
|
||||||
google.golang.org/protobuf v1.36.7 h1:IgrO7UwFQGJdRNXH/sQux4R1Dj1WAKcLElzeeRaXV2A=
|
google.golang.org/protobuf v1.36.7 h1:IgrO7UwFQGJdRNXH/sQux4R1Dj1WAKcLElzeeRaXV2A=
|
||||||
google.golang.org/protobuf v1.36.7/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY=
|
google.golang.org/protobuf v1.36.7/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY=
|
||||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
|
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
|
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
|
||||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
|
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
|
||||||
gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc=
|
gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc=
|
||||||
|
|
@ -248,3 +288,11 @@ gorm.io/driver/mysql v1.6.0 h1:eNbLmNTpPpTOVZi8MMxCi2aaIm0ZpInbORNXDwyLGvg=
|
||||||
gorm.io/driver/mysql v1.6.0/go.mod h1:D/oCC2GWK3M/dqoLxnOlaNKmXz8WNTfcS9y5ovaSqKo=
|
gorm.io/driver/mysql v1.6.0/go.mod h1:D/oCC2GWK3M/dqoLxnOlaNKmXz8WNTfcS9y5ovaSqKo=
|
||||||
gorm.io/gorm v1.31.1 h1:7CA8FTFz/gRfgqgpeKIBcervUn3xSyPUmr6B2WXJ7kg=
|
gorm.io/gorm v1.31.1 h1:7CA8FTFz/gRfgqgpeKIBcervUn3xSyPUmr6B2WXJ7kg=
|
||||||
gorm.io/gorm v1.31.1/go.mod h1:XyQVbO2k6YkOis7C2437jSit3SsDK72s7n7rsSHd+Gs=
|
gorm.io/gorm v1.31.1/go.mod h1:XyQVbO2k6YkOis7C2437jSit3SsDK72s7n7rsSHd+Gs=
|
||||||
|
modernc.org/libc v1.68.0 h1:PJ5ikFOV5pwpW+VqCK1hKJuEWsonkIJhhIXyuF/91pQ=
|
||||||
|
modernc.org/libc v1.68.0/go.mod h1:NnKCYeoYgsEqnY3PgvNgAeaJnso968ygU8Z0DxjoEc0=
|
||||||
|
modernc.org/mathutil v1.7.1 h1:GCZVGXdaN8gTqB1Mf/usp1Y/hSqgI2vAGGP4jZMCxOU=
|
||||||
|
modernc.org/mathutil v1.7.1/go.mod h1:4p5IwJITfppl0G4sUEDtCr4DthTaT47/N3aT6MhfgJg=
|
||||||
|
modernc.org/memory v1.11.0 h1:o4QC8aMQzmcwCK3t3Ux/ZHmwFPzE6hf2Y5LbkRs+hbI=
|
||||||
|
modernc.org/memory v1.11.0/go.mod h1:/JP4VbVC+K5sU2wZi9bHoq2MAkCnrt2r98UGeSK7Mjw=
|
||||||
|
modernc.org/sqlite v1.46.1 h1:eFJ2ShBLIEnUWlLy12raN0Z1plqmFX9Qe3rjQTKt6sU=
|
||||||
|
modernc.org/sqlite v1.46.1/go.mod h1:CzbrU2lSB1DKUusvwGz7rqEKIq+NUd8GWuBBZDs9/nA=
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,25 @@
|
||||||
|
package pool
|
||||||
|
|
||||||
|
import (
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
// ConnType 连接类型
|
||||||
|
type ConnType string
|
||||||
|
|
||||||
|
const (
|
||||||
|
ConnTypeWebSocket ConnType = "websocket"
|
||||||
|
ConnTypeTCP ConnType = "tcp"
|
||||||
|
)
|
||||||
|
|
||||||
|
// ConnectionInfo 连接信息
|
||||||
|
type ConnectionInfo struct {
|
||||||
|
ID string `json:"id" gorm:"primaryKey"`
|
||||||
|
Type ConnType `json:"type" gorm:"index"`
|
||||||
|
Address string `json:"address"`
|
||||||
|
IsActive bool `json:"isActive" gorm:"index"`
|
||||||
|
LastUsed time.Time `json:"lastUsed"`
|
||||||
|
CreatedAt time.Time `json:"createdAt"`
|
||||||
|
// 额外的连接数据,根据不同类型存储不同的信息
|
||||||
|
Data map[string]interface{} `json:"data" gorm:"-"`
|
||||||
|
}
|
||||||
332
pool/nutsdb.go
332
pool/nutsdb.go
|
|
@ -1,332 +0,0 @@
|
||||||
package pool
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"encoding/json"
|
|
||||||
"fmt"
|
|
||||||
"sync"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/gogf/gf/v2/os/gfile"
|
|
||||||
"github.com/nutsdb/nutsdb"
|
|
||||||
)
|
|
||||||
|
|
||||||
// ConnType 连接类型
|
|
||||||
type ConnType string
|
|
||||||
|
|
||||||
const (
|
|
||||||
ConnTypeWebSocket ConnType = "websocket"
|
|
||||||
ConnTypeTCP ConnType = "tcp"
|
|
||||||
)
|
|
||||||
|
|
||||||
// ConnectionInfo 连接信息
|
|
||||||
type ConnectionInfo struct {
|
|
||||||
ID string `json:"id"`
|
|
||||||
Type ConnType `json:"type"`
|
|
||||||
Address string `json:"address"`
|
|
||||||
IsActive bool `json:"isActive"`
|
|
||||||
LastUsed time.Time `json:"lastUsed"`
|
|
||||||
CreatedAt time.Time `json:"createdAt"`
|
|
||||||
// 额外的连接数据,根据不同类型存储不同的信息
|
|
||||||
Data map[string]interface{} `json:"data"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// NutsPool NutsDB连接池
|
|
||||||
type NutsPool struct {
|
|
||||||
db *nutsdb.DB
|
|
||||||
bucket string
|
|
||||||
mutex sync.RWMutex
|
|
||||||
ctx context.Context
|
|
||||||
cancel context.CancelFunc
|
|
||||||
// 内存缓存,提高并发性能
|
|
||||||
cache map[string]*ConnectionInfo
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewNutsPool 创建NutsDB连接池
|
|
||||||
func NewNutsPool() (*NutsPool, error) {
|
|
||||||
ctx, cancel := context.WithCancel(context.Background())
|
|
||||||
|
|
||||||
// 使用当前运行项目的根目录的nuts文件夹作为存储路径,并添加时间戳以避免锁定问题
|
|
||||||
dir := gfile.Pwd() + "/nuts"
|
|
||||||
|
|
||||||
// 打开NutsDB
|
|
||||||
db, err := nutsdb.Open(
|
|
||||||
nutsdb.DefaultOptions,
|
|
||||||
nutsdb.WithDir(dir),
|
|
||||||
)
|
|
||||||
if err != nil {
|
|
||||||
cancel()
|
|
||||||
return nil, fmt.Errorf("failed to open nutsdb: %w", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
return &NutsPool{
|
|
||||||
db: db,
|
|
||||||
bucket: "connections",
|
|
||||||
ctx: ctx,
|
|
||||||
cancel: cancel,
|
|
||||||
cache: make(map[string]*ConnectionInfo),
|
|
||||||
}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Close 关闭连接池
|
|
||||||
func (p *NutsPool) Close() error {
|
|
||||||
p.cancel()
|
|
||||||
return p.db.Close()
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add 添加连接
|
|
||||||
func (p *NutsPool) Add(conn *ConnectionInfo) error {
|
|
||||||
p.mutex.Lock()
|
|
||||||
defer p.mutex.Unlock()
|
|
||||||
|
|
||||||
// 序列化连接信息
|
|
||||||
data, err := json.Marshal(conn)
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("failed to marshal connection info: %w", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// 存储到NutsDB
|
|
||||||
err = p.db.Update(func(tx *nutsdb.Tx) error {
|
|
||||||
return tx.Put(p.bucket, []byte(conn.ID), data, 0)
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("failed to store connection: %w", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// 更新内存缓存
|
|
||||||
p.cache[conn.ID] = conn
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get 获取连接
|
|
||||||
func (p *NutsPool) Get(connID string) (*ConnectionInfo, error) {
|
|
||||||
p.mutex.RLock()
|
|
||||||
// 先从内存缓存获取
|
|
||||||
if conn, ok := p.cache[connID]; ok {
|
|
||||||
p.mutex.RUnlock()
|
|
||||||
return conn, nil
|
|
||||||
}
|
|
||||||
p.mutex.RUnlock()
|
|
||||||
|
|
||||||
// 从NutsDB获取
|
|
||||||
var connInfo ConnectionInfo
|
|
||||||
err := p.db.View(func(tx *nutsdb.Tx) error {
|
|
||||||
data, err := tx.Get(p.bucket, []byte(connID))
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return json.Unmarshal(data, &connInfo)
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
if err == nutsdb.ErrKeyNotFound {
|
|
||||||
return nil, nil
|
|
||||||
}
|
|
||||||
return nil, fmt.Errorf("failed to get connection: %w", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// 更新内存缓存
|
|
||||||
p.mutex.Lock()
|
|
||||||
p.cache[connID] = &connInfo
|
|
||||||
p.mutex.Unlock()
|
|
||||||
|
|
||||||
return &connInfo, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Remove 移除连接
|
|
||||||
func (p *NutsPool) Remove(connID string) error {
|
|
||||||
p.mutex.Lock()
|
|
||||||
defer p.mutex.Unlock()
|
|
||||||
|
|
||||||
// 从NutsDB删除
|
|
||||||
err := p.db.Update(func(tx *nutsdb.Tx) error {
|
|
||||||
return tx.Delete(p.bucket, []byte(connID))
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("failed to remove connection: %w", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// 从内存缓存删除
|
|
||||||
delete(p.cache, connID)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Update 更新连接信息
|
|
||||||
func (p *NutsPool) Update(conn *ConnectionInfo) error {
|
|
||||||
p.mutex.Lock()
|
|
||||||
defer p.mutex.Unlock()
|
|
||||||
|
|
||||||
// 序列化连接信息
|
|
||||||
data, err := json.Marshal(conn)
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("failed to marshal connection info: %w", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// 存储到NutsDB
|
|
||||||
err = p.db.Update(func(tx *nutsdb.Tx) error {
|
|
||||||
return tx.Put(p.bucket, []byte(conn.ID), data, 0)
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("failed to update connection: %w", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// 更新内存缓存
|
|
||||||
p.cache[conn.ID] = conn
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetAll 获取所有连接
|
|
||||||
func (p *NutsPool) GetAll() ([]*ConnectionInfo, error) {
|
|
||||||
p.mutex.RLock()
|
|
||||||
// 如果内存缓存不为空,直接返回缓存
|
|
||||||
if len(p.cache) > 0 {
|
|
||||||
conns := make([]*ConnectionInfo, 0, len(p.cache))
|
|
||||||
for _, conn := range p.cache {
|
|
||||||
conns = append(conns, conn)
|
|
||||||
}
|
|
||||||
p.mutex.RUnlock()
|
|
||||||
return conns, nil
|
|
||||||
}
|
|
||||||
p.mutex.RUnlock()
|
|
||||||
|
|
||||||
// 从NutsDB获取所有连接
|
|
||||||
var conns []*ConnectionInfo
|
|
||||||
err := p.db.View(func(tx *nutsdb.Tx) error {
|
|
||||||
keys, _, err := tx.GetAll(p.bucket)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
for _, key := range keys {
|
|
||||||
val, err := tx.Get(p.bucket, key)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
var connInfo ConnectionInfo
|
|
||||||
if err := json.Unmarshal(val, &connInfo); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
conns = append(conns, &connInfo)
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
return nil, fmt.Errorf("failed to get all connections: %w", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// 更新内存缓存
|
|
||||||
p.mutex.Lock()
|
|
||||||
for _, conn := range conns {
|
|
||||||
p.cache[conn.ID] = conn
|
|
||||||
}
|
|
||||||
p.mutex.Unlock()
|
|
||||||
|
|
||||||
return conns, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetByType 根据类型获取连接
|
|
||||||
func (p *NutsPool) GetByType(connType ConnType) ([]*ConnectionInfo, error) {
|
|
||||||
allConns, err := p.GetAll()
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
var filtered []*ConnectionInfo
|
|
||||||
for _, conn := range allConns {
|
|
||||||
if conn.Type == connType {
|
|
||||||
filtered = append(filtered, conn)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return filtered, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Count 获取连接数量
|
|
||||||
func (p *NutsPool) Count() (int, error) {
|
|
||||||
p.mutex.RLock()
|
|
||||||
// 如果内存缓存不为空,直接返回缓存大小
|
|
||||||
if len(p.cache) > 0 {
|
|
||||||
count := len(p.cache)
|
|
||||||
p.mutex.RUnlock()
|
|
||||||
return count, nil
|
|
||||||
}
|
|
||||||
p.mutex.RUnlock()
|
|
||||||
|
|
||||||
// 从NutsDB统计数量
|
|
||||||
var count int
|
|
||||||
err := p.db.View(func(tx *nutsdb.Tx) error {
|
|
||||||
entries, _, err := tx.GetAll(p.bucket)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
count = len(entries)
|
|
||||||
return nil
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
return 0, fmt.Errorf("failed to count connections: %w", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
return count, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetAllConnIDs 获取所有在线连接的ID列表
|
|
||||||
func (p *NutsPool) GetAllConnIDs() ([]string, error) {
|
|
||||||
p.mutex.RLock()
|
|
||||||
// 如果内存缓存不为空,从缓存中提取在线连接的ID
|
|
||||||
if len(p.cache) > 0 {
|
|
||||||
ids := make([]string, 0, len(p.cache))
|
|
||||||
for id, conn := range p.cache {
|
|
||||||
if conn.IsActive {
|
|
||||||
ids = append(ids, id)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
p.mutex.RUnlock()
|
|
||||||
return ids, nil
|
|
||||||
}
|
|
||||||
p.mutex.RUnlock()
|
|
||||||
|
|
||||||
// 从NutsDB获取所有在线连接的ID
|
|
||||||
var ids []string
|
|
||||||
err := p.db.View(func(tx *nutsdb.Tx) error {
|
|
||||||
keys, _, err := tx.GetAll(p.bucket)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
for _, key := range keys {
|
|
||||||
val, err := tx.Get(p.bucket, key)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
var connInfo ConnectionInfo
|
|
||||||
if err := json.Unmarshal(val, &connInfo); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if connInfo.IsActive {
|
|
||||||
ids = append(ids, string(key))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
return nil, fmt.Errorf("failed to get all connection IDs: %w", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
return ids, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// CleanupInactive 清理不活跃的连接
|
|
||||||
func (p *NutsPool) CleanupInactive(duration time.Duration) error {
|
|
||||||
allConns, err := p.GetAll()
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
now := time.Now()
|
|
||||||
for _, conn := range allConns {
|
|
||||||
if !conn.IsActive || now.Sub(conn.LastUsed) > duration {
|
|
||||||
if err := p.Remove(conn.ID); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
@ -0,0 +1,247 @@
|
||||||
|
package pool
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"fmt"
|
||||||
|
"sync"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"git.magicany.cc/black1552/gf-common/db"
|
||||||
|
"gorm.io/gorm"
|
||||||
|
)
|
||||||
|
|
||||||
|
// SQLitePool SQLite连接池
|
||||||
|
type SQLitePool struct {
|
||||||
|
db *gorm.DB
|
||||||
|
mutex sync.RWMutex
|
||||||
|
ctx context.Context
|
||||||
|
cancel context.CancelFunc
|
||||||
|
// 内存缓存,提高并发性能
|
||||||
|
cache map[string]*ConnectionInfo
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewSQLitePool 创建SQLite连接池
|
||||||
|
func NewSQLitePool() (*SQLitePool, error) {
|
||||||
|
ctx, cancel := context.WithCancel(context.Background())
|
||||||
|
|
||||||
|
// 检查数据库连接是否正常
|
||||||
|
if db.Db == nil {
|
||||||
|
return nil, fmt.Errorf("database connection is not initialized")
|
||||||
|
}
|
||||||
|
|
||||||
|
// 自动迁移ConnectionInfo模型
|
||||||
|
err := db.Db.AutoMigrate(&ConnectionInfo{})
|
||||||
|
if err != nil {
|
||||||
|
cancel()
|
||||||
|
return nil, fmt.Errorf("failed to migrate connection info model: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return &SQLitePool{
|
||||||
|
db: db.Db,
|
||||||
|
ctx: ctx,
|
||||||
|
cancel: cancel,
|
||||||
|
cache: make(map[string]*ConnectionInfo),
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Close 关闭连接池
|
||||||
|
func (p *SQLitePool) Close() error {
|
||||||
|
p.cancel()
|
||||||
|
// SQLite连接由db包管理,不需要在这里关闭
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add 添加连接
|
||||||
|
func (p *SQLitePool) Add(conn *ConnectionInfo) error {
|
||||||
|
p.mutex.Lock()
|
||||||
|
defer p.mutex.Unlock()
|
||||||
|
|
||||||
|
// 存储到SQLite
|
||||||
|
result := p.db.Create(conn)
|
||||||
|
if result.Error != nil {
|
||||||
|
return fmt.Errorf("failed to store connection: %w", result.Error)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 更新内存缓存
|
||||||
|
p.cache[conn.ID] = conn
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get 获取连接
|
||||||
|
func (p *SQLitePool) Get(connID string) (*ConnectionInfo, error) {
|
||||||
|
p.mutex.RLock()
|
||||||
|
// 先从内存缓存获取
|
||||||
|
if conn, ok := p.cache[connID]; ok {
|
||||||
|
p.mutex.RUnlock()
|
||||||
|
return conn, nil
|
||||||
|
}
|
||||||
|
p.mutex.RUnlock()
|
||||||
|
|
||||||
|
// 从SQLite获取
|
||||||
|
var connInfo ConnectionInfo
|
||||||
|
result := p.db.First(&connInfo, "id = ?", connID)
|
||||||
|
if result.Error != nil {
|
||||||
|
if result.Error == gorm.ErrRecordNotFound {
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
return nil, fmt.Errorf("failed to get connection: %w", result.Error)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 更新内存缓存
|
||||||
|
p.mutex.Lock()
|
||||||
|
p.cache[connID] = &connInfo
|
||||||
|
p.mutex.Unlock()
|
||||||
|
|
||||||
|
return &connInfo, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Remove 移除连接
|
||||||
|
func (p *SQLitePool) Remove(connID string) error {
|
||||||
|
p.mutex.Lock()
|
||||||
|
defer p.mutex.Unlock()
|
||||||
|
|
||||||
|
// 从SQLite删除
|
||||||
|
result := p.db.Delete(&ConnectionInfo{}, "id = ?", connID)
|
||||||
|
if result.Error != nil {
|
||||||
|
return fmt.Errorf("failed to remove connection: %w", result.Error)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 从内存缓存删除
|
||||||
|
delete(p.cache, connID)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update 更新连接信息
|
||||||
|
func (p *SQLitePool) Update(conn *ConnectionInfo) error {
|
||||||
|
p.mutex.Lock()
|
||||||
|
defer p.mutex.Unlock()
|
||||||
|
|
||||||
|
// 存储到SQLite
|
||||||
|
result := p.db.Save(conn)
|
||||||
|
if result.Error != nil {
|
||||||
|
return fmt.Errorf("failed to update connection: %w", result.Error)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 更新内存缓存
|
||||||
|
p.cache[conn.ID] = conn
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetAll 获取所有连接
|
||||||
|
func (p *SQLitePool) GetAll() ([]*ConnectionInfo, error) {
|
||||||
|
p.mutex.RLock()
|
||||||
|
// 如果内存缓存不为空,直接返回缓存
|
||||||
|
if len(p.cache) > 0 {
|
||||||
|
conns := make([]*ConnectionInfo, 0, len(p.cache))
|
||||||
|
for _, conn := range p.cache {
|
||||||
|
conns = append(conns, conn)
|
||||||
|
}
|
||||||
|
p.mutex.RUnlock()
|
||||||
|
return conns, nil
|
||||||
|
}
|
||||||
|
p.mutex.RUnlock()
|
||||||
|
|
||||||
|
// 从SQLite获取所有连接
|
||||||
|
var conns []*ConnectionInfo
|
||||||
|
result := p.db.Find(&conns)
|
||||||
|
if result.Error != nil {
|
||||||
|
return nil, fmt.Errorf("failed to get all connections: %w", result.Error)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 更新内存缓存
|
||||||
|
p.mutex.Lock()
|
||||||
|
for _, conn := range conns {
|
||||||
|
p.cache[conn.ID] = conn
|
||||||
|
}
|
||||||
|
p.mutex.Unlock()
|
||||||
|
|
||||||
|
return conns, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetByType 根据类型获取连接
|
||||||
|
func (p *SQLitePool) GetByType(connType ConnType) ([]*ConnectionInfo, error) {
|
||||||
|
allConns, err := p.GetAll()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
var filtered []*ConnectionInfo
|
||||||
|
for _, conn := range allConns {
|
||||||
|
if conn.Type == connType {
|
||||||
|
filtered = append(filtered, conn)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return filtered, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Count 获取连接数量
|
||||||
|
func (p *SQLitePool) Count() (int, error) {
|
||||||
|
p.mutex.RLock()
|
||||||
|
// 如果内存缓存不为空,直接返回缓存大小
|
||||||
|
if len(p.cache) > 0 {
|
||||||
|
count := len(p.cache)
|
||||||
|
p.mutex.RUnlock()
|
||||||
|
return count, nil
|
||||||
|
}
|
||||||
|
p.mutex.RUnlock()
|
||||||
|
|
||||||
|
// 从SQLite统计数量
|
||||||
|
var count int64
|
||||||
|
result := p.db.Model(&ConnectionInfo{}).Count(&count)
|
||||||
|
if result.Error != nil {
|
||||||
|
return 0, fmt.Errorf("failed to count connections: %w", result.Error)
|
||||||
|
}
|
||||||
|
|
||||||
|
return int(count), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetAllConnIDs 获取所有在线连接的ID列表
|
||||||
|
func (p *SQLitePool) GetAllConnIDs() ([]string, error) {
|
||||||
|
p.mutex.RLock()
|
||||||
|
// 如果内存缓存不为空,从缓存中提取在线连接的ID
|
||||||
|
if len(p.cache) > 0 {
|
||||||
|
ids := make([]string, 0, len(p.cache))
|
||||||
|
for id, conn := range p.cache {
|
||||||
|
if conn.IsActive {
|
||||||
|
ids = append(ids, id)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
p.mutex.RUnlock()
|
||||||
|
return ids, nil
|
||||||
|
}
|
||||||
|
p.mutex.RUnlock()
|
||||||
|
|
||||||
|
// 从SQLite获取所有在线连接的ID
|
||||||
|
var conns []*ConnectionInfo
|
||||||
|
result := p.db.Where("is_active = ?", true).Find(&conns)
|
||||||
|
if result.Error != nil {
|
||||||
|
return nil, fmt.Errorf("failed to get all connection IDs: %w", result.Error)
|
||||||
|
}
|
||||||
|
|
||||||
|
ids := make([]string, 0, len(conns))
|
||||||
|
for _, conn := range conns {
|
||||||
|
ids = append(ids, conn.ID)
|
||||||
|
}
|
||||||
|
|
||||||
|
return ids, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// CleanupInactive 清理不活跃的连接
|
||||||
|
func (p *SQLitePool) CleanupInactive(duration time.Duration) error {
|
||||||
|
allConns, err := p.GetAll()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
now := time.Now()
|
||||||
|
for _, conn := range allConns {
|
||||||
|
if !conn.IsActive || now.Sub(conn.LastUsed) > duration {
|
||||||
|
if err := p.Remove(conn.ID); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
@ -85,7 +85,7 @@ func TestWebSocket() {
|
||||||
}
|
}
|
||||||
log.Println("2. 管理器创建成功")
|
log.Println("2. 管理器创建成功")
|
||||||
log.Println("3. 获取在线连接数")
|
log.Println("3. 获取在线连接数")
|
||||||
count, err := m.nutsPool.Count()
|
count, err := m.sqlitePool.Count()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Printf("获取在线连接数失败:%v", err)
|
log.Printf("获取在线连接数失败:%v", err)
|
||||||
} else {
|
} else {
|
||||||
|
|
|
||||||
|
|
@ -94,7 +94,7 @@ type Manager struct {
|
||||||
config *Config // 配置
|
config *Config // 配置
|
||||||
upgrader *websocket.Upgrader // HTTP升级器
|
upgrader *websocket.Upgrader // HTTP升级器
|
||||||
connections map[string]*Connection // 内存中的连接(connID -> Connection)
|
connections map[string]*Connection // 内存中的连接(connID -> Connection)
|
||||||
nutsPool *pool.NutsPool // NutsDB连接池
|
sqlitePool *pool.SQLitePool // SQLite连接池
|
||||||
mutex sync.RWMutex // 读写锁(保护connections)
|
mutex sync.RWMutex // 读写锁(保护connections)
|
||||||
// 业务回调:收到消息时触发(用户自定义处理逻辑)
|
// 业务回调:收到消息时触发(用户自定义处理逻辑)
|
||||||
OnMessage func(connID string, msgType int, data any)
|
OnMessage func(connID string, msgType int, data any)
|
||||||
|
|
@ -155,11 +155,11 @@ func NewManager(config *Config) (*Manager, error) {
|
||||||
finalConfig := defaultConfig.Merge(config)
|
finalConfig := defaultConfig.Merge(config)
|
||||||
// 初始化升级器
|
// 初始化升级器
|
||||||
upgrader := &websocket.Upgrader{
|
upgrader := &websocket.Upgrader{
|
||||||
ReadBufferSize: config.ReadBufferSize,
|
ReadBufferSize: finalConfig.ReadBufferSize,
|
||||||
WriteBufferSize: config.WriteBufferSize,
|
WriteBufferSize: finalConfig.WriteBufferSize,
|
||||||
CheckOrigin: func(r *http.Request) bool {
|
CheckOrigin: func(r *http.Request) bool {
|
||||||
// 跨域检查
|
// 跨域检查
|
||||||
if config.AllowAllOrigins {
|
if finalConfig.AllowAllOrigins {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
origin := r.Header.Get("Origin")
|
origin := r.Header.Get("Origin")
|
||||||
|
|
@ -172,17 +172,17 @@ func NewManager(config *Config) (*Manager, error) {
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
// 初始化NutsDB连接池
|
// 初始化SQLite连接池
|
||||||
nutsPool, err := pool.NewNutsPool()
|
sqlitePool, err := pool.NewSQLitePool()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("failed to create nuts pool: %w", err)
|
return nil, fmt.Errorf("failed to create sqlite pool: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return &Manager{
|
return &Manager{
|
||||||
config: finalConfig,
|
config: finalConfig,
|
||||||
upgrader: upgrader,
|
upgrader: upgrader,
|
||||||
connections: make(map[string]*Connection),
|
connections: make(map[string]*Connection),
|
||||||
nutsPool: nutsPool,
|
sqlitePool: sqlitePool,
|
||||||
mutex: sync.RWMutex{},
|
mutex: sync.RWMutex{},
|
||||||
// 默认回调(用户可覆盖)
|
// 默认回调(用户可覆盖)
|
||||||
OnMessage: func(connID string, msgType int, data any) {
|
OnMessage: func(connID string, msgType int, data any) {
|
||||||
|
|
@ -246,7 +246,7 @@ func (m *Manager) Upgrade(w http.ResponseWriter, r *http.Request, connID string)
|
||||||
m.connections[connID] = wsConn
|
m.connections[connID] = wsConn
|
||||||
m.mutex.Unlock()
|
m.mutex.Unlock()
|
||||||
|
|
||||||
// 存储到NutsDB
|
// 存储到SQLite
|
||||||
connInfo := &pool.ConnectionInfo{
|
connInfo := &pool.ConnectionInfo{
|
||||||
ID: connID,
|
ID: connID,
|
||||||
Type: pool.ConnTypeWebSocket,
|
Type: pool.ConnTypeWebSocket,
|
||||||
|
|
@ -259,8 +259,8 @@ func (m *Manager) Upgrade(w http.ResponseWriter, r *http.Request, connID string)
|
||||||
"userAgent": r.Header.Get("User-Agent"),
|
"userAgent": r.Header.Get("User-Agent"),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
if err := m.nutsPool.Add(connInfo); err != nil {
|
if err := m.sqlitePool.Add(connInfo); err != nil {
|
||||||
log.Printf("[错误] 存储连接到NutsDB失败:%v", err)
|
log.Printf("[错误] 存储连接到SQLite失败:%v", err)
|
||||||
// 不影响连接建立,仅记录错误
|
// 不影响连接建立,仅记录错误
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -311,12 +311,12 @@ func (c *Connection) ReadPump() {
|
||||||
|
|
||||||
// 更新最后使用时间
|
// 更新最后使用时间
|
||||||
now := time.Now()
|
now := time.Now()
|
||||||
// 从NutsDB获取连接信息并更新
|
// 从SQLite获取连接信息并更新
|
||||||
connInfo, err := c.manager.nutsPool.Get(c.connID)
|
connInfo, err := c.manager.sqlitePool.Get(c.connID)
|
||||||
if err == nil && connInfo != nil {
|
if err == nil && connInfo != nil {
|
||||||
connInfo.LastUsed = now
|
connInfo.LastUsed = now
|
||||||
if err := c.manager.nutsPool.Update(connInfo); err != nil {
|
if err := c.manager.sqlitePool.Update(connInfo); err != nil {
|
||||||
log.Printf("[错误] 更新NutsDB连接信息失败:%v", err)
|
log.Printf("[错误] 更新SQLite连接信息失败:%v", err)
|
||||||
// 不影响消息处理,仅记录错误
|
// 不影响消息处理,仅记录错误
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -411,12 +411,12 @@ func (c *Connection) Send(data []byte) error {
|
||||||
|
|
||||||
// 更新最后使用时间
|
// 更新最后使用时间
|
||||||
now := time.Now()
|
now := time.Now()
|
||||||
// 从NutsDB获取连接信息并更新
|
// 从SQLite获取连接信息并更新
|
||||||
connInfo, err := c.manager.nutsPool.Get(c.connID)
|
connInfo, err := c.manager.sqlitePool.Get(c.connID)
|
||||||
if err == nil && connInfo != nil {
|
if err == nil && connInfo != nil {
|
||||||
connInfo.LastUsed = now
|
connInfo.LastUsed = now
|
||||||
if err := c.manager.nutsPool.Update(connInfo); err != nil {
|
if err := c.manager.sqlitePool.Update(connInfo); err != nil {
|
||||||
log.Printf("[错误] 更新NutsDB连接信息失败:%v", err)
|
log.Printf("[错误] 更新SQLite连接信息失败:%v", err)
|
||||||
// 不影响消息发送,仅记录错误
|
// 不影响消息发送,仅记录错误
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -446,9 +446,9 @@ func (c *Connection) Close(err error) {
|
||||||
delete(c.manager.connections, c.connID)
|
delete(c.manager.connections, c.connID)
|
||||||
c.manager.mutex.Unlock()
|
c.manager.mutex.Unlock()
|
||||||
|
|
||||||
// 从NutsDB移除
|
// 从SQLite移除
|
||||||
if err := c.manager.nutsPool.Remove(c.connID); err != nil {
|
if err := c.manager.sqlitePool.Remove(c.connID); err != nil {
|
||||||
log.Printf("[错误] 从NutsDB移除连接失败:%v", err)
|
log.Printf("[错误] 从SQLite移除连接失败:%v", err)
|
||||||
// 不影响连接关闭,仅记录错误
|
// 不影响连接关闭,仅记录错误
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -529,7 +529,7 @@ func (m *Manager) GetConn(connID string) *Connection {
|
||||||
|
|
||||||
// GetAllConnIDs 获取所有在线连接的ID列表
|
// GetAllConnIDs 获取所有在线连接的ID列表
|
||||||
func (m *Manager) GetAllConnIDs() ([]string, error) {
|
func (m *Manager) GetAllConnIDs() ([]string, error) {
|
||||||
return m.nutsPool.GetAllConnIDs()
|
return m.sqlitePool.GetAllConnIDs()
|
||||||
}
|
}
|
||||||
|
|
||||||
// CloseAll 关闭所有连接
|
// CloseAll 关闭所有连接
|
||||||
|
|
@ -555,9 +555,9 @@ func (m *Manager) CloseAll() {
|
||||||
func (m *Manager) Close() error {
|
func (m *Manager) Close() error {
|
||||||
// 关闭所有连接
|
// 关闭所有连接
|
||||||
m.CloseAll()
|
m.CloseAll()
|
||||||
// 关闭NutsDB连接池
|
// 关闭SQLite连接池
|
||||||
if m.nutsPool != nil {
|
if m.sqlitePool != nil {
|
||||||
return m.nutsPool.Close()
|
return m.sqlitePool.Close()
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
|
||||||
52
tcp/tcp.go
52
tcp/tcp.go
|
|
@ -33,7 +33,7 @@ type TCPServer struct {
|
||||||
// ConnectionPool 连接池结构
|
// ConnectionPool 连接池结构
|
||||||
type ConnectionPool struct {
|
type ConnectionPool struct {
|
||||||
connections map[string]*TcpConnection
|
connections map[string]*TcpConnection
|
||||||
nutsPool *pool.NutsPool
|
sqlitePool *pool.SQLitePool
|
||||||
mutex sync.RWMutex
|
mutex sync.RWMutex
|
||||||
config *TcpPoolConfig
|
config *TcpPoolConfig
|
||||||
logger *glog.Logger
|
logger *glog.Logger
|
||||||
|
|
@ -44,15 +44,15 @@ func NewTCPServer(address string, config *TcpPoolConfig) (*TCPServer, error) {
|
||||||
logger := g.Log(address)
|
logger := g.Log(address)
|
||||||
ctx, cancel := context.WithCancel(context.Background())
|
ctx, cancel := context.WithCancel(context.Background())
|
||||||
|
|
||||||
// 初始化NutsDB连接池
|
// 初始化SQLite连接池
|
||||||
nutsPool, err := pool.NewNutsPool()
|
sqlitePool, err := pool.NewSQLitePool()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("failed to create nuts pool: %w", err)
|
return nil, fmt.Errorf("failed to create sqlite pool: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
pool := &ConnectionPool{
|
pool := &ConnectionPool{
|
||||||
connections: make(map[string]*TcpConnection),
|
connections: make(map[string]*TcpConnection),
|
||||||
nutsPool: nutsPool,
|
sqlitePool: sqlitePool,
|
||||||
config: config,
|
config: config,
|
||||||
logger: logger,
|
logger: logger,
|
||||||
}
|
}
|
||||||
|
|
@ -95,9 +95,9 @@ func (s *TCPServer) Stop() error {
|
||||||
s.Listener.Close()
|
s.Listener.Close()
|
||||||
s.wg.Wait()
|
s.wg.Wait()
|
||||||
s.Connection.Clear()
|
s.Connection.Clear()
|
||||||
// 关闭NutsDB连接池
|
// 关闭SQLite连接池
|
||||||
if err := s.Connection.nutsPool.Close(); err != nil {
|
if err := s.Connection.sqlitePool.Close(); err != nil {
|
||||||
s.Logger.Error(s.ctx, fmt.Sprintf("Failed to close NutsDB pool: %v", err))
|
s.Logger.Error(s.ctx, fmt.Sprintf("Failed to close SQLite pool: %v", err))
|
||||||
// 不影响服务器停止,仅记录错误
|
// 不影响服务器停止,仅记录错误
|
||||||
}
|
}
|
||||||
s.Logger.Info(s.ctx, "TCP server stopped")
|
s.Logger.Info(s.ctx, "TCP server stopped")
|
||||||
|
|
@ -123,7 +123,7 @@ func (s *TCPServer) handleConnection(conn *gtcp.Conn) {
|
||||||
s.Connection.Add(tcpConn)
|
s.Connection.Add(tcpConn)
|
||||||
s.Logger.Info(s.ctx, fmt.Sprintf("New connection established: %s", connID))
|
s.Logger.Info(s.ctx, fmt.Sprintf("New connection established: %s", connID))
|
||||||
|
|
||||||
// 存储到NutsDB
|
// 存储到SQLite
|
||||||
connInfo := &pool.ConnectionInfo{
|
connInfo := &pool.ConnectionInfo{
|
||||||
ID: connID,
|
ID: connID,
|
||||||
Type: pool.ConnTypeTCP,
|
Type: pool.ConnTypeTCP,
|
||||||
|
|
@ -135,8 +135,8 @@ func (s *TCPServer) handleConnection(conn *gtcp.Conn) {
|
||||||
"localAddress": conn.LocalAddr().String(),
|
"localAddress": conn.LocalAddr().String(),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
if err := s.Connection.nutsPool.Add(connInfo); err != nil {
|
if err := s.Connection.sqlitePool.Add(connInfo); err != nil {
|
||||||
s.Logger.Error(s.ctx, fmt.Sprintf("Failed to store connection to NutsDB: %v", err))
|
s.Logger.Error(s.ctx, fmt.Sprintf("Failed to store connection to SQLite: %v", err))
|
||||||
// 不影响连接建立,仅记录错误
|
// 不影响连接建立,仅记录错误
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -152,9 +152,9 @@ func (s *TCPServer) receiveMessages(conn *TcpConnection) {
|
||||||
}
|
}
|
||||||
s.Connection.Remove(conn.Id)
|
s.Connection.Remove(conn.Id)
|
||||||
conn.Server.Close()
|
conn.Server.Close()
|
||||||
// 从NutsDB移除
|
// 从SQLite移除
|
||||||
if err := s.Connection.nutsPool.Remove(conn.Id); err != nil {
|
if err := s.Connection.sqlitePool.Remove(conn.Id); err != nil {
|
||||||
s.Logger.Error(s.ctx, fmt.Sprintf("Failed to remove connection from NutsDB: %v", err))
|
s.Logger.Error(s.ctx, fmt.Sprintf("Failed to remove connection from SQLite: %v", err))
|
||||||
// 不影响连接关闭,仅记录错误
|
// 不影响连接关闭,仅记录错误
|
||||||
}
|
}
|
||||||
s.Logger.Info(s.ctx, fmt.Sprintf("Connection closed: %s", conn.Id))
|
s.Logger.Info(s.ctx, fmt.Sprintf("Connection closed: %s", conn.Id))
|
||||||
|
|
@ -183,12 +183,12 @@ func (s *TCPServer) receiveMessages(conn *TcpConnection) {
|
||||||
conn.LastUsed = now
|
conn.LastUsed = now
|
||||||
conn.Mutex.Unlock()
|
conn.Mutex.Unlock()
|
||||||
|
|
||||||
// 更新NutsDB中的连接信息
|
// 更新SQLite中的连接信息
|
||||||
connInfo, err := s.Connection.nutsPool.Get(conn.Id)
|
connInfo, err := s.Connection.sqlitePool.Get(conn.Id)
|
||||||
if err == nil && connInfo != nil {
|
if err == nil && connInfo != nil {
|
||||||
connInfo.LastUsed = now
|
connInfo.LastUsed = now
|
||||||
if err := s.Connection.nutsPool.Update(connInfo); err != nil {
|
if err := s.Connection.sqlitePool.Update(connInfo); err != nil {
|
||||||
s.Logger.Error(s.ctx, fmt.Sprintf("Failed to update connection in NutsDB: %v", err))
|
s.Logger.Error(s.ctx, fmt.Sprintf("Failed to update connection in SQLite: %v", err))
|
||||||
// 不影响消息处理,仅记录错误
|
// 不影响消息处理,仅记录错误
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -259,12 +259,12 @@ func (s *TCPServer) sendMessage(conn *TcpConnection, data []byte) error {
|
||||||
now := time.Now()
|
now := time.Now()
|
||||||
conn.LastUsed = now
|
conn.LastUsed = now
|
||||||
|
|
||||||
// 更新NutsDB中的连接信息
|
// 更新SQLite中的连接信息
|
||||||
connInfo, err := s.Connection.nutsPool.Get(conn.Id)
|
connInfo, err := s.Connection.sqlitePool.Get(conn.Id)
|
||||||
if err == nil && connInfo != nil {
|
if err == nil && connInfo != nil {
|
||||||
connInfo.LastUsed = now
|
connInfo.LastUsed = now
|
||||||
if err := s.Connection.nutsPool.Update(connInfo); err != nil {
|
if err := s.Connection.sqlitePool.Update(connInfo); err != nil {
|
||||||
s.Logger.Error(s.ctx, fmt.Sprintf("Failed to update connection in NutsDB: %v", err))
|
s.Logger.Error(s.ctx, fmt.Sprintf("Failed to update connection in SQLite: %v", err))
|
||||||
// 不影响消息发送,仅记录错误
|
// 不影响消息发送,仅记录错误
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -283,9 +283,9 @@ func (s *TCPServer) Kick(connID string) error {
|
||||||
conn.Server.Close()
|
conn.Server.Close()
|
||||||
// 从连接池移除
|
// 从连接池移除
|
||||||
s.Connection.Remove(connID)
|
s.Connection.Remove(connID)
|
||||||
// 从NutsDB移除
|
// 从SQLite移除
|
||||||
if err := s.Connection.nutsPool.Remove(connID); err != nil {
|
if err := s.Connection.sqlitePool.Remove(connID); err != nil {
|
||||||
s.Logger.Error(s.ctx, fmt.Sprintf("Failed to remove connection from NutsDB: %v", err))
|
s.Logger.Error(s.ctx, fmt.Sprintf("Failed to remove connection from SQLite: %v", err))
|
||||||
// 不影响连接关闭,仅记录错误
|
// 不影响连接关闭,仅记录错误
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -350,5 +350,5 @@ func (p *ConnectionPool) Count() int {
|
||||||
|
|
||||||
// GetAllConnIDs 获取所有在线连接的ID列表
|
// GetAllConnIDs 获取所有在线连接的ID列表
|
||||||
func (p *ConnectionPool) GetAllConnIDs() ([]string, error) {
|
func (p *ConnectionPool) GetAllConnIDs() ([]string, error) {
|
||||||
return p.nutsPool.GetAllConnIDs()
|
return p.sqlitePool.GetAllConnIDs()
|
||||||
}
|
}
|
||||||
|
|
|
||||||
22
test.go
22
test.go
|
|
@ -1,22 +0,0 @@
|
||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"log"
|
|
||||||
|
|
||||||
"git.magicany.cc/black1552/gf-common/server/ws"
|
|
||||||
"git.magicany.cc/black1552/gf-common/tcp"
|
|
||||||
)
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
// 测试WebSocket
|
|
||||||
log.Println("开始测试WebSocket...")
|
|
||||||
ws.TestWebSocket()
|
|
||||||
log.Println("WebSocket测试完成")
|
|
||||||
|
|
||||||
// 测试TCP
|
|
||||||
log.Println("开始测试TCP...")
|
|
||||||
tcp.TestTCP()
|
|
||||||
log.Println("TCP测试完成")
|
|
||||||
|
|
||||||
log.Println("所有测试完成")
|
|
||||||
}
|
|
||||||
Loading…
Reference in New Issue