dbseed.lua 4.69 KB
require "shared.init"
require "utils.init"
require "GlobalVar"
require "RedisKeys"
require "ProtocolCode"
require "skynet.manager"
require "utils.MysqlUtil"

skynet = require "skynet"

redisproxy = require("shared.redisproxy")
mysqlproxy = require "shared.mysqlproxy"

SendPacket = function ( ... ) end


local function initRedisDb( ... )
	local function initAutoIncrementUid(tbName, keyName, fieldName)
		if not fieldName then fieldName = "value" end
		local mysqlVal = getDbCfgVal(tbName, keyName, fieldName)
		if not mysqlVal then 
			skynet.error(string.format("get db cfg fail, table %s, key %s, field %s", tbName, keyName, fieldName))
			return
		end
		local redisVal = tonum(redisproxy:hget(tbName, keyName))
		if redisVal < mysqlVal then
			redisproxy:hset(tbName, keyName, mysqlVal)
		end
	end

	initAutoIncrementUid("autoincrement_set", "role")
	initAutoIncrementUid("autoincrement_set", "union")
	initAutoIncrementUid("autoincrement_set", "order")
	initAutoIncrementUid("autoincrement_set", "email")
	initAutoIncrementUid("autoincrement_set", "emailTimestamp")
	initAutoIncrementUid("autoincrement_set", "delay_email")

	--redisproxy:hsetnx("adv_season", "idx", 0)
	--redisproxy:hsetnx("adv_season", "chapter", globalCsv.adv_endless_default_chapter)
	--redisproxy:hsetnx("adv_season", "overTime", 0)
end

-- 初始化服务器数据库以及服务器信息表
local function initServerDatabase()
	local servId = skynet.getenv("servId")
	mysqlproxy:query(string.format("CREATE DATABASE IF NOT EXISTS server_%s DEFAULT CHARSET = utf8mb4 COLLATE utf8mb4_general_ci;", servId))
	mysqlproxy:query(string.format("use server_%s", servId))

	-- 服务器信息表 开服时间
	mysqlproxy:query [[
		CREATE TABLE IF NOT EXISTS `server_info` (
			`key` varchar(45) NOT NULL,
			`int_value` int(11) DEFAULT NULL,
			`str_value` varchar(128) DEFAULT NULL,
			PRIMARY KEY (`key`)
			) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
	]]

	local res = mysqlproxy:query("SELECT * FROM `server_info` where `key` = 'server_start';")
	if not next(res) then
		mysqlproxy:query(string.format("INSERT INTO `server_info`(`key`, `str_value`) VALUES('server_start', '%s');",
			os.date("%Y%m%d", skynet.timex())))
	end
end

local function initAutoIncreUidTable()
	mysqlproxy:query [[
		CREATE TABLE IF NOT EXISTS `autoincrement_set` (
			`key` varchar(45) NOT NULL,
			`value` int(11) DEFAULT NULL,
			PRIMARY KEY (`key`)
			) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
	]]
	local servId = tonumber(skynet.getenv("servId"))
	if servId then
		local tpl = "INSERT INTO `autoincrement_set`(`key`, `value`) values('%s', %d)"
		mysqlproxy:query(string.format(tpl, "role", servId * MAX_ROLE_NUM))
		mysqlproxy:query(string.format(tpl, "union", servId * MAX_ROLE_NUM))
		mysqlproxy:query(string.format(tpl, "order", 0))
		mysqlproxy:query(string.format(tpl, "email", 0))
		mysqlproxy:query(string.format(tpl, "emailTimestamp", 0))
		mysqlproxy:query(string.format(tpl, "delay_email", 0))
	end
end

local function initAdvSeasonTable()
	mysqlproxy:query [[
		CREATE TABLE IF NOT EXISTS `adv_season` (
			`key` varchar(45) NOT NULL,
			`value` int(11) DEFAULT NULL,
			PRIMARY KEY (`key`)
			) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
	]]
	local servId = tonumber(skynet.getenv("servId"))
	if servId then
		local tpl = "INSERT INTO `adv_season`(`key`, `value`) values('%s', %d)"

		mysqlproxy:query(string.format(tpl, "idx", 0))
		mysqlproxy:query(string.format(tpl, "chapter", globalCsv.adv_endless_default_chapter))
		mysqlproxy:query(string.format(tpl, "overTime", 0))
	end
end

local function checkRoleTables()
	local list = {"Role", "Daily", "Activity", "Diner", "Store", "Hero", "RoleIncre", "Rune", "Order"}
	for _, name in ipairs(list) do
		local obj = require("models."..name).new({key = "key"})
		print("check table [" .. name .. "] begin.")
		obj:checkTableSchema()
		print("check table [" .. name .. "] end.")
	end
end

local steps = {
	[1] = {
		handler = initServerDatabase,
		desc = "initialize server database "
	},
	[2] = {
		handler = initAutoIncreUidTable,
		desc = "initialize auto_increment_uid table "
	},
	[3] = {
		handler = initAdvSeasonTable,
		desc = "initialize adv_season table "
	},
	[4] = {
		handler = checkRoleTables,
		desc = "check role tables "
	}
}

skynet.start(function ()
	--local new = redisproxy:hsetnx("autoincrement_set", "server_start", os.date("%Y%m%d", skynet.timex())) == 1
	--if not new then
	--	print("server has been initialized...")
	--	skynet.exit()
	--	return
	--end
	csvdb = require "shared.csvdata"
	globalCsv = csvdb["GlobalDefineCsv"]

	for _, action in ipairs(steps) do
		print(action.desc .. "start ...")
		action.handler()
		print(action.desc .. "finished ...")
	end
	initRedisDb()
	skynet.exit()
end)