Fix object leaks in database code

Qt's database and query model requires that both the queries and the database
objects are out of scope before a database connection can safely be removed.

Solution: Properly encapsulate databases and queries in "{ }" and use a string
to cache the connection name for out-of-scope removal.
This commit is contained in:
Felix Kauselmann 2020-08-25 14:30:13 +02:00
parent 48a0d64837
commit 4b3042def4
11 changed files with 924 additions and 868 deletions

View File

@ -10,6 +10,7 @@ Version counting is based on semantic versioning (Major.Feature.Patch)
### YACReaderLibrary ### YACReaderLibrary
* update QsLog logger to version 2.1, snapshot 46b643d5bcbc * update QsLog logger to version 2.1, snapshot 46b643d5bcbc
* fix object leaks in database code
## 9.6.0 ## 9.6.0
### Reader and Library ### Reader and Library

View File

@ -431,7 +431,8 @@ void ComicVineDialog::getComicsInfo(QList<QPair<ComicDB, QString>> &matchingInfo
setLoadingMessage(tr("Retrieving tags for : %1").arg(p.first.getFileName())); setLoadingMessage(tr("Retrieving tags for : %1").arg(p.first.getFileName()));
} }
QString connectionName = "";
{
QSqlDatabase db = DataBaseManagement::loadDatabase(databasePath); QSqlDatabase db = DataBaseManagement::loadDatabase(databasePath);
db.open(); db.open();
db.transaction(); db.transaction();
@ -439,8 +440,9 @@ void ComicVineDialog::getComicsInfo(QList<QPair<ComicDB, QString>> &matchingInfo
DBHelper::update(&(comic.info), db); DBHelper::update(&(comic.info), db);
} }
db.commit(); db.commit();
db.close(); connectionName = db.connectionName();
QSqlDatabase::removeDatabase(db.connectionName()); }
QSqlDatabase::removeDatabase(connectionName);
emit accepted(); emit accepted();
} }
@ -464,7 +466,8 @@ void ComicVineDialog::getComicInfo(const QString &comicId, int count, const QStr
ComicDB comic = parseComicInfo(comics[currentIndex], result, count, publisher); //TODO check result error ComicDB comic = parseComicInfo(comics[currentIndex], result, count, publisher); //TODO check result error
comic.info.comicVineID = comicId; comic.info.comicVineID = comicId;
setLoadingMessage(tr("Retrieving tags for : %1").arg(comics[currentIndex].getFileName())); setLoadingMessage(tr("Retrieving tags for : %1").arg(comics[currentIndex].getFileName()));
QString connectionName = "";
{
QSqlDatabase db = DataBaseManagement::loadDatabase(databasePath); QSqlDatabase db = DataBaseManagement::loadDatabase(databasePath);
db.open(); db.open();
db.transaction(); db.transaction();
@ -472,8 +475,9 @@ void ComicVineDialog::getComicInfo(const QString &comicId, int count, const QStr
DBHelper::update(&(comic.info), db); DBHelper::update(&(comic.info), db);
db.commit(); db.commit();
db.close(); connectionName = db.connectionName();
QSqlDatabase::removeDatabase(db.connectionName()); }
QSqlDatabase::removeDatabase(connectionName);
if (mode == SingleComic || currentIndex == (comics.count() - 1)) { if (mode == SingleComic || currentIndex == (comics.count() - 1)) {
emit accepted(); emit accepted();

View File

@ -152,7 +152,8 @@ bool ComicModel::dropMimeData(const QMimeData *data, Qt::DropAction action, int
foreach (ComicItem *item, _data) { foreach (ComicItem *item, _data) {
allComicIds << item->data(Id).toULongLong(); allComicIds << item->data(Id).toULongLong();
} }
QString connectionName = "";
{
QSqlDatabase db = DataBaseManagement::loadDatabase(_databasePath); QSqlDatabase db = DataBaseManagement::loadDatabase(_databasePath);
switch (mode) { switch (mode) {
case Favorites: case Favorites:
@ -167,8 +168,9 @@ bool ComicModel::dropMimeData(const QMimeData *data, Qt::DropAction action, int
default: default:
break; break;
} }
connectionName = db.connectionName();
QSqlDatabase::removeDatabase(db.connectionName()); }
QSqlDatabase::removeDatabase(connectionName);
//endMoveRows(); //endMoveRows();
@ -441,8 +443,9 @@ void ComicModel::setupFolderModelData(unsigned long long int folderId, const QSt
_data.clear(); _data.clear();
_databasePath = databasePath; _databasePath = databasePath;
QSqlDatabase db = DataBaseManagement::loadDatabase(databasePath); QString connectionName = "";
{ {
QSqlDatabase db = DataBaseManagement::loadDatabase(databasePath);
QSqlQuery selectQuery(db); QSqlQuery selectQuery(db);
selectQuery.prepare("SELECT ci.number,ci.title,c.fileName,ci.numPages,c.id,c.parentId,c.path,ci.hash,ci.read,ci.isBis,ci.currentPage,ci.rating,ci.hasBeenOpened " selectQuery.prepare("SELECT ci.number,ci.title,c.fileName,ci.numPages,c.id,c.parentId,c.path,ci.hash,ci.read,ci.isBis,ci.currentPage,ci.rating,ci.hasBeenOpened "
"FROM comic c INNER JOIN comic_info ci ON (c.comicInfoId = ci.id) " "FROM comic c INNER JOIN comic_info ci ON (c.comicInfoId = ci.id) "
@ -450,13 +453,10 @@ void ComicModel::setupFolderModelData(unsigned long long int folderId, const QSt
selectQuery.bindValue(":parentId", folderId); selectQuery.bindValue(":parentId", folderId);
selectQuery.exec(); selectQuery.exec();
setupModelData(selectQuery); setupModelData(selectQuery);
connectionName = db.connectionName();
} }
db.close(); QSqlDatabase::removeDatabase(connectionName);
QSqlDatabase::removeDatabase(db.connectionName());
endResetModel(); endResetModel();
/*if(_data.length()==0)
emit isEmpty();*/
} }
void ComicModel::setupLabelModelData(unsigned long long parentLabel, const QString &databasePath) void ComicModel::setupLabelModelData(unsigned long long parentLabel, const QString &databasePath)
@ -470,8 +470,9 @@ void ComicModel::setupLabelModelData(unsigned long long parentLabel, const QStri
_data.clear(); _data.clear();
_databasePath = databasePath; _databasePath = databasePath;
QSqlDatabase db = DataBaseManagement::loadDatabase(databasePath); QString connectionName = "";
{ {
QSqlDatabase db = DataBaseManagement::loadDatabase(databasePath);
QSqlQuery selectQuery(db); QSqlQuery selectQuery(db);
selectQuery.prepare("SELECT ci.number,ci.title,c.fileName,ci.numPages,c.id,c.parentId,c.path,ci.hash,ci.read,ci.isBis,ci.currentPage,ci.rating,ci.hasBeenOpened " selectQuery.prepare("SELECT ci.number,ci.title,c.fileName,ci.numPages,c.id,c.parentId,c.path,ci.hash,ci.read,ci.isBis,ci.currentPage,ci.rating,ci.hasBeenOpened "
"FROM comic c INNER JOIN comic_info ci ON (c.comicInfoId = ci.id) " "FROM comic c INNER JOIN comic_info ci ON (c.comicInfoId = ci.id) "
@ -481,13 +482,10 @@ void ComicModel::setupLabelModelData(unsigned long long parentLabel, const QStri
selectQuery.bindValue(":parentLabelId", parentLabel); selectQuery.bindValue(":parentLabelId", parentLabel);
selectQuery.exec(); selectQuery.exec();
setupModelDataForList(selectQuery); setupModelDataForList(selectQuery);
connectionName = db.connectionName();
} }
db.close(); QSqlDatabase::removeDatabase(connectionName);
QSqlDatabase::removeDatabase(db.connectionName());
endResetModel(); endResetModel();
/*if(_data.length()==0)
emit isEmpty();*/
} }
void ComicModel::setupReadingListModelData(unsigned long long parentReadingList, const QString &databasePath) void ComicModel::setupReadingListModelData(unsigned long long parentReadingList, const QString &databasePath)
@ -500,8 +498,9 @@ void ComicModel::setupReadingListModelData(unsigned long long parentReadingList,
_data.clear(); _data.clear();
_databasePath = databasePath; _databasePath = databasePath;
QSqlDatabase db = DataBaseManagement::loadDatabase(databasePath); QString connectionName = "";
{ {
QSqlDatabase db = DataBaseManagement::loadDatabase(databasePath);
QList<qulonglong> ids; QList<qulonglong> ids;
ids << parentReadingList; ids << parentReadingList;
@ -535,9 +534,9 @@ void ComicModel::setupReadingListModelData(unsigned long long parentReadingList,
_data = tempData << _data; _data = tempData << _data;
} }
connectionName = db.connectionName();
} }
db.close(); QSqlDatabase::removeDatabase(connectionName);
QSqlDatabase::removeDatabase(db.connectionName());
endResetModel(); endResetModel();
} }
@ -551,8 +550,9 @@ void ComicModel::setupFavoritesModelData(const QString &databasePath)
_data.clear(); _data.clear();
_databasePath = databasePath; _databasePath = databasePath;
QSqlDatabase db = DataBaseManagement::loadDatabase(databasePath); QString connectionName = "";
{ {
QSqlDatabase db = DataBaseManagement::loadDatabase(databasePath);
QSqlQuery selectQuery(db); QSqlQuery selectQuery(db);
selectQuery.prepare("SELECT ci.number,ci.title,c.fileName,ci.numPages,c.id,c.parentId,c.path,ci.hash,ci.read,ci.isBis,ci.currentPage,ci.rating,ci.hasBeenOpened " selectQuery.prepare("SELECT ci.number,ci.title,c.fileName,ci.numPages,c.id,c.parentId,c.path,ci.hash,ci.read,ci.isBis,ci.currentPage,ci.rating,ci.hasBeenOpened "
"FROM comic c INNER JOIN comic_info ci ON (c.comicInfoId = ci.id) " "FROM comic c INNER JOIN comic_info ci ON (c.comicInfoId = ci.id) "
@ -562,13 +562,10 @@ void ComicModel::setupFavoritesModelData(const QString &databasePath)
selectQuery.bindValue(":parentDefaultListId", 1); selectQuery.bindValue(":parentDefaultListId", 1);
selectQuery.exec(); selectQuery.exec();
setupModelDataForList(selectQuery); setupModelDataForList(selectQuery);
connectionName = db.connectionName();
} }
db.close(); QSqlDatabase::removeDatabase(connectionName);
QSqlDatabase::removeDatabase(db.connectionName());
endResetModel(); endResetModel();
/*if(_data.length()==0)
emit isEmpty();*/
} }
void ComicModel::setupReadingModelData(const QString &databasePath) void ComicModel::setupReadingModelData(const QString &databasePath)
@ -581,8 +578,9 @@ void ComicModel::setupReadingModelData(const QString &databasePath)
_data.clear(); _data.clear();
_databasePath = databasePath; _databasePath = databasePath;
QSqlDatabase db = DataBaseManagement::loadDatabase(databasePath); QString connectionName = "";
{ {
QSqlDatabase db = DataBaseManagement::loadDatabase(databasePath);
QSqlQuery selectQuery(db); QSqlQuery selectQuery(db);
selectQuery.prepare("SELECT ci.number,ci.title,c.fileName,ci.numPages,c.id,c.parentId,c.path,ci.hash,ci.read,ci.isBis,ci.currentPage,ci.rating,ci.hasBeenOpened " selectQuery.prepare("SELECT ci.number,ci.title,c.fileName,ci.numPages,c.id,c.parentId,c.path,ci.hash,ci.read,ci.isBis,ci.currentPage,ci.rating,ci.hasBeenOpened "
"FROM comic c INNER JOIN comic_info ci ON (c.comicInfoId = ci.id) " "FROM comic c INNER JOIN comic_info ci ON (c.comicInfoId = ci.id) "
@ -591,32 +589,22 @@ void ComicModel::setupReadingModelData(const QString &databasePath)
selectQuery.exec(); selectQuery.exec();
setupModelDataForList(selectQuery); setupModelDataForList(selectQuery);
connectionName = db.connectionName();
} }
db.close(); QSqlDatabase::removeDatabase(connectionName);
QSqlDatabase::removeDatabase(db.connectionName());
endResetModel(); endResetModel();
/*if(_data.length()==0)
emit isEmpty();*/
} }
void ComicModel::setupModelData(const SearchModifiers modifier, const QString &filter, const QString &databasePath) void ComicModel::setupModelData(const SearchModifiers modifier, const QString &filter, const QString &databasePath)
{ {
//QFile f(QCoreApplication::applicationDirPath()+"/performance.txt");
//f.open(QIODevice::Append);
beginResetModel(); beginResetModel();
//QElapsedTimer timer;
//timer.start();
qDeleteAll(_data); qDeleteAll(_data);
_data.clear(); _data.clear();
//QTextStream txtS(&f);
//txtS << "TABLEMODEL: Tiempo de borrado: " << timer.elapsed() << "ms\r\n";
_databasePath = databasePath; _databasePath = databasePath;
QSqlDatabase db = DataBaseManagement::loadDatabase(databasePath); QString connectionName = "";
{ {
//crear la consulta QSqlDatabase db = DataBaseManagement::loadDatabase(databasePath);
//timer.restart();
QSqlQuery selectQuery(db); QSqlQuery selectQuery(db);
switch (modifier) { switch (modifier) {
@ -653,14 +641,10 @@ void ComicModel::setupModelData(const SearchModifiers modifier, const QString &f
QLOG_DEBUG() << selectQuery.lastError() << "--"; QLOG_DEBUG() << selectQuery.lastError() << "--";
//txtS << "TABLEMODEL: Tiempo de consulta: " << timer.elapsed() << "ms\r\n";
//timer.restart();
setupModelData(selectQuery); setupModelData(selectQuery);
//txtS << "TABLEMODEL: Tiempo de creaci�n del modelo: " << timer.elapsed() << "ms\r\n"; connectionName = db.connectionName();
//selectQuery.finish();
} }
db.close(); QSqlDatabase::removeDatabase(connectionName);
QSqlDatabase::removeDatabase(db.connectionName());
endResetModel(); endResetModel();
emit searchNumResults(_data.length()); emit searchNumResults(_data.length());
@ -714,21 +698,29 @@ void ComicModel::setupModelDataForList(QSqlQuery &sqlquery)
} }
ComicDB ComicModel::getComic(const QModelIndex &mi) ComicDB ComicModel::getComic(const QModelIndex &mi)
{
ComicDB c;
QString connectionName = "";
{ {
QSqlDatabase db = DataBaseManagement::loadDatabase(_databasePath); QSqlDatabase db = DataBaseManagement::loadDatabase(_databasePath);
ComicDB c = DBHelper::loadComic(_data.at(mi.row())->data(ComicModel::Id).toULongLong(), db); c = DBHelper::loadComic(_data.at(mi.row())->data(ComicModel::Id).toULongLong(), db);
db.close(); connectionName = db.connectionName();
QSqlDatabase::removeDatabase(db.connectionName()); }
QSqlDatabase::removeDatabase(connectionName);
return c; return c;
} }
ComicDB ComicModel::_getComic(const QModelIndex &mi) ComicDB ComicModel::_getComic(const QModelIndex &mi)
{
ComicDB c;
QString connectionName = "";
{ {
QSqlDatabase db = DataBaseManagement::loadDatabase(_databasePath); QSqlDatabase db = DataBaseManagement::loadDatabase(_databasePath);
ComicDB c = DBHelper::loadComic(_data.at(mi.row())->data(ComicModel::Id).toULongLong(), db); c = DBHelper::loadComic(_data.at(mi.row())->data(ComicModel::Id).toULongLong(), db);
db.close(); connectionName = db.connectionName();
QSqlDatabase::removeDatabase(db.connectionName()); }
QSqlDatabase::removeDatabase(connectionName);
return c; return c;
} }
@ -756,19 +748,22 @@ QVector<YACReaderComicReadStatus> ComicModel::setAllComicsRead(YACReaderComicRea
} }
QList<ComicDB> ComicModel::getAllComics() QList<ComicDB> ComicModel::getAllComics()
{
QList<ComicDB> comics;
QString connectionName = "";
{ {
QSqlDatabase db = DataBaseManagement::loadDatabase(_databasePath); QSqlDatabase db = DataBaseManagement::loadDatabase(_databasePath);
db.transaction(); db.transaction();
QList<ComicDB> comics;
int numComics = _data.count(); int numComics = _data.count();
for (int i = 0; i < numComics; i++) { for (int i = 0; i < numComics; i++) {
comics.append(DBHelper::loadComic(_data.value(i)->data(ComicModel::Id).toULongLong(), db)); comics.append(DBHelper::loadComic(_data.value(i)->data(ComicModel::Id).toULongLong(), db));
} }
db.commit(); db.commit();
db.close(); connectionName = db.connectionName();
QSqlDatabase::removeDatabase(db.connectionName()); }
QSqlDatabase::removeDatabase(connectionName);
return comics; return comics;
} }
@ -776,20 +771,15 @@ QList<ComicDB> ComicModel::getAllComics()
QList<ComicDB> ComicModel::getComics(QList<QModelIndex> list) QList<ComicDB> ComicModel::getComics(QList<QModelIndex> list)
{ {
QList<ComicDB> comics; QList<ComicDB> comics;
for (auto itr = list.constBegin(); itr != list.constEnd(); itr++) {
QSqlDatabase db = DataBaseManagement::loadDatabase(_databasePath);
db.transaction();
QList<QModelIndex>::const_iterator itr;
for (itr = list.constBegin(); itr != list.constEnd(); itr++) {
comics.append(_getComic(*itr)); comics.append(_getComic(*itr));
} }
db.commit();
db.close();
QSqlDatabase::removeDatabase(db.connectionName());
return comics; return comics;
} }
//TODO //TODO
QVector<YACReaderComicReadStatus> ComicModel::setComicsRead(QList<QModelIndex> list, YACReaderComicReadStatus read) QVector<YACReaderComicReadStatus> ComicModel::setComicsRead(QList<QModelIndex> list, YACReaderComicReadStatus read)
{
QString connectionName = "";
{ {
QSqlDatabase db = DataBaseManagement::loadDatabase(_databasePath); QSqlDatabase db = DataBaseManagement::loadDatabase(_databasePath);
db.transaction(); db.transaction();
@ -812,18 +802,22 @@ QVector<YACReaderComicReadStatus> ComicModel::setComicsRead(QList<QModelIndex> l
} }
} }
db.commit(); db.commit();
db.close(); connectionName = db.connectionName();
QSqlDatabase::removeDatabase(db.connectionName()); }
QSqlDatabase::removeDatabase(connectionName);
emit dataChanged(index(list.first().row(), ComicModel::ReadColumn), index(list.last().row(), ComicModel::HasBeenOpened), QVector<int>() << ReadColumnRole << CurrentPageRole << HasBeenOpenedRole); emit dataChanged(index(list.first().row(), ComicModel::ReadColumn), index(list.last().row(), ComicModel::HasBeenOpened), QVector<int>() << ReadColumnRole << CurrentPageRole << HasBeenOpenedRole);
return getReadList(); return getReadList();
} }
qint64 ComicModel::asignNumbers(QList<QModelIndex> list, int startingNumber) qint64 ComicModel::asignNumbers(QList<QModelIndex> list, int startingNumber)
{
qint64 idFirst;
QString connectionName = "";
{ {
QSqlDatabase db = DataBaseManagement::loadDatabase(_databasePath); QSqlDatabase db = DataBaseManagement::loadDatabase(_databasePath);
db.transaction(); db.transaction();
qint64 idFirst = _data.value(list[0].row())->data(ComicModel::Id).toULongLong(); idFirst = _data.value(list[0].row())->data(ComicModel::Id).toULongLong();
int i = 0; int i = 0;
foreach (QModelIndex mi, list) { foreach (QModelIndex mi, list) {
ComicDB c = DBHelper::loadComic(_data.value(mi.row())->data(ComicModel::Id).toULongLong(), db); ComicDB c = DBHelper::loadComic(_data.value(mi.row())->data(ComicModel::Id).toULongLong(), db);
@ -832,12 +826,11 @@ qint64 ComicModel::asignNumbers(QList<QModelIndex> list, int startingNumber)
DBHelper::update(&(c.info), db); DBHelper::update(&(c.info), db);
i++; i++;
} }
db.commit(); db.commit();
db.close(); connectionName = db.connectionName();
QSqlDatabase::removeDatabase(db.connectionName()); }
//emit dataChanged(index(0,ComicModel::Number),index(_data.count()-1,ComicModel::HasBeenOpened)); QSqlDatabase::removeDatabase(connectionName);
return idFirst; return idFirst;
} }
@ -867,19 +860,22 @@ QList<QModelIndex> ComicModel::getIndexesFromIds(const QList<qulonglong> &comicI
void ComicModel::startTransaction() void ComicModel::startTransaction()
{ {
dbTransaction = DataBaseManagement::loadDatabase(_databasePath); auto dbTransaction = DataBaseManagement::loadDatabase(_databasePath);
_databaseConnection = dbTransaction.connectionName();
dbTransaction.transaction(); dbTransaction.transaction();
} }
void ComicModel::finishTransaction() void ComicModel::finishTransaction()
{ {
dbTransaction.commit(); {
dbTransaction.close(); QSqlDatabase::database(_databaseConnection).commit();
QSqlDatabase::removeDatabase(dbTransaction.connectionName()); }
QSqlDatabase::removeDatabase(_databaseConnection);
} }
void ComicModel::removeInTransaction(int row) void ComicModel::removeInTransaction(int row)
{ {
auto dbTransaction = QSqlDatabase::database(_databaseConnection);
ComicDB c = DBHelper::loadComic(_data.at(row)->data(ComicModel::Id).toULongLong(), dbTransaction); ComicDB c = DBHelper::loadComic(_data.at(row)->data(ComicModel::Id).toULongLong(), dbTransaction);
DBHelper::removeFromDB(&c, dbTransaction); DBHelper::removeFromDB(&c, dbTransaction);
@ -890,27 +886,6 @@ void ComicModel::removeInTransaction(int row)
endRemoveRows(); endRemoveRows();
} }
/*
void ComicModel::remove(ComicDB * comic, int row)
{
beginRemoveRows(QModelIndex(),row,row);
QSqlDatabase db = DataBaseManagement::loadDatabase(_databasePath);
DBHelper::removeFromDB(comic,db);
removeRow(row);
delete _data.at(row);
_data.removeAt(row);
db.close();
QSqlDatabase::removeDatabase(db.connectionName());
endRemoveRows();
}
*/
/*ComicDB TableModel::getComic(int row)
{
return getComic(index(row,0));
}*/
void ComicModel::remove(int row) void ComicModel::remove(int row)
{ {
@ -938,7 +913,8 @@ void ComicModel::reload(const ComicDB &comic)
void ComicModel::resetComicRating(const QModelIndex &mi) void ComicModel::resetComicRating(const QModelIndex &mi)
{ {
ComicDB comic = getComic(mi); ComicDB comic = getComic(mi);
QString connectionName = "";
{
QSqlDatabase db = DataBaseManagement::loadDatabase(_databasePath); QSqlDatabase db = DataBaseManagement::loadDatabase(_databasePath);
comic.info.rating = 0; comic.info.rating = 0;
@ -946,9 +922,9 @@ void ComicModel::resetComicRating(const QModelIndex &mi)
DBHelper::update(&(comic.info), db); DBHelper::update(&(comic.info), db);
emit dataChanged(mi, mi); emit dataChanged(mi, mi);
connectionName = db.connectionName();
db.close(); }
QSqlDatabase::removeDatabase(db.connectionName()); QSqlDatabase::removeDatabase(connectionName);
} }
QUrl ComicModel::getCoverUrlPathForComicHash(const QString &hash) const QUrl ComicModel::getCoverUrlPathForComicHash(const QString &hash) const
@ -964,13 +940,14 @@ void ComicModel::addComicsToFavorites(const QList<qulonglong> &comicIds)
void ComicModel::addComicsToFavorites(const QList<QModelIndex> &comicsList) void ComicModel::addComicsToFavorites(const QList<QModelIndex> &comicsList)
{ {
QList<ComicDB> comics = getComics(comicsList); QList<ComicDB> comics = getComics(comicsList);
QString connectionName = "";
{
QSqlDatabase db = DataBaseManagement::loadDatabase(_databasePath); QSqlDatabase db = DataBaseManagement::loadDatabase(_databasePath);
DBHelper::insertComicsInFavorites(comics, db); DBHelper::insertComicsInFavorites(comics, db);
connectionName = db.connectionName();
db.close(); }
QSqlDatabase::removeDatabase(db.connectionName()); QSqlDatabase::removeDatabase(connectionName);
} }
void ComicModel::addComicsToLabel(const QList<qulonglong> &comicIds, qulonglong labelId) void ComicModel::addComicsToLabel(const QList<qulonglong> &comicIds, qulonglong labelId)
@ -981,13 +958,14 @@ void ComicModel::addComicsToLabel(const QList<qulonglong> &comicIds, qulonglong
void ComicModel::addComicsToLabel(const QList<QModelIndex> &comicsList, qulonglong labelId) void ComicModel::addComicsToLabel(const QList<QModelIndex> &comicsList, qulonglong labelId)
{ {
QList<ComicDB> comics = getComics(comicsList); QList<ComicDB> comics = getComics(comicsList);
QString connectionName = "";
{
QSqlDatabase db = DataBaseManagement::loadDatabase(_databasePath); QSqlDatabase db = DataBaseManagement::loadDatabase(_databasePath);
DBHelper::insertComicsInLabel(comics, labelId, db); DBHelper::insertComicsInLabel(comics, labelId, db);
connectionName = db.connectionName();
db.close(); }
QSqlDatabase::removeDatabase(db.connectionName()); QSqlDatabase::removeDatabase(connectionName);
} }
void ComicModel::addComicsToReadingList(const QList<qulonglong> &comicIds, qulonglong readingListId) void ComicModel::addComicsToReadingList(const QList<qulonglong> &comicIds, qulonglong readingListId)
@ -998,25 +976,27 @@ void ComicModel::addComicsToReadingList(const QList<qulonglong> &comicIds, qulon
void ComicModel::addComicsToReadingList(const QList<QModelIndex> &comicsList, qulonglong readingListId) void ComicModel::addComicsToReadingList(const QList<QModelIndex> &comicsList, qulonglong readingListId)
{ {
QList<ComicDB> comics = getComics(comicsList); QList<ComicDB> comics = getComics(comicsList);
QString connectionName = "";
{
QSqlDatabase db = DataBaseManagement::loadDatabase(_databasePath); QSqlDatabase db = DataBaseManagement::loadDatabase(_databasePath);
DBHelper::insertComicsInReadingList(comics, readingListId, db); DBHelper::insertComicsInReadingList(comics, readingListId, db);
connectionName = db.connectionName();
db.close(); }
QSqlDatabase::removeDatabase(db.connectionName()); QSqlDatabase::removeDatabase(connectionName);
} }
void ComicModel::deleteComicsFromFavorites(const QList<QModelIndex> &comicsList) void ComicModel::deleteComicsFromFavorites(const QList<QModelIndex> &comicsList)
{ {
QList<ComicDB> comics = getComics(comicsList); QList<ComicDB> comics = getComics(comicsList);
QString connectionName = "";
{
QSqlDatabase db = DataBaseManagement::loadDatabase(_databasePath); QSqlDatabase db = DataBaseManagement::loadDatabase(_databasePath);
DBHelper::deleteComicsFromFavorites(comics, db); DBHelper::deleteComicsFromFavorites(comics, db);
connectionName = db.connectionName();
db.close(); }
QSqlDatabase::removeDatabase(db.connectionName()); QSqlDatabase::removeDatabase(connectionName);
if (mode == Favorites) if (mode == Favorites)
deleteComicsFromModel(comicsList); deleteComicsFromModel(comicsList);
@ -1025,13 +1005,14 @@ void ComicModel::deleteComicsFromFavorites(const QList<QModelIndex> &comicsList)
void ComicModel::deleteComicsFromLabel(const QList<QModelIndex> &comicsList, qulonglong labelId) void ComicModel::deleteComicsFromLabel(const QList<QModelIndex> &comicsList, qulonglong labelId)
{ {
QList<ComicDB> comics = getComics(comicsList); QList<ComicDB> comics = getComics(comicsList);
QString connectionName = "";
{
QSqlDatabase db = DataBaseManagement::loadDatabase(_databasePath); QSqlDatabase db = DataBaseManagement::loadDatabase(_databasePath);
DBHelper::deleteComicsFromLabel(comics, labelId, db); DBHelper::deleteComicsFromLabel(comics, labelId, db);
connectionName = db.connectionName();
db.close(); }
QSqlDatabase::removeDatabase(db.connectionName()); QSqlDatabase::removeDatabase(connectionName);
deleteComicsFromModel(comicsList); deleteComicsFromModel(comicsList);
} }
@ -1039,13 +1020,14 @@ void ComicModel::deleteComicsFromLabel(const QList<QModelIndex> &comicsList, qul
void ComicModel::deleteComicsFromReadingList(const QList<QModelIndex> &comicsList, qulonglong readingListId) void ComicModel::deleteComicsFromReadingList(const QList<QModelIndex> &comicsList, qulonglong readingListId)
{ {
QList<ComicDB> comics = getComics(comicsList); QList<ComicDB> comics = getComics(comicsList);
QString connectionName = "";
{
QSqlDatabase db = DataBaseManagement::loadDatabase(_databasePath); QSqlDatabase db = DataBaseManagement::loadDatabase(_databasePath);
DBHelper::deleteComicsFromReadingList(comics, readingListId, db); DBHelper::deleteComicsFromReadingList(comics, readingListId, db);
connectionName = db.connectionName();
db.close(); }
QSqlDatabase::removeDatabase(db.connectionName()); QSqlDatabase::removeDatabase(connectionName);
deleteComicsFromModel(comicsList); deleteComicsFromModel(comicsList);
} }
@ -1068,13 +1050,14 @@ void ComicModel::deleteComicsFromModel(const QList<QModelIndex> &comicsList)
bool ComicModel::isFavorite(const QModelIndex &index) bool ComicModel::isFavorite(const QModelIndex &index)
{ {
bool isFavorite; bool isFavorite;
QString connectionName = "";
{
QSqlDatabase db = DataBaseManagement::loadDatabase(_databasePath); QSqlDatabase db = DataBaseManagement::loadDatabase(_databasePath);
isFavorite = DBHelper::isFavoriteComic(_data[index.row()]->data(Id).toLongLong(), db); isFavorite = DBHelper::isFavoriteComic(_data[index.row()]->data(Id).toLongLong(), db);
connectionName = db.connectionName();
db.close(); }
QSqlDatabase::removeDatabase(db.connectionName()); QSqlDatabase::removeDatabase(connectionName);
return isFavorite; return isFavorite;
} }
@ -1082,7 +1065,8 @@ bool ComicModel::isFavorite(const QModelIndex &index)
void ComicModel::updateRating(int rating, QModelIndex mi) void ComicModel::updateRating(int rating, QModelIndex mi)
{ {
ComicDB comic = getComic(mi); ComicDB comic = getComic(mi);
QString connectionName = "";
{
QSqlDatabase db = DataBaseManagement::loadDatabase(_databasePath); QSqlDatabase db = DataBaseManagement::loadDatabase(_databasePath);
//TODO optimize update //TODO optimize update
@ -1091,7 +1075,7 @@ void ComicModel::updateRating(int rating, QModelIndex mi)
DBHelper::update(&(comic.info), db); DBHelper::update(&(comic.info), db);
emit dataChanged(mi, mi); emit dataChanged(mi, mi);
connectionName = db.connectionName();
db.close(); }
QSqlDatabase::removeDatabase(db.connectionName()); QSqlDatabase::removeDatabase(connectionName);
} }

View File

@ -150,8 +150,7 @@ private:
QList<ComicItem *> _data; QList<ComicItem *> _data;
QString _databasePath; QString _databasePath;
QString _databaseConnection;
QSqlDatabase dbTransaction;
bool enableResorting; bool enableResorting;
Mode mode; Mode mode;

View File

@ -97,13 +97,10 @@ QSqlDatabase DataBaseManagement::loadDatabase(QString path)
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE", path + threadId); QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE", path + threadId);
db.setDatabaseName(path + "/library.ydb"); db.setDatabaseName(path + "/library.ydb");
if (!db.open()) { if (!db.open()) {
//se devuelve una base de datos vacía e inválida
return QSqlDatabase(); return QSqlDatabase();
} }
QSqlQuery pragma("PRAGMA foreign_keys = ON", db); QSqlQuery pragma("PRAGMA foreign_keys = ON", db);
//pragma.finish();
//devuelve la base de datos
return db; return db;
} }
@ -118,11 +115,8 @@ QSqlDatabase DataBaseManagement::loadDatabaseFromFile(QString filePath)
return QSqlDatabase(); return QSqlDatabase();
} }
{
QSqlQuery pragma("PRAGMA foreign_keys = ON", db); QSqlQuery pragma("PRAGMA foreign_keys = ON", db);
}
//pragma.finish();
//devuelve la base de datos
return db; return db;
} }
@ -324,46 +318,34 @@ bool DataBaseManagement::createV8Tables(QSqlDatabase &database)
void DataBaseManagement::exportComicsInfo(QString source, QString dest) void DataBaseManagement::exportComicsInfo(QString source, QString dest)
{ {
//QSqlDatabase sourceDB = loadDatabase(source); QString connectionName = "";
QSqlDatabase destDB = loadDatabaseFromFile(dest);
//sourceDB.open();
{ {
QSqlDatabase destDB = loadDatabaseFromFile(dest);
QSqlQuery attach(destDB); QSqlQuery attach(destDB);
attach.prepare("ATTACH DATABASE '" + QDir().toNativeSeparators(dest) + "' AS dest;"); attach.prepare("ATTACH DATABASE '" + QDir().toNativeSeparators(dest) + "' AS dest;");
//attach.bindValue(":dest",QDir().toNativeSeparators(dest));
attach.exec(); attach.exec();
//attach.finish();
QSqlQuery attach2(destDB); QSqlQuery attach2(destDB);
attach2.prepare("ATTACH DATABASE '" + QDir().toNativeSeparators(source) + "' AS source;"); attach2.prepare("ATTACH DATABASE '" + QDir().toNativeSeparators(source) + "' AS source;");
attach2.exec(); attach2.exec();
//attach2.finish();
//sourceDB.close();
QSqlQuery queryDBInfo(destDB); QSqlQuery queryDBInfo(destDB);
queryDBInfo.prepare("CREATE TABLE dest.db_info (version TEXT NOT NULL)"); queryDBInfo.prepare("CREATE TABLE dest.db_info (version TEXT NOT NULL)");
queryDBInfo.exec(); queryDBInfo.exec();
//queryDBInfo.finish();
/*QSqlQuery queryComicsInfo(sourceDB);
queryComicsInfo.prepare("CREATE TABLE dest.comic_info (id INTEGER PRIMARY KEY, hash TEXT NOT NULL, edited BOOLEAN DEFAULT FALSE, title TEXT, read BOOLEAN)");
queryComicsInfo.exec();*/
QSqlQuery query("INSERT INTO dest.db_info (version) " QSqlQuery query("INSERT INTO dest.db_info (version) "
"VALUES ('" VERSION "')", "VALUES ('" VERSION "')",
destDB); destDB);
//query.finish();
QSqlQuery exportData(destDB); QSqlQuery exportData(destDB);
exportData.prepare("create table dest.comic_info as select " + fields + exportData.prepare("create table dest.comic_info as select " + fields +
" from source.comic_info where source.comic_info.edited = 1"); " from source.comic_info where source.comic_info.edited = 1");
exportData.exec(); exportData.exec();
//exportData.finish(); connectionName = destDB.connectionName();
} }
//sourceDB.close(); QSqlDatabase::removeDatabase(connectionName);
destDB.close();
QSqlDatabase::removeDatabase(dest);
} }
bool DataBaseManagement::importComicsInfo(QString source, QString dest) bool DataBaseManagement::importComicsInfo(QString source, QString dest)
@ -374,10 +356,13 @@ bool DataBaseManagement::importComicsInfo(QString source, QString dest)
bool b = false; bool b = false;
QString sourceDBconnection = "";
QString destDBconnection = "";
{
QSqlDatabase sourceDB = loadDatabaseFromFile(source); QSqlDatabase sourceDB = loadDatabaseFromFile(source);
QSqlDatabase destDB = loadDatabaseFromFile(dest); QSqlDatabase destDB = loadDatabaseFromFile(dest);
{
QSqlQuery pragma("PRAGMA synchronous=OFF", destDB); QSqlQuery pragma("PRAGMA synchronous=OFF", destDB);
QSqlQuery newInfo(sourceDB); QSqlQuery newInfo(sourceDB);
@ -538,9 +523,6 @@ bool DataBaseManagement::importComicsInfo(QString source, QString dest)
insert.exec(); insert.exec();
} }
//update.finish();
//insert.finish();
}
} }
destDB.commit(); destDB.commit();
@ -558,11 +540,13 @@ bool DataBaseManagement::importComicsInfo(QString source, QString dest)
tc.create(); tc.create();
} }
} }
sourceDBconnection = sourceDB.connectionName();
destDBconnection = sourceDB.connectionName();
}
QSqlDatabase::removeDatabase(sourceDBconnection);
QSqlDatabase::removeDatabase(destDBconnection);
destDB.close();
sourceDB.close();
QSqlDatabase::removeDatabase(source);
QSqlDatabase::removeDatabase(dest);
return b; return b;
} }
//TODO fix these bindings //TODO fix these bindings
@ -666,8 +650,11 @@ void DataBaseManagement::bindDouble(const QString &name, const QSqlRecord &recor
QString DataBaseManagement::checkValidDB(const QString &fullPath) QString DataBaseManagement::checkValidDB(const QString &fullPath)
{ {
QSqlDatabase db = loadDatabaseFromFile(fullPath);
QString versionString = ""; QString versionString = "";
QString connectionName = "";
{
QSqlDatabase db = loadDatabaseFromFile(fullPath);
if (db.isValid() && db.isOpen()) { if (db.isValid() && db.isOpen()) {
QSqlQuery version(db); QSqlQuery version(db);
version.prepare("SELECT * FROM db_info"); version.prepare("SELECT * FROM db_info");
@ -676,9 +663,10 @@ QString DataBaseManagement::checkValidDB(const QString &fullPath)
if (version.next()) if (version.next())
versionString = version.record().value("version").toString(); versionString = version.record().value("version").toString();
} }
connectionName = db.connectionName();
}
db.close(); QSqlDatabase::removeDatabase(connectionName);
QSqlDatabase::removeDatabase(db.connectionName());
return versionString; return versionString;
} }
@ -731,8 +719,11 @@ bool DataBaseManagement::updateToCurrentVersion(const QString &path)
if (compareVersions(DataBaseManagement::checkValidDB(fullPath), "9.5.0") < 0) if (compareVersions(DataBaseManagement::checkValidDB(fullPath), "9.5.0") < 0)
pre9_5 = true; pre9_5 = true;
QSqlDatabase db = loadDatabaseFromFile(fullPath); QString connectionName = "";
bool returnValue = false; bool returnValue = false;
{
QSqlDatabase db = loadDatabaseFromFile(fullPath);
if (db.isValid() && db.isOpen()) { if (db.isValid() && db.isOpen()) {
QSqlQuery updateVersion(db); QSqlQuery updateVersion(db);
updateVersion.prepare("UPDATE db_info SET " updateVersion.prepare("UPDATE db_info SET "
@ -838,9 +829,10 @@ bool DataBaseManagement::updateToCurrentVersion(const QString &path)
} }
} }
} }
connectionName = db.connectionName();
}
db.close(); QSqlDatabase::removeDatabase(connectionName);
QSqlDatabase::removeDatabase(db.connectionName());
return returnValue; return returnValue;
} }

View File

@ -291,16 +291,17 @@ void FolderModel::setupModelData(QString path)
//cargar la base de datos //cargar la base de datos
_databasePath = path; _databasePath = path;
QSqlDatabase db = DataBaseManagement::loadDatabase(path);
//crear la consulta //crear la consulta
QString connectionName = "";
{ {
QSqlDatabase db = DataBaseManagement::loadDatabase(path);
QSqlQuery selectQuery("select * from folder where id <> 1 order by parentId,name", db); QSqlQuery selectQuery("select * from folder where id <> 1 order by parentId,name", db);
setupModelData(selectQuery, rootItem); setupModelData(selectQuery, rootItem);
connectionName = db.connectionName();
} }
//selectQuery.finish(); //selectQuery.finish();
db.close(); QSqlDatabase::removeDatabase(connectionName);
QSqlDatabase::removeDatabase(db.connectionName());
endResetModel(); endResetModel();
} }
@ -406,6 +407,8 @@ void FolderModel::resetFilter()
}*/ }*/
void FolderModel::updateFolderCompletedStatus(const QModelIndexList &list, bool status) void FolderModel::updateFolderCompletedStatus(const QModelIndexList &list, bool status)
{
QString connectionName = "";
{ {
QSqlDatabase db = DataBaseManagement::loadDatabase(_databasePath); QSqlDatabase db = DataBaseManagement::loadDatabase(_databasePath);
db.transaction(); db.transaction();
@ -418,13 +421,16 @@ void FolderModel::updateFolderCompletedStatus(const QModelIndexList &list, bool
DBHelper::update(f, db); DBHelper::update(f, db);
} }
db.commit(); db.commit();
db.close(); connectionName = db.connectionName();
QSqlDatabase::removeDatabase(db.connectionName()); }
QSqlDatabase::removeDatabase(connectionName);
emit dataChanged(index(list.first().row(), FolderModel::Name), index(list.last().row(), FolderModel::Completed)); emit dataChanged(index(list.first().row(), FolderModel::Name), index(list.last().row(), FolderModel::Completed));
} }
void FolderModel::updateFolderFinishedStatus(const QModelIndexList &list, bool status) void FolderModel::updateFolderFinishedStatus(const QModelIndexList &list, bool status)
{
QString connectionName = "";
{ {
QSqlDatabase db = DataBaseManagement::loadDatabase(_databasePath); QSqlDatabase db = DataBaseManagement::loadDatabase(_databasePath);
db.transaction(); db.transaction();
@ -437,8 +443,9 @@ void FolderModel::updateFolderFinishedStatus(const QModelIndexList &list, bool s
DBHelper::update(f, db); DBHelper::update(f, db);
} }
db.commit(); db.commit();
db.close(); connectionName = db.connectionName();
QSqlDatabase::removeDatabase(db.connectionName()); }
QSqlDatabase::removeDatabase(connectionName);
emit dataChanged(index(list.first().row(), FolderModel::Name), index(list.last().row(), FolderModel::Completed)); emit dataChanged(index(list.first().row(), FolderModel::Name), index(list.last().row(), FolderModel::Completed));
} }
@ -451,15 +458,17 @@ QStringList FolderModel::getSubfoldersNames(const QModelIndex &mi)
auto item = static_cast<FolderItem *>(mi.internalPointer()); auto item = static_cast<FolderItem *>(mi.internalPointer());
id = item->id; id = item->id;
} }
QString connectionName = "";
{
QSqlDatabase db = DataBaseManagement::loadDatabase(_databasePath); QSqlDatabase db = DataBaseManagement::loadDatabase(_databasePath);
db.transaction(); db.transaction();
result = DBHelper::loadSubfoldersNames(id, db); result = DBHelper::loadSubfoldersNames(id, db);
db.commit(); db.commit();
db.close(); connectionName = db.connectionName();
QSqlDatabase::removeDatabase(db.connectionName()); }
QSqlDatabase::removeDatabase(connectionName);
//TODO sort result)) //TODO sort result))
qSort(result.begin(), result.end(), naturalSortLessThanCI); qSort(result.begin(), result.end(), naturalSortLessThanCI);
@ -481,6 +490,8 @@ void FolderModel::fetchMoreFromDB(const QModelIndex &parent)
endRemoveRows(); endRemoveRows();
} }
QString connectionName = "";
{
QSqlDatabase db = DataBaseManagement::loadDatabase(_databasePath); QSqlDatabase db = DataBaseManagement::loadDatabase(_databasePath);
QList<FolderItem *> items; QList<FolderItem *> items;
@ -525,11 +536,11 @@ void FolderModel::fetchMoreFromDB(const QModelIndex &parent)
items.clear(); items.clear();
items = nextLevelItems; items = nextLevelItems;
} }
connectionName = db.connectionName();
}
QLOG_DEBUG() << "item->childCount()-1" << item->childCount() - 1; QLOG_DEBUG() << "item->childCount()-1" << item->childCount() - 1;
db.close(); QSqlDatabase::removeDatabase(connectionName);
QSqlDatabase::removeDatabase(db.connectionName());
} }
QModelIndex FolderModel::addFolderAtParent(const QString &folderName, const QModelIndex &parent) QModelIndex FolderModel::addFolderAtParent(const QString &folderName, const QModelIndex &parent)
@ -545,11 +556,14 @@ QModelIndex FolderModel::addFolderAtParent(const QString &folderName, const QMod
newFolder.name = folderName; newFolder.name = folderName;
newFolder.parentId = parentItem->id; newFolder.parentId = parentItem->id;
newFolder.path = parentItem->data(1).toString() + "/" + folderName; newFolder.path = parentItem->data(1).toString() + "/" + folderName;
QString connectionName = "";
{
QSqlDatabase db = DataBaseManagement::loadDatabase(_databasePath); QSqlDatabase db = DataBaseManagement::loadDatabase(_databasePath);
newFolder.id = DBHelper::insert(&newFolder, db); newFolder.id = DBHelper::insert(&newFolder, db);
DBHelper::updateChildrenInfo(parentItem->id, db); DBHelper::updateChildrenInfo(parentItem->id, db);
QSqlDatabase::removeDatabase(db.connectionName()); connectionName = db.connectionName();
}
QSqlDatabase::removeDatabase(connectionName);
int destRow = 0; int destRow = 0;
@ -585,19 +599,27 @@ void FolderModel::deleteFolder(const QModelIndex &mi)
Folder f; Folder f;
f.setId(item->id); f.setId(item->id);
QString connectionName = "";
{
QSqlDatabase db = DataBaseManagement::loadDatabase(_databasePath); QSqlDatabase db = DataBaseManagement::loadDatabase(_databasePath);
DBHelper::removeFromDB(&f, db); DBHelper::removeFromDB(&f, db);
DBHelper::updateChildrenInfo(item->parent()->id, db); DBHelper::updateChildrenInfo(item->parent()->id, db);
QSqlDatabase::removeDatabase(db.connectionName()); connectionName = db.connectionName();
}
QSqlDatabase::removeDatabase(connectionName);
endRemoveRows(); endRemoveRows();
} }
void FolderModel::updateFolderChildrenInfo(qulonglong folderId) void FolderModel::updateFolderChildrenInfo(qulonglong folderId)
{
QString connectionName = "";
{ {
QSqlDatabase db = DataBaseManagement::loadDatabase(_databasePath); QSqlDatabase db = DataBaseManagement::loadDatabase(_databasePath);
DBHelper::updateChildrenInfo(folderId, db); DBHelper::updateChildrenInfo(folderId, db);
QSqlDatabase::removeDatabase(db.connectionName()); connectionName = db.connectionName();
}
QSqlDatabase::removeDatabase(connectionName);
} }
//PROXY //PROXY
@ -658,10 +680,10 @@ void FolderModelProxy::setupFilteredModelData()
auto model = static_cast<FolderModel *>(sourceModel()); auto model = static_cast<FolderModel *>(sourceModel());
//cargar la base de datos QString connectionName = "";
QSqlDatabase db = DataBaseManagement::loadDatabase(model->_databasePath);
//crear la consulta
{ {
QSqlDatabase db = DataBaseManagement::loadDatabase(model->_databasePath);
QSqlQuery selectQuery(db); //TODO check QSqlQuery selectQuery(db); //TODO check
if (!includeComics) { if (!includeComics) {
selectQuery.prepare("select * from folder where id <> 1 and upper(name) like upper(:filter) order by parentId,name "); selectQuery.prepare("select * from folder where id <> 1 and upper(name) like upper(:filter) order by parentId,name ");
@ -700,10 +722,9 @@ void FolderModelProxy::setupFilteredModelData()
selectQuery.exec(); selectQuery.exec();
setupFilteredModelData(selectQuery, rootItem); setupFilteredModelData(selectQuery, rootItem);
connectionName = db.connectionName();
} }
//selectQuery.finish(); QSqlDatabase::removeDatabase(connectionName);
db.close();
QSqlDatabase::removeDatabase(db.connectionName());
endResetModel(); endResetModel();
} }

View File

@ -371,6 +371,8 @@ void ReadingListModel::setupReadingListsData(QString path)
} }
void ReadingListModel::addNewLabel(const QString &name, YACReader::LabelColors color) void ReadingListModel::addNewLabel(const QString &name, YACReader::LabelColors color)
{
QString connectionName = "";
{ {
QSqlDatabase db = DataBaseManagement::loadDatabase(_databasePath); QSqlDatabase db = DataBaseManagement::loadDatabase(_databasePath);
qulonglong id = DBHelper::insertLabel(name, color, db); qulonglong id = DBHelper::insertLabel(name, color, db);
@ -379,14 +381,16 @@ void ReadingListModel::addNewLabel(const QString &name, YACReader::LabelColors c
beginInsertRows(QModelIndex(), specialLists.count() + 1 + newPos + 1, specialLists.count() + 1 + newPos + 1); beginInsertRows(QModelIndex(), specialLists.count() + 1 + newPos + 1, specialLists.count() + 1 + newPos + 1);
endInsertRows(); endInsertRows();
connectionName = db.connectionName();
QSqlDatabase::removeDatabase(db.connectionName()); }
QSqlDatabase::removeDatabase(connectionName);
} }
void ReadingListModel::addReadingList(const QString &name) void ReadingListModel::addReadingList(const QString &name)
{
QString connectionName = "";
{ {
QSqlDatabase db = DataBaseManagement::loadDatabase(_databasePath); QSqlDatabase db = DataBaseManagement::loadDatabase(_databasePath);
beginInsertRows(QModelIndex(), 0, 0); //TODO calculate the right coordinates before inserting beginInsertRows(QModelIndex(), 0, 0); //TODO calculate the right coordinates before inserting
qulonglong id = DBHelper::insertReadingList(name, db); qulonglong id = DBHelper::insertReadingList(name, db);
@ -400,16 +404,15 @@ void ReadingListModel::addReadingList(const QString &name)
items.insert(id, newItem); items.insert(id, newItem);
/*int pos = rootItem->children().indexOf(newItem);
pos += specialLists.count()+1+labels.count()+labels.count()>0?1:0;*/
endInsertRows(); endInsertRows();
connectionName = db.connectionName();
QSqlDatabase::removeDatabase(db.connectionName()); }
QSqlDatabase::removeDatabase(connectionName);
} }
void ReadingListModel::addReadingListAt(const QString &name, const QModelIndex &mi) void ReadingListModel::addReadingListAt(const QString &name, const QModelIndex &mi)
{
QString connectionName = "";
{ {
QSqlDatabase db = DataBaseManagement::loadDatabase(_databasePath); QSqlDatabase db = DataBaseManagement::loadDatabase(_databasePath);
@ -427,14 +430,10 @@ void ReadingListModel::addReadingListAt(const QString &name, const QModelIndex &
<< readingListParent->childCount())); << readingListParent->childCount()));
items.insert(id, newItem); items.insert(id, newItem);
/*int pos = readingListParent->children().indexOf(newItem);
pos += specialLists.count()+1+labels.count()+labels.count()>0?1:0;*/
endInsertRows(); endInsertRows();
connectionName = db.connectionName();
QSqlDatabase::removeDatabase(db.connectionName()); }
QSqlDatabase::removeDatabase(connectionName);
} }
bool ReadingListModel::isEditable(const QModelIndex &mi) bool ReadingListModel::isEditable(const QModelIndex &mi)
@ -477,7 +476,8 @@ void ReadingListModel::rename(const QModelIndex &mi, const QString &name)
{ {
if (!isEditable(mi)) if (!isEditable(mi))
return; return;
QString connectionName = "";
{
QSqlDatabase db = DataBaseManagement::loadDatabase(_databasePath); QSqlDatabase db = DataBaseManagement::loadDatabase(_databasePath);
auto item = static_cast<ListItem *>(mi.internalPointer()); auto item = static_cast<ListItem *>(mi.internalPointer());
@ -498,8 +498,9 @@ void ReadingListModel::rename(const QModelIndex &mi, const QString &name)
DBHelper::renameLabel(item->getId(), name, db); DBHelper::renameLabel(item->getId(), name, db);
emit dataChanged(index(mi.row(), 0), index(mi.row(), 0)); emit dataChanged(index(mi.row(), 0), index(mi.row(), 0));
} }
connectionName = db.connectionName();
QSqlDatabase::removeDatabase(db.connectionName()); }
QSqlDatabase::removeDatabase(connectionName);
} }
void ReadingListModel::deleteItem(const QModelIndex &mi) void ReadingListModel::deleteItem(const QModelIndex &mi)
@ -507,7 +508,8 @@ void ReadingListModel::deleteItem(const QModelIndex &mi)
if (isEditable(mi)) { if (isEditable(mi)) {
QLOG_DEBUG() << "parent row :" << mi.parent().data() << "-" << mi.row(); QLOG_DEBUG() << "parent row :" << mi.parent().data() << "-" << mi.row();
beginRemoveRows(mi.parent(), mi.row(), mi.row()); beginRemoveRows(mi.parent(), mi.row(), mi.row());
QString connectionName = "";
{
QSqlDatabase db = DataBaseManagement::loadDatabase(_databasePath); QSqlDatabase db = DataBaseManagement::loadDatabase(_databasePath);
auto item = static_cast<ListItem *>(mi.internalPointer()); auto item = static_cast<ListItem *>(mi.internalPointer());
@ -527,8 +529,9 @@ void ReadingListModel::deleteItem(const QModelIndex &mi)
labels.removeOne(li); labels.removeOne(li);
DBHelper::removeLabelFromDB(item->getId(), db); DBHelper::removeLabelFromDB(item->getId(), db);
} }
connectionName = db.connectionName();
QSqlDatabase::removeDatabase(db.connectionName()); }
QSqlDatabase::removeDatabase(connectionName);
endRemoveRows(); endRemoveRows();
} }
@ -705,10 +708,13 @@ void ReadingListModel::reorderingChildren(QList<ReadingListItem *> children)
item->setOrdering(i++); item->setOrdering(i++);
childrenIds << item->getId(); childrenIds << item->getId();
} }
QString connectionName = "";
{
QSqlDatabase db = DataBaseManagement::loadDatabase(_databasePath); QSqlDatabase db = DataBaseManagement::loadDatabase(_databasePath);
DBHelper::reasignOrderToSublists(childrenIds, db); DBHelper::reasignOrderToSublists(childrenIds, db);
QSqlDatabase::removeDatabase(db.connectionName()); connectionName = db.connectionName();
}
QSqlDatabase::removeDatabase(connectionName);
} }
bool ReadingListModel::rowIsSpecialList(int row, const QModelIndex &parent) const bool ReadingListModel::rowIsSpecialList(int row, const QModelIndex &parent) const

View File

@ -35,12 +35,15 @@ YACReaderLibraries DBHelper::getLibraries()
QList<LibraryItem *> DBHelper::getFolderSubfoldersFromLibrary(qulonglong libraryId, qulonglong folderId) QList<LibraryItem *> DBHelper::getFolderSubfoldersFromLibrary(qulonglong libraryId, qulonglong folderId)
{ {
QString libraryPath = DBHelper::getLibraries().getPath(libraryId); QString libraryPath = DBHelper::getLibraries().getPath(libraryId);
QString connectionName = "";
QList<LibraryItem *> list;
{
QSqlDatabase db = DataBaseManagement::loadDatabase(libraryPath + "/.yacreaderlibrary"); QSqlDatabase db = DataBaseManagement::loadDatabase(libraryPath + "/.yacreaderlibrary");
list = DBHelper::getFoldersFromParent(folderId, db, false);
QList<LibraryItem *> list = DBHelper::getFoldersFromParent(folderId, db, false); connectionName = db.connectionName();
}
db.close(); QSqlDatabase::removeDatabase(connectionName);
QSqlDatabase::removeDatabase(db.connectionName());
return list; return list;
} }
QList<LibraryItem *> DBHelper::getFolderComicsFromLibrary(qulonglong libraryId, qulonglong folderId) QList<LibraryItem *> DBHelper::getFolderComicsFromLibrary(qulonglong libraryId, qulonglong folderId)
@ -51,42 +54,43 @@ QList<LibraryItem *> DBHelper::getFolderComicsFromLibrary(qulonglong libraryId,
QList<LibraryItem *> DBHelper::getFolderComicsFromLibrary(qulonglong libraryId, qulonglong folderId, bool sort) QList<LibraryItem *> DBHelper::getFolderComicsFromLibrary(qulonglong libraryId, qulonglong folderId, bool sort)
{ {
QString libraryPath = DBHelper::getLibraries().getPath(libraryId); QString libraryPath = DBHelper::getLibraries().getPath(libraryId);
QString connectionName = "";
QList<LibraryItem *> list;
{
QSqlDatabase db = DataBaseManagement::loadDatabase(libraryPath + "/.yacreaderlibrary"); QSqlDatabase db = DataBaseManagement::loadDatabase(libraryPath + "/.yacreaderlibrary");
list = DBHelper::getComicsFromParent(folderId, db, sort);
QList<LibraryItem *> list = DBHelper::getComicsFromParent(folderId, db, sort); connectionName = db.connectionName();
}
db.close(); QSqlDatabase::removeDatabase(connectionName);
QSqlDatabase::removeDatabase(db.connectionName());
return list; return list;
} }
quint32 DBHelper::getNumChildrenFromFolder(qulonglong libraryId, qulonglong folderId) quint32 DBHelper::getNumChildrenFromFolder(qulonglong libraryId, qulonglong folderId)
{ {
QString libraryPath = DBHelper::getLibraries().getPath(libraryId); QString libraryPath = DBHelper::getLibraries().getPath(libraryId);
QSqlDatabase db = DataBaseManagement::loadDatabase(libraryPath + "/.yacreaderlibrary");
quint32 result = 0; quint32 result = 0;
QString connectionName = "";
{ {
QSqlDatabase db = DataBaseManagement::loadDatabase(libraryPath + "/.yacreaderlibrary");
QSqlQuery selectQuery(db); QSqlQuery selectQuery(db);
selectQuery.prepare("SELECT count(*) FROM folder WHERE parentId = :parentId and id <> 1"); selectQuery.prepare("SELECT count(*) FROM folder WHERE parentId = :parentId and id <> 1");
selectQuery.bindValue(":parentId", folderId); selectQuery.bindValue(":parentId", folderId);
selectQuery.exec(); selectQuery.exec();
result += selectQuery.record().value(0).toULongLong(); result += selectQuery.record().value(0).toULongLong();
}
{
QSqlQuery selectQuery(db);
selectQuery.prepare("SELECT count(*) FROM comic c WHERE c.parentId = :parentId"); selectQuery.prepare("SELECT count(*) FROM comic c WHERE c.parentId = :parentId");
selectQuery.bindValue(":parentId", folderId); selectQuery.bindValue(":parentId", folderId);
selectQuery.exec(); selectQuery.exec();
result += selectQuery.record().value(0).toULongLong(); result += selectQuery.record().value(0).toULongLong();
connectionName = db.connectionName();
} }
db.close(); QSqlDatabase::removeDatabase(connectionName);
QSqlDatabase::removeDatabase(db.connectionName());
return result; return result;
} }
@ -94,45 +98,57 @@ quint32 DBHelper::getNumChildrenFromFolder(qulonglong libraryId, qulonglong fold
qulonglong DBHelper::getParentFromComicFolderId(qulonglong libraryId, qulonglong id) qulonglong DBHelper::getParentFromComicFolderId(qulonglong libraryId, qulonglong id)
{ {
QString libraryPath = DBHelper::getLibraries().getPath(libraryId); QString libraryPath = DBHelper::getLibraries().getPath(libraryId);
QString connectionName = "";
Folder f;
{
QSqlDatabase db = DataBaseManagement::loadDatabase(libraryPath + "/.yacreaderlibrary"); QSqlDatabase db = DataBaseManagement::loadDatabase(libraryPath + "/.yacreaderlibrary");
Folder f = DBHelper::loadFolder(id, db); f = DBHelper::loadFolder(id, db);
connectionName = db.connectionName();
}
db.close(); QSqlDatabase::removeDatabase(connectionName);
QSqlDatabase::removeDatabase(db.connectionName());
return f.parentId; return f.parentId;
} }
ComicDB DBHelper::getComicInfo(qulonglong libraryId, qulonglong id) ComicDB DBHelper::getComicInfo(qulonglong libraryId, qulonglong id)
{ {
QString libraryPath = DBHelper::getLibraries().getPath(libraryId); QString libraryPath = DBHelper::getLibraries().getPath(libraryId);
QString connectionName = "";
ComicDB comic;
{
QSqlDatabase db = DataBaseManagement::loadDatabase(libraryPath + "/.yacreaderlibrary"); QSqlDatabase db = DataBaseManagement::loadDatabase(libraryPath + "/.yacreaderlibrary");
ComicDB comic = DBHelper::loadComic(id, db); comic = DBHelper::loadComic(id, db);
connectionName = db.connectionName();
db.close(); }
QSqlDatabase::removeDatabase(db.connectionName()); QSqlDatabase::removeDatabase(connectionName);
return comic; return comic;
} }
QList<ComicDB> DBHelper::getSiblings(qulonglong libraryId, qulonglong parentId) QList<ComicDB> DBHelper::getSiblings(qulonglong libraryId, qulonglong parentId)
{ {
QString libraryPath = DBHelper::getLibraries().getPath(libraryId); QString libraryPath = DBHelper::getLibraries().getPath(libraryId);
QString connectionName = "";
QList<ComicDB> comics;
{
QSqlDatabase db = DataBaseManagement::loadDatabase(libraryPath + "/.yacreaderlibrary"); QSqlDatabase db = DataBaseManagement::loadDatabase(libraryPath + "/.yacreaderlibrary");
comics = DBHelper::getSortedComicsFromParent(parentId, db);
connectionName = db.connectionName();
}
QList<ComicDB> comics = DBHelper::getSortedComicsFromParent(parentId, db); QSqlDatabase::removeDatabase(connectionName);
db.close();
QSqlDatabase::removeDatabase(db.connectionName());
return comics; return comics;
} }
QString DBHelper::getFolderName(qulonglong libraryId, qulonglong id) QString DBHelper::getFolderName(qulonglong libraryId, qulonglong id)
{ {
QString libraryPath = DBHelper::getLibraries().getPath(libraryId); QString libraryPath = DBHelper::getLibraries().getPath(libraryId);
QSqlDatabase db = DataBaseManagement::loadDatabase(libraryPath + "/.yacreaderlibrary");
QString name = ""; QString name = "";
QString connectionName = "";
{ {
QSqlDatabase db = DataBaseManagement::loadDatabase(libraryPath + "/.yacreaderlibrary");
QSqlQuery selectQuery(db); //TODO check QSqlQuery selectQuery(db); //TODO check
selectQuery.prepare("SELECT name FROM folder WHERE id = :id"); selectQuery.prepare("SELECT name FROM folder WHERE id = :id");
selectQuery.bindValue(":id", id); selectQuery.bindValue(":id", id);
@ -141,10 +157,10 @@ QString DBHelper::getFolderName(qulonglong libraryId, qulonglong id)
if (selectQuery.next()) { if (selectQuery.next()) {
name = selectQuery.value(0).toString(); name = selectQuery.value(0).toString();
} }
connectionName = db.connectionName();
} }
db.close(); QSqlDatabase::removeDatabase(connectionName);
QSqlDatabase::removeDatabase(db.connectionName());
return name; return name;
} }
QList<QString> DBHelper::getLibrariesNames() QList<QString> DBHelper::getLibrariesNames()
@ -161,11 +177,12 @@ QString DBHelper::getLibraryName(int id)
QList<ComicDB> DBHelper::getLabelComics(qulonglong libraryId, qulonglong labelId) QList<ComicDB> DBHelper::getLabelComics(qulonglong libraryId, qulonglong labelId)
{ {
QString libraryPath = DBHelper::getLibraries().getPath(libraryId); QString libraryPath = DBHelper::getLibraries().getPath(libraryId);
QSqlDatabase db = DataBaseManagement::loadDatabase(libraryPath + "/.yacreaderlibrary");
QList<ComicDB> list; QList<ComicDB> list;
QString connectionName = "";
{ {
QSqlDatabase db = DataBaseManagement::loadDatabase(libraryPath + "/.yacreaderlibrary");
QSqlQuery selectQuery(db); QSqlQuery selectQuery(db);
selectQuery.prepare("SELECT c.id,c.fileName,ci.title,ci.currentPage,ci.numPages,ci.hash,ci.read,ci.coverSizeRatio " selectQuery.prepare("SELECT c.id,c.fileName,ci.title,ci.currentPage,ci.numPages,ci.hash,ci.read,ci.coverSizeRatio "
"FROM comic c INNER JOIN comic_info ci ON (c.comicInfoId = ci.id) " "FROM comic c INNER JOIN comic_info ci ON (c.comicInfoId = ci.id) "
@ -190,11 +207,9 @@ QList<ComicDB> DBHelper::getLabelComics(qulonglong libraryId, qulonglong labelId
list.append(comic); list.append(comic);
} }
connectionName = db.connectionName();
db.close();
} }
//TODO ? QSqlDatabase::removeDatabase(connectionName);
//QSqlDatabase::removeDatabase(db.connectionName());
return list; return list;
} }
@ -202,13 +217,13 @@ QList<ComicDB> DBHelper::getLabelComics(qulonglong libraryId, qulonglong labelId
QList<ComicDB> DBHelper::getFavorites(qulonglong libraryId) QList<ComicDB> DBHelper::getFavorites(qulonglong libraryId)
{ {
QString libraryPath = DBHelper::getLibraries().getPath(libraryId); QString libraryPath = DBHelper::getLibraries().getPath(libraryId);
QSqlDatabase db = DataBaseManagement::loadDatabase(libraryPath + "/.yacreaderlibrary");
QList<ComicDB> list; QList<ComicDB> list;
const int FAV_ID = 1; const int FAV_ID = 1;
QString connectionName = "";
{ {
QSqlDatabase db = DataBaseManagement::loadDatabase(libraryPath + "/.yacreaderlibrary");
QSqlQuery selectQuery(db); QSqlQuery selectQuery(db);
selectQuery.prepare("SELECT c.id,c.fileName,ci.title,ci.currentPage,ci.numPages,ci.hash,ci.read,ci.coverSizeRatio " selectQuery.prepare("SELECT c.id,c.fileName,ci.title,ci.currentPage,ci.numPages,ci.hash,ci.read,ci.coverSizeRatio "
"FROM comic c INNER JOIN comic_info ci ON (c.comicInfoId = ci.id) " "FROM comic c INNER JOIN comic_info ci ON (c.comicInfoId = ci.id) "
@ -234,10 +249,10 @@ QList<ComicDB> DBHelper::getFavorites(qulonglong libraryId)
list.append(comic); list.append(comic);
} }
db.close(); connectionName = db.connectionName();
} }
//TODO ? //TODO ?
//QSqlDatabase::removeDatabase(db.connectionName()); QSqlDatabase::removeDatabase(connectionName);
return list; return list;
} }
@ -245,11 +260,11 @@ QList<ComicDB> DBHelper::getFavorites(qulonglong libraryId)
QList<ComicDB> DBHelper::getReading(qulonglong libraryId) QList<ComicDB> DBHelper::getReading(qulonglong libraryId)
{ {
QString libraryPath = DBHelper::getLibraries().getPath(libraryId); QString libraryPath = DBHelper::getLibraries().getPath(libraryId);
QSqlDatabase db = DataBaseManagement::loadDatabase(libraryPath + "/.yacreaderlibrary");
QList<ComicDB> list; QList<ComicDB> list;
QString connectionName = "";
{ {
QSqlDatabase db = DataBaseManagement::loadDatabase(libraryPath + "/.yacreaderlibrary");
QSqlQuery selectQuery(db); QSqlQuery selectQuery(db);
selectQuery.prepare("SELECT c.id,c.parentId,c.fileName,ci.title,ci.currentPage,ci.numPages,ci.hash,ci.read,ci.coverSizeRatio " selectQuery.prepare("SELECT c.id,c.parentId,c.fileName,ci.title,ci.currentPage,ci.numPages,ci.hash,ci.read,ci.coverSizeRatio "
"FROM comic c INNER JOIN comic_info ci ON (c.comicInfoId = ci.id) " "FROM comic c INNER JOIN comic_info ci ON (c.comicInfoId = ci.id) "
@ -272,11 +287,10 @@ QList<ComicDB> DBHelper::getReading(qulonglong libraryId)
list.append(comic); list.append(comic);
} }
connectionName = db.connectionName();
db.close();
} }
//TODO ? //TODO ?
//QSqlDatabase::removeDatabase(db.connectionName()); QSqlDatabase::removeDatabase(connectionName);
return list; return list;
} }
@ -284,10 +298,12 @@ QList<ComicDB> DBHelper::getReading(qulonglong libraryId)
QList<ReadingList> DBHelper::getReadingLists(qulonglong libraryId) QList<ReadingList> DBHelper::getReadingLists(qulonglong libraryId)
{ {
QString libraryPath = DBHelper::getLibraries().getPath(libraryId); QString libraryPath = DBHelper::getLibraries().getPath(libraryId);
QSqlDatabase db = DataBaseManagement::loadDatabase(libraryPath + "/.yacreaderlibrary"); QString connectionName = "";
QList<ReadingList> list; QList<ReadingList> list;
{
QSqlDatabase db = DataBaseManagement::loadDatabase(libraryPath + "/.yacreaderlibrary");
QSqlQuery selectQuery("SELECT * from reading_list WHERE parentId IS NULL ORDER BY name DESC", db); QSqlQuery selectQuery("SELECT * from reading_list WHERE parentId IS NULL ORDER BY name DESC", db);
selectQuery.exec(); selectQuery.exec();
@ -310,9 +326,10 @@ QList<ReadingList> DBHelper::getReadingLists(qulonglong libraryId)
list.insert(i, item); list.insert(i, item);
} }
} }
connectionName = db.connectionName();
}
//TODO ? //TODO ?
//QSqlDatabase::removeDatabase(db.connectionName()); QSqlDatabase::removeDatabase(connectionName);
return list; return list;
} }
@ -320,11 +337,11 @@ QList<ReadingList> DBHelper::getReadingLists(qulonglong libraryId)
QList<ComicDB> DBHelper::getReadingListFullContent(qulonglong libraryId, qulonglong readingListId) QList<ComicDB> DBHelper::getReadingListFullContent(qulonglong libraryId, qulonglong readingListId)
{ {
QString libraryPath = DBHelper::getLibraries().getPath(libraryId); QString libraryPath = DBHelper::getLibraries().getPath(libraryId);
QSqlDatabase db = DataBaseManagement::loadDatabase(libraryPath + "/.yacreaderlibrary");
QList<ComicDB> list; QList<ComicDB> list;
QString connectionName = "";
{ {
QSqlDatabase db = DataBaseManagement::loadDatabase(libraryPath + "/.yacreaderlibrary");
QList<qulonglong> ids; QList<qulonglong> ids;
ids << readingListId; ids << readingListId;
@ -364,10 +381,11 @@ QList<ComicDB> DBHelper::getReadingListFullContent(qulonglong libraryId, qulongl
list.append(comic); list.append(comic);
} }
} }
connectionName = db.connectionName();
} }
//TODO ? //TODO ?
//QSqlDatabase::removeDatabase(db.connectionName()); QSqlDatabase::removeDatabase(connectionName);
return list; return list;
} }
@ -476,12 +494,13 @@ void DBHelper::update(ComicDB *comic, QSqlDatabase &db)
void DBHelper::update(qulonglong libraryId, ComicInfo &comicInfo) void DBHelper::update(qulonglong libraryId, ComicInfo &comicInfo)
{ {
QString libraryPath = DBHelper::getLibraries().getPath(libraryId); QString libraryPath = DBHelper::getLibraries().getPath(libraryId);
QString connectionName = "";
{
QSqlDatabase db = DataBaseManagement::loadDatabase(libraryPath + "/.yacreaderlibrary"); QSqlDatabase db = DataBaseManagement::loadDatabase(libraryPath + "/.yacreaderlibrary");
DBHelper::update(&comicInfo, db); DBHelper::update(&comicInfo, db);
connectionName = db.connectionName();
db.close(); }
QSqlDatabase::removeDatabase(db.connectionName()); QSqlDatabase::removeDatabase(connectionName);
} }
void DBHelper::update(ComicInfo *comicInfo, QSqlDatabase &db) void DBHelper::update(ComicInfo *comicInfo, QSqlDatabase &db)
@ -680,6 +699,8 @@ void DBHelper::updateChildrenInfo(QSqlDatabase &db)
void DBHelper::updateProgress(qulonglong libraryId, const ComicInfo &comicInfo) void DBHelper::updateProgress(qulonglong libraryId, const ComicInfo &comicInfo)
{ {
QString libraryPath = DBHelper::getLibraries().getPath(libraryId); QString libraryPath = DBHelper::getLibraries().getPath(libraryId);
QString connectionName = "";
{
QSqlDatabase db = DataBaseManagement::loadDatabase(libraryPath + "/.yacreaderlibrary"); QSqlDatabase db = DataBaseManagement::loadDatabase(libraryPath + "/.yacreaderlibrary");
ComicDB comic = DBHelper::loadComic(comicInfo.id, db); ComicDB comic = DBHelper::loadComic(comicInfo.id, db);
@ -689,13 +710,17 @@ void DBHelper::updateProgress(qulonglong libraryId, const ComicInfo &comicInfo)
DBHelper::updateReadingRemoteProgress(comic.info, db); DBHelper::updateReadingRemoteProgress(comic.info, db);
db.close(); connectionName = db.connectionName();
QSqlDatabase::removeDatabase(db.connectionName()); }
QSqlDatabase::removeDatabase(connectionName);
} }
void DBHelper::setComicAsReading(qulonglong libraryId, const ComicInfo &comicInfo) void DBHelper::setComicAsReading(qulonglong libraryId, const ComicInfo &comicInfo)
{ {
QString libraryPath = DBHelper::getLibraries().getPath(libraryId); QString libraryPath = DBHelper::getLibraries().getPath(libraryId);
QString connectionName = "";
{
QSqlDatabase db = DataBaseManagement::loadDatabase(libraryPath + "/.yacreaderlibrary"); QSqlDatabase db = DataBaseManagement::loadDatabase(libraryPath + "/.yacreaderlibrary");
ComicDB comic = DBHelper::loadComic(comicInfo.id, db); ComicDB comic = DBHelper::loadComic(comicInfo.id, db);
@ -703,9 +728,9 @@ void DBHelper::setComicAsReading(qulonglong libraryId, const ComicInfo &comicInf
comic.info.read = comic.info.read || comic.info.currentPage == comic.info.numPages; comic.info.read = comic.info.read || comic.info.currentPage == comic.info.numPages;
DBHelper::updateReadingRemoteProgress(comic.info, db); DBHelper::updateReadingRemoteProgress(comic.info, db);
connectionName = db.connectionName();
db.close(); }
QSqlDatabase::removeDatabase(db.connectionName()); QSqlDatabase::removeDatabase(connectionName);
} }
void DBHelper::updateReadingRemoteProgress(const ComicInfo &comicInfo, QSqlDatabase &db) void DBHelper::updateReadingRemoteProgress(const ComicInfo &comicInfo, QSqlDatabase &db)
@ -733,6 +758,8 @@ void DBHelper::updateReadingRemoteProgress(const ComicInfo &comicInfo, QSqlDatab
void DBHelper::updateFromRemoteClient(qulonglong libraryId, const ComicInfo &comicInfo) void DBHelper::updateFromRemoteClient(qulonglong libraryId, const ComicInfo &comicInfo)
{ {
QString libraryPath = DBHelper::getLibraries().getPath(libraryId); QString libraryPath = DBHelper::getLibraries().getPath(libraryId);
QString connectionName = "";
{
QSqlDatabase db = DataBaseManagement::loadDatabase(libraryPath + "/.yacreaderlibrary"); QSqlDatabase db = DataBaseManagement::loadDatabase(libraryPath + "/.yacreaderlibrary");
ComicDB comic = DBHelper::loadComic(comicInfo.id, db); ComicDB comic = DBHelper::loadComic(comicInfo.id, db);
@ -755,9 +782,9 @@ void DBHelper::updateFromRemoteClient(qulonglong libraryId, const ComicInfo &com
DBHelper::updateReadingRemoteProgress(comic.info, db); DBHelper::updateReadingRemoteProgress(comic.info, db);
} }
connectionName = db.connectionName();
db.close(); }
QSqlDatabase::removeDatabase(db.connectionName()); QSqlDatabase::removeDatabase(connectionName);
} }
void DBHelper::updateFromRemoteClientWithHash(const ComicInfo &comicInfo) void DBHelper::updateFromRemoteClientWithHash(const ComicInfo &comicInfo)
@ -765,12 +792,13 @@ void DBHelper::updateFromRemoteClientWithHash(const ComicInfo &comicInfo)
YACReaderLibraries libraries = DBHelper::getLibraries(); YACReaderLibraries libraries = DBHelper::getLibraries();
QStringList names = libraries.getNames(); QStringList names = libraries.getNames();
QString connectionName = "";
foreach (QString name, names) { foreach (QString name, names) {
QString libraryPath = DBHelper::getLibraries().getPath(libraries.getId(name)); QString libraryPath = DBHelper::getLibraries().getPath(libraries.getId(name));
{
QSqlDatabase db = DataBaseManagement::loadDatabase(libraryPath + "/.yacreaderlibrary"); QSqlDatabase db = DataBaseManagement::loadDatabase(libraryPath + "/.yacreaderlibrary");
ComicInfo info = loadComicInfo(comicInfo.hash, db); ComicInfo info = loadComicInfo(comicInfo.hash, db);
if (!info.existOnDb) { if (!info.existOnDb) {
@ -793,9 +821,9 @@ void DBHelper::updateFromRemoteClientWithHash(const ComicInfo &comicInfo)
info.rating = comicInfo.rating; info.rating = comicInfo.rating;
DBHelper::update(&info, db); DBHelper::update(&info, db);
connectionName = db.connectionName();
db.close(); }
QSqlDatabase::removeDatabase(db.connectionName()); QSqlDatabase::removeDatabase(connectionName);
} }
} }
@ -803,6 +831,8 @@ void DBHelper::updateFromRemoteClient(const QMap<qulonglong, QList<ComicInfo>> &
{ {
foreach (qulonglong libraryId, comics.keys()) { foreach (qulonglong libraryId, comics.keys()) {
QString libraryPath = DBHelper::getLibraries().getPath(libraryId); QString libraryPath = DBHelper::getLibraries().getPath(libraryId);
QString connectionName = "";
{
QSqlDatabase db = DataBaseManagement::loadDatabase(libraryPath + "/.yacreaderlibrary"); QSqlDatabase db = DataBaseManagement::loadDatabase(libraryPath + "/.yacreaderlibrary");
db.transaction(); db.transaction();
@ -846,9 +876,10 @@ void DBHelper::updateFromRemoteClient(const QMap<qulonglong, QList<ComicInfo>> &
} }
db.commit(); db.commit();
connectionName = db.connectionName();
}
db.close(); QSqlDatabase::removeDatabase(connectionName);
QSqlDatabase::removeDatabase(db.connectionName());
} }
} }
@ -860,7 +891,8 @@ void DBHelper::updateFromRemoteClientWithHash(const QList<ComicInfo> &comics)
foreach (QString name, names) { foreach (QString name, names) {
QString libraryPath = DBHelper::getLibraries().getPath(libraries.getId(name)); QString libraryPath = DBHelper::getLibraries().getPath(libraries.getId(name));
QString connectionName = "";
{
QSqlDatabase db = DataBaseManagement::loadDatabase(libraryPath + "/.yacreaderlibrary"); QSqlDatabase db = DataBaseManagement::loadDatabase(libraryPath + "/.yacreaderlibrary");
db.transaction(); db.transaction();
@ -907,9 +939,9 @@ void DBHelper::updateFromRemoteClientWithHash(const QList<ComicInfo> &comics)
} }
db.commit(); db.commit();
connectionName = db.connectionName();
db.close(); }
QSqlDatabase::removeDatabase(db.connectionName()); QSqlDatabase::removeDatabase(connectionName);
} }
} }
@ -1405,11 +1437,12 @@ QList<LibraryItem *> DBHelper::getComicsFromParent(qulonglong parentId, QSqlData
QList<Label> DBHelper::getLabels(qulonglong libraryId) QList<Label> DBHelper::getLabels(qulonglong libraryId)
{ {
QString libraryPath = DBHelper::getLibraries().getPath(libraryId); QString libraryPath = DBHelper::getLibraries().getPath(libraryId);
QString connectionName = "";
QList<Label> labels;
{
QSqlDatabase db = DataBaseManagement::loadDatabase(libraryPath + "/.yacreaderlibrary"); QSqlDatabase db = DataBaseManagement::loadDatabase(libraryPath + "/.yacreaderlibrary");
QSqlQuery selectQuery("SELECT * FROM label ORDER BY ordering,name", db); //TODO add some kind of QSqlQuery selectQuery("SELECT * FROM label ORDER BY ordering,name", db); //TODO add some kind of
QList<Label> labels;
QSqlRecord record = selectQuery.record(); QSqlRecord record = selectQuery.record();
int name = record.indexOf("name"); int name = record.indexOf("name");
@ -1443,9 +1476,9 @@ QList<Label> DBHelper::getLabels(qulonglong libraryId)
} }
} }
} }
connectionName = db.connectionName();
db.close(); }
QSqlDatabase::removeDatabase(db.connectionName()); QSqlDatabase::removeDatabase(connectionName);
return labels; return labels;
} }

View File

@ -64,7 +64,8 @@ void LibraryCreator::updateFolder(const QString &source, const QString &target,
} }
QLOG_DEBUG() << "folders found in relative path : " << folders << "-" << relativeFolderPath; QLOG_DEBUG() << "folders found in relative path : " << folders << "-" << relativeFolderPath;
QString connectionName = "";
{
QSqlDatabase db = DataBaseManagement::loadDatabase(target); QSqlDatabase db = DataBaseManagement::loadDatabase(target);
foreach (QString folderName, folders) { foreach (QString folderName, folders) {
@ -75,8 +76,9 @@ void LibraryCreator::updateFolder(const QString &source, const QString &target,
_currentPathFolders.append(DBHelper::loadFolder(folderName, parentId, db)); _currentPathFolders.append(DBHelper::loadFolder(folderName, parentId, db));
QLOG_DEBUG() << "Folder appended : " << _currentPathFolders.last().id << " " << _currentPathFolders.last().name << " with parent" << _currentPathFolders.last().parentId; QLOG_DEBUG() << "Folder appended : " << _currentPathFolders.last().id << " " << _currentPathFolders.last().name << " with parent" << _currentPathFolders.last().parentId;
} }
connectionName = db.connectionName();
QSqlDatabase::removeDatabase(_database.connectionName()); }
QSqlDatabase::removeDatabase(connectionName);
QLOG_DEBUG() << "Relative path : " << relativeFolderPath; QLOG_DEBUG() << "Relative path : " << relativeFolderPath;
@ -127,7 +129,9 @@ void LibraryCreator::run()
dir.mkpath(_target + "/covers"); dir.mkpath(_target + "/covers");
//se crea la base de datos .yacreaderlibrary/library.ydb //se crea la base de datos .yacreaderlibrary/library.ydb
_database = DataBaseManagement::createDatabase("library", _target); // {
auto _database = DataBaseManagement::createDatabase("library", _target); //
_databaseConnection = _database.connectionName();
if (!_database.isOpen()) { if (!_database.isOpen()) {
QLOG_ERROR() << "Unable to create data base" << _database.lastError().databaseText() + "-" + _database.lastError().driverText(); QLOG_ERROR() << "Unable to create data base" << _database.lastError().databaseText() + "-" + _database.lastError().driverText();
emit failedCreatingDB(_database.lastError().databaseText() + "-" + _database.lastError().driverText()); emit failedCreatingDB(_database.lastError().databaseText() + "-" + _database.lastError().driverText());
@ -145,7 +149,8 @@ void LibraryCreator::run()
_database.commit(); _database.commit();
_database.close(); _database.close();
QSqlDatabase::removeDatabase(_database.connectionName()); }
QSqlDatabase::removeDatabase(_databaseConnection);
emit(created()); emit(created());
QLOG_INFO() << "Create library END"; QLOG_INFO() << "Create library END";
} else { } else {
@ -155,8 +160,10 @@ void LibraryCreator::run()
_currentPathFolders.append(Folder(1, 1, "root", "/")); _currentPathFolders.append(Folder(1, 1, "root", "/"));
QLOG_DEBUG() << "update whole library"; QLOG_DEBUG() << "update whole library";
} }
{
auto _database = DataBaseManagement::loadDatabase(_target);
_databaseConnection = _database.connectionName();
_database = DataBaseManagement::loadDatabase(_target);
//_database.setDatabaseName(_target+"/library.ydb"); //_database.setDatabaseName(_target+"/library.ydb");
if (!_database.open()) { if (!_database.open()) {
QLOG_ERROR() << "Unable to open data base" << _database.lastError().databaseText() + "-" + _database.lastError().driverText(); QLOG_ERROR() << "Unable to open data base" << _database.lastError().databaseText() + "-" + _database.lastError().driverText();
@ -181,7 +188,10 @@ void LibraryCreator::run()
_database.commit(); _database.commit();
_database.close(); _database.close();
QSqlDatabase::removeDatabase(_database.databaseName()); }
QSqlDatabase::removeDatabase(_databaseConnection);
//si estabamos en modo creación, se está añadiendo una librería que ya existía y se ha actualizado antes de añadirse. //si estabamos en modo creación, se está añadiendo una librería que ya existía y se ha actualizado antes de añadirse.
if (!partialUpdate) { if (!partialUpdate) {
if (!creation) { if (!creation) {
@ -203,13 +213,14 @@ void LibraryCreator::run()
void LibraryCreator::stop() void LibraryCreator::stop()
{ {
_database.commit(); QSqlDatabase::database(_databaseConnection).commit();
stopRunning = true; stopRunning = true;
} }
//retorna el id del ultimo de los folders //retorna el id del ultimo de los folders
qulonglong LibraryCreator::insertFolders() qulonglong LibraryCreator::insertFolders()
{ {
auto _database = QSqlDatabase::database(_databaseConnection);
QList<Folder>::iterator i; QList<Folder>::iterator i;
int currentId = 0; int currentId = 0;
for (i = _currentPathFolders.begin(); i != _currentPathFolders.end(); ++i) { for (i = _currentPathFolders.begin(); i != _currentPathFolders.end(); ++i) {
@ -266,6 +277,7 @@ bool LibraryCreator::checkCover(const QString &hash)
void LibraryCreator::insertComic(const QString &relativePath, const QFileInfo &fileInfo) void LibraryCreator::insertComic(const QString &relativePath, const QFileInfo &fileInfo)
{ {
auto _database = QSqlDatabase::database(_databaseConnection);
//Se calcula el hash del cómic //Se calcula el hash del cómic
QCryptographicHash crypto(QCryptographicHash::Sha1); QCryptographicHash crypto(QCryptographicHash::Sha1);
@ -305,6 +317,7 @@ void LibraryCreator::insertComic(const QString &relativePath, const QFileInfo &f
void LibraryCreator::update(QDir dirS) void LibraryCreator::update(QDir dirS)
{ {
auto _database = QSqlDatabase::database(_databaseConnection);
//QLOG_TRACE() << "Updating" << dirS.absolutePath(); //QLOG_TRACE() << "Updating" << dirS.absolutePath();
//QLOG_TRACE() << "Getting info from dir" << dirS.absolutePath(); //QLOG_TRACE() << "Getting info from dir" << dirS.absolutePath();
dirS.setNameFilters(_nameFilter); dirS.setNameFilters(_nameFilter);

View File

@ -38,7 +38,7 @@ private:
QString _target; QString _target;
QString _sourceFolder; //used for partial updates QString _sourceFolder; //used for partial updates
QStringList _nameFilter; QStringList _nameFilter;
QSqlDatabase _database; QString _databaseConnection;
QList<Folder> _currentPathFolders; //lista de folders en el orden en el que están siendo explorados, el último es el folder actual QList<Folder> _currentPathFolders; //lista de folders en el orden en el que están siendo explorados, el último es el folder actual
//recursive method //recursive method
void create(QDir currentDirectory); void create(QDir currentDirectory);

View File

@ -551,6 +551,8 @@ void PropertiesDialog::setComics(QList<ComicDB> comics)
} }
void PropertiesDialog::updateComics() void PropertiesDialog::updateComics()
{
QString connectionName = "";
{ {
QSqlDatabase db = DataBaseManagement::loadDatabase(databasePath); QSqlDatabase db = DataBaseManagement::loadDatabase(databasePath);
db.open(); db.open();
@ -561,8 +563,9 @@ void PropertiesDialog::updateComics()
DBHelper::update(&(itr->info), db); DBHelper::update(&(itr->info), db);
} }
db.commit(); db.commit();
db.close(); connectionName = db.connectionName();
QSqlDatabase::removeDatabase(databasePath); }
QSqlDatabase::removeDatabase(connectionName);
} }
void PropertiesDialog::setMultipleCover() void PropertiesDialog::setMultipleCover()