Joedb 10.4.3
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();
10 db.hard_checkpoint();
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 std::string_view buffer, int64_t offset) const
28 //////////////////////////////////////////////////////////////////////////
29 {
30 const Blob blob = db.write_blob(codec.encode(buffer));
31 db.new_buffer(blob, int64_t(buffer.size()), offset);
32 db.soft_checkpoint();
33 }
34
35 //////////////////////////////////////////////////////////////////////////
36 void Encoded_File::flush_write_buffer() const
37 //////////////////////////////////////////////////////////////////////////
38 {
39 if (write_buffer_size > 0)
40 {
41 write_blob(std::string_view(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 (write_buffer_size)
51 {
52 if (write_buffer_offset + int64_t(write_buffer_size) != offset)
53 flush_write_buffer();
54 else
55 {
56 const size_t room = write_buffer_capacity - write_buffer_size;
57 const size_t s = std::min(room, size);
58 std::memcpy(write_buffer.data() + write_buffer_size, buffer, s);
59 write_buffer_size += s;
60 buffer += s;
61 offset += int64_t(s);
62 size -= s;
63 }
64 }
65
66 if (size > 0)
67 {
68 flush_write_buffer();
69 while (size >= write_buffer_capacity)
70 {
71 write_blob(std::string_view(buffer, write_buffer_capacity), offset);
72 buffer += write_buffer_capacity;
73 offset += write_buffer_capacity;
74 size -= write_buffer_capacity;
75 }
76 }
77
78 if (size > 0)
79 {
80 std::memcpy(write_buffer.data(), buffer, size);
81 write_buffer_offset = offset;
82 write_buffer_size = size;
83 }
84 }
85
86 //////////////////////////////////////////////////////////////////////////
88 //////////////////////////////////////////////////////////////////////////
89 (
90 Codec &codec,
92 ):
94 (
95 codec,
96 db,
97 db.get_journal().get_file(),
99 ),
100 db(db),
101 codec(codec),
102 write_buffer(write_buffer_capacity),
103 write_buffer_offset(0),
104 write_buffer_size(0)
105 {
106 }
107
108 //////////////////////////////////////////////////////////////////////////
110 //////////////////////////////////////////////////////////////////////////
111 {
112 return std::max
113 (
114 write_buffer_offset + int64_t(write_buffer_size),
116 );
117 }
118
119 //////////////////////////////////////////////////////////////////////////
121 //////////////////////////////////////////////////////////////////////////
122 {
123 try
124 {
125 flush_write_buffer();
126 }
127 catch (...)
128 {
129 }
130 }
131}
void pwrite(const char *buffer, size_t size, int64_t offset) override
Write a range of bytes. Extend file size if necessary.
Encoded_File(Codec &codec, db::encoded_file::Writable_Database &db)
size_t pread(char *buffer, size_t size, int64_t offset) const override
Read a range of bytes.
int64_t get_size() const override
Get the size of the file, or -1 if it is unknown.
void sync() override
Write data durably (including file-size change)
size_t pread(char *buffer, size_t size, int64_t offset) const override
Read a range of bytes.
int64_t get_size() const override
Get the size of the file, or -1 if it is unknown.
A Database that contains a joedb::Writable_Journal and keeps them in sync.
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,...