Skip to content

Commit aaeebaf

Browse files
committed
Updated server module to use the parser
1 parent e855c15 commit aaeebaf

File tree

6 files changed

+156
-16
lines changed

6 files changed

+156
-16
lines changed

Diff for: README.md

+6
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,12 @@ Build it linking the library
7777
gcc -o my_project main.c -I/path/to/timeseries/include -L/path/to/timeseries -ltimeseries
7878
```
7979

80+
To run it
81+
82+
```bash
83+
LD_LIBRARY_PATH=/path/to/timeseries.so ./my_project
84+
```
85+
8086
#### Quickstart
8187

8288
```c

Diff for: src/arena.c

+2
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,14 @@ static void *arena_alloc_aligned(Arena *a, size_t size, size_t alignment) {
3232

3333
return ptr;
3434
}
35+
3536
void *arena_alloc(size_t size, void *context) {
3637
if (!size)
3738
return 0;
3839

3940
return arena_alloc_aligned((Arena *)context, size, DEFAULT_ALIGNMENT);
4041
}
42+
4143
void arena_free(size_t size, void *ptr, void *context) {
4244
(void)ptr;
4345
(void)size;

Diff for: src/main.c

+46-8
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
#include "commit_log.h"
22
#include "logging.h"
3+
#include "parser.h"
34
#include "persistent_index.h"
4-
#include "protocol.h"
5+
#include "server.h"
56
#include "timeseries.h"
67
#include <stdio.h>
78
#include <stdlib.h>
@@ -265,13 +266,50 @@ int main(void) {
265266

266267
/* tsdb_close(db); */
267268

268-
Token *tokens = tokenize("TS.QUERY RANGE temperatures 12 24");
269-
AST_Node *ast = parse(tokens, 5);
270-
print_ast(ast);
271-
Command cmd = parse_ast(ast);
272-
printf("%s %lu %lu\n", cmd.query.ts_name, cmd.query.start_ts,
273-
cmd.query.end_ts);
274-
ast_free(ast);
269+
size_t total_tokens = 0;
270+
Token *tokens = tokenize("CREATE temperatures INTO db_test", &total_tokens);
271+
272+
Statement_Create create = parse_create(tokens, total_tokens);
273+
274+
print_create(&create);
275+
printf("\n");
276+
277+
total_tokens = 0;
278+
279+
tokens = tokenize(
280+
"INSERT temperatures INTO db_test 12, 98.2, 15, 96.2, 18, 99.1 ",
281+
&total_tokens);
282+
283+
Statement_Insert insert = parse_insert(tokens, total_tokens);
284+
285+
print_insert(&insert);
286+
printf("\n");
287+
288+
total_tokens = 0;
289+
290+
tokens = tokenize("SELECT temperatures FROM test_db RANGE 10 TO 45 "
291+
"WHERE value > 67.8 AGGREGATE AVG BY 3600",
292+
&total_tokens);
293+
294+
Statement_Select select = parse_select(tokens, total_tokens);
295+
296+
print_select(&select);
297+
/* printf("SELECT\n\t%s\nFROM\n\t%s\nRANGE\n\t%li TO %li\nWHERE\n\t%s %i "
298+
*/
299+
/* "%.2lf\nAGGREGATE\n\t%i\nBY\n\t%lu\n", */
300+
/* select.ts_name, select.db_name, select.start_time,
301+
* select.end_time, */
302+
/* select.where.key, select.where.operator, select.where.value, */
303+
/* select.af, select.interval); */
304+
305+
/* AST_Node *ast = parse(tokens, 5); */
306+
/* print_ast(ast); */
307+
/* Command cmd = parse_ast(ast); */
308+
/* printf("%s %lu %lu\n", cmd.query.ts_name, cmd.query.start_ts, */
309+
/* cmd.query.end_ts); */
310+
/* ast_free(ast); */
311+
312+
roachdb_server_run("127.0.0.1", 17678);
275313

276314
return 0;
277315
}

Diff for: src/parser.c

+8-4
Original file line numberDiff line numberDiff line change
@@ -239,7 +239,11 @@ Statement_Insert parse_insert(Token *tokens, size_t token_count) {
239239
snprintf(insert.db_name, sizeof(insert.db_name), "%s",
240240
tokens[i].value);
241241
} else if (tokens[i].type == TOKEN_TIMESTAMP) {
242-
insert.records[j].timestamp = atoll(tokens[i].value);
242+
// Crude check for empty timestamp
243+
if (tokens[i].value[0] == '*')
244+
insert.records[j].timestamp = -1;
245+
else
246+
insert.records[j].timestamp = atoll(tokens[i].value);
243247
} else if (tokens[i].type == TOKEN_LITERAL) {
244248
insert.records[j++].value = strtod(tokens[i].value, &endptr);
245249
}
@@ -315,11 +319,11 @@ Statement_Select parse_select(Token *tokens, size_t token_count) {
315319
break;
316320
case TOKEN_AGGREGATE_FN:
317321
if (strncmp(tokens[i].value, "AVG", 3) == 0)
318-
select.af = AF_AVG;
322+
select.af = AFN_AVG;
319323
else if (strncmp(tokens[i].value, "MIN", 3) == 0)
320-
select.af = AF_MIN;
324+
select.af = AFN_MIN;
321325
else if (strncmp(tokens[i].value, "MAX", 3) == 0)
322-
select.af = AF_MAX;
326+
select.af = AFN_MAX;
323327
break;
324328
default:
325329
break;

Diff for: src/parser.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ typedef struct {
7979
} Token;
8080

8181
// Define aggregate function types
82-
typedef enum { AF_AVG, AF_MIN, AF_MAX } Aggregate_Function;
82+
typedef enum { AFN_AVG, AFN_MIN, AFN_MAX } Aggregate_Function;
8383

8484
// Define operator types
8585
typedef enum { OP_EQ, OP_NE, OP_GE, OP_GT, OP_LE, OP_LT } Operator;
@@ -109,7 +109,7 @@ typedef struct {
109109

110110
// Define a pair (timestamp, value) for INSERT statements
111111
typedef struct {
112-
uint64_t timestamp;
112+
int64_t timestamp;
113113
double_t value;
114114
} Create_Record;
115115

Diff for: src/server.c

+92-2
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,79 @@
22
#define EV_SOURCE
33
#define EV_TCP_SOURCE
44
#include "ev_tcp.h"
5-
#include "protocol.h"
5+
#include "logging.h"
6+
#include "parser.h"
67
#include "server.h"
8+
#include "timeseries.h"
79

810
#define BACKLOG 128
911

12+
// testing dummy
13+
static Timeseries_DB *db;
14+
15+
static void execute_statement(Statement *statement) {
16+
Record r = {0};
17+
Timeseries *ts = NULL;
18+
struct timespec tv;
19+
20+
switch (statement->type) {
21+
case STATEMENT_CREATE:
22+
if (statement->create.mask == 0)
23+
db = tsdb_init(statement->create.db_name);
24+
else
25+
(void)ts_create(db, statement->create.ts_name, 0, DP_IGNORE);
26+
break;
27+
case STATEMENT_INSERT:
28+
ts = ts_get(db, statement->insert.ts_name);
29+
uint64_t timestamp = 0;
30+
for (size_t i = 0; i < statement->insert.record_len; ++i) {
31+
if (statement->insert.records[i].timestamp == -1) {
32+
clock_gettime(CLOCK_REALTIME, &tv);
33+
timestamp = tv.tv_sec * 1e9 + tv.tv_nsec;
34+
} else {
35+
timestamp = statement->insert.records[i].timestamp;
36+
}
37+
ts_insert(ts, timestamp, statement->insert.records[i].value);
38+
}
39+
break;
40+
case STATEMENT_SELECT:
41+
ts = ts_get(db, statement->select.ts_name);
42+
int err = 0;
43+
Points coll;
44+
vec_new(coll);
45+
46+
if (statement->select.mask & SM_SINGLE) {
47+
err = ts_find(ts, statement->select.start_time, &r);
48+
if (err < 0)
49+
log_error("Couldn't find the record %lu",
50+
statement->select.start_time);
51+
else
52+
log_info("Record found: %lu %.2lf", r.timestamp, r.value);
53+
} else if (statement->select.mask & SM_RANGE) {
54+
err = ts_range(ts, statement->select.start_time,
55+
statement->select.end_time, &coll);
56+
if (err < 0) {
57+
log_error("Couldn't find the record %lu",
58+
statement->select.start_time);
59+
} else {
60+
for (size_t i = 0; i < vec_size(coll); i++) {
61+
Record r = vec_at(coll, i);
62+
log_info(" %lu {.sec: %lu, .nsec: %lu .value: %.02f }", r.timestamp,
63+
r.tv.tv_sec, r.tv.tv_nsec, r.value);
64+
65+
}
66+
}
67+
}
68+
break;
69+
default:
70+
log_error("Unknown command");
71+
break;
72+
}
73+
74+
if (ts)
75+
ts_close(ts);
76+
}
77+
1078
static void on_close(ev_tcp_handle *client, int err) {
1179
(void)client;
1280
if (err == EV_TCP_SUCCESS)
@@ -22,7 +90,26 @@ static void on_write(ev_tcp_handle *client) {
2290
}
2391

2492
static void on_data(ev_tcp_handle *client) {
25-
printf("Data received (%lu)\n", client->buffer.size);
93+
if (client->buffer.size == 0)
94+
return;
95+
96+
char *line_start = client->buffer.buf;
97+
char *line_end;
98+
99+
while ((line_end = strstr(line_start, "\r\n")) != NULL) {
100+
*line_end = '\0';
101+
log_info("Line received %s", line_start);
102+
// Line gets processed here
103+
// Parse into Statement
104+
size_t total_tokens;
105+
Token *tokens = tokenize(line_start, &total_tokens);
106+
Statement statement = parse(tokens, total_tokens);
107+
// Execute it
108+
execute_statement(&statement);
109+
line_start = line_end + 2;
110+
}
111+
112+
ev_tcp_queue_write(client);
26113
}
27114

28115
static void on_connection(ev_tcp_handle *server) {
@@ -39,6 +126,7 @@ static void on_connection(ev_tcp_handle *server) {
39126
}
40127

41128
int roachdb_server_run(const char *host, int port) {
129+
db = tsdb_init("testdb");
42130
ev_context *ctx = ev_get_context();
43131
ev_tcp_server server;
44132
ev_tcp_server_init(&server, ctx, BACKLOG);
@@ -59,5 +147,7 @@ int roachdb_server_run(const char *host, int port) {
59147
// to stop the server with Ctrl+C
60148
ev_tcp_server_stop(&server);
61149

150+
tsdb_close(db);
151+
62152
return 0;
63153
}

0 commit comments

Comments
 (0)