182 lines
4.3 KiB
Go
182 lines
4.3 KiB
Go
package db
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"go_dreamfactory/comm"
|
|
"go_dreamfactory/lego/sys/log"
|
|
"go_dreamfactory/lego/utils/codec/json"
|
|
"io/ioutil"
|
|
"os"
|
|
)
|
|
|
|
func newSys(options *Options) (sys *DB, err error) {
|
|
sys = &DB{
|
|
options: options,
|
|
servers: make(map[string]*DBConn),
|
|
}
|
|
sys.init()
|
|
return
|
|
}
|
|
|
|
type DB struct {
|
|
options *Options
|
|
local *DBConn
|
|
cross *DBConn
|
|
servers map[string]*DBConn
|
|
}
|
|
|
|
func (this *DB) init() (err error) {
|
|
if this.local, err = newDBConn(this.options.Log, DBConfig{
|
|
RedisIsCluster: this.options.RedisIsCluster,
|
|
RedisAddr: this.options.RedisAddr,
|
|
RedisPassword: this.options.RedisPassword,
|
|
RedisDB: this.options.RedisDB,
|
|
MongodbUrl: this.options.MongodbUrl,
|
|
MongodbDatabase: this.options.MongodbDatabase,
|
|
}); err != nil {
|
|
return
|
|
}
|
|
err = this.readercrossconf(this.options.CrossConfig)
|
|
return
|
|
}
|
|
|
|
//读取游戏配置文件
|
|
func (this *DB) readercrossconf(path string) (err error) {
|
|
config := make(comm.CrossConfigs, 0)
|
|
var (
|
|
jsonFile *os.File
|
|
byteValue []byte
|
|
)
|
|
if jsonFile, err = os.Open(path); err != nil {
|
|
return
|
|
} else {
|
|
defer jsonFile.Close()
|
|
if byteValue, err = ioutil.ReadAll(jsonFile); err != nil {
|
|
return
|
|
}
|
|
if err = json.Unmarshal(byteValue, &config); err != nil {
|
|
return
|
|
}
|
|
if cf, ok := config[this.options.CrossTag]; !ok {
|
|
err = fmt.Errorf("no found Crossconfig:%s", this.options.CrossTag)
|
|
return
|
|
} else {
|
|
if !this.options.IsCross {
|
|
if this.cross, err = newDBConn(this.options.Log, DBConfig{
|
|
RedisIsCluster: cf.LoaclDB.RedisIsCluster,
|
|
RedisAddr: cf.LoaclDB.RedisAddr,
|
|
RedisPassword: cf.LoaclDB.RedisPassword,
|
|
RedisDB: cf.LoaclDB.RedisDB,
|
|
MongodbUrl: cf.LoaclDB.MongodbUrl,
|
|
MongodbDatabase: cf.LoaclDB.MongodbDatabase,
|
|
}); err != nil {
|
|
log.Error("comment db err!", log.Fields{"stag": cf.AreaId, "db": cf.LoaclDB, "err": err})
|
|
return
|
|
}
|
|
} else {
|
|
for k, v := range cf.ServiceList {
|
|
if this.servers[k], err = newDBConn(this.options.Log, DBConfig{
|
|
RedisIsCluster: v.RedisIsCluster,
|
|
RedisAddr: v.RedisAddr,
|
|
RedisPassword: v.RedisPassword,
|
|
RedisDB: v.RedisDB,
|
|
MongodbUrl: v.MongodbUrl,
|
|
MongodbDatabase: v.MongodbDatabase,
|
|
}); err != nil {
|
|
log.Error("comment db err!", log.Fields{"stag": k, "db": v, "err": err})
|
|
return
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return
|
|
}
|
|
|
|
//同步服务列表
|
|
func (this *DB) SyncServiceList() (err error) {
|
|
config := make(comm.CrossConfigs, 0)
|
|
var (
|
|
jsonFile *os.File
|
|
byteValue []byte
|
|
)
|
|
if jsonFile, err = os.Open(this.options.CrossConfig); err != nil {
|
|
return
|
|
} else {
|
|
defer jsonFile.Close()
|
|
if byteValue, err = ioutil.ReadAll(jsonFile); err != nil {
|
|
return
|
|
}
|
|
if err = json.Unmarshal(byteValue, &config); err != nil {
|
|
return
|
|
}
|
|
if cf, ok := config[this.options.CrossTag]; !ok {
|
|
err = fmt.Errorf("no found Crossconfig:%s", this.options.CrossTag)
|
|
return
|
|
} else {
|
|
if this.options.IsCross {
|
|
for k, v := range cf.ServiceList {
|
|
if _, ok := this.servers[k]; !ok {
|
|
if this.servers[k], err = newDBConn(this.options.Log, DBConfig{
|
|
RedisIsCluster: v.RedisIsCluster,
|
|
RedisAddr: v.RedisAddr,
|
|
RedisPassword: v.RedisPassword,
|
|
RedisDB: v.RedisDB,
|
|
MongodbUrl: v.MongodbUrl,
|
|
MongodbDatabase: v.MongodbDatabase,
|
|
}); err != nil {
|
|
log.Error("comment db err!", log.Fields{"stag": k, "db": v, "err": err})
|
|
return
|
|
}
|
|
}
|
|
|
|
}
|
|
} else {
|
|
err = errors.New("curr service is not cross!")
|
|
return
|
|
}
|
|
}
|
|
}
|
|
return
|
|
}
|
|
|
|
func (this *DB) Local() (conn *DBConn, err error) {
|
|
conn = this.local
|
|
if conn == nil {
|
|
err = errors.New("LocalDBConn on init")
|
|
}
|
|
return
|
|
}
|
|
func (this *DB) IsCross() bool {
|
|
return this.options.IsCross
|
|
}
|
|
func (this *DB) CrossTag() string {
|
|
return this.options.CrossTag
|
|
}
|
|
|
|
func (this *DB) Cross() (conn *DBConn, err error) {
|
|
conn = this.cross
|
|
if conn == nil {
|
|
err = errors.New("CrossDBConn on init")
|
|
}
|
|
return
|
|
}
|
|
|
|
func (this *DB) ServerDBConn(stage string) (conn *DBConn, err error) {
|
|
ok := false
|
|
conn, ok = this.servers[stage]
|
|
if !ok {
|
|
err = fmt.Errorf("DBConn:%s on init", stage)
|
|
}
|
|
return
|
|
}
|
|
|
|
func (this *DB) GetServerTags() []string {
|
|
keys := make([]string, 0)
|
|
for k, _ := range this.servers {
|
|
keys = append(keys, k)
|
|
}
|
|
return keys
|
|
}
|