RichCMS在启动时,根据当前的安装状态决定是否去初始化数据库,它在main package的init 函数中被调用。
dbs.go位于/Users/samsong/mygo/src/github.com/zituocn/richcms/src/cms/conn目录中,以下是它的源代码及中文注释。
package conn
import (
"fmt"
"github.com/gkzy/gini"
"github.com/zituocn/gow/lib/config"
"github.com/zituocn/gow/lib/mysql"
"github.com/zituocn/logx"
"github.com/zituocn/richcms/common/constname"
"github.com/zituocn/richcms/common/utils"
)
// InitDB 初始化数据库
func InitDB() {
if IsFinishSetup() {
initMySQL()
} else {
if IsDBSetup() {
initMySQL()
fmt.Println("================安装提示==================")
fmt.Println("系统未安装完成")
fmt.Println(fmt.Sprintf("请访问:%s/install 去完成", constname.GetAdminDirectory()))
fmt.Println("========================================")
} else {
fmt.Println("================安装提示==================")
fmt.Println("系统未安装")
fmt.Println(fmt.Sprintf("请访问:%s/install 去完成", constname.GetAdminDirectory()))
fmt.Println("========================================")
}
}
}
// IsDBSetup 是否设置过数据库
//
// 是否安装过系统,判断依据是 conf目录下,是否有db.conf,且配置正确。
func IsDBSetup() bool {
_, ok, _ := GetDBConfig()
return ok
}
// IsFinishSetup 是否安装已经完成
func IsFinishSetup() bool {
return utils.PathExists(constname.LockFile)
}
// initMySQL 初始化mysql的具体方法
func initMySQL() {
conf, _, err := GetDBConfig()
if err != nil {
logx.Errorf("read db config error : %v", err)
return
}
runMode := config.DefaultString("run_mode", "dev")
if runMode == "dev" {
conf.Debug = true
}
err = mysql.InitDefaultDB(conf)
if err != nil {
logx.Panic(err)
}
logx.Infof("[DB] Database has been connected successfully: %s->%s", conf.Host, conf.Name)
}
// GetDBConfig 从配置文件中获取参数
func GetDBConfig() (conf *mysql.DBConfig, ok bool, err error) {
ini := gini.New()
err = ini.Load(constname.DBConfig)
if err != nil {
return
}
port, _ := ini.SectionInt(constname.DBSection, "port")
if port == 0 {
port = 3306
}
conf = &mysql.DBConfig{
Name: ini.SectionGet(constname.DBSection, "name"),
User: ini.SectionGet(constname.DBSection, "user"),
Password: ini.SectionGet(constname.DBSection, "password"),
Host: ini.SectionGet(constname.DBSection, "host"),
Port: port,
}
if conf != nil && conf.Host != "" && conf.Name != "" && conf.User != "" && conf.Port > 0 {
ok = true
}
return
}
代码解析:
- IsFinishSetup() 函数检查conf目录中,是否有setup.lock,如果有此文件,说明安装已经结束。直接初始化mysql;
- IsDBSetup() 函数检测是否已经安装成功数据库,即检查conf目录中,是否写入成功:db.conf。
- GetDBConfig() 函数,读取db.conf中的database节内容。
- initMySQL() 函数,去完成 mysql的连接初始化,供后续调用 。