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 | checkDatabaseSchema(); | 1203 | checkDatabaseSchema(); | ||
1149 | listTables = d->mTracksDatabase.tables(); | 1204 | listTables = d->mTracksDatabase.tables(); | ||
1150 | 1205 | | |||
1151 | if (listTables.contains(QStringLiteral("DatabaseVersionV5")) && | 1206 | if (listTables.contains(QStringLiteral("DatabaseVersionV5")) && | ||
1152 | !listTables.contains(QStringLiteral("DatabaseVersionV9"))) { | 1207 | !listTables.contains(QStringLiteral("DatabaseVersionV9"))) { | ||
1153 | upgradeDatabaseV9(); | 1208 | upgradeDatabaseV9(); | ||
1154 | upgradeDatabaseV11(); | 1209 | upgradeDatabaseV11(); | ||
1155 | upgradeDatabaseV12(); | 1210 | upgradeDatabaseV12(); | ||
1211 | upgradeDatabaseV13(); | ||||
1156 | } else if (listTables.contains(QStringLiteral("DatabaseVersionV9"))) { | 1212 | } else if (listTables.contains(QStringLiteral("DatabaseVersionV9"))) { | ||
1157 | if (!listTables.contains(QStringLiteral("DatabaseVersionV11"))) { | 1213 | if (!listTables.contains(QStringLiteral("DatabaseVersionV11"))) { | ||
1158 | upgradeDatabaseV11(); | 1214 | upgradeDatabaseV11(); | ||
1159 | } | 1215 | } | ||
1160 | if (!listTables.contains(QStringLiteral("DatabaseVersionV12"))) { | 1216 | if (!listTables.contains(QStringLiteral("DatabaseVersionV12"))) { | ||
1161 | upgradeDatabaseV12(); | 1217 | upgradeDatabaseV12(); | ||
1162 | } | 1218 | } | ||
1219 | if (!listTables.contains(QStringLiteral("DatabaseVersionV13"))) { | ||||
1220 | upgradeDatabaseV13(); | ||||
1221 | } | ||||
1163 | } else { | 1222 | } else { | ||
1164 | createDatabaseV9(); | 1223 | createDatabaseV9(); | ||
1165 | upgradeDatabaseV11(); | 1224 | upgradeDatabaseV11(); | ||
1166 | upgradeDatabaseV12(); | 1225 | upgradeDatabaseV12(); | ||
1226 | upgradeDatabaseV13(); | ||||
1167 | } | 1227 | } | ||
1168 | } | 1228 | } | ||
1169 | 1229 | | |||
1170 | void DatabaseInterface::createDatabaseV9() | 1230 | void DatabaseInterface::createDatabaseV9() | ||
1171 | { | 1231 | { | ||
1172 | qCInfo(orgKdeElisaDatabase) << "begin creation of v9 database schema"; | 1232 | qCInfo(orgKdeElisaDatabase) << "begin creation of v9 database schema"; | ||
1173 | 1233 | | |||
1174 | { | 1234 | { | ||
▲ Show 20 Lines • Show All 1287 Lines • ▼ Show 20 Line(s) | 2519 | if (!result) { | |||
2462 | 2522 | | |||
2463 | Q_EMIT databaseError(); | 2523 | Q_EMIT databaseError(); | ||
2464 | } | 2524 | } | ||
2465 | } | 2525 | } | ||
2466 | 2526 | | |||
2467 | qCInfo(orgKdeElisaDatabase) << "finished update to v12 of database schema"; | 2527 | qCInfo(orgKdeElisaDatabase) << "finished update to v12 of database schema"; | ||
2468 | } | 2528 | } | ||
2469 | 2529 | | |||
2530 | void DatabaseInterface::upgradeDatabaseV13() | ||||
2531 | { | ||||
2532 | qCInfo(orgKdeElisaDatabase) << "begin update to v13 of database schema"; | ||||
2533 | | ||||
2534 | { | ||||
2535 | QSqlQuery createSchemaQuery(d->mTracksDatabase); | ||||
2536 | | ||||
2537 | const auto &result = createSchemaQuery.exec(QStringLiteral("CREATE TABLE `DatabaseVersionV13` (`Version` INTEGER PRIMARY KEY NOT NULL)")); | ||||
2538 | | ||||
2539 | if (!result) { | ||||
2540 | qCDebug(orgKdeElisaDatabase) << "DatabaseInterface::upgradeDatabaseV13" << createSchemaQuery.lastQuery(); | ||||
2541 | qCDebug(orgKdeElisaDatabase) << "DatabaseInterface::upgradeDatabaseV13" << createSchemaQuery.lastError(); | ||||
2542 | | ||||
2543 | Q_EMIT databaseError(); | ||||
2544 | } | ||||
2545 | } | ||||
2546 | | ||||
2547 | { | ||||
2548 | QSqlQuery disableForeignKeys(d->mTracksDatabase); | ||||
2549 | | ||||
2550 | auto result = disableForeignKeys.exec(QStringLiteral(" PRAGMA foreign_keys=OFF")); | ||||
2551 | | ||||
2552 | if (!result) { | ||||
2553 | qCDebug(orgKdeElisaDatabase) << "DatabaseInterface::upgradeDatabaseV13" << disableForeignKeys.lastQuery(); | ||||
2554 | qCDebug(orgKdeElisaDatabase) << "DatabaseInterface::upgradeDatabaseV13" << disableForeignKeys.lastError(); | ||||
2555 | | ||||
2556 | Q_EMIT databaseError(); | ||||
2557 | } | ||||
2558 | } | ||||
2559 | | ||||
2560 | d->mTracksDatabase.transaction(); | ||||
2561 | | ||||
2562 | { | ||||
2563 | QSqlQuery createSchemaQuery(d->mTracksDatabase); | ||||
2564 | | ||||
2565 | const auto &result = createSchemaQuery.exec(QStringLiteral("CREATE TABLE `Radios` (" | ||||
2566 | "`ID` INTEGER PRIMARY KEY AUTOINCREMENT, " | ||||
2567 | "`HttpAddress` VARCHAR(255) NOT NULL, " | ||||
2568 | "`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… | |||||
2569 | "`Title` VARCHAR(85) NOT NULL, " | ||||
2570 | "`Rating` INTEGER NOT NULL DEFAULT 0, " | ||||
2571 | "`Genre` VARCHAR(55), " | ||||
2572 | "`Comment` VARCHAR(255), " | ||||
2573 | "UNIQUE (" | ||||
2574 | "`HttpAddress`" | ||||
2575 | "), " | ||||
2576 | "UNIQUE (" | ||||
2577 | "`Priority`, `Title`, `HttpAddress`" | ||||
2578 | ") " | ||||
2579 | "CONSTRAINT fk_tracks_genre FOREIGN KEY (`Genre`) REFERENCES `Genre`(`Name`))" | ||||
2580 | )); | ||||
2581 | | ||||
2582 | if (!result) { | ||||
2583 | qCDebug(orgKdeElisaDatabase) << "DatabaseInterface::upgradeDatabaseV13" << createSchemaQuery.lastQuery(); | ||||
2584 | qCDebug(orgKdeElisaDatabase) << "DatabaseInterface::upgradeDatabaseV13" << createSchemaQuery.lastError(); | ||||
2585 | } | ||||
2586 | } | ||||
2587 | | ||||
2588 | { | ||||
2589 | QSqlQuery createSchemaQuery(d->mTracksDatabase); | ||||
2590 | | ||||
2591 | //Find webradios (french): https://doc.ubuntu-fr.org/liste_radio_france | ||||
2592 | //English: https://www.radio.fr/language/english (to get the link play a radio and look for streamUrl in the html elements page). | ||||
2593 | const auto &result = createSchemaQuery.exec(QStringLiteral("INSERT INTO `Radios` (`HttpAddress`, `Priority`, `Title`) " | ||||
2594 | "SELECT 'http://classicrock.stream.ouifm.fr/ouifm3.mp3', 1, 'OuiFM_Classic_Rock' UNION ALL " | ||||
2595 | "SELECT 'http://rock70s.stream.ouifm.fr/ouifmseventies.mp3', 1, 'OuiFM_70s' UNION ALL " | ||||
2596 | "SELECT 'http://jazzradio.ice.infomaniak.ch/jazzradio-high.mp3', 2 , 'Jazz_Radio' UNION ALL " | ||||
2597 | "SELECT 'http://cdn.nrjaudio.fm/audio1/fr/30601/mp3_128.mp3?origine=playerweb', 1, 'Nostalgie' UNION ALL " | ||||
2598 | "SELECT 'https://scdn.nrjaudio.fm/audio1/fr/30713/aac_64.mp3?origine=playerweb', 1, 'Nostalgie Johnny' UNION ALL " | ||||
2599 | "SELECT 'http://sc-classrock.1.fm:8200', 1, 'Classic rock replay' UNION ALL " | ||||
2600 | "SELECT 'http://agnes.torontocast.com:8151/stream', 1, 'Instrumentals Forever' UNION ALL " | ||||
2601 | "SELECT 'https://stream.laut.fm/jahfari', 1, 'Jahfari'" | ||||
2602 | )); | ||||
2603 | if (!result) { | ||||
2604 | qCDebug(orgKdeElisaDatabase) << "DatabaseInterface::initRequest" << createSchemaQuery.lastQuery(); | ||||
2605 | qCDebug(orgKdeElisaDatabase) << "DatabaseInterface::initRequest" << createSchemaQuery.lastError(); | ||||
2606 | | ||||
2607 | Q_EMIT databaseError(); | ||||
2608 | } | ||||
2609 | } | ||||
2610 | | ||||
2611 | d->mTracksDatabase.commit(); | ||||
2612 | | ||||
2613 | { | ||||
2614 | QSqlQuery enableForeignKeys(d->mTracksDatabase); | ||||
2615 | | ||||
2616 | auto result = enableForeignKeys.exec(QStringLiteral(" PRAGMA foreign_keys=ON")); | ||||
2617 | | ||||
2618 | if (!result) { | ||||
2619 | qCDebug(orgKdeElisaDatabase) << "DatabaseInterface::upgradeDatabaseV13" << enableForeignKeys.lastQuery(); | ||||
2620 | qCDebug(orgKdeElisaDatabase) << "DatabaseInterface::upgradeDatabaseV13" << enableForeignKeys.lastError(); | ||||
2621 | | ||||
2622 | Q_EMIT databaseError(); | ||||
2623 | } | ||||
2624 | } | ||||
2625 | | ||||
2626 | qCInfo(orgKdeElisaDatabase) << "finished update to v13 of database schema"; | ||||
2627 | } | ||||
2628 | | ||||
2470 | void DatabaseInterface::checkDatabaseSchema() | 2629 | void DatabaseInterface::checkDatabaseSchema() | ||
2471 | { | 2630 | { | ||
2472 | checkAlbumsTableSchema(); | 2631 | checkAlbumsTableSchema(); | ||
2473 | if (d->mIsInBadState) | 2632 | if (d->mIsInBadState) | ||
2474 | { | 2633 | { | ||
2475 | resetDatabase(); | 2634 | resetDatabase(); | ||
2476 | return; | 2635 | return; | ||
2477 | } | 2636 | } | ||
▲ Show 20 Lines • Show All 565 Lines • ▼ Show 20 Line(s) | 3201 | if (!result) { | |||
3043 | qCDebug(orgKdeElisaDatabase) << "DatabaseInterface::initRequest" << d->mSelectAllTracksQuery.lastQuery(); | 3202 | qCDebug(orgKdeElisaDatabase) << "DatabaseInterface::initRequest" << d->mSelectAllTracksQuery.lastQuery(); | ||
3044 | qCDebug(orgKdeElisaDatabase) << "DatabaseInterface::initRequest" << d->mSelectAllTracksQuery.lastError(); | 3203 | qCDebug(orgKdeElisaDatabase) << "DatabaseInterface::initRequest" << d->mSelectAllTracksQuery.lastError(); | ||
3045 | 3204 | | |||
3046 | Q_EMIT databaseError(); | 3205 | Q_EMIT databaseError(); | ||
3047 | } | 3206 | } | ||
3048 | } | 3207 | } | ||
3049 | 3208 | | |||
3050 | { | 3209 | { | ||
3210 | auto selectAllRadiosText = QStringLiteral("SELECT " | ||||
3211 | "radios.`ID`, " | ||||
3212 | "radios.`Title`, " | ||||
3213 | "radios.`HttpAddress`, " | ||||
3214 | "radios.`Rating`, " | ||||
3215 | "trackGenre.`Name`, " | ||||
3216 | "radios.`Comment` " | ||||
3217 | "FROM " | ||||
3218 | "`Radios` radios " | ||||
3219 | "LEFT JOIN `Genre` trackGenre ON trackGenre.`Name` = radios.`Genre` " | ||||
3220 | ""); | ||||
3221 | | ||||
3222 | auto result = prepareQuery(d->mSelectAllRadiosQuery, selectAllRadiosText); | ||||
3223 | | ||||
3224 | if (!result) { | ||||
3225 | qCDebug(orgKdeElisaDatabase) << "DatabaseInterface::initRequest" << d->mSelectAllRadiosQuery.lastQuery(); | ||||
3226 | qCDebug(orgKdeElisaDatabase) << "DatabaseInterface::initRequest" << d->mSelectAllRadiosQuery.lastError(); | ||||
3227 | | ||||
3228 | Q_EMIT databaseError(); | ||||
3229 | } | ||||
3230 | } | ||||
3231 | | ||||
3232 | { | ||||
3051 | auto selectAllTracksText = QStringLiteral("SELECT " | 3233 | auto selectAllTracksText = QStringLiteral("SELECT " | ||
3052 | "tracks.`ID`, " | 3234 | "tracks.`ID`, " | ||
3053 | "tracks.`Title`, " | 3235 | "tracks.`Title`, " | ||
3054 | "album.`ID`, " | 3236 | "album.`ID`, " | ||
3055 | "tracks.`ArtistName`, " | 3237 | "tracks.`ArtistName`, " | ||
3056 | "tracks.`AlbumArtistName`, " | 3238 | "tracks.`AlbumArtistName`, " | ||
3057 | "tracksMapping.`FileName`, " | 3239 | "tracksMapping.`FileName`, " | ||
3058 | "tracksMapping.`FileModifiedTime`, " | 3240 | "tracksMapping.`FileModifiedTime`, " | ||
▲ Show 20 Lines • Show All 581 Lines • ▼ Show 20 Line(s) | 3749 | { | |||
3640 | 3822 | | |||
3641 | if (!result) { | 3823 | if (!result) { | ||
3642 | qCDebug(orgKdeElisaDatabase) << "DatabaseInterface::initRequest" << d->mSelectTrackFromIdQuery.lastQuery(); | 3824 | qCDebug(orgKdeElisaDatabase) << "DatabaseInterface::initRequest" << d->mSelectTrackFromIdQuery.lastQuery(); | ||
3643 | qCDebug(orgKdeElisaDatabase) << "DatabaseInterface::initRequest" << d->mSelectTrackFromIdQuery.lastError(); | 3825 | qCDebug(orgKdeElisaDatabase) << "DatabaseInterface::initRequest" << d->mSelectTrackFromIdQuery.lastError(); | ||
3644 | 3826 | | |||
3645 | Q_EMIT databaseError(); | 3827 | Q_EMIT databaseError(); | ||
3646 | } | 3828 | } | ||
3647 | } | 3829 | } | ||
3830 | | ||||
3831 | { | ||||
3832 | auto selectRadioFromIdQueryText = QStringLiteral("SELECT " | ||||
3833 | "radios.`ID`, " | ||||
3834 | "radios.`Title`, " | ||||
3835 | "radios.`HttpAddress`, " | ||||
3836 | "radios.`Rating`, " | ||||
3837 | "trackGenre.`Name`, " | ||||
3838 | "radios.`Comment` " | ||||
3839 | "FROM " | ||||
3840 | "`Radios` radios " | ||||
3841 | "LEFT JOIN `Genre` trackGenre ON trackGenre.`Name` = radios.`Genre` " | ||||
3842 | "WHERE " | ||||
3843 | "radios.`ID` = :radioId " | ||||
3844 | ""); | ||||
3845 | | ||||
3846 | auto result = prepareQuery(d->mSelectRadioFromIdQuery, selectRadioFromIdQueryText); | ||||
3847 | | ||||
3848 | if (!result) { | ||||
3849 | qCDebug(orgKdeElisaDatabase) << "DatabaseInterface::initRequest" << d->mSelectRadioFromIdQuery.lastQuery(); | ||||
3850 | qCDebug(orgKdeElisaDatabase) << "DatabaseInterface::initRequest" << d->mSelectRadioFromIdQuery.lastError(); | ||||
3851 | | ||||
3852 | Q_EMIT databaseError(); | ||||
3853 | } | ||||
3854 | } | ||||
3648 | { | 3855 | { | ||
3649 | auto selectCountAlbumsQueryText = QStringLiteral("SELECT count(*) " | 3856 | auto selectCountAlbumsQueryText = QStringLiteral("SELECT count(*) " | ||
3650 | "FROM `Albums` album " | 3857 | "FROM `Albums` album " | ||
3651 | "WHERE album.`ArtistName` = :artistName "); | 3858 | "WHERE album.`ArtistName` = :artistName "); | ||
3652 | 3859 | | |||
3653 | const auto result = prepareQuery(d->mSelectCountAlbumsForArtistQuery, selectCountAlbumsQueryText); | 3860 | const auto result = prepareQuery(d->mSelectCountAlbumsForArtistQuery, selectCountAlbumsQueryText); | ||
3654 | 3861 | | |||
3655 | if (!result) { | 3862 | if (!result) { | ||
▲ Show 20 Lines • Show All 1740 Lines • ▼ Show 20 Line(s) | 5558 | { | |||
5396 | } | 5603 | } | ||
5397 | result[TrackDataType::key_type::PlayCounter] = trackRecord.value(26); | 5604 | result[TrackDataType::key_type::PlayCounter] = trackRecord.value(26); | ||
5398 | result[TrackDataType::key_type::PlayFrequency] = trackRecord.value(27); | 5605 | result[TrackDataType::key_type::PlayFrequency] = trackRecord.value(27); | ||
5399 | result[DataType::key_type::ElementTypeRole] = ElisaUtils::Track; | 5606 | result[DataType::key_type::ElementTypeRole] = ElisaUtils::Track; | ||
5400 | 5607 | | |||
5401 | return result; | 5608 | return result; | ||
5402 | } | 5609 | } | ||
5403 | 5610 | | |||
5611 | DatabaseInterface::TrackDataType DatabaseInterface::buildRadioDataFromDatabaseRecord(const QSqlRecord &trackRecord) const | ||||
5612 | { | ||||
5613 | TrackDataType result; | ||||
5614 | | ||||
5615 | result[TrackDataType::key_type::DatabaseIdRole] = trackRecord.value(0); | ||||
5616 | result[TrackDataType::key_type::TitleRole] = trackRecord.value(1); | ||||
5617 | | ||||
5618 | result[TrackDataType::key_type::AlbumRole] = QStringLiteral("Radios"); | ||||
5619 | result[TrackDataType::key_type::ArtistRole] = trackRecord.value(1); | ||||
5620 | | ||||
5621 | result[TrackDataType::key_type::HttpAddressRole] = trackRecord.value(2); | ||||
5622 | result[TrackDataType::key_type::ResourceRole] = trackRecord.value(2); | ||||
5623 | result[TrackDataType::key_type::RatingRole] = trackRecord.value(3); | ||||
5624 | if (!trackRecord.value(4).isNull()) { | ||||
5625 | result[TrackDataType::key_type::GenreRole] = trackRecord.value(4); | ||||
5626 | } | ||||
5627 | result[TrackDataType::key_type::CommentRole] = trackRecord.value(5); | ||||
5628 | result[DataType::key_type::ElementTypeRole] = ElisaUtils::Radio; | ||||
5629 | | ||||
5630 | return result; | ||||
5631 | } | ||||
5632 | | ||||
5404 | void DatabaseInterface::internalRemoveTracksList(const QList<QUrl> &removedTracks) | 5633 | void DatabaseInterface::internalRemoveTracksList(const QList<QUrl> &removedTracks) | ||
5405 | { | 5634 | { | ||
5406 | QSet<qulonglong> modifiedAlbums; | 5635 | QSet<qulonglong> modifiedAlbums; | ||
5407 | 5636 | | |||
5408 | QUrl::FormattingOptions currentOptions = QUrl::PreferLocalFile | | 5637 | QUrl::FormattingOptions currentOptions = QUrl::PreferLocalFile | | ||
5409 | QUrl::RemoveAuthority | QUrl::RemoveFilename | QUrl::RemoveFragment | | 5638 | QUrl::RemoveAuthority | QUrl::RemoveFilename | QUrl::RemoveFragment | | ||
5410 | QUrl::RemovePassword | QUrl::RemovePort | QUrl::RemoveQuery | | 5639 | QUrl::RemovePassword | QUrl::RemovePort | QUrl::RemoveQuery | | ||
5411 | QUrl::RemoveScheme | QUrl::RemoveUserInfo; | 5640 | QUrl::RemoveScheme | QUrl::RemoveUserInfo; | ||
▲ Show 20 Lines • Show All 886 Lines • ▼ Show 20 Line(s) | 6522 | while(d->mSelectAllTracksQuery.next()) { | |||
6298 | result.push_back(newData); | 6527 | result.push_back(newData); | ||
6299 | } | 6528 | } | ||
6300 | 6529 | | |||
6301 | d->mSelectAllTracksQuery.finish(); | 6530 | d->mSelectAllTracksQuery.finish(); | ||
6302 | 6531 | | |||
6303 | return result; | 6532 | return result; | ||
6304 | } | 6533 | } | ||
6305 | 6534 | | |||
6535 | DatabaseInterface::ListTrackDataType DatabaseInterface::internalAllRadiosPartialData() | ||||
6536 | { | ||||
6537 | auto result = ListTrackDataType{}; | ||||
6538 | | ||||
6539 | if (!internalGenericPartialData(d->mSelectAllRadiosQuery)) { | ||||
6540 | return result; | ||||
6541 | } | ||||
6542 | | ||||
6543 | while(d->mSelectAllRadiosQuery.next()) { | ||||
6544 | const auto ¤tRecord = d->mSelectAllRadiosQuery.record(); | ||||
6545 | | ||||
6546 | auto newData = buildRadioDataFromDatabaseRecord(currentRecord); | ||||
6547 | | ||||
6548 | result.push_back(newData); | ||||
6549 | } | ||||
6550 | | ||||
6551 | d->mSelectAllRadiosQuery.finish(); | ||||
6552 | | ||||
6553 | return result; | ||||
6554 | } | ||||
6555 | | ||||
6306 | DatabaseInterface::ListTrackDataType DatabaseInterface::internalRecentlyPlayedTracksData(int count) | 6556 | DatabaseInterface::ListTrackDataType DatabaseInterface::internalRecentlyPlayedTracksData(int count) | ||
6307 | { | 6557 | { | ||
6308 | auto result = ListTrackDataType{}; | 6558 | auto result = ListTrackDataType{}; | ||
6309 | 6559 | | |||
6310 | d->mSelectAllRecentlyPlayedTracksQuery.bindValue(QStringLiteral(":maximumResults"), count); | 6560 | d->mSelectAllRecentlyPlayedTracksQuery.bindValue(QStringLiteral(":maximumResults"), count); | ||
6311 | 6561 | | |||
6312 | if (!internalGenericPartialData(d->mSelectAllRecentlyPlayedTracksQuery)) { | 6562 | if (!internalGenericPartialData(d->mSelectAllRecentlyPlayedTracksQuery)) { | ||
6313 | return result; | 6563 | return result; | ||
▲ Show 20 Lines • Show All 51 Lines • ▼ Show 20 Line(s) | 6612 | if (d->mSelectTrackFromIdQuery.next()) { | |||
6365 | result = buildTrackDataFromDatabaseRecord(currentRecord); | 6615 | result = buildTrackDataFromDatabaseRecord(currentRecord); | ||
6366 | } | 6616 | } | ||
6367 | 6617 | | |||
6368 | d->mSelectTrackFromIdQuery.finish(); | 6618 | d->mSelectTrackFromIdQuery.finish(); | ||
6369 | 6619 | | |||
6370 | return result; | 6620 | return result; | ||
6371 | } | 6621 | } | ||
6372 | 6622 | | |||
6623 | DatabaseInterface::TrackDataType DatabaseInterface::internalOneRadioPartialData(qulonglong databaseId) | ||||
6624 | { | ||||
6625 | auto result = TrackDataType{}; | ||||
6626 | | ||||
6627 | d->mSelectRadioFromIdQuery.bindValue(QStringLiteral(":radioId"), databaseId); | ||||
6628 | | ||||
6629 | if (!internalGenericPartialData(d->mSelectRadioFromIdQuery)) { | ||||
6630 | return result; | ||||
6631 | } | ||||
6632 | | ||||
6633 | if (d->mSelectRadioFromIdQuery.next()) { | ||||
6634 | const auto ¤tRecord = d->mSelectRadioFromIdQuery.record(); | ||||
6635 | | ||||
6636 | result = buildRadioDataFromDatabaseRecord(currentRecord); | ||||
6637 | } | ||||
6638 | | ||||
6639 | d->mSelectRadioFromIdQuery.finish(); | ||||
6640 | | ||||
6641 | return result; | ||||
6642 | } | ||||
6643 | | ||||
6373 | DatabaseInterface::ListGenreDataType DatabaseInterface::internalAllGenresPartialData() | 6644 | DatabaseInterface::ListGenreDataType DatabaseInterface::internalAllGenresPartialData() | ||
6374 | { | 6645 | { | ||
6375 | ListGenreDataType result; | 6646 | ListGenreDataType result; | ||
6376 | 6647 | | |||
6377 | if (!internalGenericPartialData(d->mSelectAllGenresQuery)) { | 6648 | if (!internalGenericPartialData(d->mSelectAllGenresQuery)) { | ||
6378 | return result; | 6649 | return result; | ||
6379 | } | 6650 | } | ||
6380 | 6651 | | |||
▲ 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]