]> Some of my projects - localmylist.git/commitdiff
Fix renaming files. Pretty critical error...
authorAPTX <marek321@gmail.com>
Wed, 25 Jul 2012 01:21:23 +0000 (03:21 +0200)
committerAPTX <marek321@gmail.com>
Wed, 25 Jul 2012 01:21:23 +0000 (03:21 +0200)
localmylist/database.cpp
localmylist/database.h
localmylist/renamehandler.cpp
localmylist/scriptable.cpp
localmylist/scriptable.h
localmylist/share/schema/schema.sql

index 2147c316cb9e211b7d597cfabc0acc4c95d38504..34cb6ce0306e3b32613f3db204ebbb7c21c2d94e 100644 (file)
@@ -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)
index 751bc3379e27253f6cb1ca9f935b0c44796f1483..23ea7ca797c92153bf6fae3a287b45cbe4f6a364 100644 (file)
@@ -122,6 +122,7 @@ struct LOCALMYLISTSHARED_EXPORT File
 
 struct LOCALMYLISTSHARED_EXPORT FileLocation
 {
+       int locationId;
        int fid;
        int hostId;
        QString path;
index 808e434999c65c074d0679195aef9fa539954646..c250b9d91f0e82b348f854858f9e40b20863a0ae 100644 (file)
@@ -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();
index b80b2a3d7e300152c90c5415aa3da5adb96e5af7..bbbefbee6ea8f5605b4a6f1cd6cf2ad6922b15b9 100644 (file)
@@ -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();
index 5c3bcbf9c5ab71dedb6767a5555fabb34606a6e2..cc22a629ee3d80195276fcb6093ca1532a0e17e9 100644 (file)
@@ -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);
 
index e7c274c9c28ef79fac6ff4ca8016cbb98a5979ce..0c064de3fe328d040bfbb8c06449ddde72613367 100644 (file)
@@ -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