-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcell.js
93 lines (70 loc) · 2.24 KB
/
cell.js
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
// Martin Pravda
// cell.js
// Cell in the sqlite terminology is a place where rowid
// and record payload are stored.
/*jslint browser, node */
import utils from "./utils.js";
import varint from "./varint64.js";
function parse_pointers(view, page_start, pointers_offset, number_of_cells) {
return utils.make_empty_list(
number_of_cells
).map(function (ignore, index) {
// since cell pointers are the array of 2 byte pointers
// we need to calculate even numbers based on the number of cells
return index * 2;
}).reduce(function (pointers, order) {
const pointer_offset = view.getUint16(pointers_offset + order);
pointers.push(page_start + pointer_offset);
return pointers;
}, []);
}
function parse_table_interior(view, start) {
const left_child_page_nr = view.getUint32(start);
const row = varint.decode(view, start + 4);
return Object.freeze({
left_child_page_nr,
row_id: row.data
});
}
function parse_table_leaf(view, start) {
const payload = varint.decode(view, start);
start += payload.size;
const row = varint.decode(view, start);
start += row.size;
return Object.freeze({
// keep overflow empty for now
// overflow_start: view.getUint32(start + payload.data),
payload_end: start + payload.data,
payload_start: start,
row_id: row.data
});
}
function parse_index_leaf(view, start) {
const payload = varint.decode(view, start);
start += payload.size;
return Object.freeze({
// keep overflow empty for now
// overflow_start: view.getUint32(start + payload.data),
payload_end: start + payload.data,
payload_start: start
});
}
function parse_index_interior(view, start) {
const left_child_page_nr = view.getUint32(start);
const payload = varint.decode(view, start);
start += payload.size;
return Object.freeze({
// keep overflow empty for now
// overflow_start: view.getUint32(start + payload.data),
left_child_page_nr,
payload_end: start + payload.data,
payload_start: start
});
}
export default Object.freeze({
parse_index_interior,
parse_index_leaf,
parse_pointers,
parse_table_interior,
parse_table_leaf
});