+
+QList<Track> DbStorage::searchTracks(QString pattern) {
+ QList <Track> found;
+ QSqlQuery *query = _get_tracks_by_pattern_query;
+ query->bindValue(":ptitle", pattern.toUpper()); // with :pattern only doesn't work
+ query->exec();
+ // id, title, artist, album, source, count, length, year
+ while (query->next()) {
+ QString title = query->value(1).toString();
+ QString artist = query->value(2).toString();
+ QString album = query->value(3).toString();
+ QString source = query->value(4).toString();
+ int count = query->value(5).toInt();
+ int length = query->value(6).toInt();
+ int year = query->value(7).toInt();
+ TrackMetadata meta(title, artist, album, length);
+ meta.setYear(year);
+ Track track(meta, source);
+ track.setCount(count);
+ found.append(track);
+ }
+ return found;
+}
+
+void DbStorage::_cleanup() {
+ _remove_empty_albums_query->exec();
+ _remove_empty_artists_query->exec();
+}
+
+int DbStorage::_check_add_directory(QString path) {
+ QSqlQuery *query = _check_directory_query;
+ query->bindValue(":path", path);
+ query->exec();
+ if (query->next()) {
+ return query->value(0).toInt();
+ } else {
+ query = _insert_directory_query;
+ query->bindValue(":path", path);
+ query->exec();
+ return _check_add_directory(path);
+ }
+}
+
+QList<QString> DbStorage::getDirectories() {
+ QSqlQuery *query = _get_directories_query;
+ query->exec();
+ QList<QString> directories;
+ while (query->next()) {
+ directories.append(query->value(1).toString());
+ }
+ return directories;
+}
+
+int DbStorage::getArtistsCount() {
+ QSqlQuery *query = _get_artists_count_query;
+ query->exec();
+ if (query->next()) {
+ return query->value(0).toInt();
+ }
+ return 0;
+}
+
+int DbStorage::getAlbumsCount() {
+ QSqlQuery *query = _get_albums_count_query;
+ query->exec();
+ if (query->next()) {
+ return query->value(0).toInt();
+ }
+ return 0;
+}
+
+int DbStorage::getTracksCount() {
+ QSqlQuery *query = _get_tracks_count_query;
+ query->exec();
+ if (query->next()) {
+ return query->value(0).toInt();
+ }
+ return 0;
+}
+
+void DbStorage::deleteTracksFrom(QString path) {
+ QSqlQuery *query = _check_directory_query;
+ query->bindValue(":path", path);
+ query->exec();
+ if (query->next()) {
+ int id = query->value(0).toInt();
+ query = _remove_tracks_from_query;
+ query->bindValue(":directory_id", id);
+ query->exec();
+ query = _remove_directory_query;
+ query->bindValue(":path", path);
+ query->exec();
+ _cleanup();
+ }
+}
+
+void DbStorage::checkTracksFrom(QString path) {
+ QSqlQuery *query = _check_directory_query;
+ query->bindValue(":path", path);
+ query->exec();
+ if (query->next()) {
+ int id = query->value(0).toInt();
+ query = _get_tracks_source_from_query;
+ query->bindValue(":directory_id", id);
+ query->exec();
+ while (query->next()) {
+ QString source = query->value(0).toString();
+ if (!QFile::exists(source)) {
+ Track track(TrackMetadata(), source); // removeTrack uses only source field, so
+ removeTrack(track); // we can use this method
+ }
+ }
+ _cleanup();
+ }
+}
+
+void DbStorage::removeFromFavorites(Track track) {
+ QSqlQuery *query = _remove_track_from_favorites_query;
+ query->bindValue(":source", track.source());
+ query->exec();
+}
+
+bool DbStorage::isFavorite(Track track) {
+ QSqlQuery *query = _check_favorite_query;
+ query->bindValue(":source", track.source());
+ query->exec();
+ if (query->next()) {
+ QString ans = query->value(0).toString();
+ return ans == "yes";
+ }
+ return false;
+}