)
経由でアクセスする SQLite データベースを使用してプログラムを開発していますQSqlDatabase
。プログラムの実行中にデータベースに何らかの変更が加えられた場合 (まれであることを願っています) を処理したいと思います (たとえば、ユーザーが書き込みアクセスを削除したり、ファイルを移動または削除したり、手動で変更したりする可能性があります)。
を使ってみましたQFileSystemWatcher
。データベースファイルを監視させ、何かを書き込むすべての関数で、シグナルをブロックして、「外部」の変更のみが変更されたシグナルをトリガーするようにしました。
問題は、QFileSystemWatcher
および/または のディスクへの実際の書き込みのチェックが、QSqlDatabase::commit()
私が呼び出した正確な瞬間に発生しないように見えることですcommit()
。そのため、実際には、最初にQFileSystemWatcher
の信号がブロックされ、次にいくつかのものを変更し、次にそれらのブロックを解除して、次に、変更するファイルを報告します。
次に、関数が変更を要求するたびに bool 変数 ( m_writeInProgress
)を設定しようとしました。true
次に、「変更された」スロットは、書き込みアクションが要求されているかどうかを確認し、要求されている場合は、再度に設定m_writeInProgress
して終了します。false
このようにして、「外部」の変更のみを処理します。
問題は、実際の書き込みが行われている正確な瞬間に変更が発生した場合、それがキャッチされないことです。
おそらく、QFileSystemWatcher
これを実装するために a を使用するのは間違った方法です。
これを安全な方法で行うにはどうすればよいでしょうか。
助けてくれてありがとう!
編集:
問題の一部を解決する方法を見つけました。データベース ファイルの排他ロックを開始すると、他の接続による変更が防止されます。それは非常に簡単です、私はただ実行する必要があります
PRAGMA locking_mode = EXCLUSIVE
BEGIN EXCLUSIVE
COMMIT
私のプログラムの別のインスタンスがデータベースにアクセスしようとした場合に発生するエラーを処理します。
残っているのは、実行時にユーザーが(誤って)ファイルを削除したかどうかを知ることです...