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.