如何做一个国产数据库系统(一)
做国产数据库之二
做一个国产数据库
做一个数据库系统真的是要懂的是基础,各种基础,网络,文件系统,操作系统,性能,测试,各方面都要懂
使用基本方法
索引文件+数据文件+ B+ 树 ,hash空间
如图是写的一个数据库文件,
前面两兆字节是索引,后面是数据。最前面的8字节数据为索引总量 4字节,和 目前索引量4字节。
1、定义我们的数据结构
typedef struct sdata
{
uint32_t index;
char vardata[128];
}sdata;
这个数据结构表明 index是索引 ,vardata是128字节的数据,长度不超过128字节,这个数据结构是各案例,以后我们会逐步修改
2 、写一个基本的数据库
//2M 的索引,一半的空间为索引号码,一半的空间为数据偏移地址
// 1024*1024/sizeof(int)
int bfile_write(const char * file,/*uint32_t index_num,*/ sdata data[],int n)
{#define INDEX_BYTES 2 * 1024 * 1024int index_num = 1024 * 1024 / sizeof(int); //max index number is 162144if (n > index_num)return -1;FILE * fp = fopen(file, "wb");if (fp == NULL)return -1;fpos_t pos_start = 0;fpos_t pos_index = 8;fpos_t pos_data = pos_index + INDEX_BYTES;fpos_t position = 4 + 4 + INDEX_BYTES + sizeof(data[0].vardata) * n;fsetpos(fp, &position);fsetpos(fp, &pos_start);//写入总索引量fwrite(&index_num, sizeof(int), 1, fp);//写入目前索引量fwrite(&n, sizeof(int), 1, fp);//排序写入文件std::sort(&data[0], &data[n], Rule());int offsetsum = 4+4+INDEX_BYTES;int len = sizeof(data[0].vardata);for (int i = 0; i < index_num; i++){//wnum++;if (i < n){fwrite(&data[i].index, sizeof(int), 1, fp);offsetsum += len;fwrite(&offsetsum, sizeof(int), 1, fp);}else{uint64_t flag = 0;fwrite(&flag, sizeof(uint64_t), 1, fp);}}offsetsum = 4 + 4 + INDEX_BYTES;fpos_t pos = offsetsum;for (int i = 0; i < n; i++){fsetpos(fp,&pos);fwrite(&data[i].vardata, strlen(data[i].vardata), 1, fp);pos += sizeof(data[0].vardata);}fclose(fp);return 0;
}
以上这个函数调用将会产生一个2M多字节的数据库文件 test.db
2、读取搜索程序
//2M的空间做索引
int bfile_Search(const char * file)
{size_t nr;uint64_t indexf;//索引标识uint64_t indexl;//索引长度,内容为x个索引FILE * fp = fopen(file, "rb");if (fp == NULL)return -1;nr = fread(&indexf, sizeof(uint64_t), 1, fp);if (nr == 0){fclose(fp);return -1;}nr = fread(&indexl, sizeof(uint64_t), 1, fp);if (nr == 0){fclose(fp);return -1;}//4字节索引号 4字节偏移地址uint8_t * index_con = (uint8_t*)malloc(indexl * sizeof(uint32_t)*2);nr = fread(index_con, indexl * sizeof(uint32_t) * 2, 1, fp);if (nr == 0){fclose(fp);return -1;}for (int i = 0; i < indexl; i++){//如果是零 前后跳过}return 0;
}
int main()
{sdata data[100];srand(1000);for (int i = 0; i < 100; i++){//模拟收集到的数据data[i].index = rand() %50;}std::sort(&data[0], &data[100], Rule());for (int i = 0; i < 100; i++){cout<<"-->"<< data[i].index << endl;sprintf(data[i].vardata, "the data is %ld", data[i].index);}bfile_write("./test.db", data, 100);for (int i = 10; i < 21; i++){int index = binSearch(i, data, 100);if (index != -1){cout << "we find it ,is " << index << endl;}}return 0;
}
以上为调用,我们写了一个基本的样子程序,还没有完成,后面我们逐步改善这个程序,直到变成一个真正的数据库程序。我们会使用内存映射文件,b+树数据结构,hash 内存映射来修正我们的程序。
如何做一个国产数据库系统(一)相关推荐
- 如何做一个国产数据库(七) 网络传输 java做订阅客户端
如何做一个国产数据库一 如何做一个国产数据库二 如何做一个国产数据库三 如何做一个国产数据库四 如何做一个国产数据库五 如何做一个国产数据库六 server端协议定义 再次强调一下我们的protoco ...
- 如何做一个国产数据库(六) 网络传输 nodejs做测试客户端
如何做一个国产数据库一 如何做一个国产数据库二 如何做一个国产数据库三 如何做一个国产数据库四 如何做一个国产数据库五 网络实战服务器 我们再四中说过使用tcp进行协议的链接,对我们所定义的协议如果有 ...
- 如何做一个国产数据库(三)
一和二 如何做一个国产数据库一 如何做一个国产数据库二 1.数据结构重新定义 再次重新定义数据结构 typedef struct sdata {uint32_t index;char vardata[ ...
- 如何做一个国产数据库(二)
如果做一个国产数据库一链接 承接上文,继续 1.重新定义数据结构 typedef struct sdata {uint32_t index;char vardata[128]; }sdata;type ...
- 如何做一个国产数据库(四)
网络 这次要用到网络了,存储的时候我们都使用网络来输入输出,当然,像本机是可以使用进程间通信的,不过为了简单,我们此次都使用tcp协议. 协议 此次使用libuv来做网络的传输,我们首先定一个协议,做 ...
- Spring 社区的唯一一个国产开源项目 - Spring Cloud Alibaba 毕业了
阿里妹导读:一年多前,Java 界最近发生了一件大事,阿里开源 Spring Cloud Alibaba,并推出首个预览版.Spring Cloud 本身是一套微服务规范,并不是一个拿来即可用的框架, ...
- 做一个互联网+时代的新农民
在村里,每天零晨闻鸡鸣,因为太宁静,鸡鸣就显得特别地高亢嘹亮,今天干脆做一个闻鸡起舞之人,来简单梳理这两天边做农民边思考的问题.技术发展得太快了,这些年感觉都在追赶,我们似乎只是国外的跟屁虫,但国外是 ...
- 大国隐痛:做一个操作系统有多难?
作者:董指导.刘芮 支持:远川研究所科技组 智库:安信证券计算机首席分析师 吕伟 北京明十三陵龙虎山脚下,有一处地势隐蔽的地方,藏着一个叫做 "200号"的科研基地. 在中国,这种 ...
- 华为鸿蒙仿安卓,华为鸿蒙负责人:我们不是做一个安卓的替代品
自华为发布鸿蒙操作系统以来,它一直备受外界瞩目. 是重压之下的应急,还是瞄准新赛道布局?是做原有软件的"影子",还是担负起产业牵引的新使命? "在别人的墙基上砌房子,再大 ...
最新文章
- 有了这 4 款工具,老板再也不怕我写烂SQL了
- matlab中的single是什么类型_MATLAB 中cell数据类型的使用方法
- [HNOI2002]营业额统计
- 文件操作:fread()和fwrite()
- 4 Oracle 操作表中数据
- python traceback对象_Python traceback【转】
- SAP CRM呼叫中心中结束按钮的实现逻辑
- torchvision学习之torchvision.datasets
- 编写一个Java应用程序,从键盘读取用户输入两个字符串,并重载3个函数分别实现这两个字符串的拼接、整数相加和浮点数相加。要进行异常处理,对输入的不符合要求的字符串提示给用户,不能使程序崩溃。
- echarts嵌套饼图
- houdini 常用命令
- Linux开发学习笔记(二)
- openstack 权限管理
- “14寸手机”,华为葫芦里到底卖的什么药?
- 丙烯的精制工艺及在线监测
- ENVI安装步骤和常见问题及解决办法(以ENVI5.3为例)
- 全桥驱动变压器漏感处理
- 安卓蓝牙功能小结(附蓝牙聊天室demo)
- Deskreen for Mac(mac投屏软件)
- 3元一集的超前点播付费模式,合理吗?