Changeset View
Changeset View
Standalone View
Standalone View
src/databaseinterface.cpp
- This file is larger than 256 KB, so syntax highlighting is disabled by default.
Show First 20 Lines • Show All 43 Lines • ▼ Show 20 Line(s) | |||||
44 | { | 44 | { | ||
45 | public: | 45 | public: | ||
46 | 46 | | |||
47 | DatabaseInterfacePrivate(const QSqlDatabase &tracksDatabase) | 47 | DatabaseInterfacePrivate(const QSqlDatabase &tracksDatabase) | ||
48 | : mTracksDatabase(tracksDatabase), mSelectAlbumQuery(mTracksDatabase), | 48 | : mTracksDatabase(tracksDatabase), mSelectAlbumQuery(mTracksDatabase), | ||
49 | mSelectTrackQuery(mTracksDatabase), mSelectAlbumIdFromTitleQuery(mTracksDatabase), | 49 | mSelectTrackQuery(mTracksDatabase), mSelectAlbumIdFromTitleQuery(mTracksDatabase), | ||
50 | mInsertAlbumQuery(mTracksDatabase), mSelectTrackIdFromTitleAlbumIdArtistQuery(mTracksDatabase), | 50 | mInsertAlbumQuery(mTracksDatabase), mSelectTrackIdFromTitleAlbumIdArtistQuery(mTracksDatabase), | ||
51 | mInsertTrackQuery(mTracksDatabase), mSelectTracksFromArtist(mTracksDatabase), | 51 | mInsertTrackQuery(mTracksDatabase), mSelectTracksFromArtist(mTracksDatabase), | ||
52 | mSelectTrackFromIdQuery(mTracksDatabase), mSelectCountAlbumsForArtistQuery(mTracksDatabase), | 52 | mSelectTrackFromIdQuery(mTracksDatabase), mSelectRadioFromIdQuery(mTracksDatabase), | ||
53 | mSelectCountAlbumsForArtistQuery(mTracksDatabase), | ||||
53 | mSelectTrackIdFromTitleArtistAlbumTrackDiscNumberQuery(mTracksDatabase), | 54 | mSelectTrackIdFromTitleArtistAlbumTrackDiscNumberQuery(mTracksDatabase), | ||
54 | mSelectAllAlbumsFromArtistQuery(mTracksDatabase), mSelectAllArtistsQuery(mTracksDatabase), | 55 | mSelectAllAlbumsFromArtistQuery(mTracksDatabase), mSelectAllArtistsQuery(mTracksDatabase), | ||
55 | mInsertArtistsQuery(mTracksDatabase), mSelectArtistByNameQuery(mTracksDatabase), | 56 | mInsertArtistsQuery(mTracksDatabase), mSelectArtistByNameQuery(mTracksDatabase), | ||
56 | mSelectArtistQuery(mTracksDatabase), mUpdateTrackStatistics(mTracksDatabase), | 57 | mSelectArtistQuery(mTracksDatabase), mUpdateTrackStatistics(mTracksDatabase), | ||
57 | mRemoveTrackQuery(mTracksDatabase), mRemoveAlbumQuery(mTracksDatabase), | 58 | mRemoveTrackQuery(mTracksDatabase), mRemoveAlbumQuery(mTracksDatabase), | ||
58 | mRemoveArtistQuery(mTracksDatabase), mSelectAllTracksQuery(mTracksDatabase), | 59 | mRemoveArtistQuery(mTracksDatabase), mSelectAllTracksQuery(mTracksDatabase), | ||
60 | mSelectAllRadiosQuery(mTracksDatabase), | ||||
mgallien: The initialization order for the members generate some warnings at compilation:
.. | |||||
59 | mInsertTrackMapping(mTracksDatabase), mUpdateTrackFirstPlayStatistics(mTracksDatabase), | 61 | mInsertTrackMapping(mTracksDatabase), mUpdateTrackFirstPlayStatistics(mTracksDatabase), | ||
60 | mInsertMusicSource(mTracksDatabase), mSelectMusicSource(mTracksDatabase), | 62 | mInsertMusicSource(mTracksDatabase), mSelectMusicSource(mTracksDatabase), | ||
61 | mUpdateTrackPriority(mTracksDatabase), mUpdateTrackFileModifiedTime(mTracksDatabase), | 63 | mUpdateTrackPriority(mTracksDatabase), mUpdateTrackFileModifiedTime(mTracksDatabase), | ||
62 | mSelectTracksMapping(mTracksDatabase), mSelectTracksMappingPriority(mTracksDatabase), | 64 | mSelectTracksMapping(mTracksDatabase), mSelectTracksMappingPriority(mTracksDatabase), | ||
63 | mUpdateAlbumArtUriFromAlbumIdQuery(mTracksDatabase), mSelectTracksMappingPriorityByTrackId(mTracksDatabase), | 65 | mUpdateAlbumArtUriFromAlbumIdQuery(mTracksDatabase), mSelectTracksMappingPriorityByTrackId(mTracksDatabase), | ||
64 | mSelectAlbumIdsFromArtist(mTracksDatabase), mSelectAllTrackFilesQuery(mTracksDatabase), | 66 | mSelectAlbumIdsFromArtist(mTracksDatabase), mSelectAllTrackFilesQuery(mTracksDatabase), | ||
65 | mRemoveTracksMappingFromSource(mTracksDatabase), mRemoveTracksMapping(mTracksDatabase), | 67 | mRemoveTracksMappingFromSource(mTracksDatabase), mRemoveTracksMapping(mTracksDatabase), | ||
66 | mSelectTracksWithoutMappingQuery(mTracksDatabase), mSelectAlbumIdFromTitleAndArtistQuery(mTracksDatabase), | 68 | mSelectTracksWithoutMappingQuery(mTracksDatabase), mSelectAlbumIdFromTitleAndArtistQuery(mTracksDatabase), | ||
Show All 12 Lines | |||||
79 | mUpdateAlbumArtistInTracksQuery(mTracksDatabase), mQueryMaximumTrackIdQuery(mTracksDatabase), | 81 | mUpdateAlbumArtistInTracksQuery(mTracksDatabase), mQueryMaximumTrackIdQuery(mTracksDatabase), | ||
80 | mQueryMaximumAlbumIdQuery(mTracksDatabase), mQueryMaximumArtistIdQuery(mTracksDatabase), | 82 | mQueryMaximumAlbumIdQuery(mTracksDatabase), mQueryMaximumArtistIdQuery(mTracksDatabase), | ||
81 | mQueryMaximumLyricistIdQuery(mTracksDatabase), mQueryMaximumComposerIdQuery(mTracksDatabase), | 83 | mQueryMaximumLyricistIdQuery(mTracksDatabase), mQueryMaximumComposerIdQuery(mTracksDatabase), | ||
82 | mQueryMaximumGenreIdQuery(mTracksDatabase), mSelectAllArtistsWithGenreFilterQuery(mTracksDatabase), | 84 | mQueryMaximumGenreIdQuery(mTracksDatabase), mSelectAllArtistsWithGenreFilterQuery(mTracksDatabase), | ||
83 | mSelectAllAlbumsShortWithGenreArtistFilterQuery(mTracksDatabase), mSelectAllAlbumsShortWithArtistFilterQuery(mTracksDatabase), | 85 | mSelectAllAlbumsShortWithGenreArtistFilterQuery(mTracksDatabase), mSelectAllAlbumsShortWithArtistFilterQuery(mTracksDatabase), | ||
84 | mSelectAllRecentlyPlayedTracksQuery(mTracksDatabase), mSelectAllFrequentlyPlayedTracksQuery(mTracksDatabase), | 86 | mSelectAllRecentlyPlayedTracksQuery(mTracksDatabase), mSelectAllFrequentlyPlayedTracksQuery(mTracksDatabase), | ||
85 | mClearTracksTable(mTracksDatabase), mClearAlbumsTable(mTracksDatabase), mClearArtistsTable(mTracksDatabase), | 87 | mClearTracksTable(mTracksDatabase), mClearAlbumsTable(mTracksDatabase), mClearArtistsTable(mTracksDatabase), | ||
86 | mClearComposerTable(mTracksDatabase), mClearGenreTable(mTracksDatabase), mClearLyricistTable(mTracksDatabase), | 88 | mClearComposerTable(mTracksDatabase), mClearGenreTable(mTracksDatabase), mClearLyricistTable(mTracksDatabase), | ||
87 | mArtistMatchGenreQuery(mTracksDatabase), mSelectTrackIdQuery(mTracksDatabase) | 89 | mArtistMatchGenreQuery(mTracksDatabase), mSelectTrackIdQuery(mTracksDatabase), | ||
90 | mInsertRadiosQuery(mTracksDatabase) | ||||
88 | { | 91 | { | ||
89 | } | 92 | } | ||
90 | 93 | | |||
91 | QSqlDatabase mTracksDatabase; | 94 | QSqlDatabase mTracksDatabase; | ||
92 | 95 | | |||
93 | QSqlQuery mSelectAlbumQuery; | 96 | QSqlQuery mSelectAlbumQuery; | ||
94 | 97 | | |||
95 | QSqlQuery mSelectTrackQuery; | 98 | QSqlQuery mSelectTrackQuery; | ||
96 | 99 | | |||
97 | QSqlQuery mSelectAlbumIdFromTitleQuery; | 100 | QSqlQuery mSelectAlbumIdFromTitleQuery; | ||
98 | 101 | | |||
99 | QSqlQuery mInsertAlbumQuery; | 102 | QSqlQuery mInsertAlbumQuery; | ||
100 | 103 | | |||
101 | QSqlQuery mSelectTrackIdFromTitleAlbumIdArtistQuery; | 104 | QSqlQuery mSelectTrackIdFromTitleAlbumIdArtistQuery; | ||
102 | 105 | | |||
103 | QSqlQuery mInsertTrackQuery; | 106 | QSqlQuery mInsertTrackQuery; | ||
104 | 107 | | |||
105 | QSqlQuery mSelectTracksFromArtist; | 108 | QSqlQuery mSelectTracksFromArtist; | ||
106 | 109 | | |||
107 | QSqlQuery mSelectTrackFromIdQuery; | 110 | QSqlQuery mSelectTrackFromIdQuery; | ||
108 | 111 | | |||
112 | QSqlQuery mSelectRadioFromIdQuery; | ||||
113 | | ||||
109 | QSqlQuery mSelectCountAlbumsForArtistQuery; | 114 | QSqlQuery mSelectCountAlbumsForArtistQuery; | ||
110 | 115 | | |||
111 | QSqlQuery mSelectTrackIdFromTitleArtistAlbumTrackDiscNumberQuery; | 116 | QSqlQuery mSelectTrackIdFromTitleArtistAlbumTrackDiscNumberQuery; | ||
112 | 117 | | |||
113 | QSqlQuery mSelectAllAlbumsFromArtistQuery; | 118 | QSqlQuery mSelectAllAlbumsFromArtistQuery; | ||
114 | 119 | | |||
115 | QSqlQuery mSelectAllArtistsQuery; | 120 | QSqlQuery mSelectAllArtistsQuery; | ||
116 | 121 | | |||
117 | QSqlQuery mInsertArtistsQuery; | 122 | QSqlQuery mInsertArtistsQuery; | ||
118 | 123 | | |||
119 | QSqlQuery mSelectArtistByNameQuery; | 124 | QSqlQuery mSelectArtistByNameQuery; | ||
120 | 125 | | |||
121 | QSqlQuery mSelectArtistQuery; | 126 | QSqlQuery mSelectArtistQuery; | ||
122 | 127 | | |||
123 | QSqlQuery mUpdateTrackStatistics; | 128 | QSqlQuery mUpdateTrackStatistics; | ||
124 | 129 | | |||
125 | QSqlQuery mRemoveTrackQuery; | 130 | QSqlQuery mRemoveTrackQuery; | ||
126 | 131 | | |||
127 | QSqlQuery mRemoveAlbumQuery; | 132 | QSqlQuery mRemoveAlbumQuery; | ||
128 | 133 | | |||
129 | QSqlQuery mRemoveArtistQuery; | 134 | QSqlQuery mRemoveArtistQuery; | ||
130 | 135 | | |||
131 | QSqlQuery mSelectAllTracksQuery; | 136 | QSqlQuery mSelectAllTracksQuery; | ||
132 | 137 | | |||
138 | QSqlQuery mSelectAllRadiosQuery; | ||||
139 | | ||||
133 | QSqlQuery mInsertTrackMapping; | 140 | QSqlQuery mInsertTrackMapping; | ||
134 | 141 | | |||
135 | QSqlQuery mUpdateTrackFirstPlayStatistics; | 142 | QSqlQuery mUpdateTrackFirstPlayStatistics; | ||
136 | 143 | | |||
137 | QSqlQuery mInsertMusicSource; | 144 | QSqlQuery mInsertMusicSource; | ||
138 | 145 | | |||
139 | QSqlQuery mSelectMusicSource; | 146 | QSqlQuery mSelectMusicSource; | ||
140 | 147 | | |||
▲ Show 20 Lines • Show All 102 Lines • ▼ Show 20 Line(s) | |||||
243 | QSqlQuery mClearGenreTable; | 250 | QSqlQuery mClearGenreTable; | ||
244 | 251 | | |||
245 | QSqlQuery mClearLyricistTable; | 252 | QSqlQuery mClearLyricistTable; | ||
246 | 253 | | |||
247 | QSqlQuery mArtistMatchGenreQuery; | 254 | QSqlQuery mArtistMatchGenreQuery; | ||
248 | 255 | | |||
249 | QSqlQuery mSelectTrackIdQuery; | 256 | QSqlQuery mSelectTrackIdQuery; | ||
250 | 257 | | |||
258 | QSqlQuery mInsertRadiosQuery; | ||||
259 | | ||||
251 | QSet<qulonglong> mModifiedTrackIds; | 260 | QSet<qulonglong> mModifiedTrackIds; | ||
252 | 261 | | |||
253 | QSet<qulonglong> mModifiedAlbumIds; | 262 | QSet<qulonglong> mModifiedAlbumIds; | ||
254 | 263 | | |||
255 | QSet<qulonglong> mModifiedArtistIds; | 264 | QSet<qulonglong> mModifiedArtistIds; | ||
256 | 265 | | |||
257 | QSet<qulonglong> mInsertedTracks; | 266 | QSet<qulonglong> mInsertedTracks; | ||
258 | 267 | | |||
▲ Show 20 Lines • Show All 100 Lines • ▼ Show 20 Line(s) | 354 | { | |||
359 | transactionResult = finishTransaction(); | 368 | transactionResult = finishTransaction(); | ||
360 | if (!transactionResult) { | 369 | if (!transactionResult) { | ||
361 | return result; | 370 | return result; | ||
362 | } | 371 | } | ||
363 | 372 | | |||
364 | return result; | 373 | return result; | ||
365 | } | 374 | } | ||
366 | 375 | | |||
376 | DatabaseInterface::ListTrackDataType DatabaseInterface::allRadiosData() | ||||
377 | { | ||||
378 | auto result = ListTrackDataType{}; | ||||
379 | | ||||
380 | if (!d) { | ||||
381 | return result; | ||||
382 | } | ||||
383 | | ||||
384 | auto transactionResult = startTransaction(); | ||||
385 | if (!transactionResult) { | ||||
386 | return result; | ||||
387 | } | ||||
388 | | ||||
389 | result = internalAllRadiosPartialData(); | ||||
390 | | ||||
391 | transactionResult = finishTransaction(); | ||||
392 | if (!transactionResult) { | ||||
393 | return result; | ||||
394 | } | ||||
395 | | ||||
396 | return result; | ||||
397 | } | ||||
398 | | ||||
367 | DatabaseInterface::ListTrackDataType DatabaseInterface::recentlyPlayedTracksData(int count) | 399 | DatabaseInterface::ListTrackDataType DatabaseInterface::recentlyPlayedTracksData(int count) | ||
368 | { | 400 | { | ||
369 | auto result = ListTrackDataType{}; | 401 | auto result = ListTrackDataType{}; | ||
370 | 402 | | |||
371 | if (!d) { | 403 | if (!d) { | ||
372 | return result; | 404 | return result; | ||
373 | } | 405 | } | ||
374 | 406 | | |||
▲ Show 20 Lines • Show All 322 Lines • ▼ Show 20 Line(s) | 715 | { | |||
697 | transactionResult = finishTransaction(); | 729 | transactionResult = finishTransaction(); | ||
698 | if (!transactionResult) { | 730 | if (!transactionResult) { | ||
699 | return result; | 731 | return result; | ||
700 | } | 732 | } | ||
701 | 733 | | |||
702 | return result; | 734 | return result; | ||
703 | } | 735 | } | ||
704 | 736 | | |||
737 | DatabaseInterface::TrackDataType DatabaseInterface::radioDataFromDatabaseId(qulonglong id) | ||||
738 | { | ||||
739 | auto result = TrackDataType(); | ||||
740 | | ||||
741 | if (!d) { | ||||
742 | return result; | ||||
743 | } | ||||
744 | | ||||
745 | auto transactionResult = startTransaction(); | ||||
746 | if (!transactionResult) { | ||||
747 | return result; | ||||
748 | } | ||||
749 | | ||||
750 | result = internalOneRadioPartialData(id); | ||||
751 | | ||||
752 | transactionResult = finishTransaction(); | ||||
753 | if (!transactionResult) { | ||||
754 | return result; | ||||
755 | } | ||||
756 | | ||||
757 | return result; | ||||
758 | } | ||||
759 | | ||||
705 | qulonglong DatabaseInterface::trackIdFromTitleAlbumTrackDiscNumber(const QString &title, const QString &artist, const QString &album, | 760 | qulonglong DatabaseInterface::trackIdFromTitleAlbumTrackDiscNumber(const QString &title, const QString &artist, const QString &album, | ||
706 | int trackNumber, int discNumber) | 761 | int trackNumber, int discNumber) | ||
707 | { | 762 | { | ||
708 | auto result = qulonglong(0); | 763 | auto result = qulonglong(0); | ||
709 | 764 | | |||
710 | if (!d) { | 765 | if (!d) { | ||
711 | return result; | 766 | return result; | ||
712 | } | 767 | } | ||
▲ Show 20 Lines • Show All 435 Lines • ▼ Show 20 Line(s) | 1150 | { | |||
1148 | listTables = d->mTracksDatabase.tables(); | 1203 | listTables = d->mTracksDatabase.tables(); | ||
1149 | 1204 | | |||
1150 | if (listTables.contains(QStringLiteral("DatabaseVersionV5")) && | 1205 | if (listTables.contains(QStringLiteral("DatabaseVersionV5")) && | ||
1151 | !listTables.contains(QStringLiteral("DatabaseVersionV9"))) { | 1206 | !listTables.contains(QStringLiteral("DatabaseVersionV9"))) { | ||
1152 | upgradeDatabaseV9(); | 1207 | upgradeDatabaseV9(); | ||
1153 | upgradeDatabaseV11(); | 1208 | upgradeDatabaseV11(); | ||
1154 | upgradeDatabaseV12(); | 1209 | upgradeDatabaseV12(); | ||
1155 | upgradeDatabaseV13(); | 1210 | upgradeDatabaseV13(); | ||
1211 | upgradeDatabaseV14(); | ||||
1156 | 1212 | | |||
1157 | checkDatabaseSchema(); | 1213 | checkDatabaseSchema(); | ||
1158 | } else if (listTables.contains(QStringLiteral("DatabaseVersionV9"))) { | 1214 | } else if (listTables.contains(QStringLiteral("DatabaseVersionV9"))) { | ||
1159 | if (!listTables.contains(QStringLiteral("DatabaseVersionV11"))) { | 1215 | if (!listTables.contains(QStringLiteral("DatabaseVersionV11"))) { | ||
1160 | upgradeDatabaseV11(); | 1216 | upgradeDatabaseV11(); | ||
1161 | } | 1217 | } | ||
1162 | if (!listTables.contains(QStringLiteral("DatabaseVersionV12"))) { | 1218 | if (!listTables.contains(QStringLiteral("DatabaseVersionV12"))) { | ||
1163 | upgradeDatabaseV12(); | 1219 | upgradeDatabaseV12(); | ||
1164 | } | 1220 | } | ||
1165 | if (!listTables.contains(QStringLiteral("DatabaseVersionV13"))) { | 1221 | if (!listTables.contains(QStringLiteral("DatabaseVersionV13"))) { | ||
1166 | upgradeDatabaseV13(); | 1222 | upgradeDatabaseV13(); | ||
1167 | } | 1223 | } | ||
1224 | if(!listTables.contains(QStringLiteral("DatabaseVersionV14"))){ | ||||
1225 | upgradeDatabaseV14(); | ||||
1226 | } | ||||
1168 | 1227 | | |||
1169 | checkDatabaseSchema(); | 1228 | checkDatabaseSchema(); | ||
1170 | } else { | 1229 | } else { | ||
1171 | createDatabaseV9(); | 1230 | createDatabaseV9(); | ||
1172 | upgradeDatabaseV11(); | 1231 | upgradeDatabaseV11(); | ||
1173 | upgradeDatabaseV12(); | 1232 | upgradeDatabaseV12(); | ||
1174 | upgradeDatabaseV13(); | 1233 | upgradeDatabaseV13(); | ||
1234 | upgradeDatabaseV14(); | ||||
1175 | } | 1235 | } | ||
1176 | } | 1236 | } | ||
1177 | 1237 | | |||
1178 | void DatabaseInterface::createDatabaseV9() | 1238 | void DatabaseInterface::createDatabaseV9() | ||
1179 | { | 1239 | { | ||
1180 | qCInfo(orgKdeElisaDatabase) << "begin creation of v9 database schema"; | 1240 | qCInfo(orgKdeElisaDatabase) << "begin creation of v9 database schema"; | ||
1181 | 1241 | | |||
1182 | { | 1242 | { | ||
▲ Show 20 Lines • Show All 1547 Lines • ▼ Show 20 Line(s) | 2787 | if (!result) { | |||
2730 | 2790 | | |||
2731 | Q_EMIT databaseError(); | 2791 | Q_EMIT databaseError(); | ||
2732 | } | 2792 | } | ||
2733 | } | 2793 | } | ||
2734 | 2794 | | |||
2735 | qCInfo(orgKdeElisaDatabase) << "finished update to v13 of database schema"; | 2795 | qCInfo(orgKdeElisaDatabase) << "finished update to v13 of database schema"; | ||
2736 | } | 2796 | } | ||
2737 | 2797 | | |||
2798 | void DatabaseInterface::upgradeDatabaseV14() | ||||
2799 | { | ||||
2800 | qCInfo(orgKdeElisaDatabase) << "begin update to v14 of database schema"; | ||||
2801 | | ||||
2802 | { | ||||
2803 | QSqlQuery createSchemaQuery(d->mTracksDatabase); | ||||
2804 | | ||||
2805 | const auto &result = createSchemaQuery.exec(QStringLiteral("CREATE TABLE `DatabaseVersionV14` (`Version` INTEGER PRIMARY KEY NOT NULL)")); | ||||
2806 | | ||||
2807 | if (!result) { | ||||
2808 | qCDebug(orgKdeElisaDatabase) << "DatabaseInterface::upgradeDatabaseV14" << createSchemaQuery.lastQuery(); | ||||
2809 | qCDebug(orgKdeElisaDatabase) << "DatabaseInterface::upgradeDatabaseV14" << createSchemaQuery.lastError(); | ||||
2810 | | ||||
2811 | Q_EMIT databaseError(); | ||||
2812 | } | ||||
2813 | } | ||||
2814 | | ||||
2815 | { | ||||
2816 | QSqlQuery disableForeignKeys(d->mTracksDatabase); | ||||
2817 | | ||||
2818 | auto result = disableForeignKeys.exec(QStringLiteral(" PRAGMA foreign_keys=OFF")); | ||||
2819 | | ||||
2820 | if (!result) { | ||||
2821 | qCDebug(orgKdeElisaDatabase) << "DatabaseInterface::upgradeDatabaseV14" << disableForeignKeys.lastQuery(); | ||||
2822 | qCDebug(orgKdeElisaDatabase) << "DatabaseInterface::upgradeDatabaseV14" << disableForeignKeys.lastError(); | ||||
2823 | | ||||
2824 | Q_EMIT databaseError(); | ||||
2825 | } | ||||
2826 | } | ||||
2827 | | ||||
2828 | d->mTracksDatabase.transaction(); | ||||
2829 | | ||||
2830 | { | ||||
2831 | QSqlQuery createSchemaQuery(d->mTracksDatabase); | ||||
2832 | | ||||
2833 | const auto &result = createSchemaQuery.exec(QStringLiteral("CREATE TABLE `Radios` (" | ||||
2834 | "`ID` INTEGER PRIMARY KEY AUTOINCREMENT, " | ||||
2835 | "`HttpAddress` VARCHAR(255) NOT NULL, " | ||||
2836 | "`Priority` INTEGER NOT NULL, " | ||||
Are you sure this column is needed ? mgallien: Are you sure this column is needed ?
The tracks have a Priority columns in order to deal with… | |||||
For now it is not needed, when I implemented the request, I was not sure about the priority purpose nor about what to keep. Given the role it makes more sense to remove it. jguidon: For now it is not needed, when I implemented the request, I was not sure about the priority… | |||||
2837 | "`Title` VARCHAR(85) NOT NULL, " | ||||
2838 | "`Rating` INTEGER NOT NULL DEFAULT 0, " | ||||
2839 | "`Genre` VARCHAR(55), " | ||||
2840 | "`Comment` VARCHAR(255), " | ||||
2841 | "UNIQUE (" | ||||
2842 | "`HttpAddress`" | ||||
2843 | "), " | ||||
2844 | "UNIQUE (" | ||||
2845 | "`Priority`, `Title`, `HttpAddress`" | ||||
2846 | ") " | ||||
2847 | "CONSTRAINT fk_tracks_genre FOREIGN KEY (`Genre`) REFERENCES `Genre`(`Name`))" | ||||
2848 | )); | ||||
2849 | | ||||
2850 | if (!result) { | ||||
2851 | qCDebug(orgKdeElisaDatabase) << "DatabaseInterface::upgradeDatabaseV14" << createSchemaQuery.lastQuery(); | ||||
2852 | qCDebug(orgKdeElisaDatabase) << "DatabaseInterface::upgradeDatabaseV14" << createSchemaQuery.lastError(); | ||||
2853 | | ||||
2854 | Q_EMIT databaseError(); | ||||
2855 | } | ||||
2856 | } | ||||
2857 | | ||||
2858 | { | ||||
2859 | QSqlQuery createSchemaQuery(d->mTracksDatabase); | ||||
2860 | | ||||
2861 | //Find webradios (french): https://doc.ubuntu-fr.org/liste_radio_france | ||||
2862 | //English: https://www.radio.fr/language/english (to get the link play a radio and look for streamUrl in the html elements page). | ||||
2863 | const auto &result = createSchemaQuery.exec(QStringLiteral("INSERT INTO `Radios` (`HttpAddress`, `Priority`, `Title`) " | ||||
2864 | "SELECT 'http://classicrock.stream.ouifm.fr/ouifm3.mp3', 1, 'OuiFM_Classic_Rock' UNION ALL " | ||||
2865 | "SELECT 'http://rock70s.stream.ouifm.fr/ouifmseventies.mp3', 1, 'OuiFM_70s' UNION ALL " | ||||
2866 | "SELECT 'http://jazzradio.ice.infomaniak.ch/jazzradio-high.mp3', 2 , 'Jazz_Radio' UNION ALL " | ||||
2867 | "SELECT 'http://cdn.nrjaudio.fm/audio1/fr/30601/mp3_128.mp3?origine=playerweb', 1, 'Nostalgie' UNION ALL " | ||||
2868 | "SELECT 'https://scdn.nrjaudio.fm/audio1/fr/30713/aac_64.mp3?origine=playerweb', 1, 'Nostalgie Johnny' UNION ALL " | ||||
2869 | "SELECT 'http://sc-classrock.1.fm:8200', 1, 'Classic rock replay' UNION ALL " | ||||
2870 | "SELECT 'http://agnes.torontocast.com:8151/stream', 1, 'Instrumentals Forever' UNION ALL " | ||||
2871 | "SELECT 'https://stream.laut.fm/jahfari', 1, 'Jahfari'" | ||||
2872 | )); | ||||
2873 | if (!result) { | ||||
2874 | qCDebug(orgKdeElisaDatabase) << "DatabaseInterface::initRequest" << createSchemaQuery.lastQuery(); | ||||
2875 | qCDebug(orgKdeElisaDatabase) << "DatabaseInterface::initRequest" << createSchemaQuery.lastError(); | ||||
2876 | | ||||
2877 | Q_EMIT databaseError(); | ||||
2878 | } | ||||
2879 | } | ||||
2880 | | ||||
2881 | d->mTracksDatabase.commit(); | ||||
2882 | | ||||
2883 | { | ||||
2884 | QSqlQuery enableForeignKeys(d->mTracksDatabase); | ||||
2885 | | ||||
2886 | auto result = enableForeignKeys.exec(QStringLiteral(" PRAGMA foreign_keys=ON")); | ||||
2887 | | ||||
2888 | if (!result) { | ||||
2889 | qCDebug(orgKdeElisaDatabase) << "DatabaseInterface::upgradeDatabaseV14" << enableForeignKeys.lastQuery(); | ||||
2890 | qCDebug(orgKdeElisaDatabase) << "DatabaseInterface::upgradeDatabaseV14" << enableForeignKeys.lastError(); | ||||
2891 | | ||||
2892 | Q_EMIT databaseError(); | ||||
2893 | } | ||||
2894 | } | ||||
2895 | | ||||
2896 | qCInfo(orgKdeElisaDatabase) << "finished update to v14 of database schema"; | ||||
2897 | } | ||||
2898 | | ||||
2738 | void DatabaseInterface::checkDatabaseSchema() | 2899 | void DatabaseInterface::checkDatabaseSchema() | ||
2739 | { | 2900 | { | ||
2740 | checkAlbumsTableSchema(); | 2901 | checkAlbumsTableSchema(); | ||
2741 | if (d->mIsInBadState) | 2902 | if (d->mIsInBadState) | ||
2742 | { | 2903 | { | ||
2743 | resetDatabase(); | 2904 | resetDatabase(); | ||
2744 | return; | 2905 | return; | ||
2745 | } | 2906 | } | ||
▲ Show 20 Lines • Show All 635 Lines • ▼ Show 20 Line(s) | 3541 | if (!result) { | |||
3381 | qCDebug(orgKdeElisaDatabase) << "DatabaseInterface::initRequest" << d->mSelectAllTracksQuery.lastQuery(); | 3542 | qCDebug(orgKdeElisaDatabase) << "DatabaseInterface::initRequest" << d->mSelectAllTracksQuery.lastQuery(); | ||
3382 | qCDebug(orgKdeElisaDatabase) << "DatabaseInterface::initRequest" << d->mSelectAllTracksQuery.lastError(); | 3543 | qCDebug(orgKdeElisaDatabase) << "DatabaseInterface::initRequest" << d->mSelectAllTracksQuery.lastError(); | ||
3383 | 3544 | | |||
3384 | Q_EMIT databaseError(); | 3545 | Q_EMIT databaseError(); | ||
3385 | } | 3546 | } | ||
3386 | } | 3547 | } | ||
3387 | 3548 | | |||
3388 | { | 3549 | { | ||
3550 | auto selectAllRadiosText = QStringLiteral("SELECT " | ||||
3551 | "radios.`ID`, " | ||||
3552 | "radios.`Title`, " | ||||
3553 | "radios.`HttpAddress`, " | ||||
3554 | "radios.`Rating`, " | ||||
3555 | "trackGenre.`Name`, " | ||||
3556 | "radios.`Comment` " | ||||
3557 | "FROM " | ||||
3558 | "`Radios` radios " | ||||
3559 | "LEFT JOIN `Genre` trackGenre ON trackGenre.`Name` = radios.`Genre` " | ||||
3560 | ""); | ||||
3561 | | ||||
3562 | auto result = prepareQuery(d->mSelectAllRadiosQuery, selectAllRadiosText); | ||||
3563 | | ||||
3564 | if (!result) { | ||||
3565 | qCDebug(orgKdeElisaDatabase) << "DatabaseInterface::initRequest" << d->mSelectAllRadiosQuery.lastQuery(); | ||||
3566 | qCDebug(orgKdeElisaDatabase) << "DatabaseInterface::initRequest" << d->mSelectAllRadiosQuery.lastError(); | ||||
3567 | | ||||
3568 | Q_EMIT databaseError(); | ||||
3569 | } | ||||
3570 | } | ||||
3571 | | ||||
3572 | { | ||||
3389 | auto selectAllTracksText = QStringLiteral("SELECT " | 3573 | auto selectAllTracksText = QStringLiteral("SELECT " | ||
3390 | "tracks.`ID`, " | 3574 | "tracks.`ID`, " | ||
3391 | "tracks.`Title`, " | 3575 | "tracks.`Title`, " | ||
3392 | "album.`ID`, " | 3576 | "album.`ID`, " | ||
3393 | "tracks.`ArtistName`, " | 3577 | "tracks.`ArtistName`, " | ||
3394 | "tracks.`AlbumArtistName`, " | 3578 | "tracks.`AlbumArtistName`, " | ||
3395 | "tracksMapping.`FileName`, " | 3579 | "tracksMapping.`FileName`, " | ||
3396 | "tracksMapping.`FileModifiedTime`, " | 3580 | "tracksMapping.`FileModifiedTime`, " | ||
▲ Show 20 Lines • Show All 637 Lines • ▼ Show 20 Line(s) | 4131 | { | |||
4034 | 4218 | | |||
4035 | if (!result) { | 4219 | if (!result) { | ||
4036 | qCDebug(orgKdeElisaDatabase) << "DatabaseInterface::initRequest" << d->mSelectTrackFromIdQuery.lastQuery(); | 4220 | qCDebug(orgKdeElisaDatabase) << "DatabaseInterface::initRequest" << d->mSelectTrackFromIdQuery.lastQuery(); | ||
4037 | qCDebug(orgKdeElisaDatabase) << "DatabaseInterface::initRequest" << d->mSelectTrackFromIdQuery.lastError(); | 4221 | qCDebug(orgKdeElisaDatabase) << "DatabaseInterface::initRequest" << d->mSelectTrackFromIdQuery.lastError(); | ||
4038 | 4222 | | |||
4039 | Q_EMIT databaseError(); | 4223 | Q_EMIT databaseError(); | ||
4040 | } | 4224 | } | ||
4041 | } | 4225 | } | ||
4226 | | ||||
4227 | { | ||||
4228 | auto selectRadioFromIdQueryText = QStringLiteral("SELECT " | ||||
4229 | "radios.`ID`, " | ||||
4230 | "radios.`Title`, " | ||||
4231 | "radios.`HttpAddress`, " | ||||
4232 | "radios.`Rating`, " | ||||
4233 | "trackGenre.`Name`, " | ||||
4234 | "radios.`Comment` " | ||||
4235 | "FROM " | ||||
4236 | "`Radios` radios " | ||||
4237 | "LEFT JOIN `Genre` trackGenre ON trackGenre.`Name` = radios.`Genre` " | ||||
4238 | "WHERE " | ||||
4239 | "radios.`ID` = :radioId " | ||||
4240 | ""); | ||||
4241 | | ||||
4242 | auto result = prepareQuery(d->mSelectRadioFromIdQuery, selectRadioFromIdQueryText); | ||||
4243 | | ||||
4244 | if (!result) { | ||||
4245 | qCDebug(orgKdeElisaDatabase) << "DatabaseInterface::initRequest" << d->mSelectRadioFromIdQuery.lastQuery(); | ||||
4246 | qCDebug(orgKdeElisaDatabase) << "DatabaseInterface::initRequest" << d->mSelectRadioFromIdQuery.lastError(); | ||||
4247 | | ||||
4248 | Q_EMIT databaseError(); | ||||
4249 | } | ||||
4250 | } | ||||
4042 | { | 4251 | { | ||
4043 | auto selectCountAlbumsQueryText = QStringLiteral("SELECT count(*) " | 4252 | auto selectCountAlbumsQueryText = QStringLiteral("SELECT count(*) " | ||
4044 | "FROM `Albums` album " | 4253 | "FROM `Albums` album " | ||
4045 | "WHERE album.`ArtistName` = :artistName "); | 4254 | "WHERE album.`ArtistName` = :artistName "); | ||
4046 | 4255 | | |||
4047 | const auto result = prepareQuery(d->mSelectCountAlbumsForArtistQuery, selectCountAlbumsQueryText); | 4256 | const auto result = prepareQuery(d->mSelectCountAlbumsForArtistQuery, selectCountAlbumsQueryText); | ||
4048 | 4257 | | |||
4049 | if (!result) { | 4258 | if (!result) { | ||
▲ Show 20 Lines • Show All 1779 Lines • ▼ Show 20 Line(s) | 5991 | { | |||
5829 | } | 6038 | } | ||
5830 | result[TrackDataType::key_type::PlayCounter] = trackRecord.value(26); | 6039 | result[TrackDataType::key_type::PlayCounter] = trackRecord.value(26); | ||
5831 | result[TrackDataType::key_type::PlayFrequency] = trackRecord.value(27); | 6040 | result[TrackDataType::key_type::PlayFrequency] = trackRecord.value(27); | ||
5832 | result[DataType::key_type::ElementTypeRole] = ElisaUtils::Track; | 6041 | result[DataType::key_type::ElementTypeRole] = ElisaUtils::Track; | ||
5833 | 6042 | | |||
5834 | return result; | 6043 | return result; | ||
5835 | } | 6044 | } | ||
5836 | 6045 | | |||
6046 | DatabaseInterface::TrackDataType DatabaseInterface::buildRadioDataFromDatabaseRecord(const QSqlRecord &trackRecord) const | ||||
6047 | { | ||||
6048 | TrackDataType result; | ||||
6049 | | ||||
6050 | result[TrackDataType::key_type::DatabaseIdRole] = trackRecord.value(0); | ||||
6051 | result[TrackDataType::key_type::TitleRole] = trackRecord.value(1); | ||||
6052 | | ||||
6053 | result[TrackDataType::key_type::AlbumRole] = QStringLiteral("Radios"); | ||||
6054 | result[TrackDataType::key_type::ArtistRole] = trackRecord.value(1); | ||||
6055 | | ||||
6056 | result[TrackDataType::key_type::HttpAddressRole] = trackRecord.value(2); | ||||
6057 | result[TrackDataType::key_type::ResourceRole] = trackRecord.value(2); | ||||
6058 | result[TrackDataType::key_type::RatingRole] = trackRecord.value(3); | ||||
6059 | if (!trackRecord.value(4).isNull()) { | ||||
6060 | result[TrackDataType::key_type::GenreRole] = trackRecord.value(4); | ||||
6061 | } | ||||
6062 | result[TrackDataType::key_type::CommentRole] = trackRecord.value(5); | ||||
6063 | result[DataType::key_type::ElementTypeRole] = ElisaUtils::Radio; | ||||
6064 | | ||||
6065 | return result; | ||||
6066 | } | ||||
6067 | | ||||
5837 | void DatabaseInterface::internalRemoveTracksList(const QList<QUrl> &removedTracks) | 6068 | void DatabaseInterface::internalRemoveTracksList(const QList<QUrl> &removedTracks) | ||
5838 | { | 6069 | { | ||
5839 | QSet<qulonglong> modifiedAlbums; | 6070 | QSet<qulonglong> modifiedAlbums; | ||
5840 | 6071 | | |||
5841 | QUrl::FormattingOptions currentOptions = QUrl::PreferLocalFile | | 6072 | QUrl::FormattingOptions currentOptions = QUrl::PreferLocalFile | | ||
5842 | QUrl::RemoveAuthority | QUrl::RemoveFilename | QUrl::RemoveFragment | | 6073 | QUrl::RemoveAuthority | QUrl::RemoveFilename | QUrl::RemoveFragment | | ||
5843 | QUrl::RemovePassword | QUrl::RemovePort | QUrl::RemoveQuery | | 6074 | QUrl::RemovePassword | QUrl::RemovePort | QUrl::RemoveQuery | | ||
5844 | QUrl::RemoveScheme | QUrl::RemoveUserInfo; | 6075 | QUrl::RemoveScheme | QUrl::RemoveUserInfo; | ||
▲ Show 20 Lines • Show All 897 Lines • ▼ Show 20 Line(s) | 6968 | while(d->mSelectAllTracksQuery.next()) { | |||
6742 | result.push_back(newData); | 6973 | result.push_back(newData); | ||
6743 | } | 6974 | } | ||
6744 | 6975 | | |||
6745 | d->mSelectAllTracksQuery.finish(); | 6976 | d->mSelectAllTracksQuery.finish(); | ||
6746 | 6977 | | |||
6747 | return result; | 6978 | return result; | ||
6748 | } | 6979 | } | ||
6749 | 6980 | | |||
6981 | DatabaseInterface::ListTrackDataType DatabaseInterface::internalAllRadiosPartialData() | ||||
6982 | { | ||||
6983 | auto result = ListTrackDataType{}; | ||||
6984 | | ||||
6985 | if (!internalGenericPartialData(d->mSelectAllRadiosQuery)) { | ||||
6986 | return result; | ||||
6987 | } | ||||
6988 | | ||||
6989 | while(d->mSelectAllRadiosQuery.next()) { | ||||
6990 | const auto ¤tRecord = d->mSelectAllRadiosQuery.record(); | ||||
6991 | | ||||
6992 | auto newData = buildRadioDataFromDatabaseRecord(currentRecord); | ||||
6993 | | ||||
6994 | result.push_back(newData); | ||||
6995 | } | ||||
6996 | | ||||
6997 | d->mSelectAllRadiosQuery.finish(); | ||||
6998 | | ||||
6999 | return result; | ||||
7000 | } | ||||
7001 | | ||||
6750 | DatabaseInterface::ListTrackDataType DatabaseInterface::internalRecentlyPlayedTracksData(int count) | 7002 | DatabaseInterface::ListTrackDataType DatabaseInterface::internalRecentlyPlayedTracksData(int count) | ||
6751 | { | 7003 | { | ||
6752 | auto result = ListTrackDataType{}; | 7004 | auto result = ListTrackDataType{}; | ||
6753 | 7005 | | |||
6754 | d->mSelectAllRecentlyPlayedTracksQuery.bindValue(QStringLiteral(":maximumResults"), count); | 7006 | d->mSelectAllRecentlyPlayedTracksQuery.bindValue(QStringLiteral(":maximumResults"), count); | ||
6755 | 7007 | | |||
6756 | if (!internalGenericPartialData(d->mSelectAllRecentlyPlayedTracksQuery)) { | 7008 | if (!internalGenericPartialData(d->mSelectAllRecentlyPlayedTracksQuery)) { | ||
6757 | return result; | 7009 | return result; | ||
▲ Show 20 Lines • Show All 51 Lines • ▼ Show 20 Line(s) | 7058 | if (d->mSelectTrackFromIdQuery.next()) { | |||
6809 | result = buildTrackDataFromDatabaseRecord(currentRecord); | 7061 | result = buildTrackDataFromDatabaseRecord(currentRecord); | ||
6810 | } | 7062 | } | ||
6811 | 7063 | | |||
6812 | d->mSelectTrackFromIdQuery.finish(); | 7064 | d->mSelectTrackFromIdQuery.finish(); | ||
6813 | 7065 | | |||
6814 | return result; | 7066 | return result; | ||
6815 | } | 7067 | } | ||
6816 | 7068 | | |||
7069 | DatabaseInterface::TrackDataType DatabaseInterface::internalOneRadioPartialData(qulonglong databaseId) | ||||
7070 | { | ||||
7071 | auto result = TrackDataType{}; | ||||
7072 | | ||||
7073 | d->mSelectRadioFromIdQuery.bindValue(QStringLiteral(":radioId"), databaseId); | ||||
7074 | | ||||
7075 | if (!internalGenericPartialData(d->mSelectRadioFromIdQuery)) { | ||||
7076 | return result; | ||||
7077 | } | ||||
7078 | | ||||
7079 | if (d->mSelectRadioFromIdQuery.next()) { | ||||
7080 | const auto ¤tRecord = d->mSelectRadioFromIdQuery.record(); | ||||
7081 | | ||||
7082 | result = buildRadioDataFromDatabaseRecord(currentRecord); | ||||
7083 | } | ||||
7084 | | ||||
7085 | d->mSelectRadioFromIdQuery.finish(); | ||||
7086 | | ||||
7087 | return result; | ||||
7088 | } | ||||
7089 | | ||||
6817 | DatabaseInterface::ListGenreDataType DatabaseInterface::internalAllGenresPartialData() | 7090 | DatabaseInterface::ListGenreDataType DatabaseInterface::internalAllGenresPartialData() | ||
6818 | { | 7091 | { | ||
6819 | ListGenreDataType result; | 7092 | ListGenreDataType result; | ||
6820 | 7093 | | |||
6821 | if (!internalGenericPartialData(d->mSelectAllGenresQuery)) { | 7094 | if (!internalGenericPartialData(d->mSelectAllGenresQuery)) { | ||
6822 | return result; | 7095 | return result; | ||
6823 | } | 7096 | } | ||
6824 | 7097 | | |||
▲ Show 20 Lines • Show All 179 Lines • Show Last 20 Lines |
The initialization order for the members generate some warnings at compilation:
../src/databaseinterface.cpp: In constructor ‘DatabaseInterfacePrivate::DatabaseInterfacePrivate(const QSqlDatabase&)’:
../src/databaseinterface.cpp:158:15: warning: ‘DatabaseInterfacePrivate::mSelectTracksMappingPriority’ will be initialized after [-Wreorder]
../src/databaseinterface.cpp:156:15: warning: ‘QSqlQuery DatabaseInterfacePrivate::mSelectRadioIdFromHttpAddress’ [-Wreorder]
../src/databaseinterface.cpp:47:5: warning: when initialized here [-Wreorder]
../src/databaseinterface.cpp:222:15: warning: ‘DatabaseInterfacePrivate::mUpdateAlbumArtistQuery’ will be initialized after [-Wreorder]
../src/databaseinterface.cpp:220:15: warning: ‘QSqlQuery DatabaseInterfacePrivate::mUpdateRadioQuery’ [-Wreorder]
../src/databaseinterface.cpp:47:5: warning: when initialized here [-Wreorder]