В моем классе, который содержит дескриптор базы данных SQLite, у меня есть:
Код: Выделить всё
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;
До сих пор я просто вызывал sqlite3_close для базы данных в деструкторе, не вызывая Finalize для операторов. Я думаю, что это неправильно, и что вам нужно вызывать финализацию для каждого оператора, связанного с дескриптором базы данных, ПЕРЕД вызовом закрытия базы данных. Вот почему я заключил операторы в структуру RAII. Но если я вызову close в базе данных в деструкторе, это произойдет ДО того, как операторы будут уничтожены. Есть ли здесь решение обернуть дескриптор базы данных еще одной структурой? Затем убедитесь, что sqlite_db всегда идет ДО операторов в порядке объявления, и деструкторы операторов будут запускаться первыми. Это гарантировано, верно? Все это кажется очень хлипким и легко ломается.
Подробнее здесь:
https://stackoverflow.com/questions/798 ... e-database