Joedb 9.1.4
The Journal-Only Embedded Database
Loading...
Searching...
No Matches
Readonly_Encoded_File.cpp
Go to the documentation of this file.
2
3namespace joedb
4{
5 //////////////////////////////////////////////////////////////////////////
7 //////////////////////////////////////////////////////////////////////////
8 (
9 char * const buffer,
10 const size_t size,
11 const int64_t offset
12 ) const
13 {
14 const int64_t start = offset;
15 const int64_t end = offset + int64_t(size);
16
17 int64_t global_end = 0;
18
19 for (auto b: db.get_buffer_table())
20 {
21 const int64_t b_start = db.get_offset(b);
22 const int64_t b_end = b_start + db.get_size(b);
23
24 const int64_t intersection_start = std::max(start, b_start);
25 const int64_t intersection_end = std::min(end, b_end);
26 const int64_t intersection_size = intersection_end - intersection_start;
27
28 if (intersection_size > 0)
29 {
30 if (intersection_end > global_end)
31 global_end = intersection_end;
32
33 if (b != decoded_buffer)
34 {
35 if (int64_t(read_buffer.size()) < db.get_size(b))
36 read_buffer.resize(size_t(db.get_size(b)));
37
38 decoder.decode
39 (
40 blob_reader.read_blob_data(db.get_data(b)),
41 read_buffer.data(),
42 size_t(db.get_size(b))
43 );
44
45 decoded_buffer = b;
46 }
47
48 std::copy_n
49 (
50 read_buffer.data() + intersection_start - b_start,
51 intersection_size,
52 buffer + intersection_start - start
53 );
54 }
55 }
56
57 return size_t(global_end - offset);
58 }
59
60 //////////////////////////////////////////////////////////////////////////
62 //////////////////////////////////////////////////////////////////////////
63 (
64 Decoder &decoder,
66 const Buffered_File &blob_reader,
67 Open_Mode mode
68 ):
69 Buffered_File(mode),
70 db(db),
71 blob_reader(blob_reader),
72 decoded_buffer{0},
73 decoder(decoder)
74 {
75 }
76
77 //////////////////////////////////////////////////////////////////////////
79 //////////////////////////////////////////////////////////////////////////
80 (
81 Decoder &decoder,
83 const Buffered_File &blob_reader
84 ):
85 Readonly_Encoded_File(decoder, db, blob_reader, Open_Mode::read_existing)
86 {
87 }
88
89 //////////////////////////////////////////////////////////////////////////
91 //////////////////////////////////////////////////////////////////////////
92 {
93 int64_t result = 0;
94
95 for (const auto buffer: db.get_buffer_table())
96 {
97 const int64_t end = db.get_offset(buffer) + db.get_size(buffer);
98 if (end > result)
99 result = end;
100 }
101
102 return result;
103 }
104}
size_t pread(char *buffer, size_t size, int64_t offset) const override
int64_t get_size() const override
Readonly_Encoded_File(Decoder &decoder, db::encoded_file::Database &db, const Buffered_File &blob_reader, Open_Mode mode)
Store all the tables of the database.
Definition Database.h:75
container_of_buffer get_buffer_table() const
Definition Database.h:577
int64_t get_size(id_of_buffer record) const
Definition Database.h:521
int64_t get_offset(id_of_buffer record) const
Definition Database.h:527
Open_Mode
Definition Open_Mode.h:8
@ read_existing
fails if does not exist
Definition Blob.h:7