22
/** Create a playlist with the given name.
23
@param name The name of the playlist to be created.
25
bool PlaylistDAO::createPlaylist(QString name, bool hidden)
21
int PlaylistDAO::createPlaylist(QString name, HiddenType hidden)
27
23
// qDebug() << "PlaylistDAO::createPlaylist"
28
24
// << QThread::currentThread()
51
47
//qDebug() << "Inserting playlist" << name << "at position" << position;
53
query.prepare("INSERT INTO Playlists (name, position, hidden) "
54
"VALUES (:name, :position, :hidden)");
49
query.prepare("INSERT INTO Playlists (name, position, hidden, date_created, date_modified) "
50
"VALUES (:name, :position, :hidden, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP)");
55
51
query.bindValue(":name", name);
56
52
query.bindValue(":position", position);
57
query.bindValue(":hidden", hidden ? 1 : 0);
53
query.bindValue(":hidden", static_cast<int>(hidden));
59
55
if (!query.exec()) {
60
56
LOG_FAILED_QUERY(query);
61
57
m_database.rollback();
65
61
int playlistId = query.lastInsertId().toInt();
66
62
//Commit the transaction
67
63
m_database.commit();
68
64
emit(added(playlistId));
72
/** Find out the name of the playlist at the given position */
73
QString PlaylistDAO::getPlaylistName(unsigned int position)
68
QString PlaylistDAO::getPlaylistName(int playlistId)
75
70
// qDebug() << "PlaylistDAO::getPlaylistName" << QThread::currentThread() << m_database.connectionName();
77
72
QSqlQuery query(m_database);
78
73
query.prepare("SELECT name FROM Playlists "
79
"WHERE position = :position");
80
query.bindValue(":position", position);
75
query.bindValue(":id", playlistId);
82
77
if (!query.exec()) {
83
78
LOG_FAILED_QUERY(query);
144
137
emit(deleted(playlistId));
148
140
void PlaylistDAO::renamePlaylist(int playlistId, const QString& newName) {
149
141
QSqlQuery query(m_database);
150
142
query.prepare("UPDATE Playlists SET name = :name WHERE id = :id");
152
144
query.bindValue(":id", playlistId);
153
145
if (!query.exec()) {
154
146
LOG_FAILED_QUERY(query);
149
emit(renamed(playlistId));
159
152
bool PlaylistDAO::setPlaylistLocked(int playlistId, bool locked) {
153
QSqlQuery query(m_database);
154
query.prepare("UPDATE Playlists SET locked = :lock WHERE id = :id");
160
155
// SQLite3 doesn't support boolean value. Using integer instead.
161
int lock = locked ? 1 : 0;
163
QSqlQuery query(m_database);
164
query.prepare("UPDATE Playlists SET locked = :lock WHERE id = :id");
165
query.bindValue(":lock", lock);
156
query.bindValue(":lock", static_cast<int>(locked));
166
157
query.bindValue(":id", playlistId);
168
159
if (!query.exec()) {
169
160
LOG_FAILED_QUERY(query);
163
emit(lockChanged(playlistId));
191
/** Append a track to a playlist */
192
void PlaylistDAO::appendTrackToPlaylist(int trackId, int playlistId)
194
// qDebug() << "PlaylistDAO::appendTrackToPlaylist"
183
void PlaylistDAO::appendTracksToPlaylist(QList<int> trackIds, int playlistId) {
184
// qDebug() << "PlaylistDAO::appendTracksToPlaylist"
195
185
// << QThread::currentThread() << m_database.connectionName();
197
187
// Start the transaction
207
197
LOG_FAILED_QUERY(query);
210
// Get the position of the highest playlist...
200
// Get the position of the highest track in the playlist.
211
201
int position = 0;
212
202
if (query.next()) {
213
203
position = query.value(query.record().indexOf("position")).toInt();
215
position++; //Append after the last song.
205
// Append after the last song. If no songs or a failed query then 0 becomes
217
209
//Insert the song into the PlaylistTracks table
218
210
query.prepare("INSERT INTO PlaylistTracks (playlist_id, track_id, position)"
219
211
"VALUES (:playlist_id, :track_id, :position)");
220
212
query.bindValue(":playlist_id", playlistId);
221
query.bindValue(":track_id", trackId);
222
query.bindValue(":position", position);
225
LOG_FAILED_QUERY(query);
215
foreach (int trackId, trackIds) {
216
query.bindValue(":track_id", trackId);
217
query.bindValue(":position", position++);
219
LOG_FAILED_QUERY(query);
228
223
// Commit the transaction
229
224
m_database.commit();
231
emit(trackAdded(playlistId, trackId, position));
226
foreach (int trackId, trackIds) {
227
emit(trackAdded(playlistId, trackId, position));
232
229
emit(changed(playlistId));
235
/** Find out how many playlists exist. */
232
void PlaylistDAO::appendTrackToPlaylist(int trackId, int playlistId) {
234
tracks.append(trackId);
235
appendTracksToPlaylist(tracks, playlistId);
236
238
unsigned int PlaylistDAO::playlistCount()
238
240
// qDebug() << "PlaylistDAO::playlistCount" << QThread::currentThread() << m_database.connectionName();
257
259
QSqlQuery query(m_database);
258
260
query.prepare("SELECT id FROM Playlists");
263
LOG_FAILED_QUERY(query);
268
while(query.next()) {
269
if (currentRow++ == index) {
270
int id = query.value(0).toInt();
277
PlaylistDAO::HiddenType PlaylistDAO::getHiddenType(int playlistId) {
278
// qDebug() << "PlaylistDAO::getHiddenType"
279
// << QThread::currentThread() << m_database.connectionName();
281
QSqlQuery query(m_database);
282
query.prepare("SELECT hidden FROM Playlists WHERE id = :id");
283
query.bindValue(":id", playlistId);
260
285
if (query.exec()) {
262
while(query.next()) {
263
if (currentRow++ == position) {
264
int id = query.value(0).toInt();
287
return static_cast<HiddenType>(query.value(0).toInt());
269
290
LOG_FAILED_QUERY(query);
292
qDebug() << "PlaylistDAO::getHiddenType returns PLHT_UNKNOWN for playlistId "
275
297
bool PlaylistDAO::isHidden(int playlistId) {
276
298
// qDebug() << "PlaylistDAO::isHidden"
277
299
// << QThread::currentThread() << m_database.connectionName();
279
QSqlQuery query(m_database);
280
query.prepare("SELECT hidden FROM Playlists WHERE id = :id");
281
query.bindValue(":id", playlistId);
285
return query.value(0).toBool();
288
LOG_FAILED_QUERY(query);
301
HiddenType ht = getHiddenType(playlistId);
302
if (ht == PLHT_NOT_HIDDEN) {
293
308
void PlaylistDAO::removeTrackFromPlaylists(int trackId) {
398
413
emit(changed(playlistId));
401
void PlaylistDAO::addToAutoDJQueue(int playlistId) {
416
void PlaylistDAO::addToAutoDJQueue(int playlistId, bool bTop) {
402
417
//qDebug() << "Adding tracks from playlist " << playlistId << " to the Auto-DJ Queue";
404
419
// Query the PlaylistTracks database to locate tracks in the selected playlist
408
423
query.bindValue(":plid", playlistId);
409
424
if (!query.exec()) {
410
425
LOG_FAILED_QUERY(query);
413
429
// Get the ID of the Auto-DJ playlist
414
430
int autoDJId = getPlaylistIdFromName(AUTODJ_TABLE);
415
// Loop through the tracks, adding them to the Auto-DJ Queue
416
while(query.next()) {
417
appendTrackToPlaylist(query.value(0).toInt(), autoDJId);
432
// Loop through the tracks, adding them to the Auto-DJ Queue. Start at
433
// position 2 because position 1 was already loaded to the deck
436
while (query.next()) {
438
insertTrackIntoPlaylist(query.value(0).toInt(), autoDJId, i++);
441
appendTrackToPlaylist(query.value(0).toInt(), autoDJId);
446
int PlaylistDAO::getPreviousPlaylist(int currentPlaylistId, HiddenType hidden) {
447
// Find out the highest position existing in the playlist so we know what
448
// position this track should have.
449
QSqlQuery query(m_database);
450
query.prepare("SELECT max(id) as id FROM Playlists "
451
"WHERE id < :id AND hidden = :hidden");
452
query.bindValue(":id", currentPlaylistId);
453
query.bindValue(":hidden", hidden);
456
LOG_FAILED_QUERY(query);
460
// Get the id of the highest playlist
461
int previousPlaylistId = -1;
463
previousPlaylistId = query.value(query.record().indexOf("id")).toInt();
465
return previousPlaylistId;
468
void PlaylistDAO::copyPlaylistTracks(int sourcePlaylistID, int targetPlaylistId) {
469
// Query Tracks from the source Playlist
470
QSqlQuery query(m_database);
471
query.prepare("SELECT track_id FROM PlaylistTracks "
472
"WHERE playlist_id = :plid");
473
query.bindValue(":plid", sourcePlaylistID);
476
LOG_FAILED_QUERY(query);
481
while (query.next()) {
482
trackIds.append(query.value(0).toInt());
484
appendTracksToPlaylist(trackIds, targetPlaylistId);