项目地址How Does a Database Work? | Let’s Build a Simple Database (cstack.github.io)
我们要写个像sqlite的轻量级数据库,先得看看它长什么样。
首先,在我们输入之前,它会打印sqlite>,然后接受输入进行判断,在输入不为.exit时程序会一直进行下去,应该是while(1),所以我们先将主函数以如下形式写出。
int main(int argc, char* argv[]) {
InputBuffer* input_buffer = new_input_buffer();
while (true) {
print_prompt();
read_input(input_buffer);
if (strcmp(input_buffer->buffer, ".exit") == 0) {
close_input_buffer(input_buffer);
exit(EXIT_SUCCESS);
} else {
printf("Unrecognized command '%s'.\n", input_buffer->buffer);
}
}
}
建立InputBuffer结构体,记录长度,指针,并初始化
typedef struct {
char* buffer;
size_t buffer_length;
ssize_t input_length;
} InputBuffer;
InputBuffer* new_input_buffer() {
InputBuffer* input_buffer = (InputBuffer*)malloc(sizeof(InputBuffer));
input_buffer->buffer = NULL;
input_buffer->buffer_length = 0;
input_buffer->input_length = 0;
return input_buffer;
}
完善函数并做一些边界判断
void print_prompt() { printf("sqlite>"); }
size_t getline(char **lineptr, size_t *n, FILE *stream);
void read_input(InputBuffer* input_buffer) {
ssize_t bytes_read =
getline(&(input_buffer->buffer), &(input_buffer->buffer_length), stdin);
if (bytes_read <= 0) {
printf("Error reading input\n");
exit(EXIT_FAILURE);
}
// 忽略换行符
input_buffer->input_length = bytes_read - 1;
input_buffer->buffer[bytes_read - 1] = 0;
}
lineptr
:指向我们用来指向包含读取行的缓冲区的变量的指针。如果将其设置为“被 mallocatted”,因此应由用户释放,即使命令失败也是如此。
n
:指向我们用于保存已分配缓冲区大小的变量的指针。
stream
:要从中读取的输入流。我们将从标准输入中读取。
return value
:读取的字节数,可能小于缓冲区的大小。
前面malloc了,就得有释放
void close_input_buffer(InputBuffer* input_buffer) {
free(input_buffer->buffer);
free(input_buffer);
}
好了,最简单的没有实装任何功能的数据库就完成了。
#include
#include
#include
#include
typedef struct {
char* buffer;
size_t buffer_length;
ssize_t input_length;
} InputBuffer;
InputBuffer* new_input_buffer() {
InputBuffer* input_buffer = malloc(sizeof(InputBuffer));
input_buffer->buffer = NULL;
input_buffer->buffer_length = 0;
input_buffer->input_length = 0;
return input_buffer;
}
void print_prompt() { printf("sqlite>"); }
void read_input(InputBuffer* input_buffer) {
ssize_t bytes_read =
getline(&(input_buffer->buffer), &(input_buffer->buffer_length), stdin);
if (bytes_read <= 0) {
printf("Error reading input\n");
exit(EXIT_FAILURE);
}
// Ignore trailing newline
input_buffer->input_length = bytes_read - 1;
input_buffer->buffer[bytes_read - 1] = 0;
}
void close_input_buffer(InputBuffer* input_buffer) {
free(input_buffer->buffer);
free(input_buffer);
}
int main(int argc, char* argv[]) {
InputBuffer* input_buffer = new_input_buffer();
while (true) {
print_prompt();
read_input(input_buffer);
if (strcmp(input_buffer->buffer, ".exit") == 0) {
printf("Good Bye.\n");
close_input_buffer(input_buffer);
exit(EXIT_SUCCESS);
} else {
printf("Unrecognized command '%s'.\n", input_buffer->buffer);
}
}
}
这里有我对数据库的思考,所以我就臭不要脸的投自制了。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)