Joedb 9.1.4
The Journal-Only Embedded Database
Loading...
Searching...
No Matches
Encoded_File.cpp
Go to the documentation of this file.
2
3namespace joedb
4{
5 //////////////////////////////////////////////////////////////////////////
7 //////////////////////////////////////////////////////////////////////////
8 {
9 flush_write_buffer();
11 }
12
13 //////////////////////////////////////////////////////////////////////////
15 //////////////////////////////////////////////////////////////////////////
16 (
17 char * const buffer,
18 const size_t size,
19 const int64_t offset
20 ) const
21 {
22 flush_write_buffer();
23 return Readonly_Encoded_File::pread(buffer, size, offset);
24 }
25
26 //////////////////////////////////////////////////////////////////////////
27 void Encoded_File::write_blob(const char *buffer, size_t size, int64_t offset) const
28 //////////////////////////////////////////////////////////////////////////
29 {
30 const Blob blob = db.write_blob_data(codec.encode(buffer, size));
31 db.new_buffer(blob, int64_t(size), offset);
32 db.checkpoint();
33 }
34
35 //////////////////////////////////////////////////////////////////////////
36 void Encoded_File::flush_write_buffer() const
37 //////////////////////////////////////////////////////////////////////////
38 {
39 if (write_buffer_size > 0)
40 {
41 write_blob(write_buffer.data(), write_buffer_size, write_buffer_offset);
42 write_buffer_size = 0;
43 }
44 }
45
46 //////////////////////////////////////////////////////////////////////////
47 void Encoded_File::pwrite(const char *buffer, size_t size, int64_t offset)
48 //////////////////////////////////////////////////////////////////////////
49 {
50 if (size > write_buffer_total_size)
51 {
52 flush_write_buffer();
53 write_blob(buffer, size, offset);
54 return;
55 }
56
57 if
58 (
59 write_buffer_size &&
60 (
61 write_buffer_offset + int64_t(write_buffer_size) != offset ||
62 write_buffer_size + size > write_buffer_total_size
63 )
64 )
65 {
66 flush_write_buffer();
67 }
68
69 if (write_buffer_size == 0)
70 write_buffer_offset = offset;
71
72 std::copy_n(buffer, size, write_buffer.data() + write_buffer_size);
73
74 write_buffer_size += size;
75 }
76
77 //////////////////////////////////////////////////////////////////////////
79 //////////////////////////////////////////////////////////////////////////
80 (
81 Codec &codec,
83 ):
85 (
86 codec,
87 db,
88 db.get_journal().get_file(),
90 ),
91 db(db),
92 codec(codec),
93 write_buffer(write_buffer_total_size),
94 write_buffer_offset(0),
95 write_buffer_size(0)
96 {
97 }
98
99 //////////////////////////////////////////////////////////////////////////
101 //////////////////////////////////////////////////////////////////////////
102 {
103 return std::max
104 (
105 write_buffer_offset + int64_t(write_buffer_size),
107 );
108 }
109
110 //////////////////////////////////////////////////////////////////////////
112 //////////////////////////////////////////////////////////////////////////
113 {
114 try
115 {
116 flush_write_buffer();
117 }
118 catch (...)
119 {
120 }
121 }
122}
void pwrite(const char *buffer, size_t size, int64_t offset) override
Encoded_File(Codec &codec, db::encoded_file::Writable_Database &db)
size_t pread(char *buffer, size_t size, int64_t offset) const override
int64_t get_size() const override
void sync() override
size_t pread(char *buffer, size_t size, int64_t offset) const override
int64_t get_size() const override
A writable Database constructed from a writable joedb::Buffered_File.
Open_Mode
Definition Open_Mode.h:8
@ write_existing_or_create_new
either write_existing or create_new depending on whether the file exists. Racy in Posix,...
Definition Blob.h:7