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