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 52 Lines • ▼ Show 20 Line(s) | 45 | : mTracksDatabase(tracksDatabase), mSelectAlbumQuery(mTracksDatabase), | |||
---|---|---|---|---|---|
53 | mSelectArtistQuery(mTracksDatabase), mUpdateTrackStatistics(mTracksDatabase), | 53 | mSelectArtistQuery(mTracksDatabase), mUpdateTrackStatistics(mTracksDatabase), | ||
54 | mRemoveTrackQuery(mTracksDatabase), mRemoveAlbumQuery(mTracksDatabase), | 54 | mRemoveTrackQuery(mTracksDatabase), mRemoveAlbumQuery(mTracksDatabase), | ||
55 | mRemoveArtistQuery(mTracksDatabase), mSelectAllTracksQuery(mTracksDatabase), | 55 | mRemoveArtistQuery(mTracksDatabase), mSelectAllTracksQuery(mTracksDatabase), | ||
56 | mInsertTrackMapping(mTracksDatabase), mUpdateTrackFirstPlayStatistics(mTracksDatabase), | 56 | mInsertTrackMapping(mTracksDatabase), mUpdateTrackFirstPlayStatistics(mTracksDatabase), | ||
57 | mInsertMusicSource(mTracksDatabase), mSelectMusicSource(mTracksDatabase), | 57 | mInsertMusicSource(mTracksDatabase), mSelectMusicSource(mTracksDatabase), | ||
58 | mUpdateTrackPriority(mTracksDatabase), mUpdateTrackFileModifiedTime(mTracksDatabase), | 58 | mUpdateTrackPriority(mTracksDatabase), mUpdateTrackFileModifiedTime(mTracksDatabase), | ||
59 | mSelectTracksMapping(mTracksDatabase), mSelectTracksMappingPriority(mTracksDatabase), | 59 | mSelectTracksMapping(mTracksDatabase), mSelectTracksMappingPriority(mTracksDatabase), | ||
60 | mUpdateAlbumArtUriFromAlbumIdQuery(mTracksDatabase), mSelectTracksMappingPriorityByTrackId(mTracksDatabase), | 60 | mUpdateAlbumArtUriFromAlbumIdQuery(mTracksDatabase), mSelectTracksMappingPriorityByTrackId(mTracksDatabase), | ||
61 | mSelectAllTrackFilesFromSourceQuery(mTracksDatabase), mSelectAlbumIdsFromArtist(mTracksDatabase), | 61 | mSelectAlbumIdsFromArtist(mTracksDatabase), mSelectAllTrackFilesQuery(mTracksDatabase), | ||
62 | mRemoveTracksMappingFromSource(mTracksDatabase), mRemoveTracksMapping(mTracksDatabase), | 62 | mRemoveTracksMappingFromSource(mTracksDatabase), mRemoveTracksMapping(mTracksDatabase), | ||
63 | mSelectTracksWithoutMappingQuery(mTracksDatabase), mSelectAlbumIdFromTitleAndArtistQuery(mTracksDatabase), | 63 | mSelectTracksWithoutMappingQuery(mTracksDatabase), mSelectAlbumIdFromTitleAndArtistQuery(mTracksDatabase), | ||
64 | mSelectAlbumIdFromTitleWithoutArtistQuery(mTracksDatabase), | 64 | mSelectAlbumIdFromTitleWithoutArtistQuery(mTracksDatabase), | ||
65 | mSelectTrackIdFromTitleAlbumTrackDiscNumberQuery(mTracksDatabase), mSelectAlbumArtUriFromAlbumIdQuery(mTracksDatabase), | 65 | mSelectTrackIdFromTitleAlbumTrackDiscNumberQuery(mTracksDatabase), mSelectAlbumArtUriFromAlbumIdQuery(mTracksDatabase), | ||
66 | mInsertComposerQuery(mTracksDatabase), mSelectComposerByNameQuery(mTracksDatabase), | 66 | mInsertComposerQuery(mTracksDatabase), mSelectComposerByNameQuery(mTracksDatabase), | ||
67 | mSelectComposerQuery(mTracksDatabase), mInsertLyricistQuery(mTracksDatabase), | 67 | mSelectComposerQuery(mTracksDatabase), mInsertLyricistQuery(mTracksDatabase), | ||
68 | mSelectLyricistByNameQuery(mTracksDatabase), mSelectLyricistQuery(mTracksDatabase), | 68 | mSelectLyricistByNameQuery(mTracksDatabase), mSelectLyricistQuery(mTracksDatabase), | ||
69 | mInsertGenreQuery(mTracksDatabase), mSelectGenreByNameQuery(mTracksDatabase), | 69 | mInsertGenreQuery(mTracksDatabase), mSelectGenreByNameQuery(mTracksDatabase), | ||
▲ Show 20 Lines • Show All 72 Lines • ▼ Show 20 Line(s) | |||||
142 | QSqlQuery mSelectTracksMapping; | 142 | QSqlQuery mSelectTracksMapping; | ||
143 | 143 | | |||
144 | QSqlQuery mSelectTracksMappingPriority; | 144 | QSqlQuery mSelectTracksMappingPriority; | ||
145 | 145 | | |||
146 | QSqlQuery mUpdateAlbumArtUriFromAlbumIdQuery; | 146 | QSqlQuery mUpdateAlbumArtUriFromAlbumIdQuery; | ||
147 | 147 | | |||
148 | QSqlQuery mSelectTracksMappingPriorityByTrackId; | 148 | QSqlQuery mSelectTracksMappingPriorityByTrackId; | ||
149 | 149 | | |||
150 | QSqlQuery mSelectAllTrackFilesFromSourceQuery; | | |||
151 | | ||||
152 | QSqlQuery mSelectAlbumIdsFromArtist; | 150 | QSqlQuery mSelectAlbumIdsFromArtist; | ||
153 | 151 | | |||
152 | QSqlQuery mSelectAllTrackFilesQuery; | ||||
153 | | ||||
154 | QSqlQuery mRemoveTracksMappingFromSource; | 154 | QSqlQuery mRemoveTracksMappingFromSource; | ||
155 | 155 | | |||
156 | QSqlQuery mRemoveTracksMapping; | 156 | QSqlQuery mRemoveTracksMapping; | ||
157 | 157 | | |||
158 | QSqlQuery mSelectTracksWithoutMappingQuery; | 158 | QSqlQuery mSelectTracksWithoutMappingQuery; | ||
159 | 159 | | |||
160 | QSqlQuery mSelectAlbumIdFromTitleAndArtistQuery; | 160 | QSqlQuery mSelectAlbumIdFromTitleAndArtistQuery; | ||
161 | 161 | | |||
▲ Show 20 Lines • Show All 100 Lines • ▼ Show 20 Line(s) | |||||
262 | qulonglong mComposerId = 1; | 262 | qulonglong mComposerId = 1; | ||
263 | 263 | | |||
264 | qulonglong mLyricistId = 1; | 264 | qulonglong mLyricistId = 1; | ||
265 | 265 | | |||
266 | qulonglong mGenreId = 1; | 266 | qulonglong mGenreId = 1; | ||
267 | 267 | | |||
268 | qulonglong mTrackId = 1; | 268 | qulonglong mTrackId = 1; | ||
269 | 269 | | |||
270 | qulonglong mDiscoverId = 1; | | |||
271 | | ||||
272 | QAtomicInt mStopRequest = 0; | 270 | QAtomicInt mStopRequest = 0; | ||
273 | 271 | | |||
274 | bool mInitFinished = false; | 272 | bool mInitFinished = false; | ||
275 | 273 | | |||
276 | }; | 274 | }; | ||
277 | 275 | | |||
278 | DatabaseInterface::DatabaseInterface(QObject *parent) : QObject(parent), d(nullptr) | 276 | DatabaseInterface::DatabaseInterface(QObject *parent) : QObject(parent), d(nullptr) | ||
279 | { | 277 | { | ||
▲ Show 20 Lines • Show All 511 Lines • ▼ Show 20 Line(s) | 770 | { | |||
791 | return result; | 789 | return result; | ||
792 | } | 790 | } | ||
793 | 791 | | |||
794 | void DatabaseInterface::applicationAboutToQuit() | 792 | void DatabaseInterface::applicationAboutToQuit() | ||
795 | { | 793 | { | ||
796 | d->mStopRequest = 1; | 794 | d->mStopRequest = 1; | ||
797 | } | 795 | } | ||
798 | 796 | | |||
799 | void DatabaseInterface::removeAllTracksFromSource(const QString &sourceName) | 797 | void DatabaseInterface::askRestoredTracks() | ||
800 | { | 798 | { | ||
801 | auto transactionResult = startTransaction(); | 799 | auto transactionResult = startTransaction(); | ||
802 | if (!transactionResult) { | 800 | if (!transactionResult) { | ||
803 | return; | 801 | return; | ||
804 | } | 802 | } | ||
805 | 803 | | |||
806 | initChangesTrackers(); | 804 | auto result = internalAllFileName(); | ||
807 | | ||||
808 | auto allFileNames = internalAllFileNameFromSource(sourceName); | | |||
809 | 805 | | |||
810 | auto allFileUrls = QList<QUrl>{}; | 806 | Q_EMIT restoredTracks(result); | ||
811 | | ||||
812 | for (auto oneUrlIt = allFileNames.begin(); oneUrlIt != allFileNames.end(); ++oneUrlIt) { | | |||
813 | allFileUrls.push_back(oneUrlIt.key()); | | |||
814 | } | | |||
815 | | ||||
816 | internalRemoveTracksList(allFileUrls); | | |||
817 | | ||||
818 | if (!d->mInsertedArtists.isEmpty()) { | | |||
819 | ListArtistDataType newArtists; | | |||
820 | for (auto artistId : qAsConst(d->mInsertedArtists)) { | | |||
821 | newArtists.push_back({{DatabaseIdRole, artistId}}); | | |||
822 | } | | |||
823 | Q_EMIT artistsAdded(newArtists); | | |||
824 | } | | |||
825 | | ||||
826 | transactionResult = finishTransaction(); | | |||
827 | if (!transactionResult) { | | |||
828 | return; | | |||
829 | } | | |||
830 | } | | |||
831 | | ||||
832 | void DatabaseInterface::askRestoredTracks(const QString &musicSource) | | |||
833 | { | | |||
834 | auto transactionResult = startTransaction(); | | |||
835 | if (!transactionResult) { | | |||
836 | return; | | |||
837 | } | | |||
838 | | ||||
839 | auto result = internalAllFileNameFromSource(musicSource); | | |||
840 | | ||||
841 | Q_EMIT restoredTracks(musicSource, result); | | |||
842 | 807 | | |||
843 | transactionResult = finishTransaction(); | 808 | transactionResult = finishTransaction(); | ||
844 | if (!transactionResult) { | 809 | if (!transactionResult) { | ||
845 | return; | 810 | return; | ||
846 | } | 811 | } | ||
847 | } | 812 | } | ||
848 | 813 | | |||
849 | void DatabaseInterface::trackHasStartedPlaying(const QUrl &fileName, const QDateTime &time) | 814 | void DatabaseInterface::trackHasStartedPlaying(const QUrl &fileName, const QDateTime &time) | ||
▲ Show 20 Lines • Show All 113 Lines • ▼ Show 20 Line(s) | 927 | { | |||
963 | d->mModifiedTrackIds.insert(trackId); | 928 | d->mModifiedTrackIds.insert(trackId); | ||
964 | } | 929 | } | ||
965 | 930 | | |||
966 | void DatabaseInterface::recordModifiedAlbum(qulonglong albumId) | 931 | void DatabaseInterface::recordModifiedAlbum(qulonglong albumId) | ||
967 | { | 932 | { | ||
968 | d->mModifiedAlbumIds.insert(albumId); | 933 | d->mModifiedAlbumIds.insert(albumId); | ||
969 | } | 934 | } | ||
970 | 935 | | |||
971 | void DatabaseInterface::insertTracksList(const QList<MusicAudioTrack> &tracks, const QHash<QString, QUrl> &covers, const QString &musicSource) | 936 | void DatabaseInterface::insertTracksList(const QList<MusicAudioTrack> &tracks, const QHash<QString, QUrl> &covers) | ||
972 | { | 937 | { | ||
973 | if (d->mStopRequest == 1) { | 938 | if (d->mStopRequest == 1) { | ||
939 | Q_EMIT finishInsertingTracksList(); | ||||
974 | return; | 940 | return; | ||
975 | } | 941 | } | ||
976 | 942 | | |||
977 | auto transactionResult = startTransaction(); | 943 | auto transactionResult = startTransaction(); | ||
978 | if (!transactionResult) { | 944 | if (!transactionResult) { | ||
945 | Q_EMIT finishInsertingTracksList(); | ||||
979 | return; | 946 | return; | ||
980 | } | 947 | } | ||
981 | 948 | | |||
982 | initChangesTrackers(); | 949 | initChangesTrackers(); | ||
983 | 950 | | |||
984 | for(const auto &oneTrack : tracks) { | 951 | for(const auto &oneTrack : tracks) { | ||
985 | d->mSelectTracksMapping.bindValue(QStringLiteral(":fileName"), oneTrack.resourceURI()); | 952 | d->mSelectTracksMapping.bindValue(QStringLiteral(":fileName"), oneTrack.resourceURI()); | ||
986 | 953 | | |||
987 | auto result = d->mSelectTracksMapping.exec(); | 954 | auto result = d->mSelectTracksMapping.exec(); | ||
988 | 955 | | |||
989 | if (!result || !d->mSelectTracksMapping.isSelect() || !d->mSelectTracksMapping.isActive()) { | 956 | if (!result || !d->mSelectTracksMapping.isSelect() || !d->mSelectTracksMapping.isActive()) { | ||
990 | Q_EMIT databaseError(); | 957 | Q_EMIT databaseError(); | ||
991 | 958 | | |||
992 | qDebug() << "DatabaseInterface::insertTracksList" << d->mSelectTracksMapping.lastQuery(); | 959 | qDebug() << "DatabaseInterface::insertTracksList" << d->mSelectTracksMapping.lastQuery(); | ||
993 | qDebug() << "DatabaseInterface::insertTracksList" << d->mSelectTracksMapping.boundValues(); | 960 | qDebug() << "DatabaseInterface::insertTracksList" << d->mSelectTracksMapping.boundValues(); | ||
994 | qDebug() << "DatabaseInterface::insertTracksList" << d->mSelectTracksMapping.lastError(); | 961 | qDebug() << "DatabaseInterface::insertTracksList" << d->mSelectTracksMapping.lastError(); | ||
995 | 962 | | |||
996 | d->mSelectTracksMapping.finish(); | 963 | d->mSelectTracksMapping.finish(); | ||
997 | 964 | | |||
998 | rollBackTransaction(); | 965 | rollBackTransaction(); | ||
966 | Q_EMIT finishInsertingTracksList(); | ||||
999 | return; | 967 | return; | ||
1000 | } | 968 | } | ||
1001 | 969 | | |||
1002 | bool isNewTrack = !d->mSelectTracksMapping.next(); | 970 | bool isNewTrack = !d->mSelectTracksMapping.next(); | ||
1003 | 971 | | |||
1004 | auto discoverId = insertMusicSource(musicSource); | | |||
1005 | | ||||
1006 | if (isNewTrack) { | 972 | if (isNewTrack) { | ||
1007 | insertTrackOrigin(oneTrack.resourceURI(), oneTrack.fileModificationTime(), | 973 | insertTrackOrigin(oneTrack.resourceURI(), oneTrack.fileModificationTime(), | ||
1008 | QDateTime::currentDateTime(), discoverId); | 974 | QDateTime::currentDateTime()); | ||
1009 | } else if (!d->mSelectTracksMapping.record().value(0).isNull() && d->mSelectTracksMapping.record().value(0).toULongLong() != 0) { | 975 | } else if (!d->mSelectTracksMapping.record().value(0).isNull() && d->mSelectTracksMapping.record().value(0).toULongLong() != 0) { | ||
1010 | updateTrackOrigin(oneTrack.resourceURI(), oneTrack.fileModificationTime()); | 976 | updateTrackOrigin(oneTrack.resourceURI(), oneTrack.fileModificationTime()); | ||
1011 | } | 977 | } | ||
1012 | 978 | | |||
1013 | d->mSelectTracksMapping.finish(); | 979 | d->mSelectTracksMapping.finish(); | ||
1014 | 980 | | |||
1015 | bool isInserted = false; | 981 | bool isInserted = false; | ||
1016 | 982 | | |||
1017 | const auto insertedTrackId = internalInsertTrack(discoverId, oneTrack, covers, isInserted); | 983 | const auto insertedTrackId = internalInsertTrack(oneTrack, covers, isInserted); | ||
1018 | 984 | | |||
1019 | if (isInserted && insertedTrackId != 0) { | 985 | if (isInserted && insertedTrackId != 0) { | ||
1020 | d->mInsertedTracks.insert(insertedTrackId); | 986 | d->mInsertedTracks.insert(insertedTrackId); | ||
1021 | } | 987 | } | ||
1022 | 988 | | |||
1023 | if (d->mStopRequest == 1) { | 989 | if (d->mStopRequest == 1) { | ||
1024 | transactionResult = finishTransaction(); | 990 | transactionResult = finishTransaction(); | ||
1025 | if (!transactionResult) { | 991 | if (!transactionResult) { | ||
992 | Q_EMIT finishInsertingTracksList(); | ||||
1026 | return; | 993 | return; | ||
1027 | } | 994 | } | ||
995 | Q_EMIT finishInsertingTracksList(); | ||||
1028 | return; | 996 | return; | ||
1029 | } | 997 | } | ||
1030 | } | 998 | } | ||
1031 | 999 | | |||
1032 | if (!d->mInsertedArtists.isEmpty()) { | 1000 | if (!d->mInsertedArtists.isEmpty()) { | ||
1033 | ListArtistDataType newArtists; | 1001 | ListArtistDataType newArtists; | ||
1034 | 1002 | | |||
1035 | for (auto artistId : qAsConst(d->mInsertedArtists)) { | 1003 | for (auto artistId : qAsConst(d->mInsertedArtists)) { | ||
Show All 32 Lines | |||||
1068 | } | 1036 | } | ||
1069 | 1037 | | |||
1070 | for (auto trackId : qAsConst(d->mModifiedTrackIds)) { | 1038 | for (auto trackId : qAsConst(d->mModifiedTrackIds)) { | ||
1071 | Q_EMIT trackModified(internalOneTrackPartialData(trackId)); | 1039 | Q_EMIT trackModified(internalOneTrackPartialData(trackId)); | ||
1072 | } | 1040 | } | ||
1073 | 1041 | | |||
1074 | transactionResult = finishTransaction(); | 1042 | transactionResult = finishTransaction(); | ||
1075 | if (!transactionResult) { | 1043 | if (!transactionResult) { | ||
1044 | Q_EMIT finishInsertingTracksList(); | ||||
1076 | return; | 1045 | return; | ||
1077 | } | 1046 | } | ||
1047 | Q_EMIT finishInsertingTracksList(); | ||||
1078 | } | 1048 | } | ||
1079 | 1049 | | |||
1080 | void DatabaseInterface::removeTracksList(const QList<QUrl> &removedTracks) | 1050 | void DatabaseInterface::removeTracksList(const QList<QUrl> &removedTracks) | ||
1081 | { | 1051 | { | ||
1082 | auto transactionResult = startTransaction(); | 1052 | auto transactionResult = startTransaction(); | ||
1083 | if (!transactionResult) { | 1053 | if (!transactionResult) { | ||
1054 | Q_EMIT finishRemovingTracksList(); | ||||
1084 | return; | 1055 | return; | ||
1085 | } | 1056 | } | ||
1086 | 1057 | | |||
1087 | initChangesTrackers(); | 1058 | initChangesTrackers(); | ||
1088 | 1059 | | |||
1089 | internalRemoveTracksList(removedTracks); | 1060 | internalRemoveTracksList(removedTracks); | ||
1090 | 1061 | | |||
1091 | if (!d->mInsertedArtists.isEmpty()) { | 1062 | if (!d->mInsertedArtists.isEmpty()) { | ||
1092 | ListArtistDataType newArtists; | 1063 | ListArtistDataType newArtists; | ||
1093 | for (auto artistId : qAsConst(d->mInsertedArtists)) { | 1064 | for (auto artistId : qAsConst(d->mInsertedArtists)) { | ||
1094 | newArtists.push_back({{DatabaseIdRole, artistId}}); | 1065 | newArtists.push_back({{DatabaseIdRole, artistId}}); | ||
1095 | } | 1066 | } | ||
1096 | Q_EMIT artistsAdded(newArtists); | 1067 | Q_EMIT artistsAdded(newArtists); | ||
1097 | } | 1068 | } | ||
1098 | 1069 | | |||
1099 | transactionResult = finishTransaction(); | 1070 | transactionResult = finishTransaction(); | ||
1100 | if (!transactionResult) { | 1071 | if (!transactionResult) { | ||
1072 | Q_EMIT finishRemovingTracksList(); | ||||
1101 | return; | 1073 | return; | ||
1102 | } | 1074 | } | ||
1075 | | ||||
1076 | Q_EMIT finishRemovingTracksList(); | ||||
1103 | } | 1077 | } | ||
1104 | 1078 | | |||
1105 | bool DatabaseInterface::startTransaction() const | 1079 | bool DatabaseInterface::startTransaction() const | ||
1106 | { | 1080 | { | ||
1107 | auto result = false; | 1081 | auto result = false; | ||
1108 | 1082 | | |||
1109 | auto transactionResult = d->mTracksDatabase.transaction(); | 1083 | auto transactionResult = d->mTracksDatabase.transaction(); | ||
1110 | if (!transactionResult) { | 1084 | if (!transactionResult) { | ||
▲ Show 20 Lines • Show All 83 Lines • ▼ Show 20 Line(s) | 1133 | if (!listTables.contains(QStringLiteral("DatabaseVersionV9"))) { | |||
1194 | 1168 | | |||
1195 | listTables = d->mTracksDatabase.tables(); | 1169 | listTables = d->mTracksDatabase.tables(); | ||
1196 | } | 1170 | } | ||
1197 | 1171 | | |||
1198 | if (listTables.contains(QStringLiteral("DatabaseVersionV9"))) { | 1172 | if (listTables.contains(QStringLiteral("DatabaseVersionV9"))) { | ||
1199 | if (!listTables.contains(QStringLiteral("DatabaseVersionV11"))) { | 1173 | if (!listTables.contains(QStringLiteral("DatabaseVersionV11"))) { | ||
1200 | upgradeDatabaseV11(); | 1174 | upgradeDatabaseV11(); | ||
1201 | } | 1175 | } | ||
1176 | if (!listTables.contains(QStringLiteral("DatabaseVersionV12"))) { | ||||
1177 | upgradeDatabaseV12(); | ||||
1178 | } | ||||
1202 | } else { | 1179 | } else { | ||
1203 | createDatabaseV9(); | 1180 | createDatabaseV9(); | ||
1204 | upgradeDatabaseV11(); | 1181 | upgradeDatabaseV11(); | ||
1182 | upgradeDatabaseV12(); | ||||
1205 | } | 1183 | } | ||
1206 | } | 1184 | } | ||
1207 | 1185 | | |||
1208 | void DatabaseInterface::createDatabaseV9() | 1186 | void DatabaseInterface::createDatabaseV9() | ||
1209 | { | 1187 | { | ||
1210 | { | 1188 | { | ||
1211 | QSqlQuery createSchemaQuery(d->mTracksDatabase); | 1189 | QSqlQuery createSchemaQuery(d->mTracksDatabase); | ||
1212 | 1190 | | |||
▲ Show 20 Lines • Show All 676 Lines • ▼ Show 20 Line(s) | 1864 | if (!result) { | |||
1889 | 1867 | | |||
1890 | Q_EMIT databaseError(); | 1868 | Q_EMIT databaseError(); | ||
1891 | } | 1869 | } | ||
1892 | } | 1870 | } | ||
1893 | 1871 | | |||
1894 | qDebug() << "finished update to v11 of database schema"; | 1872 | qDebug() << "finished update to v11 of database schema"; | ||
1895 | } | 1873 | } | ||
1896 | 1874 | | |||
1875 | void DatabaseInterface::upgradeDatabaseV12() | ||||
1876 | { | ||||
1877 | qDebug() << "begin update to v12 of database schema"; | ||||
1878 | | ||||
1879 | { | ||||
1880 | QSqlQuery createSchemaQuery(d->mTracksDatabase); | ||||
1881 | | ||||
1882 | const auto &result = createSchemaQuery.exec(QStringLiteral("CREATE TABLE `DatabaseVersionV12` (`Version` INTEGER PRIMARY KEY NOT NULL)")); | ||||
1883 | | ||||
1884 | if (!result) { | ||||
1885 | qDebug() << "DatabaseInterface::initDatabase" << createSchemaQuery.lastQuery(); | ||||
1886 | qDebug() << "DatabaseInterface::initDatabase" << createSchemaQuery.lastError(); | ||||
1887 | | ||||
1888 | Q_EMIT databaseError(); | ||||
1889 | } | ||||
1890 | } | ||||
1891 | | ||||
1892 | { | ||||
1893 | QSqlQuery disableForeignKeys(d->mTracksDatabase); | ||||
1894 | | ||||
1895 | auto result = disableForeignKeys.exec(QStringLiteral(" PRAGMA foreign_keys=OFF")); | ||||
1896 | | ||||
1897 | if (!result) { | ||||
1898 | qDebug() << "DatabaseInterface::initDatabase" << disableForeignKeys.lastQuery(); | ||||
1899 | qDebug() << "DatabaseInterface::initDatabase" << disableForeignKeys.lastError(); | ||||
1900 | | ||||
1901 | Q_EMIT databaseError(); | ||||
1902 | } | ||||
1903 | } | ||||
1904 | | ||||
1905 | d->mTracksDatabase.transaction(); | ||||
1906 | | ||||
1907 | { | ||||
1908 | QSqlQuery createSchemaQuery(d->mTracksDatabase); | ||||
1909 | | ||||
1910 | const auto &result = createSchemaQuery.exec(QStringLiteral("CREATE TABLE `NewTracks` (" | ||||
1911 | "`ID` INTEGER PRIMARY KEY AUTOINCREMENT, " | ||||
1912 | "`FileName` VARCHAR(255) NOT NULL, " | ||||
1913 | "`Priority` INTEGER NOT NULL, " | ||||
1914 | "`Title` VARCHAR(85) NOT NULL, " | ||||
1915 | "`ArtistName` VARCHAR(55), " | ||||
1916 | "`AlbumTitle` VARCHAR(55), " | ||||
1917 | "`AlbumArtistName` VARCHAR(55), " | ||||
1918 | "`AlbumPath` VARCHAR(255), " | ||||
1919 | "`TrackNumber` INTEGER, " | ||||
1920 | "`DiscNumber` INTEGER, " | ||||
1921 | "`Duration` INTEGER NOT NULL, " | ||||
1922 | "`Rating` INTEGER NOT NULL DEFAULT 0, " | ||||
1923 | "`Genre` VARCHAR(55), " | ||||
1924 | "`Composer` VARCHAR(55), " | ||||
1925 | "`Lyricist` VARCHAR(55), " | ||||
1926 | "`Comment` VARCHAR(255), " | ||||
1927 | "`Year` INTEGER, " | ||||
1928 | "`Channels` INTEGER, " | ||||
1929 | "`BitRate` INTEGER, " | ||||
1930 | "`SampleRate` INTEGER, " | ||||
1931 | "`HasEmbeddedCover` BOOLEAN NOT NULL, " | ||||
1932 | "UNIQUE (" | ||||
1933 | "`FileName`" | ||||
1934 | "), " | ||||
1935 | "UNIQUE (" | ||||
1936 | "`Priority`, `Title`, `ArtistName`, " | ||||
1937 | "`AlbumTitle`, `AlbumArtistName`, `AlbumPath`" | ||||
1938 | "), " | ||||
1939 | "CONSTRAINT fk_fileName FOREIGN KEY (`FileName`) " | ||||
1940 | "REFERENCES `TracksData`(`FileName`) ON DELETE CASCADE, " | ||||
1941 | "CONSTRAINT fk_artist FOREIGN KEY (`ArtistName`) REFERENCES `Artists`(`Name`), " | ||||
1942 | "CONSTRAINT fk_tracks_composer FOREIGN KEY (`Composer`) REFERENCES `Composer`(`Name`), " | ||||
1943 | "CONSTRAINT fk_tracks_lyricist FOREIGN KEY (`Lyricist`) REFERENCES `Lyricist`(`Name`), " | ||||
1944 | "CONSTRAINT fk_tracks_genre FOREIGN KEY (`Genre`) REFERENCES `Genre`(`Name`), " | ||||
1945 | "CONSTRAINT fk_tracks_album FOREIGN KEY (" | ||||
1946 | "`AlbumTitle`, `AlbumArtistName`, `AlbumPath`)" | ||||
1947 | "REFERENCES `Albums`(`Title`, `ArtistName`, `AlbumPath`))")); | ||||
1948 | | ||||
1949 | if (!result) { | ||||
1950 | qDebug() << "DatabaseInterface::initDatabase" << createSchemaQuery.lastQuery(); | ||||
1951 | qDebug() << "DatabaseInterface::initDatabase" << createSchemaQuery.lastError(); | ||||
1952 | } | ||||
1953 | } | ||||
1954 | | ||||
1955 | { | ||||
1956 | QSqlQuery createSchemaQuery(d->mTracksDatabase); | ||||
1957 | | ||||
1958 | const auto &result = createSchemaQuery.exec(QStringLiteral("CREATE TABLE `NewTracksData` (" | ||||
1959 | "`FileName` VARCHAR(255) NOT NULL, " | ||||
1960 | "`FileModifiedTime` DATETIME NOT NULL, " | ||||
1961 | "`ImportDate` INTEGER NOT NULL, " | ||||
1962 | "`FirstPlayDate` INTEGER, " | ||||
1963 | "`LastPlayDate` INTEGER, " | ||||
1964 | "`PlayCounter` INTEGER NOT NULL, " | ||||
1965 | "PRIMARY KEY (`FileName`))")); | ||||
1966 | | ||||
1967 | if (!result) { | ||||
1968 | qDebug() << "DatabaseInterface::initDatabase" << createSchemaQuery.lastQuery(); | ||||
1969 | qDebug() << "DatabaseInterface::initDatabase" << createSchemaQuery.lastError(); | ||||
1970 | } | ||||
1971 | } | ||||
1972 | | ||||
1973 | { | ||||
1974 | QSqlQuery copyDataQuery(d->mTracksDatabase); | ||||
1975 | | ||||
1976 | auto result = copyDataQuery.exec(QStringLiteral("INSERT INTO `NewTracksData` " | ||||
1977 | "SELECT " | ||||
1978 | "td.`FileName`, " | ||||
1979 | "td.`FileModifiedTime`, " | ||||
1980 | "td.`ImportDate`, " | ||||
1981 | "td.`FirstPlayDate`, " | ||||
1982 | "td.`LastPlayDate`, " | ||||
1983 | "td.`PlayCounter` " | ||||
1984 | "FROM " | ||||
1985 | "`TracksData` td")); | ||||
1986 | | ||||
1987 | if (!result) { | ||||
1988 | qDebug() << "DatabaseInterface::initDatabase" << copyDataQuery.lastQuery(); | ||||
1989 | qDebug() << "DatabaseInterface::initDatabase" << copyDataQuery.lastError(); | ||||
1990 | | ||||
1991 | Q_EMIT databaseError(); | ||||
1992 | } | ||||
1993 | } | ||||
1994 | | ||||
1995 | { | ||||
1996 | QSqlQuery copyDataQuery(d->mTracksDatabase); | ||||
1997 | | ||||
1998 | auto result = copyDataQuery.exec(QStringLiteral("INSERT INTO `NewTracks` " | ||||
1999 | "SELECT " | ||||
2000 | "t.`ID`, " | ||||
2001 | "t.`FileName`, " | ||||
2002 | "t.`Priority`, " | ||||
2003 | "t.`Title`, " | ||||
2004 | "t.`ArtistName`, " | ||||
2005 | "t.`AlbumTitle`, " | ||||
2006 | "t.`AlbumArtistName`, " | ||||
2007 | "t.`AlbumPath`, " | ||||
2008 | "t.`TrackNumber`, " | ||||
2009 | "t.`DiscNumber`, " | ||||
2010 | "t.`Duration`, " | ||||
2011 | "t.`Rating`, " | ||||
2012 | "t.`Genre`, " | ||||
2013 | "t.`Composer`, " | ||||
2014 | "t.`Lyricist`, " | ||||
2015 | "t.`Comment`, " | ||||
2016 | "t.`Year`, " | ||||
2017 | "t.`Channels`, " | ||||
2018 | "t.`BitRate`, " | ||||
2019 | "t.`SampleRate`, " | ||||
2020 | "t.`HasEmbeddedCover` " | ||||
2021 | "FROM " | ||||
2022 | "`Tracks` t")); | ||||
2023 | | ||||
2024 | if (!result) { | ||||
2025 | qDebug() << "DatabaseInterface::initDatabase" << copyDataQuery.lastQuery(); | ||||
2026 | qDebug() << "DatabaseInterface::initDatabase" << copyDataQuery.lastError(); | ||||
2027 | | ||||
2028 | Q_EMIT databaseError(); | ||||
2029 | } | ||||
2030 | } | ||||
2031 | | ||||
2032 | { | ||||
2033 | QSqlQuery createSchemaQuery(d->mTracksDatabase); | ||||
2034 | | ||||
2035 | auto result = createSchemaQuery.exec(QStringLiteral("DROP TABLE `TracksData`")); | ||||
2036 | | ||||
2037 | if (!result) { | ||||
2038 | qDebug() << "DatabaseInterface::initDatabase" << createSchemaQuery.lastQuery(); | ||||
2039 | qDebug() << "DatabaseInterface::initDatabase" << createSchemaQuery.lastError(); | ||||
2040 | | ||||
2041 | Q_EMIT databaseError(); | ||||
2042 | } | ||||
2043 | } | ||||
2044 | | ||||
2045 | { | ||||
2046 | QSqlQuery createSchemaQuery(d->mTracksDatabase); | ||||
2047 | | ||||
2048 | auto result = createSchemaQuery.exec(QStringLiteral("DROP TABLE `Tracks`")); | ||||
2049 | | ||||
2050 | if (!result) { | ||||
2051 | qDebug() << "DatabaseInterface::initDatabase" << createSchemaQuery.lastQuery(); | ||||
2052 | qDebug() << "DatabaseInterface::initDatabase" << createSchemaQuery.lastError(); | ||||
2053 | | ||||
2054 | Q_EMIT databaseError(); | ||||
2055 | } | ||||
2056 | } | ||||
2057 | | ||||
2058 | { | ||||
2059 | QSqlQuery createSchemaQuery(d->mTracksDatabase); | ||||
2060 | | ||||
2061 | auto result = createSchemaQuery.exec(QStringLiteral("ALTER TABLE `NewTracksData` RENAME TO `TracksData`")); | ||||
2062 | | ||||
2063 | if (!result) { | ||||
2064 | qDebug() << "DatabaseInterface::initDatabase" << createSchemaQuery.lastQuery(); | ||||
2065 | qDebug() << "DatabaseInterface::initDatabase" << createSchemaQuery.lastError(); | ||||
2066 | | ||||
2067 | Q_EMIT databaseError(); | ||||
2068 | } | ||||
2069 | } | ||||
2070 | | ||||
2071 | { | ||||
2072 | QSqlQuery createSchemaQuery(d->mTracksDatabase); | ||||
2073 | | ||||
2074 | auto result = createSchemaQuery.exec(QStringLiteral("ALTER TABLE `NewTracks` RENAME TO `Tracks`")); | ||||
2075 | | ||||
2076 | if (!result) { | ||||
2077 | qDebug() << "DatabaseInterface::initDatabase" << createSchemaQuery.lastQuery(); | ||||
2078 | qDebug() << "DatabaseInterface::initDatabase" << createSchemaQuery.lastError(); | ||||
2079 | | ||||
2080 | Q_EMIT databaseError(); | ||||
2081 | } | ||||
2082 | } | ||||
2083 | | ||||
2084 | d->mTracksDatabase.commit(); | ||||
2085 | | ||||
2086 | { | ||||
2087 | QSqlQuery enableForeignKeys(d->mTracksDatabase); | ||||
2088 | | ||||
2089 | auto result = enableForeignKeys.exec(QStringLiteral(" PRAGMA foreign_keys=ON")); | ||||
2090 | | ||||
2091 | if (!result) { | ||||
2092 | qDebug() << "DatabaseInterface::initDatabase" << enableForeignKeys.lastQuery(); | ||||
2093 | qDebug() << "DatabaseInterface::initDatabase" << enableForeignKeys.lastError(); | ||||
2094 | | ||||
2095 | Q_EMIT databaseError(); | ||||
2096 | } | ||||
2097 | } | ||||
2098 | | ||||
2099 | qDebug() << "finished update to v12 of database schema"; | ||||
2100 | } | ||||
2101 | | ||||
1897 | void DatabaseInterface::initRequest() | 2102 | void DatabaseInterface::initRequest() | ||
1898 | { | 2103 | { | ||
1899 | auto transactionResult = startTransaction(); | 2104 | auto transactionResult = startTransaction(); | ||
1900 | if (!transactionResult) { | 2105 | if (!transactionResult) { | ||
1901 | return; | 2106 | return; | ||
1902 | } | 2107 | } | ||
1903 | 2108 | | |||
1904 | { | 2109 | { | ||
▲ Show 20 Lines • Show All 1156 Lines • ▼ Show 20 Line(s) | 3262 | if (!result) { | |||
3061 | Q_EMIT databaseError(); | 3266 | Q_EMIT databaseError(); | ||
3062 | } | 3267 | } | ||
3063 | } | 3268 | } | ||
3064 | 3269 | | |||
3065 | { | 3270 | { | ||
3066 | auto insertTrackMappingQueryText = QStringLiteral("INSERT INTO " | 3271 | auto insertTrackMappingQueryText = QStringLiteral("INSERT INTO " | ||
3067 | "`TracksData` " | 3272 | "`TracksData` " | ||
3068 | "(`FileName`, " | 3273 | "(`FileName`, " | ||
3069 | "`DiscoverID`, " | | |||
3070 | "`FileModifiedTime`, " | 3274 | "`FileModifiedTime`, " | ||
3071 | "`ImportDate`, " | 3275 | "`ImportDate`, " | ||
3072 | "`PlayCounter`) " | 3276 | "`PlayCounter`) " | ||
3073 | "VALUES (:fileName, :discoverId, :mtime, :importDate, 0)"); | 3277 | "VALUES (:fileName, :mtime, :importDate, 0)"); | ||
3074 | 3278 | | |||
3075 | auto result = prepareQuery(d->mInsertTrackMapping, insertTrackMappingQueryText); | 3279 | auto result = prepareQuery(d->mInsertTrackMapping, insertTrackMappingQueryText); | ||
3076 | 3280 | | |||
3077 | if (!result) { | 3281 | if (!result) { | ||
3078 | qDebug() << "DatabaseInterface::initRequest" << d->mInsertTrackMapping.lastQuery(); | 3282 | qDebug() << "DatabaseInterface::initRequest" << d->mInsertTrackMapping.lastQuery(); | ||
3079 | qDebug() << "DatabaseInterface::initRequest" << d->mInsertTrackMapping.lastError(); | 3283 | qDebug() << "DatabaseInterface::initRequest" << d->mInsertTrackMapping.lastError(); | ||
3080 | 3284 | | |||
3081 | Q_EMIT databaseError(); | 3285 | Q_EMIT databaseError(); | ||
Show All 29 Lines | 3313 | if (!result) { | |||
3111 | qDebug() << "DatabaseInterface::initRequest" << d->mUpdateTrackPriority.lastError(); | 3315 | qDebug() << "DatabaseInterface::initRequest" << d->mUpdateTrackPriority.lastError(); | ||
3112 | 3316 | | |||
3113 | Q_EMIT databaseError(); | 3317 | Q_EMIT databaseError(); | ||
3114 | } | 3318 | } | ||
3115 | } | 3319 | } | ||
3116 | 3320 | | |||
3117 | { | 3321 | { | ||
3118 | auto removeTracksMappingFromSourceQueryText = QStringLiteral("DELETE FROM `TracksData` " | 3322 | auto removeTracksMappingFromSourceQueryText = QStringLiteral("DELETE FROM `TracksData` " | ||
3119 | "WHERE `FileName` = :fileName AND `DiscoverID` = :sourceId"); | 3323 | "WHERE `FileName` = :fileName"); | ||
3120 | 3324 | | |||
3121 | auto result = prepareQuery(d->mRemoveTracksMappingFromSource, removeTracksMappingFromSourceQueryText); | 3325 | auto result = prepareQuery(d->mRemoveTracksMappingFromSource, removeTracksMappingFromSourceQueryText); | ||
3122 | 3326 | | |||
3123 | if (!result) { | 3327 | if (!result) { | ||
3124 | qDebug() << "DatabaseInterface::initRequest" << d->mRemoveTracksMappingFromSource.lastQuery(); | 3328 | qDebug() << "DatabaseInterface::initRequest" << d->mRemoveTracksMappingFromSource.lastQuery(); | ||
3125 | qDebug() << "DatabaseInterface::initRequest" << d->mRemoveTracksMappingFromSource.lastError(); | 3329 | qDebug() << "DatabaseInterface::initRequest" << d->mRemoveTracksMappingFromSource.lastError(); | ||
3126 | 3330 | | |||
3127 | Q_EMIT databaseError(); | 3331 | Q_EMIT databaseError(); | ||
▲ Show 20 Lines • Show All 82 Lines • ▼ Show 20 Line(s) | 3410 | if (!result) { | |||
3210 | Q_EMIT databaseError(); | 3414 | Q_EMIT databaseError(); | ||
3211 | } | 3415 | } | ||
3212 | } | 3416 | } | ||
3213 | 3417 | | |||
3214 | { | 3418 | { | ||
3215 | auto selectTracksMappingQueryText = QStringLiteral("SELECT " | 3419 | auto selectTracksMappingQueryText = QStringLiteral("SELECT " | ||
3216 | "track.`ID`, " | 3420 | "track.`ID`, " | ||
3217 | "trackData.`FileName`, " | 3421 | "trackData.`FileName`, " | ||
3218 | "trackData.`DiscoverID`, " | | |||
3219 | "track.`Priority`, " | 3422 | "track.`Priority`, " | ||
3220 | "trackData.`FileModifiedTime` " | 3423 | "trackData.`FileModifiedTime` " | ||
3221 | "FROM " | 3424 | "FROM " | ||
3222 | "`TracksData` trackData " | 3425 | "`TracksData` trackData " | ||
3223 | "LEFT JOIN " | 3426 | "LEFT JOIN " | ||
3224 | "`Tracks` track " | 3427 | "`Tracks` track " | ||
3225 | "ON " | 3428 | "ON " | ||
3226 | "track.`FileName` = trackData.`FileName` " | 3429 | "track.`FileName` = trackData.`FileName` " | ||
▲ Show 20 Lines • Show All 54 Lines • ▼ Show 20 Line(s) | |||||
3281 | } | 3484 | } | ||
3282 | 3485 | | |||
3283 | { | 3486 | { | ||
3284 | auto selectAllTrackFilesFromSourceQueryText = QStringLiteral("SELECT " | 3487 | auto selectAllTrackFilesFromSourceQueryText = QStringLiteral("SELECT " | ||
3285 | "tracksMapping.`FileName`, " | 3488 | "tracksMapping.`FileName`, " | ||
3286 | "tracksMapping.`FileModifiedTime` " | 3489 | "tracksMapping.`FileModifiedTime` " | ||
3287 | "FROM " | 3490 | "FROM " | ||
3288 | "`TracksData` tracksMapping, " | 3491 | "`TracksData` tracksMapping, " | ||
3289 | "`Tracks` tracks, " | 3492 | "`Tracks` tracks " | ||
3290 | "`DiscoverSource` source " | | |||
3291 | "WHERE " | 3493 | "WHERE " | ||
3292 | "tracksMapping.`DiscoverID` = source.`ID` AND " | 3494 | "tracks.`FileName` = tracksMapping.`FileName`"); | ||
3293 | "tracks.`FileName` = tracksMapping.`FileName` AND " | | |||
3294 | "source.`Name` = :sourceName"); | | |||
3295 | 3495 | | |||
3296 | auto result = prepareQuery(d->mSelectAllTrackFilesFromSourceQuery, selectAllTrackFilesFromSourceQueryText); | 3496 | auto result = prepareQuery(d->mSelectAllTrackFilesQuery, selectAllTrackFilesFromSourceQueryText); | ||
3297 | 3497 | | |||
3298 | if (!result) { | 3498 | if (!result) { | ||
3299 | qDebug() << "DatabaseInterface::initRequest" << d->mSelectAllTrackFilesFromSourceQuery.lastQuery(); | 3499 | qDebug() << "DatabaseInterface::initRequest" << d->mSelectAllTrackFilesQuery.lastQuery(); | ||
3300 | qDebug() << "DatabaseInterface::initRequest" << d->mSelectAllTrackFilesFromSourceQuery.lastError(); | 3500 | qDebug() << "DatabaseInterface::initRequest" << d->mSelectAllTrackFilesQuery.lastError(); | ||
3301 | 3501 | | |||
3302 | Q_EMIT databaseError(); | 3502 | Q_EMIT databaseError(); | ||
3303 | } | 3503 | } | ||
3304 | } | 3504 | } | ||
3305 | 3505 | | |||
3306 | { | 3506 | { | ||
3307 | auto insertMusicSourceQueryText = QStringLiteral("INSERT OR IGNORE INTO `DiscoverSource` (`ID`, `Name`) " | 3507 | auto insertMusicSourceQueryText = QStringLiteral("INSERT OR IGNORE INTO `DiscoverSource` (`ID`, `Name`) " | ||
3308 | "VALUES (:discoverId, :name)"); | 3508 | "VALUES (:discoverId, :name)"); | ||
▲ Show 20 Lines • Show All 59 Lines • ▼ Show 20 Line(s) | 3564 | if (!result) { | |||
3368 | Q_EMIT databaseError(); | 3568 | Q_EMIT databaseError(); | ||
3369 | } | 3569 | } | ||
3370 | } | 3570 | } | ||
3371 | 3571 | | |||
3372 | { | 3572 | { | ||
3373 | auto insertTrackQueryText = QStringLiteral("INSERT INTO `Tracks` " | 3573 | auto insertTrackQueryText = QStringLiteral("INSERT INTO `Tracks` " | ||
3374 | "(" | 3574 | "(" | ||
3375 | "`ID`, " | 3575 | "`ID`, " | ||
3376 | "`DiscoverID`, " | | |||
3377 | "`FileName`, " | 3576 | "`FileName`, " | ||
3378 | "`Priority`, " | 3577 | "`Priority`, " | ||
3379 | "`Title`, " | 3578 | "`Title`, " | ||
3380 | "`ArtistName`, " | 3579 | "`ArtistName`, " | ||
3381 | "`AlbumTitle`, " | 3580 | "`AlbumTitle`, " | ||
3382 | "`AlbumArtistName`, " | 3581 | "`AlbumArtistName`, " | ||
3383 | "`AlbumPath`, " | 3582 | "`AlbumPath`, " | ||
3384 | "`Genre`, " | 3583 | "`Genre`, " | ||
3385 | "`Composer`, " | 3584 | "`Composer`, " | ||
3386 | "`Lyricist`, " | 3585 | "`Lyricist`, " | ||
3387 | "`Comment`, " | 3586 | "`Comment`, " | ||
3388 | "`TrackNumber`, " | 3587 | "`TrackNumber`, " | ||
3389 | "`DiscNumber`, " | 3588 | "`DiscNumber`, " | ||
3390 | "`Channels`, " | 3589 | "`Channels`, " | ||
3391 | "`BitRate`, " | 3590 | "`BitRate`, " | ||
3392 | "`SampleRate`, " | 3591 | "`SampleRate`, " | ||
3393 | "`Year`, " | 3592 | "`Year`, " | ||
3394 | "`Duration`, " | 3593 | "`Duration`, " | ||
3395 | "`Rating`, " | 3594 | "`Rating`, " | ||
3396 | "`HasEmbeddedCover`) " | 3595 | "`HasEmbeddedCover`) " | ||
3397 | "VALUES " | 3596 | "VALUES " | ||
3398 | "(" | 3597 | "(" | ||
3399 | ":trackId, " | 3598 | ":trackId, " | ||
3400 | ":discoverId, " | | |||
3401 | ":fileName, " | 3599 | ":fileName, " | ||
3402 | ":priority, " | 3600 | ":priority, " | ||
3403 | ":title, " | 3601 | ":title, " | ||
3404 | ":artistName, " | 3602 | ":artistName, " | ||
3405 | ":albumTitle, " | 3603 | ":albumTitle, " | ||
3406 | ":albumArtistName, " | 3604 | ":albumArtistName, " | ||
3407 | ":albumPath, " | 3605 | ":albumPath, " | ||
3408 | ":genre, " | 3606 | ":genre, " | ||
▲ Show 20 Lines • Show All 846 Lines • ▼ Show 20 Line(s) | 4399 | { | |||
4255 | d->mInsertGenreQuery.finish(); | 4453 | d->mInsertGenreQuery.finish(); | ||
4256 | 4454 | | |||
4257 | Q_EMIT genresAdded({{{DatabaseIdRole, result}}}); | 4455 | Q_EMIT genresAdded({{{DatabaseIdRole, result}}}); | ||
4258 | 4456 | | |||
4259 | return result; | 4457 | return result; | ||
4260 | } | 4458 | } | ||
4261 | 4459 | | |||
4262 | void DatabaseInterface::insertTrackOrigin(const QUrl &fileNameURI, const QDateTime &fileModifiedTime, | 4460 | void DatabaseInterface::insertTrackOrigin(const QUrl &fileNameURI, const QDateTime &fileModifiedTime, | ||
4263 | const QDateTime &importDate, qulonglong discoverId) | 4461 | const QDateTime &importDate) | ||
4264 | { | 4462 | { | ||
4265 | d->mInsertTrackMapping.bindValue(QStringLiteral(":discoverId"), discoverId); | | |||
4266 | d->mInsertTrackMapping.bindValue(QStringLiteral(":fileName"), fileNameURI); | 4463 | d->mInsertTrackMapping.bindValue(QStringLiteral(":fileName"), fileNameURI); | ||
4267 | d->mInsertTrackMapping.bindValue(QStringLiteral(":priority"), 1); | 4464 | d->mInsertTrackMapping.bindValue(QStringLiteral(":priority"), 1); | ||
4268 | d->mInsertTrackMapping.bindValue(QStringLiteral(":mtime"), fileModifiedTime); | 4465 | d->mInsertTrackMapping.bindValue(QStringLiteral(":mtime"), fileModifiedTime); | ||
4269 | d->mInsertTrackMapping.bindValue(QStringLiteral(":importDate"), importDate.toMSecsSinceEpoch()); | 4466 | d->mInsertTrackMapping.bindValue(QStringLiteral(":importDate"), importDate.toMSecsSinceEpoch()); | ||
4270 | 4467 | | |||
4271 | auto queryResult = d->mInsertTrackMapping.exec(); | 4468 | auto queryResult = d->mInsertTrackMapping.exec(); | ||
4272 | 4469 | | |||
4273 | if (!queryResult || !d->mInsertTrackMapping.isActive()) { | 4470 | if (!queryResult || !d->mInsertTrackMapping.isActive()) { | ||
▲ Show 20 Lines • Show All 71 Lines • ▼ Show 20 Line(s) | 4537 | if (d->mSelectTracksMappingPriority.next()) { | |||
4345 | return result + 1; | 4542 | return result + 1; | ||
4346 | } | 4543 | } | ||
4347 | 4544 | | |||
4348 | d->mSelectTracksMappingPriority.finish(); | 4545 | d->mSelectTracksMappingPriority.finish(); | ||
4349 | 4546 | | |||
4350 | return result; | 4547 | return result; | ||
4351 | } | 4548 | } | ||
4352 | 4549 | | |||
4353 | qulonglong DatabaseInterface::internalInsertTrack(qulonglong discoverId, const MusicAudioTrack &oneTrack, | 4550 | qulonglong DatabaseInterface::internalInsertTrack(const MusicAudioTrack &oneTrack, | ||
4354 | const QHash<QString, QUrl> &covers, bool &isInserted) | 4551 | const QHash<QString, QUrl> &covers, bool &isInserted) | ||
4355 | { | 4552 | { | ||
4356 | qulonglong resultId = 0; | 4553 | qulonglong resultId = 0; | ||
4357 | 4554 | | |||
4358 | if (oneTrack.title().isEmpty()) { | 4555 | if (oneTrack.title().isEmpty()) { | ||
4359 | return resultId; | 4556 | return resultId; | ||
4360 | } | 4557 | } | ||
4361 | 4558 | | |||
▲ Show 20 Lines • Show All 84 Lines • ▼ Show 20 Line(s) | 4635 | while(true) { | |||
4446 | } | 4643 | } | ||
4447 | } | 4644 | } | ||
4448 | 4645 | | |||
4449 | resultId = existingTrackId; | 4646 | resultId = existingTrackId; | ||
4450 | 4647 | | |||
4451 | const auto &albumData = internalOneAlbumPartialData(albumId); | 4648 | const auto &albumData = internalOneAlbumPartialData(albumId); | ||
4452 | 4649 | | |||
4453 | d->mInsertTrackQuery.bindValue(QStringLiteral(":trackId"), existingTrackId); | 4650 | d->mInsertTrackQuery.bindValue(QStringLiteral(":trackId"), existingTrackId); | ||
4454 | d->mInsertTrackQuery.bindValue(QStringLiteral(":discoverId"), discoverId); | | |||
4455 | d->mInsertTrackQuery.bindValue(QStringLiteral(":fileName"), oneTrack.resourceURI()); | 4651 | d->mInsertTrackQuery.bindValue(QStringLiteral(":fileName"), oneTrack.resourceURI()); | ||
4456 | d->mInsertTrackQuery.bindValue(QStringLiteral(":priority"), priority); | 4652 | d->mInsertTrackQuery.bindValue(QStringLiteral(":priority"), priority); | ||
4457 | d->mInsertTrackQuery.bindValue(QStringLiteral(":title"), oneTrack.title()); | 4653 | d->mInsertTrackQuery.bindValue(QStringLiteral(":title"), oneTrack.title()); | ||
4458 | insertArtist(oneTrack.artist()); | 4654 | insertArtist(oneTrack.artist()); | ||
4459 | d->mInsertTrackQuery.bindValue(QStringLiteral(":artistName"), oneTrack.artist()); | 4655 | d->mInsertTrackQuery.bindValue(QStringLiteral(":artistName"), oneTrack.artist()); | ||
4460 | d->mInsertTrackQuery.bindValue(QStringLiteral(":albumTitle"), albumData[AlbumDataType::key_type::TitleRole]); | 4656 | d->mInsertTrackQuery.bindValue(QStringLiteral(":albumTitle"), albumData[AlbumDataType::key_type::TitleRole]); | ||
4461 | d->mInsertTrackQuery.bindValue(QStringLiteral(":albumArtistName"), albumData[AlbumDataType::key_type::ArtistRole]); | 4657 | d->mInsertTrackQuery.bindValue(QStringLiteral(":albumArtistName"), albumData[AlbumDataType::key_type::ArtistRole]); | ||
4462 | d->mInsertTrackQuery.bindValue(QStringLiteral(":albumPath"), trackPath); | 4658 | d->mInsertTrackQuery.bindValue(QStringLiteral(":albumPath"), trackPath); | ||
▲ Show 20 Lines • Show All 281 Lines • ▼ Show 20 Line(s) | 4916 | { | |||
4744 | 4940 | | |||
4745 | const auto ¤tRecord = d->mSelectAlbumQuery.record(); | 4941 | const auto ¤tRecord = d->mSelectAlbumQuery.record(); | ||
4746 | 4942 | | |||
4747 | result = !currentRecord.value(2).toString().isEmpty(); | 4943 | result = !currentRecord.value(2).toString().isEmpty(); | ||
4748 | 4944 | | |||
4749 | return result; | 4945 | return result; | ||
4750 | } | 4946 | } | ||
4751 | 4947 | | |||
4752 | qulonglong DatabaseInterface::internalSourceIdFromName(const QString &sourceName) | | |||
4753 | { | | |||
4754 | qulonglong sourceId = 0; | | |||
4755 | | ||||
4756 | d->mSelectMusicSource.bindValue(QStringLiteral(":name"), sourceName); | | |||
4757 | | ||||
4758 | auto queryResult = d->mSelectMusicSource.exec(); | | |||
4759 | | ||||
4760 | if (!queryResult || !d->mSelectMusicSource.isSelect() || !d->mSelectMusicSource.isActive()) { | | |||
4761 | Q_EMIT databaseError(); | | |||
4762 | | ||||
4763 | qDebug() << "DatabaseInterface::insertMusicSource" << d->mSelectMusicSource.lastQuery(); | | |||
4764 | qDebug() << "DatabaseInterface::insertMusicSource" << d->mSelectMusicSource.boundValues(); | | |||
4765 | qDebug() << "DatabaseInterface::insertMusicSource" << d->mSelectMusicSource.lastError(); | | |||
4766 | | ||||
4767 | d->mSelectMusicSource.finish(); | | |||
4768 | | ||||
4769 | return sourceId; | | |||
4770 | } | | |||
4771 | | ||||
4772 | if (!d->mSelectMusicSource.next()) { | | |||
4773 | return sourceId; | | |||
4774 | } | | |||
4775 | | ||||
4776 | sourceId = d->mSelectMusicSource.record().value(0).toULongLong(); | | |||
4777 | | ||||
4778 | d->mSelectMusicSource.finish(); | | |||
4779 | | ||||
4780 | return sourceId; | | |||
4781 | } | | |||
4782 | | ||||
4783 | QHash<QUrl, QDateTime> DatabaseInterface::internalAllFileNameFromSource(const QString &sourceName) | | |||
4784 | { | | |||
4785 | QHash<QUrl, QDateTime> allFileNames; | | |||
4786 | | ||||
4787 | d->mSelectAllTrackFilesFromSourceQuery.bindValue(QStringLiteral(":sourceName"), sourceName); | | |||
4788 | | ||||
4789 | auto queryResult = d->mSelectAllTrackFilesFromSourceQuery.exec(); | | |||
4790 | | ||||
4791 | if (!queryResult || !d->mSelectAllTrackFilesFromSourceQuery.isSelect() || !d->mSelectAllTrackFilesFromSourceQuery.isActive()) { | | |||
4792 | Q_EMIT databaseError(); | | |||
4793 | | ||||
4794 | qDebug() << "DatabaseInterface::insertMusicSource" << d->mSelectAllTrackFilesFromSourceQuery.lastQuery(); | | |||
4795 | qDebug() << "DatabaseInterface::insertMusicSource" << d->mSelectAllTrackFilesFromSourceQuery.boundValues(); | | |||
4796 | qDebug() << "DatabaseInterface::insertMusicSource" << d->mSelectAllTrackFilesFromSourceQuery.lastError(); | | |||
4797 | | ||||
4798 | d->mSelectAllTrackFilesFromSourceQuery.finish(); | | |||
4799 | | ||||
4800 | return allFileNames; | | |||
4801 | } | | |||
4802 | | ||||
4803 | while(d->mSelectAllTrackFilesFromSourceQuery.next()) { | | |||
4804 | auto fileName = d->mSelectAllTrackFilesFromSourceQuery.record().value(0).toUrl(); | | |||
4805 | auto fileModificationTime = d->mSelectAllTrackFilesFromSourceQuery.record().value(1).toDateTime(); | | |||
4806 | | ||||
4807 | allFileNames[fileName] = fileModificationTime; | | |||
4808 | } | | |||
4809 | | ||||
4810 | d->mSelectAllTrackFilesFromSourceQuery.finish(); | | |||
4811 | | ||||
4812 | return allFileNames; | | |||
4813 | } | | |||
4814 | | ||||
4815 | bool DatabaseInterface::internalGenericPartialData(QSqlQuery &query) | 4948 | bool DatabaseInterface::internalGenericPartialData(QSqlQuery &query) | ||
4816 | { | 4949 | { | ||
4817 | auto result = false; | 4950 | auto result = false; | ||
4818 | 4951 | | |||
4819 | auto queryResult = query.exec(); | 4952 | auto queryResult = query.exec(); | ||
4820 | 4953 | | |||
4821 | if (!queryResult || !query.isSelect() || !query.isActive()) { | 4954 | if (!queryResult || !query.isSelect() || !query.isActive()) { | ||
4822 | Q_EMIT databaseError(); | 4955 | Q_EMIT databaseError(); | ||
▲ Show 20 Lines • Show All 74 Lines • ▼ Show 20 Line(s) | 4977 | { | |||
4897 | 5030 | | |||
4898 | d->mInsertLyricistQuery.finish(); | 5031 | d->mInsertLyricistQuery.finish(); | ||
4899 | 5032 | | |||
4900 | Q_EMIT lyricistsAdded(internalAllLyricistsPartialData()); | 5033 | Q_EMIT lyricistsAdded(internalAllLyricistsPartialData()); | ||
4901 | 5034 | | |||
4902 | return result; | 5035 | return result; | ||
4903 | } | 5036 | } | ||
4904 | 5037 | | |||
5038 | QHash<QUrl, QDateTime> DatabaseInterface::internalAllFileName() | ||||
5039 | { | ||||
5040 | auto allFileNames = QHash<QUrl, QDateTime>{}; | ||||
5041 | | ||||
5042 | auto queryResult = d->mSelectAllTrackFilesQuery.exec(); | ||||
5043 | | ||||
5044 | if (!queryResult || !d->mSelectAllTrackFilesQuery.isSelect() || !d->mSelectAllTrackFilesQuery.isActive()) { | ||||
5045 | Q_EMIT databaseError(); | ||||
5046 | | ||||
5047 | qDebug() << "DatabaseInterface::insertMusicSource" << d->mSelectAllTrackFilesQuery.lastQuery(); | ||||
5048 | qDebug() << "DatabaseInterface::insertMusicSource" << d->mSelectAllTrackFilesQuery.boundValues(); | ||||
5049 | qDebug() << "DatabaseInterface::insertMusicSource" << d->mSelectAllTrackFilesQuery.lastError(); | ||||
5050 | | ||||
5051 | d->mSelectAllTrackFilesQuery.finish(); | ||||
5052 | | ||||
5053 | return allFileNames; | ||||
5054 | } | ||||
5055 | | ||||
5056 | while(d->mSelectAllTrackFilesQuery.next()) { | ||||
5057 | auto fileName = d->mSelectAllTrackFilesQuery.record().value(0).toUrl(); | ||||
5058 | auto fileModificationTime = d->mSelectAllTrackFilesQuery.record().value(1).toDateTime(); | ||||
5059 | | ||||
5060 | allFileNames[fileName] = fileModificationTime; | ||||
5061 | } | ||||
5062 | | ||||
5063 | d->mSelectAllTrackFilesQuery.finish(); | ||||
5064 | | ||||
5065 | return allFileNames; | ||||
5066 | } | ||||
5067 | | ||||
4905 | qulonglong DatabaseInterface::internalArtistIdFromName(const QString &name) | 5068 | qulonglong DatabaseInterface::internalArtistIdFromName(const QString &name) | ||
4906 | { | 5069 | { | ||
4907 | auto result = qulonglong(0); | 5070 | auto result = qulonglong(0); | ||
4908 | 5071 | | |||
4909 | if (name.isEmpty()) { | 5072 | if (name.isEmpty()) { | ||
4910 | return result; | 5073 | return result; | ||
4911 | } | 5074 | } | ||
4912 | 5075 | | |||
▲ Show 20 Lines • Show All 200 Lines • ▼ Show 20 Line(s) | 5243 | { | |||
5113 | transactionResult = finishTransaction(); | 5276 | transactionResult = finishTransaction(); | ||
5114 | if (!transactionResult) { | 5277 | if (!transactionResult) { | ||
5115 | return result; | 5278 | return result; | ||
5116 | } | 5279 | } | ||
5117 | 5280 | | |||
5118 | return result; | 5281 | return result; | ||
5119 | } | 5282 | } | ||
5120 | 5283 | | |||
5121 | qulonglong DatabaseInterface::insertMusicSource(const QString &name) | | |||
5122 | { | | |||
5123 | qulonglong result = 0; | | |||
5124 | | ||||
5125 | d->mSelectMusicSource.bindValue(QStringLiteral(":name"), name); | | |||
5126 | | ||||
5127 | auto queryResult = d->mSelectMusicSource.exec(); | | |||
5128 | | ||||
5129 | if (!queryResult || !d->mSelectMusicSource.isSelect() || !d->mSelectMusicSource.isActive()) { | | |||
5130 | Q_EMIT databaseError(); | | |||
5131 | | ||||
5132 | qDebug() << "DatabaseInterface::insertMusicSource" << d->mSelectMusicSource.lastQuery(); | | |||
5133 | qDebug() << "DatabaseInterface::insertMusicSource" << d->mSelectMusicSource.boundValues(); | | |||
5134 | qDebug() << "DatabaseInterface::insertMusicSource" << d->mSelectMusicSource.lastError(); | | |||
5135 | | ||||
5136 | d->mSelectMusicSource.finish(); | | |||
5137 | | ||||
5138 | return result; | | |||
5139 | } | | |||
5140 | | ||||
5141 | if (d->mSelectMusicSource.next()) { | | |||
5142 | result = d->mSelectMusicSource.record().value(0).toULongLong(); | | |||
5143 | | ||||
5144 | d->mSelectMusicSource.finish(); | | |||
5145 | | ||||
5146 | return result; | | |||
5147 | } | | |||
5148 | | ||||
5149 | d->mSelectMusicSource.finish(); | | |||
5150 | | ||||
5151 | d->mInsertMusicSource.bindValue(QStringLiteral(":discoverId"), d->mDiscoverId); | | |||
5152 | d->mInsertMusicSource.bindValue(QStringLiteral(":name"), name); | | |||
5153 | | ||||
5154 | queryResult = d->mInsertMusicSource.exec(); | | |||
5155 | | ||||
5156 | if (!queryResult || !d->mInsertMusicSource.isActive()) { | | |||
5157 | Q_EMIT databaseError(); | | |||
5158 | | ||||
5159 | qDebug() << "DatabaseInterface::insertMusicSource" << d->mInsertMusicSource.lastQuery(); | | |||
5160 | qDebug() << "DatabaseInterface::insertMusicSource" << d->mInsertMusicSource.boundValues(); | | |||
5161 | qDebug() << "DatabaseInterface::insertMusicSource" << d->mInsertMusicSource.lastError(); | | |||
5162 | | ||||
5163 | d->mInsertMusicSource.finish(); | | |||
5164 | | ||||
5165 | return d->mDiscoverId; | | |||
5166 | } | | |||
5167 | | ||||
5168 | d->mInsertMusicSource.finish(); | | |||
5169 | | ||||
5170 | ++d->mDiscoverId; | | |||
5171 | | ||||
5172 | return d->mDiscoverId - 1; | | |||
5173 | } | | |||
5174 | | ||||
5175 | QList<qulonglong> DatabaseInterface::fetchTrackIds(qulonglong albumId) | 5284 | QList<qulonglong> DatabaseInterface::fetchTrackIds(qulonglong albumId) | ||
5176 | { | 5285 | { | ||
5177 | auto allTracks = QList<qulonglong>(); | 5286 | auto allTracks = QList<qulonglong>(); | ||
5178 | 5287 | | |||
5179 | d->mSelectTrackQuery.bindValue(QStringLiteral(":albumId"), albumId); | 5288 | d->mSelectTrackQuery.bindValue(QStringLiteral(":albumId"), albumId); | ||
5180 | 5289 | | |||
5181 | auto result = d->mSelectTrackQuery.exec(); | 5290 | auto result = d->mSelectTrackQuery.exec(); | ||
5182 | 5291 | | |||
▲ Show 20 Lines • Show All 726 Lines • Show Last 20 Lines |