From 9853abf8ac82c8151146a844d89eb2e1c274e599 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20=C3=81ngel=20San=20Mart=C3=ADn?= Date: Mon, 27 May 2013 14:40:34 +0200 Subject: [PATCH] Eliminado el uso de framework sql de ComicDB y ComicInfo --- YACReaderLibrary/db/comic_db.cpp | 401 +++---------------------- YACReaderLibrary/db/comic_db.h | 25 +- YACReaderLibrary/db/folder.cpp | 5 - YACReaderLibrary/db/tablemodel.cpp | 24 +- YACReaderLibrary/db_helper.cpp | 338 ++++++++++++++++++++- YACReaderLibrary/db_helper.h | 21 +- YACReaderLibrary/library_creator.cpp | 6 +- YACReaderLibrary/properties_dialog.cpp | 3 +- 8 files changed, 404 insertions(+), 419 deletions(-) diff --git a/YACReaderLibrary/db/comic_db.cpp b/YACReaderLibrary/db/comic_db.cpp index 845a2c18..55aaa5b7 100644 --- a/YACReaderLibrary/db/comic_db.cpp +++ b/YACReaderLibrary/db/comic_db.cpp @@ -1,7 +1,5 @@ #include "comic_db.h" -#include -#include #include //----------------------------------------------------------------------------- @@ -12,130 +10,6 @@ ComicDB::ComicDB() } -ComicDB::ComicDB(qulonglong cparentId, QString cname, QString cpath, QString chash, QSqlDatabase & database) -{ - parentId = cparentId; - name = cname; - path = cpath; - - if(!info.load(chash,database)) - { - info.hash = chash; - info.coverPage = new int(1); - _hasCover = false; - } - else - _hasCover = true; -} - -QList ComicDB::getComicsFromParent(qulonglong parentId, QSqlDatabase & db, bool sort) -{ - QList list; - - QSqlQuery selectQuery(db); - selectQuery.prepare("select c.id,c.parentId,c.fileName,c.path,ci.hash from comic c inner join comic_info ci on (c.comicInfoId = ci.id) where c.parentId = :parentId"); - selectQuery.bindValue(":parentId", parentId); - selectQuery.exec(); - - ComicDB * currentItem; - while (selectQuery.next()) - { - QList data; - QSqlRecord record = selectQuery.record(); - for(int i=0;iid = record.value("id").toULongLong(); - currentItem->parentId = record.value(1).toULongLong(); - currentItem->name = record.value(2).toString(); - currentItem->path = record.value(3).toString(); - currentItem->info.load(record.value(4).toString(),db); - int lessThan = 0; - if(list.isEmpty() || !sort) - list.append(currentItem); - else - { - ComicDB * last = static_cast(list.back()); - QString nameLast = last->name; - QString nameCurrent = currentItem->name; - QList::iterator i; - i = list.end(); - i--; - while ((0 > (lessThan = nameCurrent.localeAwareCompare(nameLast))) && i != list.begin()) //se usa la misma ordenación que en QDir - { - i--; - nameLast = (*i)->name; - } - if(lessThan>0) //si se ha encontrado un elemento menor que current, se inserta justo después - list.insert(++i,currentItem); - else - list.insert(i,currentItem); - - } - } - //selectQuery.finish(); - return list; -} - -bool ComicDB::load(qulonglong idc, QSqlDatabase & db) -{ - - QSqlQuery selectQuery(db); - selectQuery.prepare("select c.id,c.parentId,c.fileName,c.path,ci.hash from comic c inner join comic_info ci on (c.comicInfoId = ci.id) where c.id = :id"); - selectQuery.bindValue(":id", idc); - selectQuery.exec(); - this->id = idc; - if(selectQuery.next()) - { - QSqlRecord record = selectQuery.record(); - //id = record.value("id").toULongLong(); - parentId = record.value("parentId").toULongLong(); - name = record.value("name").toString(); - path = record.value("path").toString(); - info.load(record.value("hash").toString(),db); - - return true; - } - //selectQuery.finish(); - return false; - -} - -qulonglong ComicDB::insert(QSqlDatabase & db) -{ - //TODO cambiar por info.insert(db) - - if(!info.existOnDb) - { - QSqlQuery comicInfoInsert(db); - comicInfoInsert.prepare("INSERT INTO comic_info (hash,numPages) " - "VALUES (:hash,:numPages)"); - comicInfoInsert.bindValue(":hash", info.hash); - comicInfoInsert.bindValue(":numPages", *info.numPages); - comicInfoInsert.exec(); - info.id =comicInfoInsert.lastInsertId().toULongLong(); - _hasCover = false; - } - else - _hasCover = true; - - QSqlQuery query(db); - query.prepare("INSERT INTO comic (parentId, comicInfoId, fileName, path) " - "VALUES (:parentId,:comicInfoId,:name, :path)"); - query.bindValue(":parentId", parentId); - query.bindValue(":comicInfoId", info.id); - query.bindValue(":name", name); - query.bindValue(":path", path); - query.exec(); - return query.lastInsertId().toULongLong(); -} - -void ComicDB::update(QSqlDatabase & db) -{ - -} - bool ComicDB::isDir() { return false; @@ -287,6 +161,39 @@ ComicInfo::ComicInfo(const ComicInfo & comicInfo) synopsis(NULL), characters(NULL), notes(NULL) +{ + operator=(comicInfo); +} + +ComicInfo::~ComicInfo() +{ + delete title; + delete coverPage; + delete numPages; + delete number; + delete isBis; + delete count; + delete volume; + delete storyArc; + delete arcNumber; + delete arcCount; + delete genere; + delete writer; + delete penciller; + delete inker; + delete colorist; + delete letterer; + delete coverArtist; + delete date; + delete publisher; + delete format; + delete color; + delete ageRating; + delete synopsis; + delete characters; + delete notes; +} +ComicInfo & ComicInfo::operator=(const ComicInfo & comicInfo) { copyField(title,comicInfo.title); copyField(coverPage,comicInfo.coverPage); @@ -320,88 +227,9 @@ ComicInfo::ComicInfo(const ComicInfo & comicInfo) read = comicInfo.read; edited = comicInfo.edited; + return *this; } -ComicInfo::~ComicInfo() -{ - delete title; - delete coverPage; - delete numPages; - delete number; - delete isBis; - delete count; - delete volume; - delete storyArc; - delete arcNumber; - delete arcCount; - delete genere; - delete writer; - delete penciller; - delete inker; - delete colorist; - delete letterer; - delete coverArtist; - delete date; - delete publisher; - delete format; - delete color; - delete ageRating; - delete synopsis; - delete characters; - delete notes; -} - -void ComicInfo::setField(const QString & name, QString * & field, QSqlRecord & record) -{ - if(!record.value(name).isNull()) - { - field = new QString(); - *field = record.value(name).toString(); - } -} - -void ComicInfo::setField(const QString & name, int * & field, QSqlRecord & record) -{ - if(!record.value(name).isNull()) - { - field = new int; - *field = record.value(name).toInt(); - } -} - -void ComicInfo::setField(const QString & name, bool * & field, QSqlRecord & record) -{ - if(!record.value(name).isNull()) - { - field = new bool; - *field = record.value(name).toBool(); - } -} - - -void ComicInfo::bindField(const QString & name, QString * field, QSqlQuery & query) -{ - if(field != NULL) - { - query.bindValue(name,*field); - } -} - -void ComicInfo::bindField(const QString & name, int * field, QSqlQuery & query) -{ - if(field != NULL) - { - query.bindValue(name,*field); - } -} - -void ComicInfo::bindField(const QString & name, bool * field, QSqlQuery & query) -{ - if(field != NULL) - { - query.bindValue(name,*field); - } -} void ComicInfo::setValue(QString * & field, const QString & value) { @@ -442,167 +270,6 @@ void ComicInfo::copyField(bool * & field, bool * value) field = new bool(*value); } -bool ComicInfo::load(QString hash, QSqlDatabase & db) -{ - QSqlQuery findComicInfo(db); - findComicInfo.prepare("SELECT * FROM comic_info WHERE hash = :hash"); - findComicInfo.bindValue(":hash", hash); - findComicInfo.exec(); - - - if(findComicInfo.next()) - { - this->hash = hash; - QSqlRecord record = findComicInfo.record(); - - hash = hash; - id = record.value("id").toULongLong(); - read = record.value("read").toBool(); - edited = record.value("edited").toBool(); - - setField("title",title,record); - setField("numPages",numPages,record); - - setField("coverPage",coverPage,record); - - setField("number",number,record); - setField("isBis",isBis,record); - setField("count",count,record); - - setField("volume",volume,record); - setField("storyArc",storyArc,record); - setField("arcNumber",arcNumber,record); - setField("arcCount",arcCount,record); - - setField("genere",genere,record); - - setField("writer",writer,record); - setField("penciller",penciller,record); - setField("inker",inker,record); - setField("colorist",colorist,record); - setField("letterer",letterer,record); - setField("coverArtist",coverArtist,record); - - setField("date",date,record); - setField("publisher",publisher,record); - setField("format",format,record); - setField("color",color,record); - setField("ageRating",ageRating,record); - - setField("synopsis",synopsis,record); - setField("characters",characters,record); - setField("notes",notes,record); - - return existOnDb = true; - } - - return existOnDb = false; -} - -qulonglong ComicInfo::insert(QSqlDatabase & db) -{ - return 0; -} -void ComicInfo::removeFromDB(QSqlDatabase & db) -{ - -} -void ComicInfo::update(QSqlDatabase & db) -{ - //db.open(); - QSqlQuery updateComicInfo(db); - updateComicInfo.prepare("UPDATE comic_info SET " - "title = :title," - - "coverPage = :coverPage," - "numPages = :numPages," - - "number = :number," - "isBis = :isBis," - "count = :count," - - "volume = :volume," - "storyArc = :storyArc," - "arcNumber = :arcNumber," - "arcCount = :arcCount," - - "genere = :genere," - - "writer = :writer," - "penciller = :penciller," - "inker = :inker," - "colorist = :colorist," - "letterer = :letterer," - "coverArtist = :coverArtist," - - "date = :date," - "publisher = :publisher," - "format = :format," - "color = :color," - "ageRating = :ageRating," - - "synopsis = :synopsis," - "characters = :characters," - "notes = :notes," - - "read = :read," - "edited = :edited" - - " WHERE id = :id "); - bindField(":title",title,updateComicInfo); - - bindField(":coverPage",coverPage,updateComicInfo); - bindField(":numPages",numPages,updateComicInfo); - - bindField(":number",number,updateComicInfo); - bindField(":isBis",isBis,updateComicInfo); - bindField(":count",count,updateComicInfo); - - bindField(":volume",volume,updateComicInfo); - bindField(":storyArc",storyArc,updateComicInfo); - bindField(":arcNumber",arcNumber,updateComicInfo); - bindField(":arcCount",arcCount,updateComicInfo); - - bindField(":genere",genere,updateComicInfo); - - bindField(":writer",writer,updateComicInfo); - bindField(":penciller",penciller,updateComicInfo); - bindField(":inker",inker,updateComicInfo); - bindField(":colorist",colorist,updateComicInfo); - bindField(":letterer",letterer,updateComicInfo); - bindField(":coverArtist",coverArtist,updateComicInfo); - - bindField(":date",date,updateComicInfo); - bindField(":publisher",publisher,updateComicInfo); - bindField(":format",format,updateComicInfo); - bindField(":color",color,updateComicInfo); - bindField(":ageRating",ageRating,updateComicInfo); - - bindField(":synopsis",synopsis,updateComicInfo); - bindField(":characters",characters,updateComicInfo); - bindField(":notes",notes,updateComicInfo); - - updateComicInfo.bindValue(":read", read?1:0); - updateComicInfo.bindValue(":id", id); - updateComicInfo.bindValue(":edited", edited?1:0); - updateComicInfo.exec(); - //updateComicInfo.finish(); - //db.close(); -} - -void ComicInfo::updateRead(QSqlDatabase & db) -{ - QSqlQuery findComicInfo(db); - findComicInfo.prepare("UPDATE comic_info SET " - "read = :read" - " WHERE id = :id "); - - findComicInfo.bindValue(":read", read?1:0); - findComicInfo.bindValue(":id", id); - findComicInfo.exec(); - //findComicInfo.finish(); -} - //set fields void ComicInfo::setTitle(QString value) diff --git a/YACReaderLibrary/db/comic_db.h b/YACReaderLibrary/db/comic_db.h index 9dec8338..93142cbe 100644 --- a/YACReaderLibrary/db/comic_db.h +++ b/YACReaderLibrary/db/comic_db.h @@ -2,7 +2,6 @@ #define __COMICDB_H #include "library_item.h" -#include #include #include #include @@ -14,11 +13,7 @@ public: ComicInfo(const ComicInfo & comicInfo); ~ComicInfo(); - bool load(QString hash, QSqlDatabase & db); - qulonglong insert(QSqlDatabase & db); - void removeFromDB(QSqlDatabase & db); - void update(QSqlDatabase & db); - void updateRead(QSqlDatabase & db); + ComicInfo & operator=(const ComicInfo & comicInfo); qulonglong id; bool read; @@ -97,14 +92,6 @@ public: QPixmap getCover(const QString & basePath); private: - void setField(const QString & name, QString * & field, QSqlRecord & record); - void setField(const QString & name, int * & field, QSqlRecord & record); - void setField(const QString & name, bool * & field, QSqlRecord & record); - - void bindField(const QString & name, QString * field, QSqlQuery & query); - void bindField(const QString & name, int * field, QSqlQuery & query); - void bindField(const QString & name, bool * field, QSqlQuery & query); - void setValue(QString * & field, const QString & value); void setValue(int * & field, int value); void setValue(bool * & field, bool value); @@ -116,19 +103,13 @@ private: class ComicDB : public LibraryItem { -private: - bool _hasCover; public: ComicDB(); - ComicDB(qulonglong cparentId, QString cname, QString cpath, QString chash, QSqlDatabase & database); - //Comic(QString fn, QString fp):name(fn),path(fp),knownParent(false), knownId(false){}; - static QList getComicsFromParent(qulonglong parentId, QSqlDatabase & db, bool sort = true); bool isDir(); + + bool _hasCover; - bool load(qulonglong id, QSqlDatabase & db); - qulonglong insert(QSqlDatabase & db); - void update(QSqlDatabase & db); bool hasCover() {return _hasCover;}; QString toTXT(); diff --git a/YACReaderLibrary/db/folder.cpp b/YACReaderLibrary/db/folder.cpp index ddd1d4e8..e69de29b 100644 --- a/YACReaderLibrary/db/folder.cpp +++ b/YACReaderLibrary/db/folder.cpp @@ -1,5 +0,0 @@ - -#include "folder.h" -#include -#include -#include diff --git a/YACReaderLibrary/db/tablemodel.cpp b/YACReaderLibrary/db/tablemodel.cpp index 8da25187..62b8f1d3 100644 --- a/YACReaderLibrary/db/tablemodel.cpp +++ b/YACReaderLibrary/db/tablemodel.cpp @@ -7,6 +7,7 @@ #include "data_base_management.h" #include "qnaturalsorting.h" #include "comic_db.h" +#include "db_helper.h" //ci.number,ci.title,c.fileName,ci.numPages,c.id,c.parentId,c.path,ci.hash,ci.read #define NUMBER 0 @@ -308,10 +309,8 @@ void TableModel::setupModelData(QSqlQuery &sqlquery) ComicDB TableModel::getComic(const QModelIndex & mi) { - ComicDB c; - QSqlDatabase db = DataBaseManagement::loadDatabase(_databasePath); - c.load(_data.at(mi.row())->data(ID).toULongLong(),db); + ComicDB c = DBHelper::loadComic(_data.at(mi.row())->data(ID).toULongLong(),db); db.close(); QSqlDatabase::removeDatabase(_databasePath); @@ -320,10 +319,8 @@ ComicDB TableModel::getComic(const QModelIndex & mi) ComicDB TableModel::_getComic(const QModelIndex & mi) { - ComicDB c; - QSqlDatabase db = DataBaseManagement::loadDatabase(_databasePath); - c.load(_data.at(mi.row())->data(ID).toULongLong(),db); + ComicDB c = DBHelper::loadComic(_data.at(mi.row())->data(ID).toULongLong(),db); db.close(); QSqlDatabase::removeDatabase(_databasePath); @@ -352,10 +349,9 @@ QVector TableModel::setAllComicsRead(bool read) { readList[i] = read; _data.value(i)->setData(READ,QVariant(read)); - ComicDB c; - c.load(_data.value(i)->data(ID).toULongLong(),db); + ComicDB c = DBHelper::loadComic(_data.value(i)->data(ID).toULongLong(),db); c.info.read = read; - c.info.update(db); + DBHelper::update(&(c.info),db); } db.commit(); db.close(); @@ -390,10 +386,9 @@ QVector TableModel::setComicsRead(QList list,bool read) foreach (QModelIndex mi, list) { _data.value(mi.row())->setData(READ, QVariant(read)); - ComicDB c; - c.load(_data.value(mi.row())->data(ID).toULongLong(),db); + ComicDB c = DBHelper::loadComic(_data.value(mi.row())->data(ID).toULongLong(),db); c.info.read = read; - c.info.update(db); + DBHelper::update(&(c.info),db); } db.commit(); db.close(); @@ -411,11 +406,10 @@ qint64 TableModel::asignNumbers(QList list,int startingNumber) int i = 0; foreach (QModelIndex mi, list) { - ComicDB c; - c.load(_data.value(mi.row())->data(ID).toULongLong(),db); + ComicDB c = DBHelper::loadComic(_data.value(mi.row())->data(ID).toULongLong(),db); c.info.setNumber(startingNumber+i); c.info.edited = true; - c.info.update(db); + DBHelper::update(&(c.info),db); i++; } diff --git a/YACReaderLibrary/db_helper.cpp b/YACReaderLibrary/db_helper.cpp index 6a468450..cbc05d1a 100644 --- a/YACReaderLibrary/db_helper.cpp +++ b/YACReaderLibrary/db_helper.cpp @@ -9,6 +9,8 @@ #include #include #include +#include +#include #include "library_item.h" #include "comic_db.h" @@ -73,7 +75,7 @@ QList DBHelper::getFolderComicsFromLibrary(const QString & librar QString libraryPath = DBHelper::getLibraries().value(libraryName); QSqlDatabase db = DataBaseManagement::loadDatabase(libraryPath+"/.yacreaderlibrary"); - QList list = ComicDB::getComicsFromParent(folderId,db,false); + QList list = DBHelper::getComicsFromParent(folderId,db,false); db.close(); QSqlDatabase::removeDatabase(libraryPath); @@ -95,8 +97,7 @@ ComicDB DBHelper::getComicInfo(const QString & libraryName, qulonglong id) QString libraryPath = DBHelper::getLibraries().value(libraryName); QSqlDatabase db = DataBaseManagement::loadDatabase(libraryPath+"/.yacreaderlibrary"); - ComicDB comic; - comic.load(id,db); + ComicDB comic = DBHelper::loadComic(id,db); db.close(); QSqlDatabase::removeDatabase(libraryPath); @@ -151,6 +152,103 @@ void DBHelper::removeFromDB(ComicDB * comic, QSqlDatabase & db) query.exec(); } +//updates +void DBHelper::update(ComicDB * comic, QSqlDatabase & db) +{ + //do nothing +} + +void DBHelper::update(ComicInfo * comicInfo, QSqlDatabase & db) +{ + QSqlQuery updateComicInfo(db); + updateComicInfo.prepare("UPDATE comic_info SET " + "title = :title," + + "coverPage = :coverPage," + "numPages = :numPages," + + "number = :number," + "isBis = :isBis," + "count = :count," + + "volume = :volume," + "storyArc = :storyArc," + "arcNumber = :arcNumber," + "arcCount = :arcCount," + + "genere = :genere," + + "writer = :writer," + "penciller = :penciller," + "inker = :inker," + "colorist = :colorist," + "letterer = :letterer," + "coverArtist = :coverArtist," + + "date = :date," + "publisher = :publisher," + "format = :format," + "color = :color," + "ageRating = :ageRating," + + "synopsis = :synopsis," + "characters = :characters," + "notes = :notes," + + "read = :read," + "edited = :edited" + + " WHERE id = :id "); + bindField(":title",comicInfo->title,updateComicInfo); + + bindField(":coverPage",comicInfo->coverPage,updateComicInfo); + bindField(":numPages",comicInfo->numPages,updateComicInfo); + + bindField(":number",comicInfo->number,updateComicInfo); + bindField(":isBis",comicInfo->isBis,updateComicInfo); + bindField(":count",comicInfo->count,updateComicInfo); + + bindField(":volume",comicInfo->volume,updateComicInfo); + bindField(":storyArc",comicInfo->storyArc,updateComicInfo); + bindField(":arcNumber",comicInfo->arcNumber,updateComicInfo); + bindField(":arcCount",comicInfo->arcCount,updateComicInfo); + + bindField(":genere",comicInfo->genere,updateComicInfo); + + bindField(":writer",comicInfo->writer,updateComicInfo); + bindField(":penciller",comicInfo->penciller,updateComicInfo); + bindField(":inker",comicInfo->inker,updateComicInfo); + bindField(":colorist",comicInfo->colorist,updateComicInfo); + bindField(":letterer",comicInfo->letterer,updateComicInfo); + bindField(":coverArtist",comicInfo->coverArtist,updateComicInfo); + + bindField(":date",comicInfo->date,updateComicInfo); + bindField(":publisher",comicInfo->publisher,updateComicInfo); + bindField(":format",comicInfo->format,updateComicInfo); + bindField(":color",comicInfo->color,updateComicInfo); + bindField(":ageRating",comicInfo->ageRating,updateComicInfo); + + bindField(":synopsis",comicInfo->synopsis,updateComicInfo); + bindField(":characters",comicInfo->characters,updateComicInfo); + bindField(":notes",comicInfo->notes,updateComicInfo); + + updateComicInfo.bindValue(":read", comicInfo->read?1:0); + updateComicInfo.bindValue(":id", comicInfo->id); + updateComicInfo.bindValue(":edited", comicInfo->edited?1:0); + updateComicInfo.exec(); +} + +void DBHelper::updateRead(ComicInfo * comicInfo, QSqlDatabase & db) +{ + QSqlQuery findComicInfo(db); + findComicInfo.prepare("UPDATE comic_info SET " + "read = :read" + " WHERE id = :id "); + + findComicInfo.bindValue(":read", comicInfo->read?1:0); + findComicInfo.bindValue(":id", comicInfo->id); + findComicInfo.exec(); +} //inserts qulonglong DBHelper::insert(Folder * folder, QSqlDatabase & db) { @@ -164,6 +262,32 @@ qulonglong DBHelper::insert(Folder * folder, QSqlDatabase & db) return query.lastInsertId().toULongLong(); } +qulonglong DBHelper::insert(ComicDB * comic, QSqlDatabase & db) +{ + if(!comic->info.existOnDb) + { + QSqlQuery comicInfoInsert(db); + comicInfoInsert.prepare("INSERT INTO comic_info (hash,numPages) " + "VALUES (:hash,:numPages)"); + comicInfoInsert.bindValue(":hash", comic->info.hash); + comicInfoInsert.bindValue(":numPages", *(comic->info.numPages)); + comicInfoInsert.exec(); + comic->info.id =comicInfoInsert.lastInsertId().toULongLong(); + comic->_hasCover = false; + } + else + comic->_hasCover = true; + + QSqlQuery query(db); + query.prepare("INSERT INTO comic (parentId, comicInfoId, fileName, path) " + "VALUES (:parentId,:comicInfoId,:name, :path)"); + query.bindValue(":parentId", comic->parentId); + query.bindValue(":comicInfoId", comic->info.id); + query.bindValue(":name", comic->name); + query.bindValue(":path", comic->path); + query.exec(); + return query.lastInsertId().toULongLong(); +} //queries QList DBHelper::getFoldersFromParent(qulonglong parentId, QSqlDatabase & db, bool sort) { @@ -210,6 +334,55 @@ QList DBHelper::getFoldersFromParent(qulonglong parentId, QSqlDat return list; } +QList DBHelper::getComicsFromParent(qulonglong parentId, QSqlDatabase & db, bool sort) +{ + QList list; + + QSqlQuery selectQuery(db); + selectQuery.prepare("select c.id,c.parentId,c.fileName,c.path,ci.hash from comic c inner join comic_info ci on (c.comicInfoId = ci.id) where c.parentId = :parentId"); + selectQuery.bindValue(":parentId", parentId); + selectQuery.exec(); + + ComicDB * currentItem; + while (selectQuery.next()) + { + QList data; + QSqlRecord record = selectQuery.record(); + for(int i=0;iid = record.value("id").toULongLong(); + currentItem->parentId = record.value(1).toULongLong(); + currentItem->name = record.value(2).toString(); + currentItem->path = record.value(3).toString(); + currentItem->info = DBHelper::loadComicInfo(record.value(4).toString(),db); + int lessThan = 0; + if(list.isEmpty() || !sort) + list.append(currentItem); + else + { + ComicDB * last = static_cast(list.back()); + QString nameLast = last->name; + QString nameCurrent = currentItem->name; + QList::iterator i; + i = list.end(); + i--; + while ((0 > (lessThan = nameCurrent.localeAwareCompare(nameLast))) && i != list.begin()) //se usa la misma ordenación que en QDir + { + i--; + nameLast = (*i)->name; + } + if(lessThan>0) //si se ha encontrado un elemento menor que current, se inserta justo después + list.insert(++i,currentItem); + else + list.insert(i,currentItem); + + } + } + //selectQuery.finish(); + return list; +} //loads Folder DBHelper::loadFolder(qulonglong id, QSqlDatabase & db) @@ -231,4 +404,161 @@ Folder DBHelper::loadFolder(qulonglong id, QSqlDatabase & db) } return folder; -} \ No newline at end of file +} + +ComicDB DBHelper::loadComic(qulonglong id, QSqlDatabase & db) +{ + ComicDB comic; + + QSqlQuery selectQuery(db); + selectQuery.prepare("select c.id,c.parentId,c.fileName,c.path,ci.hash from comic c inner join comic_info ci on (c.comicInfoId = ci.id) where c.id = :id"); + selectQuery.bindValue(":id", id); + selectQuery.exec(); + comic.id = id; + if(selectQuery.next()) + { + QSqlRecord record = selectQuery.record(); + //id = record.value("id").toULongLong(); + comic.parentId = record.value("parentId").toULongLong(); + comic.name = record.value("name").toString(); + comic.path = record.value("path").toString(); + comic.info = DBHelper::loadComicInfo(record.value("hash").toString(),db); + } + + return comic; +} + +ComicDB DBHelper::loadComic(qulonglong cparentId, QString cname, QString cpath, QString chash, QSqlDatabase & database) +{ + ComicDB comic; + + comic.parentId = cparentId; + comic.name = cname; + comic.path = cpath; + + comic.info = DBHelper::loadComicInfo(chash,database); + + if(!comic.info.existOnDb) + { + comic.info.hash = chash; + comic.info.coverPage = new int(1); + comic._hasCover = false; + } + else + comic._hasCover = true; + + return comic; +} + +ComicInfo DBHelper::loadComicInfo(QString hash, QSqlDatabase & db) +{ + ComicInfo comicInfo; + + QSqlQuery findComicInfo(db); + findComicInfo.prepare("SELECT * FROM comic_info WHERE hash = :hash"); + findComicInfo.bindValue(":hash", hash); + findComicInfo.exec(); + + + if(findComicInfo.next()) + { + comicInfo.hash = hash; + QSqlRecord record = findComicInfo.record(); + + comicInfo.hash = hash; + comicInfo.id = record.value("id").toULongLong(); + comicInfo.read = record.value("read").toBool(); + comicInfo.edited = record.value("edited").toBool(); + + setField("title",comicInfo.title,record); + setField("numPages",comicInfo.numPages,record); + + setField("coverPage",comicInfo.coverPage,record); + + setField("number",comicInfo.number,record); + setField("isBis",comicInfo.isBis,record); + setField("count",comicInfo.count,record); + + setField("volume",comicInfo.volume,record); + setField("storyArc",comicInfo.storyArc,record); + setField("arcNumber",comicInfo.arcNumber,record); + setField("arcCount",comicInfo.arcCount,record); + + setField("genere",comicInfo.genere,record); + + setField("writer",comicInfo.writer,record); + setField("penciller",comicInfo.penciller,record); + setField("inker",comicInfo.inker,record); + setField("colorist",comicInfo.colorist,record); + setField("letterer",comicInfo.letterer,record); + setField("coverArtist",comicInfo.coverArtist,record); + + setField("date",comicInfo.date,record); + setField("publisher",comicInfo.publisher,record); + setField("format",comicInfo.format,record); + setField("color",comicInfo.color,record); + setField("ageRating",comicInfo.ageRating,record); + + setField("synopsis",comicInfo.synopsis,record); + setField("characters",comicInfo.characters,record); + setField("notes",comicInfo.notes,record); + + comicInfo.existOnDb = true; + } + else + comicInfo.existOnDb = false; + + return comicInfo; +} + +void DBHelper::setField(const QString & name, QString * & field, QSqlRecord & record) +{ + if(!record.value(name).isNull()) + { + field = new QString(); + *field = record.value(name).toString(); + } +} + +void DBHelper::setField(const QString & name, int * & field, QSqlRecord & record) +{ + if(!record.value(name).isNull()) + { + field = new int; + *field = record.value(name).toInt(); + } +} + +void DBHelper::setField(const QString & name, bool * & field, QSqlRecord & record) +{ + if(!record.value(name).isNull()) + { + field = new bool; + *field = record.value(name).toBool(); + } +} + + +void DBHelper::bindField(const QString & name, QString * field, QSqlQuery & query) +{ + if(field != NULL) + { + query.bindValue(name,*field); + } +} + +void DBHelper::bindField(const QString & name, int * field, QSqlQuery & query) +{ + if(field != NULL) + { + query.bindValue(name,*field); + } +} + +void DBHelper::bindField(const QString & name, bool * field, QSqlQuery & query) +{ + if(field != NULL) + { + query.bindValue(name,*field); + } +} diff --git a/YACReaderLibrary/db_helper.h b/YACReaderLibrary/db_helper.h index 5346dcf8..a2a7687a 100644 --- a/YACReaderLibrary/db_helper.h +++ b/YACReaderLibrary/db_helper.h @@ -9,6 +9,9 @@ class ComicDB; class Folder; class LibraryItem; class QSqlDatabase; +class ComicInfo; +class QSqlRecord; +class QSqlQuery; class DBHelper { @@ -28,13 +31,27 @@ public: static void removeFromDB(ComicDB * comic, QSqlDatabase & db); //inserts static qulonglong insert(Folder * folder, QSqlDatabase & db); + static qulonglong insert(ComicDB * comic, QSqlDatabase & db); //updates - + static void update(ComicDB * comics, QSqlDatabase & db); + static void update(ComicInfo * comicInfo, QSqlDatabase & db); + static void updateRead(ComicInfo * comicInfo, QSqlDatabase & db); //queries static QList getFoldersFromParent(qulonglong parentId, QSqlDatabase & db, bool sort = true); - + static QList getComicsFromParent(qulonglong parentId, QSqlDatabase & db, bool sort = true); //load static Folder loadFolder(qulonglong id, QSqlDatabase & db); + static ComicDB loadComic(qulonglong id, QSqlDatabase & db); + static ComicDB loadComic(qulonglong cparentId, QString cname, QString cpath, QString chash, QSqlDatabase & database); + static ComicInfo loadComicInfo(QString hash, QSqlDatabase & db); +private: + static void setField(const QString & name, QString * & field, QSqlRecord & record); + static void setField(const QString & name, int * & field, QSqlRecord & record); + static void setField(const QString & name, bool * & field, QSqlRecord & record); + + static void bindField(const QString & name, QString * field, QSqlQuery & query); + static void bindField(const QString & name, int * field, QSqlQuery & query); + static void bindField(const QString & name, bool * field, QSqlQuery & query); }; #endif \ No newline at end of file diff --git a/YACReaderLibrary/library_creator.cpp b/YACReaderLibrary/library_creator.cpp index 0d603ae0..90c529ca 100644 --- a/YACReaderLibrary/library_creator.cpp +++ b/YACReaderLibrary/library_creator.cpp @@ -194,7 +194,7 @@ void LibraryCreator::insertComic(const QString & relativePath,const QFileInfo & file.close(); //hash Sha1 del primer 0.5MB + filesize QString hash = QString(crypto.result().toHex().constData()) + QString::number(fileInfo.size()); - ComicDB comic(_currentPathFolders.last().id,fileInfo.fileName(),relativePath,hash,_database); + ComicDB comic = DBHelper::loadComic(_currentPathFolders.last().id,fileInfo.fileName(),relativePath,hash,_database); int numPages; if(! ( comic.hasCover() && checkCover(hash))) @@ -207,7 +207,7 @@ void LibraryCreator::insertComic(const QString & relativePath,const QFileInfo & emit(comicAdded(relativePath,_target+"/covers/"+hash+".jpg")); } comic.info.setNumPages(numPages); - comic.insert(_database); + DBHelper::insert(&comic,_database); } void LibraryCreator::update(QDir dirS) @@ -218,7 +218,7 @@ void LibraryCreator::update(QDir dirS) QFileInfoList listS = dirS.entryInfoList(); QList folders = DBHelper::getFoldersFromParent(_currentPathFolders.last().id,_database); - QList comics = ComicDB::getComicsFromParent(_currentPathFolders.last().id,_database); + QList comics = DBHelper::getComicsFromParent(_currentPathFolders.last().id,_database); QList listD; listD.append(folders); diff --git a/YACReaderLibrary/properties_dialog.cpp b/YACReaderLibrary/properties_dialog.cpp index 470a709f..dcbcbc02 100644 --- a/YACReaderLibrary/properties_dialog.cpp +++ b/YACReaderLibrary/properties_dialog.cpp @@ -4,6 +4,7 @@ #include "library_creator.h" #include "yacreader_field_edit.h" #include "yacreader_field_plain_text_edit.h" +#include "db_helper.h" #include #include @@ -432,7 +433,7 @@ void PropertiesDialog::updateComics() for(itr = comics.begin();itr!=comics.end();itr++) { if(itr->info.edited) - itr->info.update(db); + DBHelper::update(&(itr->info),db); } db.commit(); db.close();