-
Notifications
You must be signed in to change notification settings - Fork 1
/
sqlparser.h
107 lines (99 loc) · 2.89 KB
/
sqlparser.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#include <string.h>
#include <stdlib.h>
#include "types.h"
#ifndef SQL_PARSER_H
#define SQL_PARSER_H
/**
* This is equal to `SQL Compiler` module in sqlite.
* Here, we just compiler(parse) the sql by hands :-D .
* Parse the sql statements, and put the result in statement_t
* From so far, we support sql statements:
* - insert
* - select
* - update
**/
parse_result_t parse_row_fields(buffer_t *input, statement_t *statement)
{
char *keyword = strtok(input->buffer, " ");
char *id_str = strtok(NULL, " ");
char *username = strtok(NULL, " ");
char *email = strtok(NULL, " ");
if (id_str == NULL || username == NULL || email == NULL || strtok(NULL, " ") != NULL)
{
return PARSE_SYNTAX_ERROR;
}
int id = atoi(id_str);
if (strlen(username) > COLUMN_USERNAME_SIZE || strlen(email) > COLUMN_EMAIL_SIZE)
{
return PARSE_STRING_TOO_LONG;
}
statement->row_to_insert.id = id;
strcpy(statement->row_to_insert.username, username);
strcpy(statement->row_to_insert.email, email);
return PARSE_SUCCESS;
}
parse_result_t parse_insert(buffer_t *input, statement_t *statement)
{
statement->type = STATEMENT_INSERT;
return parse_row_fields(input, statement);
}
parse_result_t parse_select(buffer_t *input, statement_t *statement)
{
statement->type = STATEMENT_SELECT;
return PARSE_SUCCESS;
}
parse_result_t parse_update(buffer_t *input, statement_t *statement)
{
statement->type = STATEMENT_UPDATE;
return parse_row_fields(input, statement);
}
parse_result_t parse_delete(buffer_t *input, statement_t *statement)
{
statement->type = STATEMENT_DELETE;
char *keyword = strtok(input->buffer, " ");
char *id_str = strtok(NULL, " ");
if (keyword == NULL || id_str == NULL || strtok(NULL, " ") != NULL)
{
return PARSE_SYNTAX_ERROR;
}
statement->row_to_insert.id = atoi(id_str);
return PARSE_SUCCESS;
}
parse_result_t parse_commit(buffer_t *input, statement_t *statement)
{
return PARSE_UNIMPLEMENTED;
}
parse_result_t parse_rollback(buffer_t *input, statement_t *statement)
{
return PARSE_UNIMPLEMENTED;
}
// 执行 insert, select 命令
parse_result_t parse_statement(buffer_t *input, statement_t *statement)
{
if (strncmp(input->buffer, "insert", 6) == 0)
{
return parse_insert(input, statement);
}
if (strncmp(input->buffer, "select", 6) == 0)
{
return parse_select(input, statement);
}
if (strncmp(input->buffer, "update", 6) == 0)
{
return parse_update(input, statement);
}
if (strncmp(input->buffer, "delete", 6) == 0)
{
return parse_delete(input, statement);
}
if (strncmp(input->buffer, "commit", 6) == 0)
{
return parse_commit(input, statement);
}
if (strncmp(input->buffer, "rollback", 8) == 0)
{
return parse_rollback(input, statement);
}
return PARSE_UNRECOGNIZED_STATEMENT;
}
#endif