80 lines
1.4 KiB
Go
80 lines
1.4 KiB
Go
|
package storage
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
"sync"
|
||
|
)
|
||
|
|
||
|
type DbPolicy int
|
||
|
|
||
|
const (
|
||
|
DbPolicy_Tidy DbPolicy = iota // all store in one db
|
||
|
DbPolicy_Loosy // store in different db
|
||
|
)
|
||
|
|
||
|
const (
|
||
|
DefaultDbName = "default"
|
||
|
)
|
||
|
|
||
|
type StorageManager struct {
|
||
|
policy DbPolicy
|
||
|
dbrootDir string
|
||
|
db map[string]*LevelDBStorage
|
||
|
}
|
||
|
|
||
|
var (
|
||
|
instance *StorageManager
|
||
|
once sync.Once
|
||
|
)
|
||
|
|
||
|
// 修改工厂函数实现单例模式
|
||
|
func NewStorageManager(dbrootDir string, dbPolicy int) (*StorageManager, error) {
|
||
|
var initErr error
|
||
|
once.Do(func() {
|
||
|
instance = &StorageManager{
|
||
|
policy: DbPolicy(dbPolicy),
|
||
|
dbrootDir: dbrootDir,
|
||
|
db: make(map[string]*LevelDBStorage),
|
||
|
}
|
||
|
|
||
|
// 预初始化默认数据库
|
||
|
if _, err := instance.GetStorage(DefaultDbName); err != nil {
|
||
|
initErr = err
|
||
|
}
|
||
|
})
|
||
|
|
||
|
if initErr != nil {
|
||
|
return nil, initErr
|
||
|
}
|
||
|
return instance, nil
|
||
|
}
|
||
|
|
||
|
// 新增获取单例实例的方法
|
||
|
func GetInstance() *StorageManager {
|
||
|
return instance
|
||
|
}
|
||
|
|
||
|
func (sm *StorageManager) GetStorage(dbName string) (*LevelDBStorage, error) {
|
||
|
if dbName == "" {
|
||
|
return nil, fmt.Errorf("db name is empty")
|
||
|
}
|
||
|
if sm.policy == DbPolicy_Tidy {
|
||
|
dbName = DefaultDbName
|
||
|
}
|
||
|
_, exists := sm.db[dbName]
|
||
|
if !exists {
|
||
|
db, err := NewLevelDBStorage(sm.dbrootDir + "/" + dbName)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
sm.db[dbName] = db
|
||
|
}
|
||
|
return sm.db[dbName], nil
|
||
|
}
|
||
|
|
||
|
func (sm *StorageManager) Close() {
|
||
|
for _, db := range sm.db {
|
||
|
db.Close()
|
||
|
}
|
||
|
}
|