一,数据信息管理模块设计
该模块主要用于服务端对备份的文件进行数据信息管理,以便于业务处理模块或者热点管理模随用随取,以及在网页上迅速的显示备份文件列表,因此该模块需要管理的信息也是根据后续业务处理模块以及热点管理模块确定的
根据后续需要我们要管理的信息大概有以下几种
1. 文件的实际存储路径:当用户发出下载请求时,会从该路径读取文件进行响应
2. 文件的压缩包存放路径名:当用户要下载的文件为非热点文件时,需要到该路径下找到目标文件压缩包进行解压,再响应
3. 文件是否压缩标志位:判断文件是否已经被压缩
4. 文件大小
5. 文件最后一次修改时间
6. 文件最后一次访问时间
7. 文件访问中URL的资源路径:/download/a.txt
那么我们如何进行数据管理呢?
1.首先对于数据的访问,最常用的就是查找,如当插入时需要查找资源是否存在,要获取某个备份文件时需要查找资源是否存在,当要更新备份文件时也需要迅速找到目标文件位置;因此我们选择用hash表在内存中管理数据,以URL的下载路径作为key值,对应的信息结构体作为value
2. 持久化存储管理:当服务器关闭或者重启时,我们的文件信息也需要保存到文件中,当服务器再次开始,信息管理模块直接从文件中读取信息即可,因此我们选择用Json序列化将信息保存起来,取出时反序列化即可
数据管理类提供的主要接口如下所示:
#ifndef _MY_MANAGER_
#define _MY_MANAGER_
#include "util.hpp"
#include "config.hpp"
#include <unordered_map>
namespace mjw_cloud
{
struct BackupInfo
{
BackupInfo(const std::string real_path);
BackupInfo& operator=(const BackupInfo& data);//DataManager中的接口需要
bool _pack_flag; // 判断文件是否压缩
size_t _fsize; // 文件大小
time_t _atime; // 文件最后一次访问时间
time_t _mtime; // 文件最后一次修改时间
std::string _real_path; // 文件真实存储路径 ./packdir/
std::string _pack_path; // 文件压缩包存储路径 ./backdir/
std::string _url_path; // 文件访问中url的资源路径 /download/文件名
};
class DataManager
{
public:
DataManager();
~DataManager();
// 存储
bool Storage();
// 从文件中读取文件信息管理表
bool InitTable();
// 表中插入数据
bool Insert(const BackupInfo &data);
// 修改更新表中数据
bool Updata(const BackupInfo &data);
// 根据url获取对应文件信息,用户根据url请求下载文件时需要
bool GetoneByURL(const std::string &url_path, BackupInfo *data);
// 根据文件存放路径获取文件信息,服务端检测备份文件时要用
bool GetoneByRp(const std::string &real_path, BackupInfo *data);
// 获取所有的文件信息,向用户提供一个备份文件表时需要
bool GetAll(std::vector<BackupInfo> *arry);
private:
std::unordered_map<std::string, BackupInfo> _table; // 文件信息管理表
std::string _backup_file; // 持久化存储文件信息管理表
pthre