Joedb 10.0.1
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 (
82 Lock_Action lock_action,
83 Data_Transfer data_transfer,
84 Writable_Journal &client_journal,
85 std::chrono::milliseconds wait
86 )
87 {
88 if (bool(lock_action))
89 get_journal().lock_pull();
90 else
91 get_journal().pull();
92
93 if (bool(data_transfer))
94 client_journal.pull_from(server_journal);
95
96 return server_journal.get_checkpoint();
97 }
98
99 //////////////////////////////////////////////////////////////////////////
101 //////////////////////////////////////////////////////////////////////////
102 (
103 const Readonly_Journal &client_journal,
104 const int64_t from,
105 const int64_t until,
106 Unlock_Action unlock_action
107 )
108 {
109 if (!get_journal().is_locked())
110 get_journal().lock_pull();
111
112 if (from != server_journal.get_checkpoint())
113 throw Exception("push error: conflict");
114 get_journal().pull_from(client_journal, until);
115
116 if (bool(unlock_action))
117 get_journal().unlock();
118
119 return server_journal.get_checkpoint();
120 }
121
122 //////////////////////////////////////////////////////////////////////////
124 //////////////////////////////////////////////////////////////////////////
125 {
126 get_journal().unlock();
127 }
128
129 //////////////////////////////////////////////////////////////////////////
131 //////////////////////////////////////////////////////////////////////////
132 {
133 get_journal().unlock();
134 }
135}
void unlock() override
Unlock the connection.
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:27
Lock_Action
Definition Connection.h:34
Content_Check
Definition Connection.h:19
Unlock_Action
Definition Connection.h:41
Definition Blob.h:7
static constexpr int64_t ssize
Definition Header.h:18