Joedb 9.5.0
The Journal-Only Embedded Database
Loading...
Searching...
No Matches
Stream_File.cpp
Go to the documentation of this file.
3
4namespace joedb
5{
6 /////////////////////////////////////////////////////////////////////////////
8 /////////////////////////////////////////////////////////////////////////////
9 (
10 std::streambuf &streambuf,
11 Open_Mode mode
12 ):
13 Buffered_File(mode),
14 streambuf(streambuf),
15 pos(0)
16 {
17 if (is_shared())
18 throw Exception("Stream_File does not support shared_write");
19
20 streambuf.pubseekoff
21 (
22 pos,
23 std::ios_base::beg,
24 std::ios_base::in
25 );
26 }
27
28 /////////////////////////////////////////////////////////////////////////////
29 int64_t Stream_File::get_size() const
30 /////////////////////////////////////////////////////////////////////////////
31 {
32 pos = streambuf.pubseekoff
33 (
34 0,
35 std::ios_base::end,
36 std::ios_base::in
37 );
38
39 return pos;
40 }
41
42 /////////////////////////////////////////////////////////////////////////////
43 void Stream_File::seek(int64_t offset) const
44 /////////////////////////////////////////////////////////////////////////////
45 {
46 if (int64_t(pos) == offset)
47 return;
48
49 if (offset >= 0)
50 {
51 pos = streambuf.pubseekoff(offset, std::ios_base::beg);
52 if (int64_t(pos) == offset)
53 return;
54 }
55
56 throw Exception("seek error");
57 }
58
59 /////////////////////////////////////////////////////////////////////////////
60 size_t Stream_File::pread(char *data, size_t size, int64_t offset) const
61 /////////////////////////////////////////////////////////////////////////////
62 {
63 seek(offset);
64 const std::streamsize n = streambuf.sgetn(data, std::streamsize(size));
65 pos += n;
66 return size_t(n);
67 }
68
69 /////////////////////////////////////////////////////////////////////////////
70 void Stream_File::pwrite(const char *data, size_t size, int64_t offset)
71 /////////////////////////////////////////////////////////////////////////////
72 {
73 seek(offset);
74
75 size_t written = 0;
76
77 while (written < size)
78 {
79 const std::streamsize n = streambuf.sputn
80 (
81 data + written,
82 std::streamsize(size - written)
83 );
84
85 if (n <= 0)
86 throw Exception("Could not write to stream");
87
88 pos += n;
89 written += size_t(n);
90 }
91
92 if (streambuf.pubsync() < 0)
93 throw Exception("sync error");
94 }
95
96 /////////////////////////////////////////////////////////////////////////////
98 /////////////////////////////////////////////////////////////////////////////
99 {
101 }
102}
bool is_shared() const noexcept
void destructor_flush() noexcept
int64_t get_size() const override
Get the size of the file, or -1 if it is unknown.
size_t pread(char *data, size_t size, int64_t offset) const override
Read a range of bytes.
void pwrite(const char *data, size_t size, int64_t offset) override
Write a range of bytes. Extend file size if necessary.
~Stream_File() override
Stream_File(std::streambuf &streambuf, Open_Mode mode)
Open_Mode
Definition Open_Mode.h:8
Definition Blob.h:7