File indexing completed on 2024-05-19 04:49:44
0001 /**************************************************************************************** 0002 * Copyright (c) 2013 Konrad Zemek <konrad.zemek@gmail.com> * 0003 * * 0004 * This program is free software; you can redistribute it and/or modify it under * 0005 * the terms of the GNU General Public License as published by the Free Software * 0006 * Foundation; either version 2 of the License, or (at your option) any later * 0007 * version. * 0008 * * 0009 * This program is distributed in the hope that it will be useful, but WITHOUT ANY * 0010 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A * 0011 * PARTICULAR PURPOSE. See the GNU General Public License for more details. * 0012 * * 0013 * You should have received a copy of the GNU General Public License along with * 0014 * this program. If not, see <http://www.gnu.org/licenses/>. * 0015 ****************************************************************************************/ 0016 0017 #include "FastForwardTrack.h" 0018 0019 #include "core/support/Debug.h" 0020 #include "importers/ImporterSqlConnection.h" 0021 0022 using namespace StatSyncing; 0023 0024 FastForwardTrack::FastForwardTrack( const QString &trackUrl, 0025 const ImporterSqlConnectionPtr &connection, 0026 const Meta::FieldHash &metadata, 0027 const QSet<QString> &labels ) 0028 : SimpleWritableTrack( metadata, labels ) 0029 , m_connection( connection ) 0030 , m_trackUrl( trackUrl ) 0031 { 0032 } 0033 0034 FastForwardTrack::~FastForwardTrack() 0035 { 0036 } 0037 0038 void 0039 StatSyncing::FastForwardTrack::doCommit( const qint64 fields ) 0040 { 0041 m_connection->transaction(); 0042 bool ok = true; 0043 0044 const QString query = "SELECT deviceid, uniqueid FROM uniqueid WHERE url = :url"; 0045 QVariantMap bindValues; 0046 bindValues.insert( ":url", m_trackUrl ); 0047 0048 const QList<QVariantList> result = m_connection->query( query, bindValues, &ok ); 0049 if( !ok ) 0050 { 0051 m_connection->rollback(); 0052 return; 0053 } 0054 0055 const int deviceId = result.front()[0].toInt(); 0056 const QString uniqueId = result.front()[1].toString(); 0057 0058 QStringList updates; 0059 QVariantMap uBindValues; 0060 0061 if( fields & Meta::valFirstPlayed ) 0062 { 0063 updates << QStringLiteral("createdate = :createdate"); 0064 uBindValues.insert( ":createdate", m_statistics.value( Meta::valFirstPlayed ) ); 0065 } 0066 if( fields & Meta::valLastPlayed ) 0067 { 0068 updates << QStringLiteral("accessdate = :accessdate"); 0069 uBindValues.insert( ":accessdate", m_statistics.value( Meta::valLastPlayed ) ); 0070 } 0071 if( fields & Meta::valRating ) 0072 { 0073 updates << QStringLiteral("rating = :rating"); 0074 uBindValues.insert( ":rating", m_statistics.value( Meta::valRating ) ); 0075 } 0076 if( fields & Meta::valPlaycount ) 0077 { 0078 updates << QStringLiteral("playcounter = :playcount"); 0079 uBindValues.insert( ":playcount", m_statistics.value( Meta::valPlaycount ) ); 0080 } 0081 0082 if( !updates.isEmpty() ) 0083 { 0084 const QString query = "SELECT COUNT(*) FROM statistics WHERE url = :url"; 0085 QVariantMap bindValues; 0086 bindValues.insert( ":url", m_trackUrl ); 0087 0088 const QList<QVariantList> result = m_connection->query( query, bindValues, &ok ); 0089 if( !ok ) 0090 { 0091 m_connection->rollback(); 0092 return; 0093 } 0094 0095 // Statistic row doesn't exist 0096 if( !result.front()[0].toInt() ) 0097 { 0098 const QString query = "INSERT INTO statistics (url, deviceid, uniqueid) " 0099 "VALUES ( :url, :devid, :uniqid )"; 0100 QVariantMap bindValues; 0101 bindValues.insert( ":url", m_trackUrl ); 0102 bindValues.insert( ":devid", deviceId ); 0103 bindValues.insert( ":url", uniqueId ); 0104 0105 m_connection->query( query, bindValues, &ok ); 0106 if( !ok ) 0107 { 0108 m_connection->rollback(); 0109 return; 0110 } 0111 } 0112 0113 // Update statistics 0114 const QString uQuery = "UPDATE statistics SET " + updates.join(", ") + 0115 " WHERE url = :url"; 0116 0117 uBindValues.insert( ":url", m_trackUrl ); 0118 m_connection->query( uQuery, uBindValues, &ok ); 0119 if( !ok ) 0120 { 0121 m_connection->rollback(); 0122 return; 0123 } 0124 } 0125 0126 if( fields & Meta::valLabel ) 0127 { 0128 // Drop old label associations 0129 const QString query = "DELETE FROM tags_labels WHERE url = :url"; 0130 QVariantMap bindValues; 0131 bindValues.insert( ":url", m_trackUrl ); 0132 m_connection->query( query, bindValues, &ok ); 0133 if( !ok ) 0134 { 0135 m_connection->rollback(); 0136 return; 0137 } 0138 0139 foreach( const QString &label, m_labels ) 0140 { 0141 { 0142 // Check if the label exists 0143 const QString query = "SELECT COUNT(*) FROM labels WHERE name = :name"; 0144 QVariantMap bindValues; 0145 bindValues.insert( ":name", label ); 0146 0147 const QList<QVariantList> result = m_connection->query( query, bindValues, 0148 &ok ); 0149 if( !ok ) 0150 { 0151 m_connection->rollback(); 0152 return; 0153 } 0154 0155 // Insert label if it doesn't 0156 if( !result.front()[0].toInt() ) 0157 { 0158 const QString query = "INSERT INTO labels (name, type) " 0159 "VALUES (:name, 1)"; 0160 QVariantMap bindValues; 0161 bindValues.insert( ":name", label ); 0162 0163 m_connection->query( query, bindValues, &ok ); 0164 if( !ok ) 0165 { 0166 m_connection->rollback(); 0167 return; 0168 } 0169 } 0170 } 0171 0172 // Insert track <-> label association 0173 const QString query = "INSERT INTO tags_labels (deviceid, url, uniqueid, " 0174 "labelid) VALUES ( :devid, :url, :uniqid, " 0175 "(SELECT id FROM labels WHERE name = :name) )"; 0176 QVariantMap bindValues; 0177 bindValues.insert( ":devid", deviceId ); 0178 bindValues.insert( ":url", m_trackUrl ); 0179 bindValues.insert( ":uniqid", uniqueId ); 0180 bindValues.insert( ":name", label ); 0181 0182 m_connection->query( query, bindValues, &ok ); 0183 if( !ok ) 0184 { 0185 m_connection->rollback(); 0186 return; 0187 } 0188 } 0189 } 0190 0191 m_connection->commit(); 0192 }