zoukankan      html  css  js  c++  java
  • 利用TinyXml进行数据库的热更新

    TinyXml库比较小,但功能较为完善,挺适合用来读取小块的xml文件;

    我写了几个利用TinyXml读取和保存数据的例子,大家可以参考使用;

    主要是为了热更新配置所做的一些函数应用;

      1 //开始热更
      2 void CLocalConfig::HotUpdateXmlCfg(string filePath)
      3 {
      4     // 定义一个TiXmlDocument类变量
      5     TiXmlDocument Doc;    
      6     mapTaskInfoCfg mpTaskInfoConfig;
      7     map<int,int> mpInsert;
      8     if(!Doc.LoadFile(filePath.c_str()))
      9     {
     10         return;
     11     }
     12     
     13     GetAttributeByTaskXml(Doc,1,mpTaskInfoConfig);
     14     for(itmapTaskInfoCfg itr = mpTaskInfoConfig.begin();itr != mpTaskInfoConfig.end(); ++itr)
     15     {
     16         TaskDetail TaskInfo = itr->second;
     17         if(TaskInfo.GetNewAble() || TaskInfo.GetModifyAble())
     18         {
     19             //insert 插入数据库
     20             if(CDbManager::Instance()->InsertTaskDetail(NULL,TaskInfo))
     21             {
     22                 //数据库热更成功,插入到更新map
     23                 mpInsert.insert(make_pair(TaskInfo.GetTaskId(),TaskInfo.GetTaskId()));
     24             }
     25             continue;
     26         }
     27     }
     28     //更新插入的数据
     29     if (mpInsert.size() != 0)
     30     {
     31         //更新刚刚热更成功的xml表
     32         UpdateAttributeByTaskXml(Doc,1,mpInsert);
     33     }
     34     //保存xml表
     35     Doc.SaveFile(filePath.c_str());
     36 }
     37 
     38 //读取xml表格内容
     39 void CLocalConfig::GetAttributeByGrownBagsXml(TiXmlDocument &stDoc,int Flag/*层级*/,mapTaskInfoCfg &mpTaskInfo)
     40 {
     41     TiXmlElement* pNowElement = stDoc.RootElement(); //root节点
     42     //循环Flag次,以指向需要的节点层级
     43     while(Flag--){
     44         pNowElement = pNowElement->FirstChildElement(); //指向下一个
     45     }
     46     while ( pNowElement ) {
     47         TiXmlAttribute* attributeOfStudent = pNowElement->FirstAttribute(); //获得每一级的各种属性
     48         TASK_INFO_DETAIL Config;
     49         ZeroMemory(&Config, sizeof(TASK_INFO_DETAIL));
     50         while ( attributeOfStudent ) {
     51             switch(string(attributeOfStudent->Name()))
     52             {
     53                 case GROWN_BAGS_CFG_XML_ID:
     54                     {
     55                         //数字直接赋值
     56                         Config.m_iID= atoi(attributeOfStudent->Value());
     57                         break;
     58                     }
     59                 case GROWN_BAGS_CFG_XML_ID:
     60                     {
     61                         //字符串直接拷贝
     62                         memcpy(Config.m_strName ,attributeOfStudent->Value(),strlen(attributeOfStudent->Value())+1);
     63                         break;
     64                     }
     65                 default:
     66                     break;
     67             }
     68             std::cout << attributeOfStudent->Name() << " : " << attributeOfStudent->Value() << std::endl;//打印当前的数据看看
     69             attributeOfStudent = attributeOfStudent->Next();//指向下一个元素
     70         }
     71         mpTaskInfo[Config.m_iID] = Config;
     72         pNowElement = pNowElement->NextSiblingElement();//指向下一个同级节点
     73     }
     74 }
     75 
     76 //更新xml节点元素
     77 void CLocalConfig::UpdateAttributeByTaskXml(TiXmlDocument &stDoc,int Flag,map<int,int> &mpTaskUpdate)
     78 {
     79     TiXmlElement* pNowElement = stDoc.RootElement(); //root
     80     //循环Flag次,以指向需要的节点层级
     81     while(Flag--){
     82         pNowElement = pNowElement->FirstChildElement(); //指向下一个
     83     }
     84     while ( pNowElement ) {
     85         TiXmlAttribute* attributeOfStudent = pNowElement->FirstAttribute(); //获得每一级的各种属性
     86         while ( attributeOfStudent ) {
     87             if(string(attributeOfStudent->Name())==TASKINFO_CFG_XML_ID)
     88             {
     89                 //看看是不是这个ID
     90                 int iTaskId= atoi(attributeOfStudent->Value());
     91                 map<int,int>::iterator itr = mpTaskUpdate.find(iTaskId);
     92                 if(itr == mpTaskUpdate.end())
     93                 {
     94                     break;
     95                 }
     96             }
     97             else if(string(attributeOfStudent->Name())==TASKINFO_CFG_XML_MODIFY)
     98             {
     99                 attributeOfStudent->SetValue("0");//设置属性为0,代表已经更新了
    100             }
    101             else if(string(attributeOfStudent->Name())==TASKINFO_CFG_XML_NEW)
    102             {
    103                 attributeOfStudent->SetValue("0");//设置属性为0,代表已经更新了
    104             }
    105             else
    106             {
    107                 
    108             }
    109             attributeOfStudent = attributeOfStudent->Next();//指向下一个元素
    110         }
    111         pNowElement = pNowElement->NextSiblingElement();//指向下一个同级节点
    112     }
    113 }
    114 
    115  
  • 相关阅读:
    angularjs: ng-select和ng-options
    angularjs之$timeout指令
    angular的uiRouter服务学习(5) --- $state.includes()方法
    深究AngularJS——如何获取input的焦点(自定义指令)
    深究AngularJS——自定义服务详解(factory、service、provider)
    AngularJS 事件指令/input相关指令/样式指令/DOM操作指令详解
    字符串对象的创建
    redis安装和配置
    Cent Linux启动tomcat慢的问题
    Linux环境nginx的配置
  • 原文地址:https://www.cnblogs.com/left69/p/5692710.html
Copyright © 2011-2022 走看看