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

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

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

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

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

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

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

 

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

 

因此,我们接口设置如下

#pragma once
#include "util.hpp"
#include <unordered_map>
namespace mjw_cloud
{class FileDatas{public:FileDatas(const std::string& backup_file):_backup_file(backup_file){}bool InitTable(){}bool Storage(){}bool Insert(const std::string& key, const std::string& val){}bool Updata(const std::string& key, const std::string& val){}bool GetoneByKey(const std::string& key, std::string* val){}private://解析序列化字符串时需要//字符串分割,对序列化字符串进行分割//"key val key" -> "key" "val" "key"int Split(const std::string& str, const std::string& seq, std::vector<std::string>* arry){}private:std::unordered_map<std::string, std::string> _table;//文件信息表std::string _backup_file;//备份文件信息 存储文件};
}

代码实现如下:

#pragma once
#include "util.hpp"
#include <unordered_map>
namespace mjw_cloud
{class FileDatas{public:FileDatas(const std::string& backup_file):_backup_file(backup_file){InitTable();}bool InitTable(){//1.从文件中读取备份文件信息序列化字符串std::string body;FileUtil fu(_backup_file);fu.GetContent(&body);if (body.empty()) return true;//2.对字符串进行反序列化解析std::vector<std::string> arry;//"key val\nkey val\n" -> "key val" "key val"Split(body, "\n", &arry);for (auto a : arry){std::vector<std::string> tmp;//"key val" -> "key" "val"Split(a, " ", &tmp);if (tmp.size() != 0) continue;_table[tmp[0]] = tmp[1];}return true;}bool Storage(){if (_table.empty()) return true;//1.构建序列化字符串std::string body;for (auto& t : _table){body += t.first + " " + t.second + "\n";}//2.将字符串写入指定文件FileUtil fu(_backup_file);fu.SetContent(body);return true;}bool Insert(const std::string& key, const std::string& val){_table[key] = val;return true;}bool Updata(const std::string& key, const std::string& val){_table[key] = val;return true;}bool GetoneByKey(const std::string& key, std::string* val){auto it = _table.find(key);if (it == _table.end()){return false;}*val = _table[key];return true;}private://解析序列化字符串时需要//字符串分割,对序列化字符串进行分割//"key val key" -> "key" "val" "key"int Split(const std::string& str, const std::string& seq, std::vector<std::string>* arry){int count = 0;int pos = 0, idx = 0;while (idx < str.size()){pos = str.find(seq, idx);if (pos == std::string::npos) break;arry->push_back(str.substr(idx, pos - idx));idx = pos + 1;count++;}if (idx < str.size()){//说明str还有最后一截字符串没有push_back进arryarry->push_back(str.substr(idx));count++;}return count;}private:std::unordered_map<std::string, std::string> _table;//文件信息表std::string _backup_file;//备份文件信息 存储文件};
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/101986.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java版工程行业管理系统源码-专业的工程管理软件-提供一站式服务

鸿鹄工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离构建工程项目管理系统 1. 项目背景 一、随着公司的快速发展&#xff0c;企业人员和经营规模不断壮大。为了提高工程管理效率、减轻劳动强度、提高信息处理速度和准确性&#xff0c;公司对内部工程管…

听书网站模板源码 懒人书院网站源码 苹果cms手机听书网站模版源码 支持手机端

苹果cms超漂亮UI高仿芒果TV听书网站模板带手机端。 手机版修改logo&#xff0c;ting_wap/images/logo.png 电脑版修改logo&#xff0c;ting_pc/img/logo.png 编辑推荐后台推荐5颗星。 新势力/热播榜单后台推荐9颗星。

OLED透明屏模块:引领未来显示技术的突破

OLED透明屏模块作为一项引领未来显示技术的突破&#xff0c;以其独特的特点和卓越的画质在市场上引起了广泛关注。 根据行业报告&#xff0c;预计到2025年&#xff0c;OLED透明屏模块将占据智能手机市场的20%份额&#xff0c;并在汽车导航系统市场中占据30%以上份额。 那么&am…

回归与聚类算法系列②:线性回归

目录 1、定义与公式 2、应用场景 3、特征与目标的关系分析 线性回归的损失函数 为什么需要损失函数 损失函数 ⭐如何减少损失 4、优化算法 正规方程 梯度下降 优化动态图 偏导 正规方程和梯度下降比较 5、优化方法GD、SGD、SAG 6、⭐线性回归API 7、实例&#…

Vue2项目练手——通用后台管理项目第七节

Vue2项目练手——通用后台管理项目 用户管理分页使用的组件Users.vuemock.js 关键字搜索区Users.vue 权限管理登录页面样式修改Login.vue 登录权限使用token对用户鉴&#xff0c;使用cookie对当前信息保存&#xff08;类似localstorage&#xff09;Login.vuerouter/index.js 登…

大屏开发,浏览器的可视区域和设备的分辨率

在线屏幕检测 - 显示器检测 - 显示器坏点检测工具

【三等奖方案】小样本数据分类任务赛题「复兴15号」团队解题思路

第十届CCF大数据与计算智能大赛&#xff08;2022 CCF BDCI&#xff09;已圆满结束。大赛官方竞赛平台DataFountain&#xff08;简称DF平台&#xff09;将陆续释出各赛题获奖队伍的方案思路。 本方案为【小样本数据分类任务】赛题的三等奖获奖方案&#xff0c;赛题地址&#xff…

Vue2+Vue3基础入门到实战项目(七)——智慧商城项目

Vue 核心技术与实战 智慧商城 接口文档&#xff1a;https://apifox.com/apidoc/shared-12ab6b18-adc2-444c-ad11-0e60f5693f66/doc-2221080 演示地址&#xff1a;http://cba.itlike.com/public/mweb/#/ 01. 项目功能演示 1.明确功能模块 启动准备好的代码&#xff0c;演示…

Windows SQLYog连接不上VMbox Ubuntu2204 的Mysql解决方法

Windows SQLYog连接不上VMbox Ubuntu2204 的Mysql解决方法 解决方法&#xff1a; 1、先检查以下mysql的端口状态 netstat -anp|grep mysql如果显示127.0.0.1:3306 则说明需要修改&#xff0c;若为: : :3306&#xff0c;则不用。 在**/etc/mysql/mysql.conf.d/mysqld.cnf**&am…

VsCode备忘

上次简单学习了一下vscode的使用&#xff0c;结果好长时间没用&#xff0c;今天打开又全忘了。。。再记录一下吧 快捷键 CtrlShiftP 命令面板&#xff0c;查找命令&#xff0c;设置等等 Ctrl 打开集成终端&#xff0c;监视生成输出 Ctrl, 打开设置 CtrlP 转到文件,使用转到符…

2023 大学生数学建模竞赛-C题-第一问

题目&#xff1a; 在生鲜商超中&#xff0c;一般蔬菜类商品的保鲜期都比较短&#xff0c;且品相随销售时间的增加而变差&#xff0c; 大部分品种如当日未售出&#xff0c;隔日就无法再售。因此&#xff0c;商超通常会根据各商品的历史销售和需 求情况每天进行补货。 由于商超销…

Qt creator中项目的构建配置和运行设置

使用 Qt Creator 集成开发环境构建和运行程序是一件非常简单的事情&#xff0c;一个按钮或者一个快捷键搞定全部&#xff0c;大家已经都了解了。但是&#xff0c;这些看起来简单的过程&#xff0c;背后到底发生了什么呢&#xff1f; 点击 Qt Creator 项目模式&#xff0c;可以…