码迷,mamicode.com
首页 > 数据库 > 详细

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

时间:2016-07-21 19:44:00      阅读:172      评论:0      收藏:0      [点我收藏+]

标签:

//开始热更
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();//指向下一个同级节点
	}
}

 

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

标签:

原文地址:http://www.cnblogs.com/left69/p/5692710.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!