Russian Qt Forum

Qt => Базы данных => Тема начата: Flakes от Сентябрь 05, 2008, 15:17



Название: close() не освобождает файл
Отправлено: Flakes от Сентябрь 05, 2008, 15:17
Юзаю SQLite:

Код:
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName(databaseFileName);
db.open();
...
db.close();

db.isOpen() дает false, но файл с базой тем не менее еще занят, пока приложение не закрыть.


Название: Re: close() не освобождает файл
Отправлено: ритт от Сентябрь 05, 2008, 17:37
датабазу удали


Название: Re: close() не освобождает файл
Отправлено: Flakes от Сентябрь 05, 2008, 18:04
сделал QSqlDatabase::removeDatabase("QSQLITE"); - не катит, файл все равно занят..


Название: Re: close() не освобождает файл
Отправлено: ритт от Сентябрь 05, 2008, 18:16
а почему не QSqlDatabase::removeDatabase("ой-ой-ой") ?
ртфм по removeDatabase


Название: Re: close() не освобождает файл
Отправлено: Flakes от Сентябрь 05, 2008, 18:52
там мануал (http://doc.trolltech.com/4.4/qsqldatabase.html#removeDatabase) по ней из двух срок :D

попробывал QSqlDatabase::removeDatabase(QSqlDatabase::database().connectionName()) - не выходит


Название: Re: close() не освобождает файл
Отправлено: ритт от Сентябрь 05, 2008, 20:11
не верю :)
прикрепляй компилябельный пример


Название: Re: close() не освобождает файл
Отправлено: lit-uriy от Сентябрь 06, 2008, 07:10
2 Flakes, удаляется, читая приведенный тобою мануал, так:
QSqlDatabase::removeDatabase();
драйвер не указывается, имя соединения в твоем случае не нужно, оно умалчиваемое.


Название: Re: close() не освобождает файл
Отправлено: Flakes от Сентябрь 07, 2008, 22:50
Берем любой экзампл из \examples\sql\. В конец connection.h дописываем удаление ДБ, и заменяем :memory: на имя файла. И получаем мою траблу - файл не отпускается. Может у меня бага в моем Qt 4.4.

2 Flakes, удаляется, читая приведенный тобою мануал, так:
QSqlDatabase::removeDatabase();
драйвер не указывается, имя соединения в твоем случае не нужно, оно умалчиваемое.

Указывается имя соединения, которое я и получаю по connectionName(). Ты предлагаешь совсем без параметра - так это не прокатит.


Название: Re: close() не освобождает файл
Отправлено: lit-uriy от Сентябрь 08, 2008, 01:47
думал можно не указывать т.к. соединение у тебя по-умолчанию.
хм, посмотрел доку, и правда не катит, отсюда мысль - а соединение по-умолчанию может нельзя удалять?
попробуй задать своему соединению имя, и его потом удалять.


Название: Re: close() не освобождает файл
Отправлено: ритт от Сентябрь 08, 2008, 07:29
Берем любой экзампл из \examples\sql\. В конец connection.h дописываем удаление ДБ, и заменяем :memory: на имя файла. И получаем мою траблу - файл не отпускается. Может у меня бага в моем Qt 4.4.

ещё раз напоминаю о необходимости читать документацию!

в connectino.h
заменяю db.setDatabaseName(":memory:") на db.setDatabaseName("memory.db")
окружаю весь код createConnection() вплоть до return true фигурными скобками {} - понижаю скоп кода
после новодобаленной } и перед return true доавляю код
Код:
	QSqlDatabase db = QSqlDatabase::database();
if(db.isValid())
{
if(db.isOpen())
db.close();
QString connectionName = db.connectionName();
db = QSqlDatabase();
QSqlDatabase::removeDatabase(connectionName);
}

файл базы освобождается
будем дальше спорить о глюках?


Название: Re: close() не освобождает файл
Отправлено: lit-uriy от Сентябрь 08, 2008, 07:40
ну да, так и написано:
Цитировать
     {
         QSqlDatabase db = QSqlDatabase::database("sales");
         QSqlQuery query("SELECT NAME, DOB FROM EMPLOYEES", db);
     }
     // Both "db" and "query" are destroyed because they are out of scope
     QSqlDatabase::removeDatabase("sales"); // correct
даже неподумал что этот момент человек пропустил, а самому лень было проверять.


Название: Re: close() не освобождает файл
Отправлено: ритт от Сентябрь 08, 2008, 08:17
а я об этом говорил ещё в первом и твором ответе...и надеялся что флэйкс пойдёт читать доки и сам поймёт свою ошибку

ветку оставляем для таких же ленивых? :)


Название: Re: close() не освобождает файл
Отправлено: lit-uriy от Сентябрь 08, 2008, 09:40
Цитировать
ветку оставляем для таких же ленивых?
обязательно, я сам на эти грабли наступал, и еще не раз люди на них наступят.


Название: Re: close() не освобождает файл
Отправлено: Flakes от Сентябрь 08, 2008, 17:58
Всем спасибо!

На экзампле заработало, а в моем проекте - нет, делаю абсолютно тоже самое. Ну да ладно, думаю уже смогу разобраться.


Название: Re: close() не освобождает файл
Отправлено: ритт от Сентябрь 08, 2008, 19:40
> На экзампле заработало
...поэтому и спрашивал твой код, а не стандартный пример

значит, в своём проекте где-то не отпускаешь запрос или базу (возможно, создаёшь с куче и объект не удаляешь: используешь (квери|тэйбл)модель - там запрос всегда активен; или используешь глобальные объекты) - в любом случае, в скопе, где ты закрываешь соединение и удаляешь базу, эта же самая база уже не должна быть активной...


Название: Re: close() не освобождает файл
Отправлено: Flakes от Сентябрь 09, 2008, 00:28
Весь код выкладывать - заиметься можно.
Конечно же я много где query юзаю; и tableModel тоже - он объявлен членом класса. Все в пределах методов, за их скопами этого не должно быть видно, пытаюсь удалить базу через другой метод - и там базы не должно быть видно.

Или я не совсем понимаю суть активности. А как отпускается запрос, метод select() считается? Нигде в глобальной области видимости у меня query не висят.


Название: Re: close() не освобождает файл
Отправлено: ритт от Сентябрь 09, 2008, 01:36
наследники QSqlQueryModel используют QSqlQuery для чтения данных и этот QSqlQuery активен, пока несдохнет сервер/соединение или сама модель. чтобы прибить этот квери можно установить пустой/невалидный запрос в модель или пнуть этому квери finish() - модель, естественно, очистится и при возобновлении соединения запрос придётся переустанавливать. можно написать свою SqlQueryModel, которая не будет гонять запрос, а сразу по исполнении сольёт все данные во внутренний кэш - но для объёмных результатов ресурсозатраты модели весьма значительно увеличатся

на данный момент в кутэ не существует красивого способа (при|)остановить работу объектов, использующих соединение QSqlDriver (на самом деле QSqlDatabase - всего лишь удобная обёртка для QSqlDriver) - эти объекты придётся деактивировать или убивать


Название: Re: close() не освобождает файл
Отправлено: Flakes от Декабрь 20, 2009, 06:07
Проблема снова всплыла. Если ставлю перед удалением базы query.exec("VACUUM"), то файл не отпускается.

Код
C++ (Qt)
QString connectionName;
{
QSqlDatabase db = QSqlDatabase::database();
if (!db.isValid())
return;
 
QSqlQuery query;
query.exec("VACUUM");
 
connectionName = db.connectionName();
if(db.isOpen())
db.close();
}
QSqlDatabase::removeDatabase(connectionName);
 

Без вакуума все норм.


Название: Re: close() не освобождает файл
Отправлено: lit-uriy от Декабрь 20, 2009, 13:50
а после этого вакума, не надо подтверждать транзакцию?


Название: Re: close() не освобождает файл
Отправлено: Flakes от Декабрь 20, 2009, 20:26
Не знаю как нужно ее подтвержать. Сделал так, но видимо не правильно:

Код
C++ (Qt)
db.transaction();
QSqlQuery query;
query.exec("VACUUM");
db.commit();