如何做一个国产数据库系统(一)

做国产数据库之二

做一个国产数据库

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

使用基本方法

索引文件+数据文件+ 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 * 1024
	int index_num = 1024 * 1024 / sizeof(int); //max index number is 162144
	if (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 内存映射来修正我们的程序。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qianbo_insist

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值