mirror of
https://github.com/YACReader/yacreader
synced 2025-05-28 03:10:27 -04:00
Conexi?n y desconexi?n de la base de datos en cada operaci?n
esto evita el bloqueo del archivo de BD Si se detecta una biblioteca que no tiene contenido se ofrece al usuario la posibilidad de eliminarla (di?logo)
This commit is contained in:
parent
0b1b3df8b2
commit
6cff6162d2
@ -60,7 +60,7 @@ QSqlDatabase DataBaseManagement::createDatabase(QString name, QString path)
|
||||
|
||||
QSqlDatabase DataBaseManagement::createDatabase(QString dest)
|
||||
{
|
||||
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
|
||||
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE",dest);
|
||||
db.setDatabaseName(dest);
|
||||
if (!db.open())
|
||||
qDebug() << db.lastError();
|
||||
@ -242,77 +242,9 @@ bool DataBaseManagement::importComicsInfo(QString source, QString dest)
|
||||
QSqlDatabase sourceDB = loadDatabaseFromFile(source);
|
||||
QSqlDatabase destDB = loadDatabaseFromFile(dest);
|
||||
|
||||
{
|
||||
QSqlQuery pragma("PRAGMA synchronous=OFF",destDB);
|
||||
|
||||
|
||||
//QSqlQuery attach(destDB);
|
||||
//attach.prepare("ATTACH DATABASE '"+QDir().toNativeSeparators(dest) +"' AS dest;");
|
||||
//attach.exec();
|
||||
|
||||
//error = attach.lastError().databaseText();
|
||||
//driver = attach.lastError().driverText();
|
||||
|
||||
//QMessageBox::critical(NULL,tr("db error"),error);
|
||||
//QMessageBox::critical(NULL,tr("db error"),driver);
|
||||
|
||||
//QSqlQuery attach2(destDB);
|
||||
//attach2.prepare("ATTACH DATABASE '"+QDir().toNativeSeparators(source) +"' AS source;");
|
||||
//attach2.exec();
|
||||
//
|
||||
//error = attach2.lastError().databaseText();
|
||||
//driver = attach2.lastError().driverText();
|
||||
|
||||
//QMessageBox::critical(NULL,tr("db error"),error);
|
||||
//QMessageBox::critical(NULL,tr("db error"),driver);
|
||||
//TODO check versions...
|
||||
//QSqlQuery update(destDB);
|
||||
//update.prepare("UPDATE dest.comic_info"
|
||||
// "SET"
|
||||
//"title = coalesce(title , (select source.comic_info.title from source.comic_info where dest.comic_info.hash = source.comic_info.hash)),"
|
||||
//"coverPage = coalesce(coverPage , (select source.comic_info.coverPage from source.comic_info where dest.comic_info.hash = source.comic_info.hash)),"
|
||||
//"numPages = coalesce(numPages , (select source.comic_info.numPages from source.comic_info where dest.comic_info.hash = source.comic_info.hash)),"
|
||||
//"number = coalesce(number , (select source.comic_info.number from source.comic_info where dest.comic_info.hash = source.comic_info.hash)),"
|
||||
//"isBis = coalesce(isBis , (select source.comic_info.isBis from source.comic_info where dest.comic_info.hash = source.comic_info.hash)),"
|
||||
//"count = coalesce(count , (select source.comic_info.count from source.comic_info where dest.comic_info.hash = source.comic_info.hash)),"
|
||||
//"volume = coalesce(volume , (select source.comic_info.volume from source.comic_info where dest.comic_info.hash = source.comic_info.hash)),"
|
||||
//"storyArc = coalesce(storyArc , (select source.comic_info.storyArc from source.comic_info where dest.comic_info.hash = source.comic_info.hash)),"
|
||||
//"arcNumber = coalesce(arcNumber , (select source.comic_info.arcNumber from source.comic_info where dest.comic_info.hash = source.comic_info.hash)),"
|
||||
//"arcCount = coalesce(arcCount , (select source.comic_info.arcCount from source.comic_info where dest.comic_info.hash = source.comic_info.hash)),"
|
||||
//"genere = coalesce(genere , (select source.comic_info.genere from source.comic_info where dest.comic_info.hash = source.comic_info.hash)),"
|
||||
//"writer = coalesce(writer , (select source.comic_info.writer from source.comic_info where dest.comic_info.hash = source.comic_info.hash)),"
|
||||
//"penciller = coalesce(penciller , (select source.comic_info.penciller from source.comic_info where dest.comic_info.hash = source.comic_info.hash)),"
|
||||
//"inker = coalesce(inker , (select source.comic_info.inker from source.comic_info where dest.comic_info.hash = source.comic_info.hash)),"
|
||||
//"colorist = coalesce(colorist , (select source.comic_info.colorist from source.comic_info where dest.comic_info.hash = source.comic_info.hash)),"
|
||||
//"letterer = coalesce(letterer , (select source.comic_info.letterer from source.comic_info where dest.comic_info.hash = source.comic_info.hash)),"
|
||||
//"coverArtist = coalesce(coverArtist , (select source.comic_info.coverArtist from source.comic_info where dest.comic_info.hash = source.comic_info.hash)),"
|
||||
//"date = coalesce(date , (select source.comic_info.date from source.comic_info where dest.comic_info.hash = source.comic_info.hash)),"
|
||||
//"publisher = coalesce(publisher , (select source.comic_info.publisher from source.comic_info where dest.comic_info.hash = source.comic_info.hash)),"
|
||||
//"format = coalesce(format , (select source.comic_info.format from source.comic_info where dest.comic_info.hash = source.comic_info.hash)),"
|
||||
//"color = coalesce(color , (select source.comic_info.color from source.comic_info where dest.comic_info.hash = source.comic_info.hash)),"
|
||||
//"ageRating = coalesce(ageRating , (select source.comic_info.ageRating from source.comic_info where dest.comic_info.hash = source.comic_info.hash)),"
|
||||
//"synopsis = coalesce(synopsis , (select source.comic_info.synopsis from source.comic_info where dest.comic_info.hash = source.comic_info.hash)),"
|
||||
//"characters = coalesce(characters , (select source.comic_info.characters from source.comic_info where dest.comic_info.hash = source.comic_info.hash)),"
|
||||
//"notes = coalesce(notes , (select source.comic_info.notes from source.comic_info where dest.comic_info.hash = source.comic_info.hash)),"
|
||||
//"edited = 1"
|
||||
// );
|
||||
//b = b || update.exec();
|
||||
|
||||
//error = update.lastError().databaseText();
|
||||
//driver = update.lastError().driverText();
|
||||
|
||||
//QMessageBox::critical(NULL,tr("db error"),error);
|
||||
//QMessageBox::critical(NULL,tr("db error"),driver);
|
||||
|
||||
//QSqlQuery import(destDB);
|
||||
//import.prepare("insert or ignore into dest.comic_info (" +fields + ",edited,read) select " + fields + ",1 as edited, 0 as read from source.comic_info;");
|
||||
////import.prepare("insert into dest.comic_info (" +fields + ",edited,read) select " + fields + ",1 as edited, 0 as read from source.comic_info where sourc.comic_info.hash not in (select dest.comic_info.hash from dest.comic_info);");
|
||||
//b = b || import.exec();
|
||||
//error = import.lastError().databaseText();
|
||||
//driver = import.lastError().driverText();
|
||||
|
||||
//QMessageBox::critical(NULL,tr("db error"),error);
|
||||
//QMessageBox::critical(NULL,tr("db error"),driver);
|
||||
|
||||
QSqlQuery update(destDB);
|
||||
update.prepare("UPDATE comic_info SET "
|
||||
"title = :title,"
|
||||
@ -484,9 +416,14 @@ bool DataBaseManagement::importComicsInfo(QString source, QString dest)
|
||||
insert.finish();
|
||||
}
|
||||
}
|
||||
|
||||
destDB.commit();
|
||||
}
|
||||
|
||||
destDB.commit();
|
||||
destDB.close();
|
||||
sourceDB.close();
|
||||
|
||||
QSqlDatabase::removeDatabase(source);
|
||||
QSqlDatabase::removeDatabase(dest);
|
||||
return b;
|
||||
|
||||
}
|
||||
|
@ -140,7 +140,7 @@ QStringList TableModel::getPaths(const QString & _source)
|
||||
return paths;
|
||||
}
|
||||
|
||||
void TableModel::setupModelData(unsigned long long int folderId,QSqlDatabase & db)
|
||||
void TableModel::setupModelData(unsigned long long int folderId,const QString & databasePath)
|
||||
{
|
||||
//QFile f(QCoreApplication::applicationDirPath()+"/performance.txt");
|
||||
//f.open(QIODevice::Append);
|
||||
@ -152,7 +152,9 @@ void TableModel::setupModelData(unsigned long long int folderId,QSqlDatabase & d
|
||||
|
||||
//QTextStream txtS(&f);
|
||||
//txtS << "TABLEMODEL: Tiempo de borrado: " << timer.elapsed() << "ms\r\n";
|
||||
db.open();
|
||||
_databasePath = databasePath;
|
||||
QSqlDatabase db = DataBaseManagement::loadDatabase(databasePath);
|
||||
{
|
||||
//crear la consulta
|
||||
//timer.restart();
|
||||
QSqlQuery selectQuery(db); //TODO check
|
||||
@ -164,8 +166,9 @@ void TableModel::setupModelData(unsigned long long int folderId,QSqlDatabase & d
|
||||
setupModelData(selectQuery);
|
||||
//txtS << "TABLEMODEL: Tiempo de creación del modelo: " << timer.elapsed() << "ms\r\n";
|
||||
//selectQuery.finish();
|
||||
}
|
||||
db.close();
|
||||
_database = db;
|
||||
QSqlDatabase::removeDatabase(_databasePath);
|
||||
endResetModel();
|
||||
//f.close();
|
||||
}
|
||||
@ -215,9 +218,12 @@ void TableModel::setupModelData(QSqlQuery &sqlquery)
|
||||
Comic TableModel::getComic(const QModelIndex & mi)
|
||||
{
|
||||
Comic c;
|
||||
_database.open();
|
||||
c.load(_data.at(mi.row())->data(0).toLongLong(),_database);
|
||||
_database.close();
|
||||
|
||||
QSqlDatabase db = DataBaseManagement::loadDatabase(_databasePath);
|
||||
c.load(_data.at(mi.row())->data(0).toLongLong(),db);
|
||||
db.close();
|
||||
QSqlDatabase::removeDatabase(_databasePath);
|
||||
|
||||
return c;
|
||||
}
|
||||
|
||||
@ -225,7 +231,10 @@ Comic TableModel::_getComic(const QModelIndex & mi)
|
||||
{
|
||||
Comic c;
|
||||
|
||||
c.load(_data.at(mi.row())->data(0).toLongLong(),_database);
|
||||
QSqlDatabase db = DataBaseManagement::loadDatabase(_databasePath);
|
||||
c.load(_data.at(mi.row())->data(0).toLongLong(),db);
|
||||
db.close();
|
||||
QSqlDatabase::removeDatabase(_databasePath);
|
||||
|
||||
return c;
|
||||
}
|
||||
@ -245,8 +254,8 @@ QVector<bool> TableModel::getReadList()
|
||||
|
||||
QVector<bool> TableModel::setAllComicsRead(bool read)
|
||||
{
|
||||
_database.open();
|
||||
_database.transaction();
|
||||
QSqlDatabase db = DataBaseManagement::loadDatabase(_databasePath);
|
||||
db.transaction();
|
||||
int numComics = _data.count();
|
||||
QVector<bool> readList(numComics);
|
||||
for(int i=0;i<numComics;i++)
|
||||
@ -255,12 +264,13 @@ QVector<bool> TableModel::setAllComicsRead(bool read)
|
||||
readList[i] = read;
|
||||
_data.value(i)->data(5) = QVariant(true);
|
||||
Comic c;
|
||||
c.load(_data.value(i)->data(0).toLongLong(),_database);
|
||||
c.load(_data.value(i)->data(0).toLongLong(),db);
|
||||
c.info.read = read;
|
||||
c.info.update(_database);
|
||||
c.info.update(db);
|
||||
}
|
||||
_database.commit();
|
||||
_database.close();
|
||||
db.commit();
|
||||
db.close();
|
||||
QSqlDatabase::removeDatabase(_databasePath);
|
||||
|
||||
return readList;
|
||||
}
|
||||
@ -269,14 +279,15 @@ QList<Comic> TableModel::getComics(QList<QModelIndex> list)
|
||||
{
|
||||
QList<Comic> comics;
|
||||
|
||||
_database.open();
|
||||
_database.transaction();
|
||||
QSqlDatabase db = DataBaseManagement::loadDatabase(_databasePath);
|
||||
db.transaction();
|
||||
QList<QModelIndex>::const_iterator itr;
|
||||
for(itr = list.constBegin(); itr!= list.constEnd();itr++)
|
||||
{
|
||||
comics.append(_getComic(*itr));
|
||||
}
|
||||
_database.commit();
|
||||
_database.close();
|
||||
db.commit();
|
||||
db.close();
|
||||
QSqlDatabase::removeDatabase(_databasePath);
|
||||
return comics;
|
||||
}
|
@ -30,7 +30,7 @@ public:
|
||||
QModelIndex parent(const QModelIndex &index) const;
|
||||
int rowCount(const QModelIndex &parent = QModelIndex()) const;
|
||||
int columnCount(const QModelIndex &parent = QModelIndex()) const;
|
||||
void setupModelData(unsigned long long int parentFolder,QSqlDatabase & db);
|
||||
void setupModelData(unsigned long long int parentFolder,const QString & databasePath);
|
||||
|
||||
//Métodos de conveniencia
|
||||
QStringList getPaths(const QString & _source);
|
||||
@ -47,7 +47,7 @@ private:
|
||||
Comic _getComic(const QModelIndex & mi);
|
||||
QList<TableItem *> _data;
|
||||
|
||||
QSqlDatabase _database;
|
||||
QString _databasePath;
|
||||
|
||||
signals:
|
||||
void beforeReset();
|
||||
|
@ -213,17 +213,16 @@ void TreeModel::setupModelData(QString path)
|
||||
rootItem->parentItem = 0;
|
||||
|
||||
//cargar la base de datos
|
||||
if(_database.isOpen())
|
||||
_database.close();
|
||||
_database = DataBaseManagement::loadDatabase(path);
|
||||
_databasePath = path;
|
||||
QSqlDatabase db = DataBaseManagement::loadDatabase(path);
|
||||
//crear la consulta
|
||||
{
|
||||
QSqlQuery selectQuery("select * from folder where id <> 1 order by parentId,name",_database);
|
||||
QSqlQuery selectQuery("select * from folder where id <> 1 order by parentId,name",db);
|
||||
|
||||
setupModelData(selectQuery,rootItem);
|
||||
}
|
||||
//selectQuery.finish();
|
||||
_database.close();
|
||||
db.close();
|
||||
QSqlDatabase::removeDatabase(path);
|
||||
endResetModel();
|
||||
|
||||
@ -274,10 +273,10 @@ void TreeModel::setupFilteredModelData()
|
||||
rootItem->parentItem = 0;
|
||||
|
||||
//cargar la base de datos
|
||||
if(_database.isValid())
|
||||
_database.open();
|
||||
QSqlDatabase db = DataBaseManagement::loadDatabase(_databasePath);
|
||||
//crear la consulta
|
||||
QSqlQuery selectQuery(_database); //TODO check
|
||||
{
|
||||
QSqlQuery selectQuery(db); //TODO check
|
||||
if(!includeComics)
|
||||
{
|
||||
selectQuery.prepare("select * from folder where id <> 1 and upper(name) like upper(:filter) order by parentId,name ");
|
||||
@ -292,9 +291,10 @@ void TreeModel::setupFilteredModelData()
|
||||
selectQuery.exec();
|
||||
|
||||
setupFilteredModelData(selectQuery,rootItem);
|
||||
|
||||
}
|
||||
//selectQuery.finish();
|
||||
_database.close();
|
||||
db.close();
|
||||
QSqlDatabase::removeDatabase(_databasePath);
|
||||
|
||||
endResetModel();
|
||||
}
|
||||
@ -374,9 +374,9 @@ void TreeModel::setupFilteredModelData(QSqlQuery &sqlquery, TreeItem *parent)
|
||||
|
||||
|
||||
|
||||
QSqlDatabase & TreeModel::getDatabase()
|
||||
QString TreeModel::getDatabase()
|
||||
{
|
||||
return _database;
|
||||
return _databasePath;
|
||||
}
|
||||
|
||||
QString TreeModel::getFolderPath(const QModelIndex &folder)
|
||||
|
@ -73,7 +73,7 @@ public:
|
||||
int rowCount(const QModelIndex &parent = QModelIndex()) const;
|
||||
int columnCount(const QModelIndex &parent = QModelIndex()) const;
|
||||
void setupModelData(QString path);
|
||||
QSqlDatabase & getDatabase();
|
||||
QString getDatabase();
|
||||
|
||||
//Métodos de conveniencia
|
||||
QString getFolderPath(const QModelIndex &folder);
|
||||
@ -92,7 +92,7 @@ private:
|
||||
TreeItem *rootBeforeFilter;
|
||||
QMap<unsigned long long int, TreeItem *> filteredItems; //relación entre folders
|
||||
|
||||
QSqlDatabase _database;
|
||||
QString _databasePath;
|
||||
|
||||
bool includeComics;
|
||||
QString filter;
|
||||
|
@ -67,6 +67,7 @@ void LibraryCreator::run()
|
||||
create(QDir(_source));
|
||||
_database.commit();
|
||||
_database.close();
|
||||
QSqlDatabase::removeDatabase(_database.connectionName());
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -81,6 +82,7 @@ void LibraryCreator::run()
|
||||
update(QDir(_source));
|
||||
_database.commit();
|
||||
_database.close();
|
||||
QSqlDatabase::removeDatabase(_target);
|
||||
}
|
||||
emit(finished());
|
||||
}
|
||||
|
@ -17,6 +17,8 @@
|
||||
|
||||
#include <iterator>
|
||||
|
||||
#include "data_base_management.h"
|
||||
|
||||
//
|
||||
|
||||
LibraryWindow::LibraryWindow()
|
||||
@ -586,7 +588,6 @@ void LibraryWindow::loadLibrary(const QString & name)
|
||||
{
|
||||
if(libraries.size()>0)
|
||||
{
|
||||
dm->getDatabase().close();
|
||||
QString path=libraries.value(name)+"/.yacreaderlibrary";
|
||||
QDir d; //TODO change this by static methods (utils class?? with delTree for example)
|
||||
if(d.exists(path))
|
||||
@ -625,6 +626,12 @@ void LibraryWindow::loadLibrary(const QString & name)
|
||||
foldersView->setModel(NULL);
|
||||
comicFlow->clear();
|
||||
disableAllActions();//TODO comprobar que se deben deshabilitar
|
||||
|
||||
QString currentLibrary = selectedLibrary->currentText();
|
||||
if(QMessageBox::question(this,tr("Library not available"),tr("Library ")+currentLibrary+tr(" is no longer available. Do you want to remove it?"),QMessageBox::Yes,QMessageBox::No)==QMessageBox::Yes)
|
||||
{
|
||||
deleteCurrentLibrary();
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
@ -750,10 +757,11 @@ void LibraryWindow::setCurrentComicReaded()
|
||||
|
||||
Comic c = dmCV->getComic(comicView->currentIndex());
|
||||
c.info.read = true;
|
||||
QSqlDatabase db = dm->getDatabase();
|
||||
QSqlDatabase db = DataBaseManagement::loadDatabase(dm->getDatabase());
|
||||
db.open();
|
||||
c.info.updateRead(db);
|
||||
db.close();
|
||||
QSqlDatabase::removeDatabase(dm->getDatabase());
|
||||
}
|
||||
|
||||
void LibraryWindow::setComicsReaded()
|
||||
@ -769,10 +777,11 @@ void LibraryWindow::setCurrentComicUnreaded()
|
||||
|
||||
Comic c = dmCV->getComic(comicView->currentIndex());
|
||||
c.info.read = false;
|
||||
QSqlDatabase db = dm->getDatabase();
|
||||
QSqlDatabase db = DataBaseManagement::loadDatabase(dm->getDatabase());
|
||||
db.open();
|
||||
c.info.updateRead(db);
|
||||
db.close();
|
||||
QSqlDatabase::removeDatabase(dm->getDatabase());
|
||||
|
||||
}
|
||||
|
||||
@ -881,12 +890,12 @@ void LibraryWindow::deleteLibrary()
|
||||
|
||||
void LibraryWindow::deleteCurrentLibrary()
|
||||
{
|
||||
QSqlDatabase db = dm->getDatabase();
|
||||
db.commit();
|
||||
db.close();
|
||||
QSqlDatabase::removeDatabase(db.connectionName());
|
||||
if(!dm->getDatabase().isOpen())
|
||||
{
|
||||
//QSqlDatabase db = dm->getDatabase();
|
||||
//db.commit();
|
||||
//db.close();
|
||||
//QSqlDatabase::removeDatabase(db.connectionName());
|
||||
//if(!dm->getDatabase().isOpen())
|
||||
//{
|
||||
QString path = libraries.value(selectedLibrary->currentText());
|
||||
libraries.remove(selectedLibrary->currentText());
|
||||
selectedLibrary->removeItem(selectedLibrary->currentIndex());
|
||||
@ -903,7 +912,7 @@ void LibraryWindow::deleteCurrentLibrary()
|
||||
comicFlow->clear();
|
||||
}
|
||||
saveLibraries();
|
||||
}
|
||||
//}
|
||||
}
|
||||
|
||||
void LibraryWindow::removeLibrary()
|
||||
@ -1046,7 +1055,7 @@ void LibraryWindow::showProperties()
|
||||
|
||||
//ThumbnailCreator tc(path,"");
|
||||
//tc.create();
|
||||
propertiesDialog->database = dm->getDatabase();
|
||||
propertiesDialog->databasePath = dm->getDatabase();
|
||||
propertiesDialog->basePath = currentPath();
|
||||
propertiesDialog->setComics(comics);
|
||||
|
||||
|
@ -7,6 +7,7 @@
|
||||
#include <QCheckBox>
|
||||
#include <QTabWidget>
|
||||
|
||||
#include "data_base_management.h"
|
||||
|
||||
PropertiesDialog::PropertiesDialog(QWidget * parent)
|
||||
:QDialog(parent)
|
||||
@ -393,16 +394,18 @@ void PropertiesDialog::setComics(QList<Comic> comics)
|
||||
|
||||
void PropertiesDialog::updateComics()
|
||||
{
|
||||
database.open();
|
||||
database.transaction();
|
||||
QSqlDatabase db = DataBaseManagement::loadDatabase(databasePath);
|
||||
db.open();
|
||||
db.transaction();
|
||||
QList<Comic>::iterator itr;
|
||||
for(itr = comics.begin();itr!=comics.end();itr++)
|
||||
{
|
||||
if(itr->info.edited)
|
||||
itr->info.update(database);
|
||||
itr->info.update(db);
|
||||
}
|
||||
database.commit();
|
||||
database.close();
|
||||
db.commit();
|
||||
db.close();
|
||||
QSqlDatabase::removeDatabase(databasePath);
|
||||
}
|
||||
//Deprecated
|
||||
void PropertiesDialog::setCover(const QPixmap & coverImage)
|
||||
|
@ -89,7 +89,7 @@
|
||||
void closeEvent ( QCloseEvent * e );
|
||||
public:
|
||||
PropertiesDialog(QWidget * parent = 0);
|
||||
QSqlDatabase database;
|
||||
QString databasePath;
|
||||
QString basePath;
|
||||
|
||||
public slots:
|
||||
|
Loading…
Reference in New Issue
Block a user