-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmeta.c
165 lines (125 loc) · 3.66 KB
/
meta.c
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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "common/include.h"
#include "vendor/fnv.h"
const VOIDDB_slice VOIDDB_META_MAGIC =
(VOIDDB_slice){ "voidMETA", VOIDDB_WORD_SIZE };
const int64_t VOIDDB_VERSION = 0;
VOIDDB_slice voiddb_meta_magic(VOIDDB_slice meta)
{
return voiddb_common_field(meta, 0, VOIDDB_WORD_SIZE);
}
void voiddb_meta_set_magic(VOIDDB_slice meta)
{
memcpy(voiddb_meta_magic(meta).array, VOIDDB_META_MAGIC.array,
VOIDDB_WORD_SIZE);
return;
}
VOIDDB_slice voiddb_meta_version(VOIDDB_slice meta)
{
return voiddb_common_field(meta, VOIDDB_WORD_SIZE, VOIDDB_WORD_SIZE);
}
int64_t voiddb_meta_get_version(VOIDDB_slice meta)
{
return voiddb_common_get_int(voiddb_meta_version(meta));
}
int voiddb_meta_set_version(VOIDDB_slice meta)
{
return voiddb_common_put_int(voiddb_meta_version(meta), VOIDDB_VERSION);
}
VOIDDB_slice voiddb_meta_timestamp(VOIDDB_slice meta)
{
return voiddb_common_field(meta, 2 * VOIDDB_WORD_SIZE,
VOIDDB_WORD_SIZE);
}
int voiddb_meta_set_timestamp(VOIDDB_slice meta)
{
int e;
struct timespec time;
e = clock_gettime(CLOCK_REALTIME, &time);
if (e != 0) {
return e;
}
return voiddb_common_put_int(voiddb_meta_timestamp(meta),
(int64_t)(time.tv_sec) * 1e9 +
(int64_t)(time.tv_nsec));
}
VOIDDB_slice voiddb_meta_root_node_pointer(VOIDDB_slice meta)
{
return voiddb_common_field(meta, 4 * VOIDDB_WORD_SIZE,
VOIDDB_WORD_SIZE);
}
int voiddb_meta_set_root_node_pointer(VOIDDB_slice meta, int64_t pointer)
{
return voiddb_common_put_int(voiddb_meta_root_node_pointer(meta),
pointer);
}
VOIDDB_slice voiddb_meta_frontier_pointer(VOIDDB_slice meta)
{
return voiddb_common_field(meta, 5 * VOIDDB_WORD_SIZE,
VOIDDB_WORD_SIZE);
}
int voiddb_meta_set_frontier_pointer(VOIDDB_slice meta, int64_t pointer)
{
return voiddb_common_put_int(voiddb_meta_frontier_pointer(meta),
pointer);
}
VOIDDB_slice voiddb_meta_checksum(VOIDDB_slice meta)
{
return voiddb_common_field(meta, 7 * VOIDDB_WORD_SIZE,
VOIDDB_WORD_SIZE);
}
uint64_t voiddb_meta_compute_checksum(VOIDDB_slice meta)
{
VOIDDB_slice head = voiddb_common_field(meta, 0, 7 * VOIDDB_WORD_SIZE);
VOIDDB_slice tail =
voiddb_common_field(meta, 8 * VOIDDB_WORD_SIZE,
VOIDDB_PAGE_SIZE - 8 * VOIDDB_WORD_SIZE);
return fnv_64a_buf(tail.array, tail.length,
fnv_64a_buf(head.array, head.length, FNV1A_64_INIT));
}
int voiddb_meta_set_checksum(VOIDDB_slice meta)
{
return voiddb_common_put_uint64(voiddb_meta_checksum(meta),
voiddb_meta_compute_checksum(meta));
}
bool voiddb_meta_checksum_ok(VOIDDB_slice meta)
{
return voiddb_common_get_uint64(voiddb_meta_checksum(meta)) ==
voiddb_meta_compute_checksum(meta);
}
VOIDDB_slice voiddb_meta_new_meta()
{
VOIDDB_slice meta = { calloc(1, VOIDDB_PAGE_SIZE), VOIDDB_PAGE_SIZE };
voiddb_meta_set_magic(meta);
voiddb_meta_set_version(meta);
return meta;
}
VOIDDB_slice voiddb_meta_new_meta_init()
{
VOIDDB_slice meta = voiddb_meta_new_meta();
voiddb_meta_set_timestamp(meta);
voiddb_meta_set_root_node_pointer(meta, 2 * VOIDDB_PAGE_SIZE);
voiddb_meta_set_frontier_pointer(meta, 3 * VOIDDB_PAGE_SIZE);
voiddb_meta_set_checksum(meta);
return meta;
}
VOIDDB_slice voiddb_meta_make_copy(VOIDDB_slice meta)
{
VOIDDB_slice copy = { calloc(1, VOIDDB_PAGE_SIZE), VOIDDB_PAGE_SIZE };
memcpy(copy.array, meta.array, VOIDDB_PAGE_SIZE);
return copy;
}
bool voiddb_meta_is_meta(VOIDDB_slice meta)
{
if (!voiddb_meta_checksum_ok(meta)) {
return false;
} else if (!voiddb_common_equal(voiddb_meta_magic(meta),
VOIDDB_META_MAGIC)) {
return false;
} else if (voiddb_meta_get_version(meta) != VOIDDB_VERSION) {
return false;
}
return true;
}