Wie kann mit RAII für die SQLite-Datenbank die richtige Vernichtungsreihenfolge sichergestellt werden?C++

Programme in C++. Entwicklerforum
Anonymous
 Wie kann mit RAII für die SQLite-Datenbank die richtige Vernichtungsreihenfolge sichergestellt werden?

Post by Anonymous »

In meiner Klasse, die ein SQLite-Datenbankhandle enthält, habe ich:

Code: Select all

struct SQLitePreparedStatement
{
sqlite3_stmt* stmt = nullptr;
~SQLitePreparedStatement()
{
if (stmt)
sqlite3_finalize(stmt);
}
};
SQLitePreparedStatement create_table_statement{};
SQLitePreparedStatement exists_statement{};
SQLitePreparedStatement insert_statement{};
SQLitePreparedStatement insert_or_replace_statement{};
SQLitePreparedStatement get_value_statement{};
SQLitePreparedStatement remove_value_statement{};
SQLitePreparedStatement count_rows_prepared_stmt{};
SQLitePreparedStatement get_row_id_stmt{};
sqlite3* sqlite_db;
Bis jetzt habe ich einfach sqlite3_close für die Datenbank im Destruktor aufgerufen, ohne finalize für die Anweisungen aufzurufen. Ich denke, das ist falsch und Sie müssen finalize für jede Anweisung aufrufen, die mit dem Datenbank-Handle verknüpft ist, BEVOR Sie close für die Datenbank aufrufen. Aus diesem Grund habe ich die Anweisungen in eine RAII-Struktur verpackt. Aber wenn ich im Destruktor close für die Datenbank aufrufe, geschieht dies, BEVOR die Anweisungen zerstört wurden. Ist hier die Lösung, das Datenbankhandle in eine weitere Struktur zu packen? Und stellen Sie dann sicher, dass sqlite_db immer VOR den Anweisungen in der Deklarationsreihenfolge steht und die Anweisungsdestruktoren zuerst ausgeführt werden. Das ist garantiert, oder? Das alles scheint sehr dünn und bruchanfällig zu sein.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post