做国产数据库之二

做一个国产数据库

做一个数据库系统真的是要懂的是基础,各种基础,网络,文件系统,操作系统,性能,测试,各方面都要懂

使用基本方法

索引文件+数据文件+ 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 内存映射来修正我们的程序。

如何做一个国产数据库系统(一)相关推荐

  1. 如何做一个国产数据库(七) 网络传输 java做订阅客户端

    如何做一个国产数据库一 如何做一个国产数据库二 如何做一个国产数据库三 如何做一个国产数据库四 如何做一个国产数据库五 如何做一个国产数据库六 server端协议定义 再次强调一下我们的protoco ...

  2. 如何做一个国产数据库(六) 网络传输 nodejs做测试客户端

    如何做一个国产数据库一 如何做一个国产数据库二 如何做一个国产数据库三 如何做一个国产数据库四 如何做一个国产数据库五 网络实战服务器 我们再四中说过使用tcp进行协议的链接,对我们所定义的协议如果有 ...

  3. 如何做一个国产数据库(三)

    一和二 如何做一个国产数据库一 如何做一个国产数据库二 1.数据结构重新定义 再次重新定义数据结构 typedef struct sdata {uint32_t index;char vardata[ ...

  4. 如何做一个国产数据库(二)

    如果做一个国产数据库一链接 承接上文,继续 1.重新定义数据结构 typedef struct sdata {uint32_t index;char vardata[128]; }sdata;type ...

  5. 如何做一个国产数据库(四)

    网络 这次要用到网络了,存储的时候我们都使用网络来输入输出,当然,像本机是可以使用进程间通信的,不过为了简单,我们此次都使用tcp协议. 协议 此次使用libuv来做网络的传输,我们首先定一个协议,做 ...

  6. Spring 社区的唯一一个国产开源项目 - Spring Cloud Alibaba 毕业了

    阿里妹导读:一年多前,Java 界最近发生了一件大事,阿里开源 Spring Cloud Alibaba,并推出首个预览版.Spring Cloud 本身是一套微服务规范,并不是一个拿来即可用的框架, ...

  7. 做一个互联网+时代的新农民

    在村里,每天零晨闻鸡鸣,因为太宁静,鸡鸣就显得特别地高亢嘹亮,今天干脆做一个闻鸡起舞之人,来简单梳理这两天边做农民边思考的问题.技术发展得太快了,这些年感觉都在追赶,我们似乎只是国外的跟屁虫,但国外是 ...

  8. 大国隐痛:做一个操作系统有多难?

    作者:董指导.刘芮 支持:远川研究所科技组 智库:安信证券计算机首席分析师 吕伟 北京明十三陵龙虎山脚下,有一处地势隐蔽的地方,藏着一个叫做 "200号"的科研基地. 在中国,这种 ...

  9. 华为鸿蒙仿安卓,华为鸿蒙负责人:我们不是做一个安卓的替代品

    自华为发布鸿蒙操作系统以来,它一直备受外界瞩目. 是重压之下的应急,还是瞄准新赛道布局?是做原有软件的"影子",还是担负起产业牵引的新使命? "在别人的墙基上砌房子,再大 ...

最新文章

  1. 有了这 4 款工具,老板再也不怕我写烂SQL了
  2. matlab中的single是什么类型_MATLAB 中cell数据类型的使用方法
  3. [HNOI2002]营业额统计
  4. 文件操作:fread()和fwrite()
  5. 4 Oracle 操作表中数据
  6. python traceback对象_Python traceback【转】
  7. SAP CRM呼叫中心中结束按钮的实现逻辑
  8. torchvision学习之torchvision.datasets
  9. 编写一个Java应用程序,从键盘读取用户输入两个字符串,并重载3个函数分别实现这两个字符串的拼接、整数相加和浮点数相加。要进行异常处理,对输入的不符合要求的字符串提示给用户,不能使程序崩溃。
  10. echarts嵌套饼图
  11. houdini 常用命令
  12. Linux开发学习笔记(二)
  13. openstack 权限管理
  14. “14寸手机”,华为葫芦里到底卖的什么药?
  15. 丙烯的精制工艺及在线监测
  16. ENVI安装步骤和常见问题及解决办法(以ENVI5.3为例)
  17. 全桥驱动变压器漏感处理
  18. 安卓蓝牙功能小结(附蓝牙聊天室demo)
  19. Deskreen for Mac(mac投屏软件)
  20. 3元一集的超前点播付费模式,合理吗?

热门文章

  1. linux screen 命令是 ssh 的有效补充
  2. 中国历史上最牛气的十大豪言壮语
  3. 豆瓣鹅组等7个小组被停用 豆瓣4个月累计关停56个问题小组
  4. 6999元!红魔6S Pro推出战地迷彩主题限定套装:11月1日正式开售
  5. OPPO K9 Pro将于9月26日登场:搭载天玑1200旗舰游戏芯
  6. iPhone 13 Pro原型机曝光:全新玫瑰金配色,女性首选
  7. 蓝色起源8月25日进行无人飞行,携带实验设备等上天
  8. 微软宣布明年停止支持已推出25年的IE浏览器
  9. 黄峥辞任董事长,超级投票权失效!拼多多已成为中国电商第一
  10. 苏宁:国庆节首日 电器门店订单增长50%