@@ -328,14 +328,24 @@ migrateLedgerHeadersToStoreState(Database& db)
328328{
329329 // Migrate LCL header from ledgerheaders table to storestate
330330 std::string lclHash;
331- auto & sess = db.getRawSession ();
332- sess << " SELECT state FROM storestate WHERE statename = "
333- " 'lastclosedledger'" ,
334- soci::into (lclHash);
331+ auto & session = db.getSession ();
332+ auto & raw = session.session ();
333+
334+ // Open a scope because we need prep to be cleaned up before the body of the
335+ // `if`
336+ {
337+ auto prep = db.getPreparedStatement (
338+ " SELECT state FROM storestate WHERE statename = 'lastclosedledger'" ,
339+ session);
340+ auto & stmt = prep.statement ();
341+ stmt.exchange (soci::into (lclHash));
342+ stmt.define_and_bind ();
343+ stmt.execute (true );
344+ }
335345
336346 // When we're doing this migration for a new db, storestate will be empty.
337347 // So, only try to set lastclosedledgerheader when the data is found
338- if (sess .got_data ())
348+ if (raw .got_data ())
339349 {
340350 if (lclHash.empty ())
341351 {
@@ -349,13 +359,18 @@ migrateLedgerHeadersToStoreState(Database& db)
349359 throw std::runtime_error (
350360 " No ledger header found in DB for last closed ledger hash" );
351361 }
352- sess << " INSERT INTO storestate (statename, state) VALUES "
353- " ('lastclosedledgerheader', :v)" ,
354- soci::use (headerData);
355- sess << " DELETE FROM storestate WHERE statename = 'lastclosedledger'" ;
362+ auto prep =
363+ db.getPreparedStatement (" INSERT INTO storestate (statename, state) "
364+ " VALUES ('lastclosedledgerheader', :v)" ,
365+ session);
366+ auto & stmt = prep.statement ();
367+ stmt.exchange (soci::use (headerData));
368+ stmt.define_and_bind ();
369+ stmt.execute (true );
370+ raw << " DELETE FROM storestate WHERE statename = 'lastclosedledger'" ;
356371 }
357372
358- sess << " DROP TABLE ledgerheaders" ;
373+ raw << " DROP TABLE ledgerheaders" ;
359374}
360375
361376void
0 commit comments