• 云备份客户端——数据管理模块


    数据管理模块设计之前,我们需要先明确该模块的信息是用来做什么的。根据上文分析该模块信息主要用于判断一个文件是否需要备份,判断条件有两个:1.新增文件 2.被修改过的文件

    新增文件好判断,由于我们获得新文件后是先上传文件,再将文件信息插入到数据管理模块中,模块里没有存储该文件信息,则该文件为新增文件

    而第二个判断修改文件,我们会设定一个文件的唯一标识,类似于之前服务端构建http协议的ETag关键字,该标识由 文件名-文件大小-文件最后一次修改时间 构成

    由上可得,我们文件信息表中需要存储的信息只有两个:文件名-唯一标识

    因此内存中存储文件信息表我们选择用unordered_map存储这对KV(文件名-文件唯一标识)值

    而对于持久化存储,关键点在于自己完成序列化和反序列化,不过由于存储信息简单因此序列化和反序列化也比较简单,我们序列化方式如下

     

    反序列化则是写一个字符串拆分函数,先拆除一个一个的KV键值对,在将KV值分离

     

    因此,我们接口设置如下

    1. #pragma once
    2. #include "util.hpp"
    3. #include
    4. namespace mjw_cloud
    5. {
    6. class FileDatas
    7. {
    8. public:
    9. FileDatas(const std::string& backup_file)
    10. :_backup_file(backup_file)
    11. {}
    12. bool InitTable()
    13. {}
    14. bool Storage()
    15. {}
    16. bool Insert(const std::string& key, const std::string& val)
    17. {}
    18. bool Updata(const std::string& key, const std::string& val)
    19. {}
    20. bool GetoneByKey(const std::string& key, std::string* val)
    21. {}
    22. private:
    23. //解析序列化字符串时需要
    24. //字符串分割,对序列化字符串进行分割
    25. //"key val key" -> "key" "val" "key"
    26. int Split(const std::string& str, const std::string& seq, std::vector* arry)
    27. {}
    28. private:
    29. std::unordered_map _table;//文件信息表
    30. std::string _backup_file;//备份文件信息 存储文件
    31. };
    32. }

    代码实现如下:

    1. #pragma once
    2. #include "util.hpp"
    3. #include
    4. namespace mjw_cloud
    5. {
    6. class FileDatas
    7. {
    8. public:
    9. FileDatas(const std::string& backup_file)
    10. :_backup_file(backup_file)
    11. {
    12. InitTable();
    13. }
    14. bool InitTable()
    15. {
    16. //1.从文件中读取备份文件信息序列化字符串
    17. std::string body;
    18. FileUtil fu(_backup_file);
    19. fu.GetContent(&body);
    20. if (body.empty()) return true;
    21. //2.对字符串进行反序列化解析
    22. std::vector arry;
    23. //"key val\nkey val\n" -> "key val" "key val"
    24. Split(body, "\n", &arry);
    25. for (auto a : arry)
    26. {
    27. std::vector tmp;
    28. //"key val" -> "key" "val"
    29. Split(a, " ", &tmp);
    30. if (tmp.size() != 0) continue;
    31. _table[tmp[0]] = tmp[1];
    32. }
    33. return true;
    34. }
    35. bool Storage()
    36. {
    37. if (_table.empty()) return true;
    38. //1.构建序列化字符串
    39. std::string body;
    40. for (auto& t : _table)
    41. {
    42. body += t.first + " " + t.second + "\n";
    43. }
    44. //2.将字符串写入指定文件
    45. FileUtil fu(_backup_file);
    46. fu.SetContent(body);
    47. return true;
    48. }
    49. bool Insert(const std::string& key, const std::string& val)
    50. {
    51. _table[key] = val;
    52. return true;
    53. }
    54. bool Updata(const std::string& key, const std::string& val)
    55. {
    56. _table[key] = val;
    57. return true;
    58. }
    59. bool GetoneByKey(const std::string& key, std::string* val)
    60. {
    61. auto it = _table.find(key);
    62. if (it == _table.end())
    63. {
    64. return false;
    65. }
    66. *val = _table[key];
    67. return true;
    68. }
    69. private:
    70. //解析序列化字符串时需要
    71. //字符串分割,对序列化字符串进行分割
    72. //"key val key" -> "key" "val" "key"
    73. int Split(const std::string& str, const std::string& seq, std::vector* arry)
    74. {
    75. int count = 0;
    76. int pos = 0, idx = 0;
    77. while (idx < str.size())
    78. {
    79. pos = str.find(seq, idx);
    80. if (pos == std::string::npos) break;
    81. arry->push_back(str.substr(idx, pos - idx));
    82. idx = pos + 1;
    83. count++;
    84. }
    85. if (idx < str.size())
    86. {
    87. //说明str还有最后一截字符串没有push_back进arry
    88. arry->push_back(str.substr(idx));
    89. count++;
    90. }
    91. return count;
    92. }
    93. private:
    94. std::unordered_map _table;//文件信息表
    95. std::string _backup_file;//备份文件信息 存储文件
    96. };
    97. }

  • 相关阅读:
    html_label标签
    Linux文件查找、别名、用户组
    VUE3.0+Antdv+Asp.net WebApi开发学生信息管理系统(三)
    第17章 站点构建
    C语言每日一题(31)相交链表
    java毕业设计选题高校科研项目管理系统[包运行成功]
    华为云云耀云服务器L实例评测|认识redis未授权访问漏洞 & 漏洞的部分复现 & 设置连接密码 & redis其他命令学习
    Paas 相关介绍
    JAVA要点
    【信管1.12】新技术(一)物联网与云计算
  • 原文地址:https://blog.csdn.net/zcxmjw/article/details/132745562