|
Блокируется файл БД, несмотря на закрытие базы - как вылечить?
|
|||
---|---|---|---|
#18+
Здравствуйте, господа. Прошу помочь с таким неожиданным поведением: файл БД блокирован операционкой (не могу скопировать), пока не завершится процесс, вызывавший код работы с БД. Схема такая: процесс namgr.exe исполняет программу на скриптовом языке, которая использует внешнюю DLL для работы с базой (DLL скомпилирована с файлами sqlite). Скрипт отрабатывает нормально, база закрывается, но сам файл БД блокируется до завершения exe-шника; при этом повторные запуски скрипта работают как положено, добавляя записи в существующий файл. При этом dll после завершения скрипта освобождается и выгружается, как может сохраняться блокировка файла, мне непонятно:( Мне нужно, чтобы после завершения скрипта можно было переместить файл БД, не завершая вызывающий скрипт exe. Что я делаю не так (или не делаю того, что нужно было) ? открываю базу: extern "C" _stdcall _export int sql_openDb(char *path){ // 0 - ошибка, 1 - ок if( sqlite3_open(path, &db) ) ошибка; if( sqlite3_exec(db, "PRAGMA synchronous = OFF; PRAGMA journal_mode = OFF;", 0, 0, &err) )ошибка; if( sqlite3_exec(db, "CREATE TABLE IF NOT EXISTS documents(repl text,unid text,dxlText text);", 0, 0, &err) ) ошибка; if( sqlite3_prepare(db, "INSERT INTO documents VALUES (?,?,?)", -1, &addDoc_stmt, 0) != SQLITE_OK)ошибка; return 1; } в цикле заполняю данными, вызывая функцию из dll: extern "C" _stdcall _export int sql_addDoc(char *repl, char* unid, char *dxlText){ // 0 - ошибка, 1 - ок sqlite3_reset(addDoc_stmt); if( sqlite3_bind_text( addDoc_stmt, 1, repl, strlen(repl), SQLITE_STATIC) != SQLITE_OK )ошибка; if( sqlite3_bind_text( addDoc_stmt, 2, unid, strlen(unid), SQLITE_STATIC) != SQLITE_OK )ошибка; if( sqlite3_bind_text( addDoc_stmt, 3, dxlText, strlen(dxlText), SQLITE_STATIC) != SQLITE_OK )ошибка; if( sqlite3_step(addDoc_stmt) != SQLITE_DONE )ошибка; return 1; } и закрываю базу (и в DLL_PROCESS_DETACH, и явно вызываю после цикла заполнения): sqlite3_close(db); ... |
|||
:
Нравится:
Не нравится:
|
|||
18.02.2016, 20:18 |
|
Блокируется файл БД, несмотря на закрытие базы - как вылечить?
|
|||
---|---|---|---|
#18+
Mikle0xПри этом dll после завершения скрипта освобождается и выгружается,Значит этого не происходит. Попробуй удалить файл dll когда ты считаешь что он уже выгрузился... Mikle0xи закрываю базу (и в DLL_PROCESS_DETACH, и явно вызываю после цикла заполнения): sqlite3_close(db);Ну а кто будет проверить что sqlite3_close() вернула? Она же не обязательно закроет файл... http://sqlite.org/c3ref/close.html ... |
|||
:
Нравится:
Не нравится:
|
|||
19.02.2016, 01:43 |
|
Блокируется файл БД, несмотря на закрытие базы - как вылечить?
|
|||
---|---|---|---|
#18+
White Owl, Проверил: после завершения скрипта dll можно удалить, а базу нельзя (только скопировать - это можно, да). Закрытие базы сделал так: extern "C" _stdcall _export int sql_close(){ // 0 - ошибка, 1 - ок sqlite3_finalize(addDoc_stmt); if( sqlite3_close(db)!=SQLITE_OK ){lastErr=sqlite3_errmsg(db); return 0; } db=0; return 1; } не помогло:( закрытие базы отрабатывает без ошибки, а переместить/удалить файл базы не даёт. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.02.2016, 19:20 |
|
Блокируется файл БД, несмотря на закрытие базы - как вылечить?
|
|||
---|---|---|---|
#18+
Виноват, плохо проверял - нужно было перезапустить exe, чтобы снять старую блокировку. Видимо, проблема была в отсутствующем sqlite3_finalize перед закрытием базы - теперь всё ровно, база доступна. Дело закрыто:) ... |
|||
:
Нравится:
Не нравится:
|
|||
19.02.2016, 19:34 |
|
|
start [/forum/topic.php?fid=54&msg=39174741&tid=2008622]: |
0ms |
get settings: |
8ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
45ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
49ms |
get tp. blocked users: |
2ms |
others: | 284ms |
total: | 422ms |
0 / 0 |