)
Я разрабатываю программу, использующую базу данных SQLite, к которой я получаю доступ через QSqlDatabase
.Я хотел бы рассмотреть (надеюсь, редкий) случай, когда в базу данных вносятся некоторые изменения, которые не вызваны программой во время ее работы (например, пользователь может удалить доступ для записи, переместить или удалить файл или изменить его вручную).
Я пытался использовать QFileSystemWatcher
.Я позволил ему просмотреть файл базы данных, и во всех функциях, записывающих что-то к нему, я заблокировал его сигналы, так что только «внешние» изменения вызовут измененный сигнал.
Проблема в том, что проверка QFileSystemWatcher
и / или фактическая запись на диск QSqlDatabase::commit()
, кажется, не происходит в тот момент, когда я называю commit()
, так что фактически сначала блокируются сигналы QFileSystemWatcher
, затем я изменяю некоторые вещи, затем яразблокируйте их, а затем он сообщает об изменении файла.
Затем я попытался установить переменную bool (m_writeInProgress
) равной true
каждый раз, когда функция запрашивает изменение.Затем «измененный» слот проверяет, было ли запрошено действие записи, и если да, снова устанавливает m_writeInProgress
в false
и завершает работу.Таким образом, он будет обрабатывать только «внешние» изменения.
Проблема по-прежнему в том, что если изменение происходит именно в тот момент, когда происходит фактическая запись, оно не перехватывается.
Так что возможно,использование QFileSystemWatcher
является неправильным способом реализации этого.
Как это можно сделать безопасным способом?
Спасибо за помощь!
Редактировать:
Я нашел способ решить часть проблемы.Запуск эксклюзивной блокировки файла базы данных не позволяет другим соединениям изменять его.Это довольно просто, мне просто нужно выполнить
PRAGMA locking_mode = EXCLUSIVE
BEGIN EXCLUSIVE
COMMIT
и обработать ошибку, которая возникает, если другой экземпляр моей программы пытается получить доступ к базе данных.
Осталось узнать, является ли пользователь(случайно) удалил файл во время выполнения ...