Joedb 10.2.1
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 Abstract_File(mode),
14 streambuf(streambuf),
15 pos(0)
16 {
17 streambuf.pubseekoff
18 (
19 pos,
20 std::ios_base::beg,
21 std::ios_base::in
22 );
23 }
24
25 /////////////////////////////////////////////////////////////////////////////
26 int64_t Stream_File::get_size() const
27 /////////////////////////////////////////////////////////////////////////////
28 {
29 pos = streambuf.pubseekoff
30 (
31 0,
32 std::ios_base::end,
33 std::ios_base::in
34 );
35
36 return pos;
37 }
38
39 /////////////////////////////////////////////////////////////////////////////
40 void Stream_File::seek(int64_t offset) const
41 /////////////////////////////////////////////////////////////////////////////
42 {
43 if (int64_t(pos) == offset)
44 return;
45
46 if (offset >= 0)
47 {
48 pos = streambuf.pubseekoff(offset, std::ios_base::beg);
49 if (int64_t(pos) == offset)
50 return;
51 }
52
53 throw Exception("seek error");
54 }
55
56 /////////////////////////////////////////////////////////////////////////////
57 size_t Stream_File::pread(char *data, size_t size, int64_t offset) const
58 /////////////////////////////////////////////////////////////////////////////
59 {
60 seek(offset);
61 const std::streamsize n = streambuf.sgetn(data, std::streamsize(size));
62 pos += n;
63 return size_t(n);
64 }
65
66 /////////////////////////////////////////////////////////////////////////////
67 void Stream_File::pwrite(const char *data, size_t size, int64_t offset)
68 /////////////////////////////////////////////////////////////////////////////
69 {
70 seek(offset);
71
72 size_t written = 0;
73
74 while (written < size)
75 {
76 const std::streamsize n = streambuf.sputn
77 (
78 data + written,
79 std::streamsize(size - written)
80 );
81
82 if (n <= 0)
83 throw Exception("Could not write to stream");
84
85 pos += n;
86 written += size_t(n);
87 }
88
89 if (streambuf.pubsync() < 0)
90 throw Exception("sync error");
91 }
92}
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(std::streambuf &streambuf, Open_Mode mode)
Open_Mode
Definition Open_Mode.h:8