数据库类

展开阅读

[TOC]

DataBase的数据结构

数据库类拥有以下成员:

  • string name: 数据库名称

  • bool isDirty: 标志数据库是否发生未存储的更改

  • bool isAvailable: 标志数据库是否可用, 若此项为false, 除了能够将其变为true的函数, 不应该有任何成员函数可以工作.

  • string owner: 数据库创建人

  • string createTime: 数据库创建时间, 此处应当以ISO时间格式string进行存储

  • string modifiedTime: 数据库最后修改时间

  • int tableNumber: 数据库中表的数量, 小型数据库应用不考虑表数量超出int类型最大值的情况. 正常应用下表的数量应该在20个以内.

  • DataFile file: 数据库文件对象.

  • map<string, DataTable> tables: 数据库表名映射, 为一个map.

    这个map的索引为表名, 索引对应的值是数据表对象DataTable.

DataBase的成员函数

DataBase::DataBase(const string& path)

构造函数, 通过path来初始化DataFile成员, 并调用已经初始化的DataFile成员, 进行数据读取和恢复. 如果path所指向的数据库文件不存在, 那么自动创建一个新的数据库文件, 并调用DataFile::Init()函数来初始化这个新文件, 同时调用DataBase::Init()函数对数据库进行必要的空初始化, 由于名称未设置, MarkAvailible(false)

string DataBase::Serialize(void)

序列化函数, 用来将整个数据库的信息以特定格式组织成一个string字符串. 序列化之后的结果应该返回给DataFile成员进行文件存储.

bool DataBase::Deserialize(const string& source)

反序列化函数, 用来将Serialize()函数序列化产生的string字符串中的数据恢复到数据库中. 注: 序列化时应当调用DataTable::Serialize()让其自身进行序列化, 然后再将数据表的序列化结果继续序列化到整个数据库的序列化结果中. 反序列化时也相同, 从数据库序列化结果中恢复出来的数据表序列化结果应当直接调用DataTable::Deserialize(const string& source)进行反序列化恢复. 切勿在父类中直接读取和修改添加子类数据, 这样将极大的降低项目代码的可读性和可维护性.

void DataBase::Init()

本函数当且仅当指定的数据库文件不存在时才会被调用. 本函数将数据库名称设置为空字符串"", 创建人设置为"Default", 数据库创建时间为当前时间, 最后修改时间为当前时间, 表数量为0, 数据库映射为空的map.

void DataBase::InitInfo(const string& name, const string& owner)

根据给定的字符串修改数据库的名称和所有者, 标志数据库MarkAvailible(true) MarkDirty(true)

void DataBase::SetName(const string& name)

根据给定的名称修改数据库名称.MarkDirty(true). 在每次更改了数据库状态之后, 都应该调用MarkDirty(true)将标志变量设置为true, 直到数据库被保存.

void DataBase::SetOwner(const string& owner)

根据给定的所有者修改数据库的所有者.MarkDirty(true)

string DataBase::Name()

return this->name; 返回数据库名称, 由于数据库名称为私有变量所以不能被外界直接读取. 为了防止读取时名称被恶意修改, 故封装成函数. 请注意在C++ class内, 不应该有任何数据直接暴露在public下面. 为了保证对象运行稳定性和易于排查错误, 读取和修改私有数据的操作都必须封装成成员函数调用.

string DataBase::Owner()

return this->owner;

int DataBase::Count()

return this->tableNumber;

DataFile DataBase::File()

return this->file; 返回DataBase中数据文件对象的一个拷贝. 这样可以保证对返回值进行操作时不影响数据库内容.

bool DataBase::CreateTable(const string& tableName)

创建一个新表, 表名为给定的tableN当前ame, 创建时间与最后修改时间为当前时间, 同时递增tableNumber成员, 以及维持数据库其它成员的值使其正确. 如果已有同名称的数据表存在, 那么拒绝创建并返回false. 创建成功则返回true.MarkDirty(true)

DataTable& DataBase::InTable(const string& tableName)

根据表名返回对应的数据表对象引用(可能会修改表值). MarkDirty(true)

bool DataBase::DropTable(const string& tableName)

根据表名删除表. MarkDirty(true)

bool DataBase::Save(void)

保存数据库到文件(调用Serialize()) 函数生成整个数据库的序列化信息, 然后调用 dataFile对象进行数据写入), 返回是否保存成功. 更改数据库状态标志MarkDirty(true).

bool DataBase::Reset(void)

重新从数据库文件中加载数据, 如果成功, 使用MarkDirty(false)MarkAvailible(true)更改数据库状态标志.

否则更改MarkAvailible(false)

bool DataBase::Load(const string& path)

放弃当前数据库数据, 从path指向的数据文件重新加载数据. 若数据文件不存在, 那么返回false同时调用MarkDirty(true)将数据库设置为脏.

bool DataBase::Eval(void)

对数据库可用性进行检查. 如果其他成员函数遵循了正确设置isAvailible变量和isDirty变量, 那么此函数可简单得写为return this->isAvailible;.

bool DataBase::MarkDirty(bool flag)

此函数用来将本数据库的标志isDirty设置为flag的值, 同时给所有需要的成员(例如tables)的此状态变量都设置为flag.

bool DataBase::MarkAvailible(bool flag)

此函数用来将本数据库的标志isAvailible设置为flag的值, 同时给所有需要的成员(例如tables)的此状态变量都设置为flag.

其他函数 | 私有成员函数

按需添加.

如果有需要, 请更新此文档.

评论

:D 一言句子获取中...