#include "library/dao/playlistdao.h"
#include "moc_playlistdao.cpp"
#include <QRandomGenerator>
#include <QtDebug>
#include <QtSql>
#include "library/autodj/autodjprocessor.h"
#include "library/queryutil.h"
#include "library/trackcollection.h"
#include "track/track.h"
#include "util/db/fwdsqlquery.h"
#include "util/math.h"
PlaylistDAO::PlaylistDAO()
: m_pAutoDJProcessor(nullptr) {
}
void PlaylistDAO::initialize(const QSqlDatabase& database) {
DAO::initialize(database);
populatePlaylistMembershipCache();
}
void PlaylistDAO::populatePlaylistMembershipCache() {
// Minor optimization: reserve space in m_playlistsTrackIsIn.
QSqlQuery query(m_database);
query.prepare(QStringLiteral("SELECT COUNT(*) from " PLAYLIST_TRACKS_TABLE));
if (query.exec() && query.next()) {
m_playlistsTrackIsIn.reserve(query.value(0).toInt());
} else {
LOG_FAILED_QUERY(query);
}
// now fetch all Tracks from all playlists and insert them into the hashmap
query.prepare(QStringLiteral(
"SELECT track_id, playlist_id from " PLAYLIST_TRACKS_TABLE));
if (!query.exec()) {
LOG_FAILED_QUERY(query);
}
const int trackIdColumn = query.record().indexOf(PLAYLISTTRACKSTABLE_TRACKID);
const int playlistIdColumn = query.record().indexOf(PLAYLISTTRACKSTABLE_PLAYLISTID);
while (query.next()) {
m_playlistsTrackIsIn.insert(TrackId(query.value(trackIdColumn)),
query.value(playlistIdColumn).toInt());
}
}
int PlaylistDAO::createPlaylist(const QString& name, const HiddenType hidden) {
//qDebug() << "PlaylistDAO::createPlaylist"
// << QThread::currentThread()
// << m_database.connectionName();
// Start the transaction
ScopedTransaction transaction(m_database);
// Find out the highest position for the existing playlists so we know what
// position this playlist should have.
QSqlQuery query(m_database);
query.prepare(QStringLiteral(
"SELECT max(position) as posmax FROM Playlists"));
if (!query.exec()) {
LOG_FAILED_QUERY(query);
return -1;
}
//Get the id of the last playlist.
int position = 0;
if (query.next()) {
position = query.value(query.record().indexOf("posmax")).toInt();
position++; // Append after the last playlist.
}
//qDebug() << "Inserting playlist" << name << "at position" << position;
query.prepare(QStringLiteral(
"INSERT INTO Playlists (name, position, hidden, date_created, date_modified) "
"VALUES (:name, :position, :hidden, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP)"));
query.bindValue(":name", name);
query.bindValue(":position", position);
query.bindValue(":hidden", static_cast<int>(hidden));
if (!query.exec()) {
LOG_FAILED_QUERY(query);
return -1;
}
int playlistId = query.lastInsertId().toInt();
// Commit the transaction
transaction.commit();
emit added(playlistId);
return playlistId;
}
int PlaylistDAO::createUniquePlaylist(QString* pName, const HiddenType hidden) {
int playlistId = getPlaylistIdFromName(*pName);
int i