From: APTX Date: Wed, 25 Jul 2012 01:21:23 +0000 (+0200) Subject: Fix renaming files. Pretty critical error... X-Git-Url: https://gitweb.aptx.org/?a=commitdiff_plain;h=205c268ed45e7fdc8c8896c1cbf70d1c5c0d6d13;p=localmylist.git Fix renaming files. Pretty critical error... --- diff --git a/localmylist/database.cpp b/localmylist/database.cpp index 2147c31..34cb6ce 100644 --- a/localmylist/database.cpp +++ b/localmylist/database.cpp @@ -64,6 +64,7 @@ File::File() FileLocation::FileLocation() { + locationId = 0; fid = 0; hostId = 0; failedRename = false; @@ -416,7 +417,7 @@ int Database::isKnownFile(const QByteArray &ed2k, qint64 size) bool Database::addFileLocation(const FileLocation &fileLocation) { - QSqlQuery &q = prepare("INSERT INTO file_location VALUES(:fid, :hostId, :path, DEFAULT, DEFAULT)"); + QSqlQuery &q = prepare("INSERT INTO file_location VALUES(DEFAULT, :fid, :hostId, :path, DEFAULT, DEFAULT)"); q.bindValue(":fid", fileLocation.fid); q.bindValue(":hostId", fileLocation.hostId); q.bindValue(":path", fileLocation.path); @@ -427,10 +428,11 @@ bool Database::addFileLocation(const FileLocation &fileLocation) bool Database::setFileLocation(const FileLocation &fileLocation) { QSqlQuery &q = prepare( - "UPDATE file_location SET host_id = :hostId, path = :path, renamed = :renamed, " + "UPDATE file_location SET fid = :fid, host_id = :hostId, path = :path, renamed = :renamed, " " failed_rename = :failedRename " - " WHERE fid = :fid"); + " WHERE location_id = :locationId"); + q.bindValue(":locationId", fileLocation.locationId); q.bindValue(":fid", fileLocation.fid); q.bindValue(":hostId", fileLocation.hostId); q.bindValue(":path", fileLocation.path); @@ -438,6 +440,19 @@ bool Database::setFileLocation(const FileLocation &fileLocation) q.bindValue(":failedRename", fileLocation.failedRename); return exec(q); + if (!exec(q)) + return false; + + if (q.numRowsAffected()) + return true; + + { + QSqlQuery &q = prepare( + "UPDATE file_location SET failed_rename = true " + " WHERE location_id = :locationId"); + q.bindValue(":locationId", fileLocation.locationId); + return exec(q); + } } Anime Database::getAnime(int aid) diff --git a/localmylist/database.h b/localmylist/database.h index 751bc33..23ea7ca 100644 --- a/localmylist/database.h +++ b/localmylist/database.h @@ -122,6 +122,7 @@ struct LOCALMYLISTSHARED_EXPORT File struct LOCALMYLISTSHARED_EXPORT FileLocation { + int locationId; int fid; int hostId; QString path; diff --git a/localmylist/renamehandler.cpp b/localmylist/renamehandler.cpp index 808e434..c250b9d 100644 --- a/localmylist/renamehandler.cpp +++ b/localmylist/renamehandler.cpp @@ -63,6 +63,7 @@ void RenameHandler::handleRename() QFileInfo oldFile(r.value("path").toString()); FileLocation fl; + fl.locationId = r.value("location_id").toInt(); fl.fid = q.value(0).toInt(); fl.hostId = MyList::instance()->hostId(); fl.path = r.value("path").toString(); diff --git a/localmylist/scriptable.cpp b/localmylist/scriptable.cpp index b80b2a3..bbbefbe 100644 --- a/localmylist/scriptable.cpp +++ b/localmylist/scriptable.cpp @@ -1316,6 +1316,20 @@ void File::write_myOther(QString val) // -------------------------------------------------------------------------------- +int FileLocation::read_locationId() const +{ + auto o = thisObj(); + if (!o) return int(); + return o->locationId; +} + +void FileLocation::write_locationId(int val) +{ + auto o = thisObj(); + if (!o) return; + o->locationId = val; +} + int FileLocation::read_fid() const { auto o = thisObj(); diff --git a/localmylist/scriptable.h b/localmylist/scriptable.h index 5c3bcbf..cc22a62 100644 --- a/localmylist/scriptable.h +++ b/localmylist/scriptable.h @@ -397,6 +397,7 @@ public: class LOCALMYLISTSHARED_EXPORT FileLocation : public QObject, protected QScriptable { Q_OBJECT + Q_PROPERTY(int locationId READ read_locationId WRITE write_locationId) Q_PROPERTY(int fid READ read_fid WRITE write_fid) Q_PROPERTY(int hostId READ read_hostId WRITE write_hostId) Q_PROPERTY(QString path READ read_path WRITE write_path) @@ -411,6 +412,9 @@ public slots: QString toString() const; public: + int read_locationId() const; + void write_locationId(int val); + int read_fid() const; void write_fid(int val); diff --git a/localmylist/share/schema/schema.sql b/localmylist/share/schema/schema.sql index e7c274c..0c064de 100644 --- a/localmylist/share/schema/schema.sql +++ b/localmylist/share/schema/schema.sql @@ -125,12 +125,14 @@ CREATE INDEX file_episode_rel_eid_fk ON file_episode_rel USING btree (eid); CREATE INDEX file_episode_rel_fid_fk ON file_episode_rel USING btree (fid); CREATE TABLE file_location ( + location_id serial NOT NULL, fid integer NOT NULL, host_id integer, path text, renamed timestamp without time zone, failed_rename boolean NOT NULL DEFAULT false, - CONSTRAINT file_location_pk PRIMARY KEY (fid, host_id, path ) + CONSTRAINT file_location_pk PRIMARY KEY (location_id ), + CONSTRAINT file_location_unique_location UNIQUE (fid, host_id, path ) ); CREATE TABLE unknown_file ( @@ -221,7 +223,7 @@ CREATE VIEW rename_data AS e.title_kanji AS episode_title_kanji, e.length AS episode_length, e.airdate, e.state, e.type, e.recap, e.rating, e.votes, e.my_vote, e.my_vote_date, f.anidb_update, f.entry_update, f.my_update, f.ed2k, f.size, f.length, f.extension, f.group_name, f.group_name_short, f.crc, f.release_date, f.version, f.censored, f.source, f.quality_id, f.quality, f.resolution, f.video_codec, f.audio_codec, f.audio_language, f.subtitle_language, f.aspect_ratio, f.my_watched, f.my_state, f.my_file_state, f.my_storage, f.my_source, - f.my_other, fl.host_id, fl.path, fl.renamed, fl.failed_rename + f.my_other, fl.location_id, fl.host_id, fl.path, fl.renamed, fl.failed_rename FROM file f JOIN anime a ON a.aid = f.aid JOIN episode e ON e.eid = f.eid