资源简介
DBMS 小型数据库 c语言实现 增删改查基本功能
代码片段和文件信息
//
// Created by apple on 2017/7/21.
//
#include “database.h“
Database::Database(const std::string &db_name)
{
if (db_name != ““) { open(db_name); }
}
Database::~Database(void)
{
close();
}
inline Offset Database::_hash(const std::string &key)
{
uint32_t seed = 13; // 31 131 1313 13131 131313 etc..
uint32_t hash_val = 0;
uint32_t mask = hash_table_size - 1;
for (char ch : key) { hash_val = hash_val * seed + ch; }
return hash_val % mask;
}
void Database::open(const std::string &db_name)
{
close();
_index_file.open(db_name + index_file_suffix std::ios::binary | std::ios::in | std::ios::out);
_data_file.open(db_name + data_file_suffix std::ios::binary | std::ios::in | std::ios::out);
}
void Database::close(void)
{
_index_file.close();
_data_file.close();
}
void Database::insert(const std::string &key const std::string &data)
{
if (!_index_file.is_open() || !_data_file.is_open()) { return; }
Offset hash_offset = _hash(key) * sizeof(HashItem);
HashItem hash_item = _read_hash_item(hash_offset);
if (_get_index_offset(hash_item key) != -1) { return; }
_data_file.seekp(0 std::ios::end);
HashItem hash_head = _read_hash_item(0);
IndexInfo index_info = { .next = hash_item.first .key_len = (Size)(key.size() + 1) };
Offset index_offset = hash_head.first;
Offset data_offset = _data_file.tellp();
DataInfo data_info = { .data_len = (Size)(data.length() + 1) .deleted = 0 };
_write_index_info(index_offset index_info);
_write_data_offset(index_offset data_offset);
_write_key(index_offset key);
_write_data_info(data_offset data_info);
_write_data(data_offset data);
hash_head.first = _index_file.tellp();
_write_hash_item(0 hash_head);
hash_item.count++;
hash_item.first = index_offset;
_write_hash_item(hash_offset hash_item);
}
void Database::remove(const std::string &key)
{
if (!_index_file.is_open() || !_data_file.is_open()) { return; }
Offset hash_offset = _hash(key) * sizeof(HashItem);
HashItem hash_item = _read_hash_item(hash_offset);
if (hash_item.count == 0) { return; }
IndexInfo index_info;
Offset prev_index_offset = -1;
Offset curr_index_offset = hash_item.first;
bool found = false;
for (int i = 0; i < hash_item.count; i++)
{
index_info = _read_index_info(curr_index_offset);
std::string index_key = _read_key(curr_index_offset index_info.key_len);
if (index_key == key)
{
found = true;
break;
}
prev_index_offset = curr_index_offset;
curr_index_offset = index_info.next;
}
if (found)
{
Offset data_offset = _read_data_offset(curr_index_offset);
DataInfo data_info = _read_data_info(data_offset);
data_info.deleted = 1;
_write_data_info(data_offset data_info);
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
目录 0 2017-07-23 21:08 Databa
文件 232 2017-07-23 21:08 Databa
目录 0 2018-02-28 11:58 __MACOSX\
目录 0 2018-02-28 11:58 __MACOSX\Databa
文件 216 2017-07-23 21:08 __MACOSX\Databa
文件 9870 2017-07-23 21:08 Databa
文件 216 2017-07-23 21:08 __MACOSX\Databa
文件 2467 2017-07-23 21:08 Databa
文件 216 2017-07-23 21:08 __MACOSX\Databa
文件 2020 2017-07-23 21:08 Databa
文件 216 2017-07-23 21:08 __MACOSX\Databa
文件 49 2017-07-23 21:08 Databa
文件 216 2017-07-23 21:08 __MACOSX\Databa
文件 216 2017-07-23 21:08 __MACOSX\._Databa
- 上一篇:libtiff头文件及库
- 下一篇:基于C++数据结构编写的航空订票系统
相关资源
- 基于C++数据结构编写的航空订票系统
- C语言实现遍历注册表
- 多线程MFCVS2010版本
- Q学习算法C语言程序亲测完美运行
- 基于C++的端口扫描
- 基于VC++6.0的四杆机构运动仿真软件
- win32对话框tab control控件使用demo
- 决策树C语言代码
-
Win32 Dialogba
sed Application - 遗传算法c++代码,车间调度
- 图像融合C++/MFC
- PC微信多开器,C#编写,C++ DLL
- ADE7758三相电能芯片读写源程序,全部
- C++蚁群算法的机器人路径规划
- C++队列操作入队出队
- Vc++/MFC下 Json解析
- SVM+OPENCV+交叉验证 计算识别率
- 拍卖系统及其说明文档
- 八皇后问题课程设计C++版
- 数据结构c语言实现求最短路径
- 山东大学历年C语言题库.
- More Effective C++中文完整版
- C语言课程设计之繁华曲线
- C语言课程设计之波形显示
- C++宿舍管理系统含实验报告
- 三次样条插值算法C++实现
- C语言课设之校级运动会管理系统
- socket tcp通信 多客户端
- RTSP服务器 C语言
- 如何利用VC++自动生成Excel表格
评论
共有 条评论