利用TinyXml进行数据库的热更新

//开始热更
void CLocalConfig::HotUpdateXmlCfg(string filePath)
{
    // 定义一个TiXmlDocument类变量
	TiXmlDocument Doc;
	mapTaskInfoCfg mpTaskInfoConfig;
	map<int,int> mpInsert;
	if(!Doc.LoadFile(filePath.c_str()))
	{
        return;
	}

    GetAttributeByTaskXml(Doc,1,mpTaskInfoConfig);
    for(itmapTaskInfoCfg itr = mpTaskInfoConfig.begin();itr != mpTaskInfoConfig.end(); ++itr)
    {
		TaskDetail TaskInfo = itr->second;
        if(TaskInfo.GetNewAble() || TaskInfo.GetModifyAble())
        {
            //insert 插入数据库
			if(CDbManager::Instance()->InsertTaskDetail(NULL,TaskInfo))
			{
				//数据库热更成功,插入到更新map
                mpInsert.insert(make_pair(TaskInfo.GetTaskId(),TaskInfo.GetTaskId()));
            }
            continue;
        }
    }
    //更新插入的数据
	if (mpInsert.size() != 0)
	{
		//更新刚刚热更成功的xml表
		UpdateAttributeByTaskXml(Doc,1,mpInsert);
	}
    //保存xml表
    Doc.SaveFile(filePath.c_str());
}

//读取xml表格内容
void CLocalConfig::GetAttributeByGrownBagsXml(TiXmlDocument &stDoc,int Flag/*层级*/,mapTaskInfoCfg &mpTaskInfo)
{
    TiXmlElement* pNowElement = stDoc.RootElement(); //root节点
	//循环Flag次,以指向需要的节点层级
	while(Flag--){
		pNowElement = pNowElement->FirstChildElement(); //指向下一个
	}
	while ( pNowElement ) {
		TiXmlAttribute* attributeOfStudent = pNowElement->FirstAttribute(); //获得每一级的各种属性
		TASK_INFO_DETAIL Config;
        ZeroMemory(&Config, sizeof(TASK_INFO_DETAIL));
		while ( attributeOfStudent ) {
			switch(string(attributeOfStudent->Name()))
			{
				case GROWN_BAGS_CFG_XML_ID:
					{
						//数字直接赋值
						Config.m_iID= atoi(attributeOfStudent->Value());
						break;
					}
				case GROWN_BAGS_CFG_XML_ID:
					{
						//字符串直接拷贝
						memcpy(Config.m_strName ,attributeOfStudent->Value(),strlen(attributeOfStudent->Value())+1);
						break;
					}
				default:
					break;
			}
			std::cout << attributeOfStudent->Name() << " : " << attributeOfStudent->Value() << std::endl;//打印当前的数据看看
			attributeOfStudent = attributeOfStudent->Next();//指向下一个元素
		}
		mpTaskInfo[Config.m_iID] = Config;
		pNowElement = pNowElement->NextSiblingElement();//指向下一个同级节点
	}
}

//更新xml节点元素
void CLocalConfig::UpdateAttributeByTaskXml(TiXmlDocument &stDoc,int Flag,map<int,int> &mpTaskUpdate)
{
    TiXmlElement* pNowElement = stDoc.RootElement(); //root
	//循环Flag次,以指向需要的节点层级
	while(Flag--){
		pNowElement = pNowElement->FirstChildElement(); //指向下一个
	}
	while ( pNowElement ) {
		TiXmlAttribute* attributeOfStudent = pNowElement->FirstAttribute(); //获得每一级的各种属性
		while ( attributeOfStudent ) {
			if(string(attributeOfStudent->Name())==TASKINFO_CFG_XML_ID)
			{
				//看看是不是这个ID
				int iTaskId= atoi(attributeOfStudent->Value());
                map<int,int>::iterator itr = mpTaskUpdate.find(iTaskId);
                if(itr == mpTaskUpdate.end())
                {
                    break;
                }
			}
            else if(string(attributeOfStudent->Name())==TASKINFO_CFG_XML_MODIFY)
			{
                attributeOfStudent->SetValue("0");//设置属性为0,代表已经更新了
			}
            else if(string(attributeOfStudent->Name())==TASKINFO_CFG_XML_NEW)
			{
                attributeOfStudent->SetValue("0");//设置属性为0,代表已经更新了
			}
            else
            {

            }
			attributeOfStudent = attributeOfStudent->Next();//指向下一个元素
		}
        pNowElement = pNowElement->NextSiblingElement();//指向下一个同级节点
	}
}
时间: 2024-09-29 05:31:05

利用TinyXml进行数据库的热更新的相关文章

Unity热更新技术整理

一.热更新学习介绍 1.什么是热更新 举例来说: 游戏上线后,玩家下载第一个版本(70M左右或者更大),在运营的过程中,如果需要更换UI显示,或者修改游戏的逻辑,这个时候,如果不使用热更新,就需要重新打包,然后让玩家重新下载(浪费流量和时间,体验不好). 热更新可以在不重新下载客户端的情况下,更新游戏的内容. 热更新一般应用在手机网游上. 2.为什么C#脚本不可以直接更新 C#是一门编程语言,它运行之前需要进行编译,而这个编译的过程在移动平台无法完成,所以当我们游戏的逻辑更改,C#代码发生改变的

二、unity游戏热更新专题

第 1 章 : 热更新技术学习介绍 课时1:101-热更新技术学习介绍 11:55 什么是热更新? 举例来说 游戏上线后,玩家下载第一个版本(70M左右或者更大),在运营的过程中,如果需要更换UI显示,或者修改游戏的逻辑,这个时候,如果不使用热更新,就需要重新打包,然后让玩家重新下载(浪费流量和时间,体验不好). 热更新可以在不重新下载客户端的情况下,更新游戏的内容. 热更新一般应用在手机网游上. 为什么C#脚本不可以直接更新? C#是一门编程语言,它运行之前需要进行编译,而这个编译的过程在移动

数据库双机热备

数据库镜像相对于日志传送,数据库镜像显然更高一级.在最简单的形式下,它其实与日志传送的工作原理相似,但是生产服务器发送事务到镜像服务器的频率要高得多,这意味着更新速度也要快很多.对于数据库镜像来说,故障转移功能也是需要手动完成.但是你可以添加第三个SQLServer,称为witness.Witness 可以作为一个普通的SQL Server,但是一直留意着其它两个镜像服务器.当主镜像发生故障,witness 可以让第二个镜像接管操作,类似一种自动的故障转移.在故障转移时,任何进行中的客户端事务都

菜鸟学习 - Unity中的热更新 - Lua和C#通信

孙广东 2015-4-6 热更新我是个菜鸟,感谢网上的各位的奉献,这次又当一回搬运工. 准备: 1.了解Lua的语法 推荐书籍<Lua程序设计 第二版> 2.使用ULua插件进行通信 尽量早上真机.因为Bug问题特别多. 大杂烩: 更新LUa其实也是更新资源. Lua被看作一个资源么.Lua代码都是运行时才编译的,不运行的时候就如同一张图片.一段音频一样,都是文件资源:所以更新逻辑只需要更新脚本,不需要再编译,因而Lua能轻松实现"热更新".运行效率由于使用反射,所以成为它

移动端热更新方案(iOS+Android)

PPT资源包含iOS+Android 各种方案分析:https://github.com/qiyer/Share/blob/master/%E7%83%AD%E6%9B%B4%E6%96%B0%E5%88%86%E4%BA%ABPPT.pptx 一 .热更新(热修复)产品背景 这里谈到的热更新都是指APP(不包含网页).APP按大类别可以粗略分为 应用 和 游戏.APP的开发周期是极其快速的,在实际开发流程中,我们总会有一些需求迫使我们短时间内快速上线,比如需求流程出错,程序员主观导致的一些bu

JSPatch热更新的利器.

如果用一句话来描述JSPatch,就是利用系统自带的JavaScriptCore.framework配合RunTime机制,进行实时的代码下载与运行.. 而且使用也很简单,启动,加载JS,运行... [JPEngine startEngine]; NSString *sourcePath = [[NSBundle mainBundle] pathForResource:@"demo" ofType:@"js"]; NSString *script = [NSStri

ios app 实现热更新(无需发新版本号实现app加入新功能)

眼下可以实现热更新的方法,总结起来有下面三种 1. 使用FaceBook 的开源框架 reactive native,使用js写原生的ios应用 ios app能够在执行时从server拉取最新的js文件到本地.然后执行,由于js是一门动态的 脚本语言.所以可以在执行时直接读取js文件执行,也因此可以实现ios的热更新 2. 使用lua 脚本.lua脚本如同js 一样,也能在动态时被.之前愤慨的小鸟使用 lua脚本做的一个插件 wax,能够实现使用lua写ios应用.热更新时,从server拉去

iOS热更新的几种方案

iOS APP的上架审核一直是个令人困扰的问题,动辄一个星期甚至半个月的审核时间,往往会耽误产品的运营计划. 尤其是,审核过程中难以避免的会被苹果拒绝,然后又是一个周期,很是痛苦. 除了在提交审核前,尽可能的保证产品没有Bug,以及充分研究苹果的app审核政策外,从技术开发层面如果能解决热更新问题,则再好不过了. 所以我简单整理了以下一些技术,可用于产品的内部更新,而不用重新提交给苹果审核.如果有更多的方案,或是错误,也请提出. 1. Hybrid App 混合架构,借助于Html,JS等前端技

Unity3D游戏开发之Lua与游戏的不解之缘终结篇:UniLua热更新完全解读

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 喜欢我的博客请记住我的名字:秦元培,我的博客地址是blog.csdn.net/qinyuanpei. 转载请注明出处,本文作者: