77#include " crypto/SHA.h"
88#include " database/Database.h"
99#include " database/DatabaseUtils.h"
10- #include " history/CheckpointBuilder.h"
1110#include " util/Decoder.h"
12- #include " util/GlobalChecks.h"
13- #include " util/Logging.h"
14- #include " util/XDRStream.h"
1511#include " util/types.h"
1612#include " xdrpp/marshal.h"
1713
2218namespace stellar
2319{
2420
25- namespace LedgerHeaderUtils
26- {
27-
28- uint32_t
29- getFlags (LedgerHeader const & lh)
21+ namespace
3022{
31- return lh.ext .v () == 1 ? lh.ext .v1 ().flags : 0 ;
32- }
3323
34- bool
24+ static bool
3525isValid (LedgerHeader const & lh)
3626{
3727 bool res = (lh.ledgerSeq <= INT32_MAX);
@@ -42,6 +32,36 @@ isValid(LedgerHeader const& lh)
4232 return res;
4333}
4434
35+ static LedgerHeader
36+ decodeFromData (std::string const & data)
37+ {
38+ ZoneScoped;
39+ LedgerHeader lh;
40+ std::vector<uint8_t > decoded;
41+ decoder::decode_b64 (data, decoded);
42+
43+ xdr::xdr_get g (&decoded.front (), &decoded.back () + 1 );
44+ xdr::xdr_argpack_archive (g, lh);
45+ g.done ();
46+
47+ if (!isValid (lh))
48+ {
49+ throw std::runtime_error (" invalid ledger header (load)" );
50+ }
51+ return lh;
52+ }
53+
54+ } // anonymous namespace
55+
56+ namespace LedgerHeaderUtils
57+ {
58+
59+ uint32_t
60+ getFlags (LedgerHeader const & lh)
61+ {
62+ return lh.ext .v () == 1 ? lh.ext .v1 ().flags : 0 ;
63+ }
64+
4565void
4666storeInDatabase (Database& db, LedgerHeader const & header, SessionWrapper& sess)
4767{
@@ -84,25 +104,6 @@ storeInDatabase(Database& db, LedgerHeader const& header, SessionWrapper& sess)
84104 }
85105}
86106
87- LedgerHeader
88- decodeFromData (std::string const & data)
89- {
90- ZoneScoped;
91- LedgerHeader lh;
92- std::vector<uint8_t > decoded;
93- decoder::decode_b64 (data, decoded);
94-
95- xdr::xdr_get g (&decoded.front (), &decoded.back () + 1 );
96- xdr::xdr_argpack_archive (g, lh);
97- g.done ();
98-
99- if (!isValid (lh))
100- {
101- throw std::runtime_error (" invalid ledger header (load)" );
102- }
103- return lh;
104- }
105-
106107std::shared_ptr<LedgerHeader>
107108loadByHash (Database& db, Hash const & hash)
108109{
@@ -140,55 +141,6 @@ loadByHash(Database& db, Hash const& hash)
140141 return lhPtr;
141142}
142143
143- uint32_t
144- loadMaxLedgerSeq (Database& db)
145- {
146- ZoneScoped;
147- uint32_t seq = 0 ;
148- soci::indicator maxIndicator;
149- auto prep = db.getPreparedStatement (
150- " SELECT MAX(ledgerseq) FROM ledgerheaders" , db.getSession ());
151- auto & st = prep.statement ();
152- st.exchange (soci::into (seq, maxIndicator));
153- st.define_and_bind ();
154- st.execute (true );
155- if (maxIndicator == soci::indicator::i_ok)
156- {
157- return seq;
158- }
159- return 0 ;
160- }
161-
162- std::shared_ptr<LedgerHeader>
163- loadBySequence (Database& db, soci::session& sess, uint32_t seq)
164- {
165- ZoneScoped;
166- std::shared_ptr<LedgerHeader> lhPtr;
167-
168- std::string headerEncoded;
169- {
170- ZoneNamedN (selectLedgerHeadersZone, " select ledgerheaders" , true );
171- sess << " SELECT data FROM ledgerheaders "
172- " WHERE ledgerseq = :s" ,
173- soci::into (headerEncoded), soci::use (seq);
174- }
175- if (sess.got_data ())
176- {
177- auto lh = decodeFromData (headerEncoded);
178- lhPtr = std::make_shared<LedgerHeader>(lh);
179-
180- if (lh.ledgerSeq != seq)
181- {
182- throw std::runtime_error (fmt::format (
183- FMT_STRING (" Wrong sequence number in ledger header database: "
184- " loaded ledger {:d} contains {:d}" ),
185- seq, lh.ledgerSeq ));
186- }
187- }
188-
189- return lhPtr;
190- }
191-
192144void
193145deleteOldEntries (soci::session& sess, uint32_t ledgerSeq, uint32_t count)
194146{
@@ -197,38 +149,6 @@ deleteOldEntries(soci::session& sess, uint32_t ledgerSeq, uint32_t count)
197149 " ledgerheaders" , " ledgerseq" );
198150}
199151
200- size_t
201- copyToStream (soci::session& sess, uint32_t ledgerSeq, uint32_t ledgerCount,
202- CheckpointBuilder& checkpointBuilder)
203- {
204- ZoneNamedN (selectLedgerHeadersZone, " select ledgerheaders history" , true );
205- uint32_t begin = ledgerSeq, end = ledgerSeq + ledgerCount;
206- releaseAssert (begin <= end);
207-
208- std::string headerEncoded;
209-
210- soci::statement st =
211- (sess.prepare << " SELECT data FROM ledgerheaders "
212- " WHERE ledgerseq >= :begin AND ledgerseq < :end ORDER "
213- " BY ledgerseq ASC" ,
214- soci::into (headerEncoded), soci::use (begin), soci::use (end));
215-
216- size_t n = 0 ;
217- st.execute (true );
218- while (st.got_data ())
219- {
220- LedgerHeaderHistoryEntry lhe;
221- lhe.header = decodeFromData (headerEncoded);
222- lhe.hash = xdrSha256 (lhe.header );
223- CLOG_DEBUG (Ledger, " Streaming ledger-header {}" , lhe.header .ledgerSeq );
224- checkpointBuilder.appendLedgerHeader (lhe.header ,
225- /* skipStartupCheck */ true );
226- ++n;
227- st.fetch ();
228- }
229- return n;
230- }
231-
232152void
233153maybeDropAndCreateNew (Database& db)
234154{
0 commit comments