Joedb 10.3.0
The Journal-Only Embedded Database
Loading...
Searching...
No Matches
File_Connection.cpp
Go to the documentation of this file.
2
3namespace joedb
4{
5 //////////////////////////////////////////////////////////////////////////
7 //////////////////////////////////////////////////////////////////////////
8 (
9 const Readonly_Journal &client_journal,
10 Content_Check content_check
11 )
12 {
13 if (content_check != Content_Check::none)
14 {
15 const int64_t min = std::min
16 (
17 server_journal.get_checkpoint(),
18 client_journal.get_checkpoint()
19 );
20
21 const int64_t fast_size = 1 << 11;
22
23 if (content_check == Content_Check::full || min <= 2 * fast_size)
24 {
25 if (!client_journal.equal_to(server_journal, Header::ssize, min))
26 content_mismatch();
27 }
28 else
29 {
30 if
31 (
32 !client_journal.equal_to(server_journal, Header::ssize, fast_size) ||
33 !client_journal.equal_to(server_journal, min - fast_size, min)
34 )
35 {
36 content_mismatch();
37 }
38 }
39 }
40
41 return server_journal.get_checkpoint();
42 }
43
44 //////////////////////////////////////////////////////////////////////////
46 //////////////////////////////////////////////////////////////////////////
47 (
48 Lock_Action lock_action,
49 Data_Transfer data_transfer,
50 Writable_Journal &client_journal,
51 std::chrono::milliseconds wait
52 )
53 {
54 if (bool(lock_action))
55 throw Exception("Connected to a read-only journal: can't lock");
56
57 server_journal.pull();
58
59 if (bool(data_transfer))
60 client_journal.pull_from(server_journal);
61
62 return server_journal.get_checkpoint();
63 }
64
65 //////////////////////////////////////////////////////////////////////////
67 //////////////////////////////////////////////////////////////////////////
68 (
69 const Readonly_Journal &client_journal,
70 const int64_t from,
71 const int64_t until,
72 Unlock_Action unlock_action
73 )
74 {
75 throw Exception("Connected to a read-only journal: can't push");
76 }
77
78 //////////////////////////////////////////////////////////////////////////
80 //////////////////////////////////////////////////////////////////////////
81 Pullonly_Journal_Connection(server_journal)
82 {
84 }
85
86 //////////////////////////////////////////////////////////////////////////
88 //////////////////////////////////////////////////////////////////////////
89 (
90 Lock_Action lock_action,
91 Data_Transfer data_transfer,
92 Writable_Journal &client_journal,
93 std::chrono::milliseconds wait
94 )
95 {
96 if (bool(lock_action))
97 get_journal().lock_pull();
98 else
99 get_journal().pull();
100
101 if (bool(data_transfer))
102 client_journal.pull_from(server_journal);
103
104 return server_journal.get_checkpoint();
105 }
106
107 //////////////////////////////////////////////////////////////////////////
109 //////////////////////////////////////////////////////////////////////////
110 (
111 const Readonly_Journal &client_journal,
112 const int64_t from,
113 const int64_t until,
114 Unlock_Action unlock_action
115 )
116 {
117 if (from != server_journal.get_checkpoint())
118 throw Exception("push error: conflict");
119 get_journal().pull_from(client_journal, until);
120 return server_journal.get_checkpoint();
121 }
122
123 //////////////////////////////////////////////////////////////////////////
125 //////////////////////////////////////////////////////////////////////////
126 {
127 get_journal().unlock();
128 }
129
130 //////////////////////////////////////////////////////////////////////////
132 //////////////////////////////////////////////////////////////////////////
133 {
134 get_journal().unlock();
135 }
136}
void unlock() override
Unlock the connection.
Journal_Connection(Writable_Journal &server_journal)
int64_t push(const Readonly_Journal &client_journal, const int64_t from, const int64_t until, Unlock_Action unlock_action) override
Push new data to the connection.
int64_t pull(Lock_Action lock_action, Data_Transfer data_transfer, Writable_Journal &client_journal, std::chrono::milliseconds wait) override
Pull from the connection.
int64_t pull(Lock_Action lock_action, Data_Transfer data_transfer, Writable_Journal &client_journal, std::chrono::milliseconds wait) override
Pull from the connection.
int64_t handshake(const Readonly_Journal &client_journal, Content_Check content_check) override
Called during Client construction.
int64_t push(const Readonly_Journal &client_journal, const int64_t from, const int64_t until, Unlock_Action unlock_action) override
Push new data to the connection.
Data_Transfer
Definition Connection.h:28
Lock_Action
Definition Connection.h:35
Content_Check
Definition Connection.h:20
Unlock_Action
Definition Connection.h:42
#define JOEDB_RELEASE_ASSERT(x)
always-tested assertion (release and debug mode)
Definition assert.h:24
static constexpr int64_t ssize
Definition Header.h:18