/* This file is part of libdjinterop. libdjinterop is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. libdjinterop is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with libdjinterop. If not, see . */ #include #include #include #include #include namespace djinterop::enginelibrary { static void verify_album_art(sqlite::database &db) { { table_info cols{db, "AlbumArt"}; auto iter = cols.begin(), end = cols.end(); validate(iter, end, "albumArt", "BLOB", 0, "", 0); ++iter; validate(iter, end, "hash", "TEXT", 0, "", 0); ++iter; validate(iter, end, "id", "INTEGER", 0, "", 1); ++iter; validate_no_more(iter, end, "table_info", "AlbumArt"); } { index_list indices{db, "AlbumArt"}; auto iter = indices.begin(), end = indices.end(); validate(iter, end, "index_AlbumArt_hash", 0, "c", 0); ++iter; validate(iter, end, "index_AlbumArt_id", 0, "c", 0); ++iter; validate_no_more(iter, end, "index_list", "AlbumArt"); } { index_info ii{db, "index_AlbumArt_hash"}; auto iter = ii.begin(), end = ii.end(); validate(iter, end, 0, "hash"); ++iter; validate_no_more(iter, end, "index_info", "index_AlbumArt_hash"); } { index_info ii{db, "index_AlbumArt_id"}; auto iter = ii.begin(), end = ii.end(); validate(iter, end, 0, "id"); ++iter; validate_no_more(iter, end, "index_info", "index_AlbumArt_id"); } } static void verify_copied_track(sqlite::database &db) { { table_info cols{db, "CopiedTrack"}; auto iter = cols.begin(), end = cols.end(); validate(iter, end, "idOfTrackInSourceDatabase", "INTEGER", 0, "", 0); ++iter; validate(iter, end, "trackId", "INTEGER", 0, "", 1); ++iter; validate(iter, end, "uuidOfSourceDatabase", "TEXT", 0, "", 0); ++iter; validate_no_more(iter, end, "table_info", "CopiedTrack"); } { index_list indices{db, "CopiedTrack"}; auto iter = indices.begin(), end = indices.end(); validate(iter, end, "index_CopiedTrack_trackId", 0, "c", 0); ++iter; validate_no_more(iter, end, "index_list", "CopiedTrack"); } { index_info ii{db, "index_CopiedTrack_trackId"}; auto iter = ii.begin(), end = ii.end(); validate(iter, end, 0, "trackId"); ++iter; validate_no_more(iter, end, "index_info", "index_CopiedTrack_trackId"); } } static void verify_crate(sqlite::database &db) { { table_info cols{db, "Crate"}; auto iter = cols.begin(), end = cols.end(); validate(iter, end, "id", "INTEGER", 0, "", 1); ++iter; validate(iter, end, "path", "TEXT", 0, "", 0); ++iter; validate(iter, end, "title", "TEXT", 0, "", 0); ++iter; validate_no_more(iter, end, "table_info", "Crate"); } { index_list indices{db, "Crate"}; auto iter = indices.begin(), end = indices.end(); validate(iter, end, "index_Crate_id", 0, "c", 0); ++iter; validate(iter, end, "index_Crate_path", 0, "c", 0); ++iter; validate(iter, end, "index_Crate_title", 0, "c", 0); ++iter; validate_no_more(iter, end, "index_list", "Crate"); } { index_info ii{db, "index_Crate_path"}; auto iter = ii.begin(), end = ii.end(); validate(iter, end, 0, "path"); ++iter; validate_no_more(iter, end, "index_info", "index_Crate_path"); } { index_info ii{db, "index_Crate_title"}; auto iter = ii.begin(), end = ii.end(); validate(iter, end, 0, "title"); ++iter; validate_no_more(iter, end, "index_info", "index_Crate_title"); } { index_info ii{db, "index_Crate_id"}; auto iter = ii.begin(), end = ii.end(); validate(iter, end, 0, "id"); ++iter; validate_no_more(iter, end, "index_info", "index_Crate_id"); } } static void verify_crate_hierarchy(sqlite::database &db) { { table_info cols{db, "CrateHierarchy"}; auto iter = cols.begin(), end = cols.end(); validate(iter, end, "crateId", "INTEGER", 0, "", 0); ++iter; validate(iter, end, "crateIdChild", "INTEGER", 0, "", 0); ++iter; validate_no_more(iter, end, "table_info", "CrateHierarchy"); } { index_list indices{db, "CrateHierarchy"}; auto iter = indices.begin(), end = indices.end(); validate(iter, end, "index_CrateHierarchy_crateId", 0, "c", 0); ++iter; validate(iter, end, "index_CrateHierarchy_crateIdChild", 0, "c", 0); ++iter; validate_no_more(iter, end, "index_list", "CrateHierarchy"); } { index_info ii{db, "index_CrateHierarchy_crateId"}; auto iter = ii.begin(), end = ii.end(); validate(iter, end, 0, "crateId"); ++iter; validate_no_more( iter, end, "index_info", "index_CrateHierarchy_crateId"); } { index_info ii{db, "index_CrateHierarchy_crateIdChild"}; auto iter = ii.begin(), end = ii.end(); validate(iter, end, 0, "crateIdChild"); ++iter; validate_no_more( iter, end, "index_info", "index_CrateHierarchy_crateIdChild"); } } static void verify_crate_parent_list(sqlite::database &db) { { table_info cols{db, "CrateParentList"}; auto iter = cols.begin(), end = cols.end(); validate(iter, end, "crateOriginId", "INTEGER", 0, "", 0); ++iter; validate(iter, end, "crateParentId", "INTEGER", 0, "", 0); ++iter; validate_no_more(iter, end, "table_info", "CrateParentList"); } { index_list indices{db, "CrateParentList"}; auto iter = indices.begin(), end = indices.end(); validate(iter, end, "index_CrateParentList_crateOriginId", 0, "c", 0); ++iter; validate(iter, end, "index_CrateParentList_crateParentId", 0, "c", 0); ++iter; validate_no_more(iter, end, "index_list", "CrateParentList"); } { index_info ii{db, "index_CrateParentList_crateOriginId"}; auto iter = ii.begin(), end = ii.end(); validate(iter, end, 0, "crateOriginId"); ++iter; validate_no_more( iter, end, "index_info", "index_CrateParentList_crateOriginId"); } { index_info ii{db, "index_CrateParentList_crateParentId"}; auto iter = ii.begin(), end = ii.end(); validate(iter, end, 0, "crateParentId"); ++iter; validate_no_more( iter, end, "index_info", "index_CrateParentList_crateParentId"); } } static void verify_crate_track_list(sqlite::database &db) { { table_info cols{db, "CrateTrackList"}; auto iter = cols.begin(), end = cols.end(); validate(iter, end, "crateId", "INTEGER", 0, "", 0); ++iter; validate(iter, end, "trackId", "INTEGER", 0, "", 0); ++iter; validate_no_more(iter, end, "table_info", "CrateTrackList"); } { index_list indices{db, "CrateTrackList"}; auto iter = indices.begin(), end = indices.end(); validate(iter, end, "index_CrateTrackList_crateId", 0, "c", 0); ++iter; validate(iter, end, "index_CrateTrackList_trackId", 0, "c", 0); ++iter; validate_no_more(iter, end, "index_list", "CrateTrackList"); } { index_info ii{db, "index_CrateTrackList_crateId"}; auto iter = ii.begin(), end = ii.end(); validate(iter, end, 0, "crateId"); ++iter; validate_no_more( iter, end, "index_info", "index_CrateTrackList_crateId"); } { index_info ii{db, "index_CrateTrackList_trackId"}; auto iter = ii.begin(), end = ii.end(); validate(iter, end, 0, "trackId"); ++iter; validate_no_more( iter, end, "index_info", "index_CrateTrackList_trackId"); } } static void verify_historylist(sqlite::database &db) { { table_info cols{db, "Historylist"}; auto iter = cols.begin(), end = cols.end(); validate(iter, end, "id", "INTEGER", 0, "", 1); ++iter; validate(iter, end, "title", "TEXT", 0, "", 0); ++iter; validate_no_more(iter, end, "table_info", "Historylist"); } { index_list indices{db, "Historylist"}; auto iter = indices.begin(), end = indices.end(); validate(iter, end, "index_Historylist_id", 0, "c", 0); ++iter; validate_no_more(iter, end, "index_list", "Historylist"); } { index_info ii{db, "index_Historylist_id"}; auto iter = ii.begin(), end = ii.end(); validate(iter, end, 0, "id"); ++iter; validate_no_more(iter, end, "index_info", "index_Historylist"); } } static void verify_historylist_track_list(sqlite::database &db) { { table_info cols{db, "HistorylistTrackList"}; auto iter = cols.begin(), end = cols.end(); validate(iter, end, "databaseUuid", "TEXT", 0, "", 0); ++iter; validate(iter, end, "date", "INTEGER", 0, "", 0); ++iter; validate(iter, end, "historylistId", "INTEGER", 0, "", 0); ++iter; validate(iter, end, "trackId", "INTEGER", 0, "", 0); ++iter; validate(iter, end, "trackIdInOriginDatabase", "INTEGER", 0, "", 0); ++iter; validate_no_more(iter, end, "table_info", "HistorylistTrackList"); } { index_list indices{db, "HistorylistTrackList"}; auto iter = indices.begin(), end = indices.end(); validate(iter, end, "index_HistorylistTrackList_date", 0, "c", 0); ++iter; validate( iter, end, "index_HistorylistTrackList_historylistId", 0, "c", 0); ++iter; validate(iter, end, "index_HistorylistTrackList_trackId", 0, "c", 0); ++iter; validate_no_more(iter, end, "index_list", "HistorylistTrackList"); } { index_info ii{db, "index_HistorylistTrackList_date"}; auto iter = ii.begin(), end = ii.end(); validate(iter, end, 0, "date"); ++iter; validate_no_more( iter, end, "index_info", "index_HistorylistTrackList_date"); } { index_info ii{db, "index_HistorylistTrackList_historylistId"}; auto iter = ii.begin(), end = ii.end(); validate(iter, end, 0, "historylistId"); ++iter; validate_no_more( iter, end, "index_info", "index_HistorylistTrackList_historylistId"); } { index_info ii{db, "index_HistorylistTrackList_trackId"}; auto iter = ii.begin(), end = ii.end(); validate(iter, end, 0, "trackId"); ++iter; validate_no_more( iter, end, "index_info", "index_HistorylistTrackList_trackId"); } } static void verify_information(sqlite::database &db) { { table_info cols{db, "Information"}; auto iter = cols.begin(), end = cols.end(); validate(iter, end, "currentPlayedIndiciator", "INTEGER", 0, "", 0); ++iter; validate(iter, end, "id", "INTEGER", 0, "", 1); ++iter; validate( iter, end, "lastRekordBoxLibraryImportReadCounter", "INTEGER", 0, "", 0); ++iter; validate(iter, end, "schemaVersionMajor", "INTEGER", 0, "", 0); ++iter; validate(iter, end, "schemaVersionMinor", "INTEGER", 0, "", 0); ++iter; validate(iter, end, "schemaVersionPatch", "INTEGER", 0, "", 0); ++iter; validate(iter, end, "uuid", "TEXT", 0, "", 0); ++iter; validate_no_more(iter, end, "table_info", "Information"); } { index_list indices{db, "Information"}; auto iter = indices.begin(), end = indices.end(); validate(iter, end, "index_Information_id", 0, "c", 0); ++iter; validate_no_more(iter, end, "index_list", "Information"); } { index_info ii{db, "index_Information_id"}; auto iter = ii.begin(), end = ii.end(); validate(iter, end, 0, "id"); ++iter; validate_no_more(iter, end, "index_info", "index_Information_id"); } } static void verify_metadata(sqlite::database &db) { { table_info cols{db, "MetaData"}; auto iter = cols.begin(), end = cols.end(); validate(iter, end, "id", "INTEGER", 0, "", 1); ++iter; validate(iter, end, "text", "TEXT", 0, "", 0); ++iter; validate(iter, end, "type", "INTEGER", 0, "", 2); ++iter; validate_no_more(iter, end, "table_info", "MetaData"); } { index_list indices{db, "MetaData"}; auto iter = indices.begin(), end = indices.end(); validate(iter, end, "index_MetaData_id", 0, "c", 0); ++iter; validate(iter, end, "index_MetaData_text", 0, "c", 0); ++iter; validate(iter, end, "index_MetaData_type", 0, "c", 0); ++iter; validate(iter, end, "sqlite_autoindex_MetaData_1", 1, "pk", 0); ++iter; validate_no_more(iter, end, "index_list", "MetaData"); } { index_info ii{db, "index_MetaData_id"}; auto iter = ii.begin(), end = ii.end(); validate(iter, end, 0, "id"); ++iter; validate_no_more(iter, end, "index_info", "index_MetaData_id"); } { index_info ii{db, "index_MetaData_text"}; auto iter = ii.begin(), end = ii.end(); validate(iter, end, 0, "text"); ++iter; validate_no_more(iter, end, "index_info", "index_MetaData_text"); } { index_info ii{db, "index_MetaData_type"}; auto iter = ii.begin(), end = ii.end(); validate(iter, end, 0, "type"); ++iter; validate_no_more(iter, end, "index_info", "index_MetaData_type"); } { index_info ii{db, "sqlite_autoindex_MetaData_1"}; auto iter = ii.begin(), end = ii.end(); validate(iter, end, 0, "id"); ++iter; validate(iter, end, 1, "type"); ++iter; validate_no_more( iter, end, "index_info", "sqlite_autoindex_MetaData_1"); } } static void verify_metadata_integer(sqlite::database &db) { { table_info cols{db, "MetaDataInteger"}; auto iter = cols.begin(), end = cols.end(); validate(iter, end, "id", "INTEGER", 0, "", 1); ++iter; validate(iter, end, "type", "INTEGER", 0, "", 2); ++iter; validate(iter, end, "value", "INTEGER", 0, "", 0); ++iter; validate_no_more(iter, end, "table_info", "MetaDataInteger"); } { index_list indices{db, "MetaDataInteger"}; auto iter = indices.begin(), end = indices.end(); validate(iter, end, "index_MetaDataInteger_id", 0, "c", 0); ++iter; validate(iter, end, "index_MetaDataInteger_type", 0, "c", 0); ++iter; validate(iter, end, "index_MetaDataInteger_value", 0, "c", 0); ++iter; validate(iter, end, "sqlite_autoindex_MetaDataInteger_1", 1, "pk", 0); ++iter; validate_no_more(iter, end, "index_list", "MetaDataInteger"); } { index_info ii{db, "index_MetaDataInteger_id"}; auto iter = ii.begin(), end = ii.end(); validate(iter, end, 0, "id"); ++iter; validate_no_more(iter, end, "index_info", "index_MetaDataInteger_id"); } { index_info ii{db, "index_MetaDataInteger_type"}; auto iter = ii.begin(), end = ii.end(); validate(iter, end, 0, "type"); ++iter; validate_no_more(iter, end, "index_info", "index_MetaDataInteger_type"); } { index_info ii{db, "index_MetaDataInteger_value"}; auto iter = ii.begin(), end = ii.end(); validate(iter, end, 0, "value"); ++iter; validate_no_more( iter, end, "index_info", "index_MetaDataInteger_value"); } { index_info ii{db, "sqlite_autoindex_MetaDataInteger_1"}; auto iter = ii.begin(), end = ii.end(); validate(iter, end, 0, "id"); ++iter; validate(iter, end, 1, "type"); ++iter; validate_no_more( iter, end, "index_info", "sqlite_autoindex_MetaDataInteger_1"); } } static void verify_playlist(sqlite::database &db) { { table_info cols{db, "Playlist"}; auto iter = cols.begin(), end = cols.end(); validate(iter, end, "id", "INTEGER", 0, "", 1); ++iter; validate(iter, end, "title", "TEXT", 0, "", 0); ++iter; validate_no_more(iter, end, "table_info", "Playlist"); } { index_list indices{db, "Playlist"}; auto iter = indices.begin(), end = indices.end(); validate(iter, end, "index_Playlist_id", 0, "c", 0); ++iter; validate_no_more(iter, end, "index_list", "Playlist"); } { index_info ii{db, "index_Playlist_id"}; auto iter = ii.begin(), end = ii.end(); validate(iter, end, 0, "id"); ++iter; validate_no_more(iter, end, "index_info", "index_Playlist_id"); } } static void verify_playlist_track_list(sqlite::database &db) { { table_info cols{db, "PlaylistTrackList"}; auto iter = cols.begin(), end = cols.end(); validate(iter, end, "databaseUuid", "TEXT", 0, "", 0); ++iter; validate(iter, end, "playlistId", "INTEGER", 0, "", 0); ++iter; validate(iter, end, "trackId", "INTEGER", 0, "", 0); ++iter; validate(iter, end, "trackIdInOriginDatabase", "INTEGER", 0, "", 0); ++iter; validate(iter, end, "trackNumber", "INTEGER", 0, "", 0); ++iter; validate_no_more(iter, end, "table_info", "PlaylistTrackList"); } { index_list indices{db, "PlaylistTrackList"}; auto iter = indices.begin(), end = indices.end(); validate(iter, end, "index_PlaylistTrackList_playlistId", 0, "c", 0); ++iter; validate(iter, end, "index_PlaylistTrackList_trackId", 0, "c", 0); ++iter; validate_no_more(iter, end, "index_list", "PlaylistTrackList"); } { index_info ii{db, "index_PlaylistTrackList_playlistId"}; auto iter = ii.begin(), end = ii.end(); validate(iter, end, 0, "playlistId"); ++iter; validate_no_more( iter, end, "index_info", "index_PlaylistTrackList_playlistId"); } { index_info ii{db, "index_PlaylistTrackList_trackId"}; auto iter = ii.begin(), end = ii.end(); validate(iter, end, 0, "trackId"); ++iter; validate_no_more( iter, end, "index_info", "index_PlaylistTrackList_trackId"); } } static void verify_preparelist(sqlite::database &db) { { table_info cols{db, "Preparelist"}; auto iter = cols.begin(), end = cols.end(); validate(iter, end, "id", "INTEGER", 0, "", 1); ++iter; validate(iter, end, "title", "TEXT", 0, "", 0); ++iter; validate_no_more(iter, end, "table_info", "Preparelist"); } { index_list indices{db, "Preparelist"}; auto iter = indices.begin(), end = indices.end(); validate(iter, end, "index_Preparelist_id", 0, "c", 0); ++iter; validate_no_more(iter, end, "index_list", "Preparelist"); } { index_info ii{db, "index_Preparelist_id"}; auto iter = ii.begin(), end = ii.end(); validate(iter, end, 0, "id"); ++iter; validate_no_more(iter, end, "index_info", "index_Preparelist_id"); } } static void verify_preparelist_track_list(sqlite::database &db) { { table_info cols{db, "PreparelistTrackList"}; auto iter = cols.begin(), end = cols.end(); validate(iter, end, "databaseUuid", "TEXT", 0, "", 0); ++iter; validate(iter, end, "playlistId", "INTEGER", 0, "", 0); ++iter; validate(iter, end, "trackId", "INTEGER", 0, "", 0); ++iter; validate(iter, end, "trackIdInOriginDatabase", "INTEGER", 0, "", 0); ++iter; validate(iter, end, "trackNumber", "INTEGER", 0, "", 0); ++iter; validate_no_more(iter, end, "table_info", "PreparelistTrackList"); } { index_list indices{db, "PreparelistTrackList"}; auto iter = indices.begin(), end = indices.end(); validate(iter, end, "index_PreparelistTrackList_playlistId", 0, "c", 0); ++iter; validate(iter, end, "index_PreparelistTrackList_trackId", 0, "c", 0); ++iter; validate_no_more(iter, end, "index_list", "PreparelistTrackList"); } { index_info ii{db, "index_PreparelistTrackList_playlistId"}; auto iter = ii.begin(), end = ii.end(); validate(iter, end, 0, "playlistId"); ++iter; validate_no_more( iter, end, "index_info", "index_PreparelistTrackList_playlistId"); } { index_info ii{db, "index_PreparelistTrackList_trackId"}; auto iter = ii.begin(), end = ii.end(); validate(iter, end, 0, "trackId"); ++iter; validate_no_more( iter, end, "index_info", "index_PreparelistTrackList_trackId"); } } static void verify_track(sqlite::database &db) { { table_info cols{db, "Track"}; auto iter = cols.begin(), end = cols.end(); validate(iter, end, "bitrate", "INTEGER", 0, "", 0); ++iter; validate(iter, end, "bpm", "INTEGER", 0, "", 0); ++iter; validate(iter, end, "bpmAnalyzed", "REAL", 0, "", 0); ++iter; validate(iter, end, "filename", "TEXT", 0, "", 0); ++iter; validate(iter, end, "id", "INTEGER", 0, "", 1); ++iter; validate(iter, end, "idAlbumArt", "INTEGER", 0, "", 0); ++iter; validate(iter, end, "idTrackInExternalDatabase", "INTEGER", 0, "", 0); ++iter; validate(iter, end, "isExternalTrack", "NUMERIC", 0, "", 0); ++iter; validate(iter, end, "length", "INTEGER", 0, "", 0); ++iter; validate(iter, end, "lengthCalculated", "INTEGER", 0, "", 0); ++iter; validate(iter, end, "path", "TEXT", 0, "", 0); ++iter; validate(iter, end, "pdbImportKey", "INTEGER", 0, "", 0); ++iter; validate(iter, end, "playOrder", "INTEGER", 0, "", 0); ++iter; validate(iter, end, "trackType", "INTEGER", 0, "", 0); ++iter; validate(iter, end, "uuidOfExternalDatabase", "TEXT", 0, "", 0); ++iter; validate(iter, end, "year", "INTEGER", 0, "", 0); ++iter; validate_no_more(iter, end, "table_info", "Track"); } { index_list indices{db, "Track"}; auto iter = indices.begin(), end = indices.end(); validate(iter, end, "index_Track_filename", 0, "c", 0); ++iter; validate(iter, end, "index_Track_id", 0, "c", 0); ++iter; validate(iter, end, "index_Track_idAlbumArt", 0, "c", 0); ++iter; validate(iter, end, "index_Track_idTrackInExternalDatabase", 0, "c", 0); ++iter; validate(iter, end, "index_Track_isExternalTrack", 0, "c", 0); ++iter; validate(iter, end, "index_Track_path", 0, "c", 0); ++iter; validate(iter, end, "index_Track_uuidOfExternalDatabase", 0, "c", 0); ++iter; validate_no_more(iter, end, "index_list", "Track"); } { index_info ii{db, "index_Track_filename"}; auto iter = ii.begin(), end = ii.end(); validate(iter, end, 0, "filename"); ++iter; validate_no_more(iter, end, "index_info", "index_Track_filename"); } { index_info ii{db, "index_Track_id"}; auto iter = ii.begin(), end = ii.end(); validate(iter, end, 0, "id"); ++iter; validate_no_more(iter, end, "index_info", "index_Track_id"); } { index_info ii{db, "index_Track_idAlbumArt"}; auto iter = ii.begin(), end = ii.end(); validate(iter, end, 0, "idAlbumArt"); ++iter; validate_no_more(iter, end, "index_info", "index_Track_idAlbumArt"); } { index_info ii{db, "index_Track_idTrackInExternalDatabase"}; auto iter = ii.begin(), end = ii.end(); validate(iter, end, 0, "idTrackInExternalDatabase"); ++iter; validate_no_more( iter, end, "index_info", "index_Track_idTrackInExternalDatabase"); } { index_info ii{db, "index_Track_isExternalTrack"}; auto iter = ii.begin(), end = ii.end(); validate(iter, end, 0, "isExternalTrack"); ++iter; validate_no_more( iter, end, "index_info", "index_Track_isExternalTrack"); } { index_info ii{db, "index_Track_path"}; auto iter = ii.begin(), end = ii.end(); validate(iter, end, 0, "path"); ++iter; validate_no_more(iter, end, "index_info", "index_Track_path"); } { index_info ii{db, "index_Track_uuidOfExternalDatabase"}; auto iter = ii.begin(), end = ii.end(); validate(iter, end, 0, "uuidOfExternalDatabase"); ++iter; validate_no_more( iter, end, "index_info", "index_Track_uuidOfExternalDatabase"); } } static void verify_performance_data(sqlite::database &db) { { table_info cols{db, "PerformanceData"}; auto iter = cols.begin(), end = cols.end(); validate(iter, end, "beatData", "BLOB", 0, "", 0); ++iter; validate(iter, end, "hasRekordboxValues", "NUMERIC", 0, "", 0); ++iter; validate(iter, end, "hasSeratoValues", "NUMERIC", 0, "", 0); ++iter; validate(iter, end, "highResolutionWaveFormData", "BLOB", 0, "", 0); ++iter; validate(iter, end, "id", "INTEGER", 0, "", 1); ++iter; validate(iter, end, "isAnalyzed", "NUMERIC", 0, "", 0); ++iter; validate(iter, end, "isRendered", "NUMERIC", 0, "", 0); ++iter; validate(iter, end, "loops", "BLOB", 0, "", 0); ++iter; validate(iter, end, "overviewWaveFormData", "BLOB", 0, "", 0); ++iter; validate(iter, end, "quickCues", "BLOB", 0, "", 0); ++iter; validate(iter, end, "trackData", "BLOB", 0, "", 0); ++iter; validate_no_more(iter, end, "table_info", "PerformanceData"); } { index_list indices{db, "PerformanceData"}; auto iter = indices.begin(), end = indices.end(); validate(iter, end, "index_PerformanceData_id", 0, "c", 0); ++iter; validate_no_more(iter, end, "index_list", "PerformanceData"); } { index_info ii{db, "index_PerformanceData_id"}; auto iter = ii.begin(), end = ii.end(); validate(iter, end, 0, "id"); ++iter; validate_no_more(iter, end, "index_info", "index_PerformanceData_id"); } } void verify_music_schema_1_7_1(sqlite::database &db) { verify_information(db); // Note: the version can be used to verify schema differently, should it // ever change in future. verify_album_art(db); verify_copied_track(db); verify_crate(db); verify_crate_hierarchy(db); verify_crate_parent_list(db); verify_crate_track_list(db); verify_historylist(db); verify_historylist_track_list(db); verify_metadata(db); verify_metadata_integer(db); verify_playlist(db); verify_playlist_track_list(db); verify_preparelist(db); verify_preparelist_track_list(db); verify_track(db); } void verify_performance_schema_1_7_1(sqlite::database &db) { verify_information(db); verify_performance_data(db); } void create_music_schema_1_7_1(sqlite::database &db) { // Note that the table creation order is precisely the same as that produced // by a real hardware player. // Track db << "CREATE TABLE music.Track ( [id] INTEGER, [playOrder] INTEGER , " "[length] INTEGER , [lengthCalculated] INTEGER , [bpm] INTEGER , " "[year] INTEGER , [path] TEXT , [filename] TEXT , [bitrate] INTEGER " ", [bpmAnalyzed] REAL , [trackType] INTEGER , [isExternalTrack] " "NUMERIC , [uuidOfExternalDatabase] TEXT , " "[idTrackInExternalDatabase] INTEGER , [idAlbumArt] INTEGER " "REFERENCES AlbumArt ( id ) ON DELETE RESTRICT, [pdbImportKey] " "INTEGER , PRIMARY KEY ( [id] ) )"; db << "CREATE INDEX music.index_Track_id ON Track ( id )"; db << "CREATE INDEX music.index_Track_path ON Track ( path )"; db << "CREATE INDEX music.index_Track_filename ON Track ( filename )"; db << "CREATE INDEX music.index_Track_isExternalTrack ON Track ( " "isExternalTrack )"; db << "CREATE INDEX music.index_Track_uuidOfExternalDatabase ON Track ( " "uuidOfExternalDatabase )"; db << "CREATE INDEX music.index_Track_idTrackInExternalDatabase ON Track ( " "idTrackInExternalDatabase )"; db << "CREATE INDEX music.index_Track_idAlbumArt ON Track ( idAlbumArt )"; // Information db << "DROP TABLE IF EXISTS music.Information"; db << "CREATE TABLE music.Information ( [id] INTEGER, [uuid] TEXT , " "[schemaVersionMajor] INTEGER , [schemaVersionMinor] INTEGER , " "[schemaVersionPatch] INTEGER , [currentPlayedIndiciator] INTEGER , " "[lastRekordBoxLibraryImportReadCounter] INTEGER , PRIMARY KEY ( " "[id] ) )"; db << "CREATE INDEX music.index_Information_id ON Information ( id )"; // Metadata db << "CREATE TABLE music.MetaData ( [id] INTEGER REFERENCES Track ( id ) " " ON DELETE CASCADE, [type] INTEGER, [text] TEXT , PRIMARY KEY ( " "[id], [type] ) )"; db << "CREATE INDEX music.index_MetaData_id ON MetaData ( id )"; db << "CREATE INDEX music.index_MetaData_type ON MetaData ( type )"; db << "CREATE INDEX music.index_MetaData_text ON MetaData ( text )"; // MetadataInteger db << "CREATE TABLE music.MetaDataInteger ( [id] INTEGER REFERENCES Track " "( id ) ON DELETE CASCADE, [type] INTEGER, [value] INTEGER , " "PRIMARY KEY ( [id], [type] ) )"; db << "CREATE INDEX music.index_MetaDataInteger_id ON MetaDataInteger ( id " ")"; db << "CREATE INDEX music.index_MetaDataInteger_type ON MetaDataInteger ( " "type )"; db << "CREATE INDEX music.index_MetaDataInteger_value ON MetaDataInteger ( " "value )"; // Playlist db << "CREATE TABLE music.Playlist ( [id] INTEGER, [title] TEXT , PRIMARY " "KEY ( [id] ) )"; db << "CREATE INDEX music.index_Playlist_id ON Playlist ( id )"; // PlaylistTrackList db << "CREATE TABLE music.PlaylistTrackList ( [playlistId] INTEGER " "REFERENCES Playlist ( id ) ON DELETE CASCADE, [trackId] INTEGER " "REFERENCES Track ( id ) ON DELETE CASCADE, " "[trackIdInOriginDatabase] INTEGER , [databaseUuid] TEXT , " "[trackNumber] INTEGER )"; db << "CREATE INDEX music.index_PlaylistTrackList_playlistId ON " "PlaylistTrackList ( playlistId )"; db << "CREATE INDEX music.index_PlaylistTrackList_trackId ON " "PlaylistTrackList ( trackId )"; // Preparelist db << "CREATE TABLE music.Preparelist ( [id] INTEGER, [title] TEXT , " "PRIMARY KEY ( [id] ) )"; db << "CREATE INDEX music.index_Preparelist_id ON Preparelist ( id )"; // PreparelistTrackList db << "CREATE TABLE music.PreparelistTrackList ( [playlistId] INTEGER " "REFERENCES Preparelist ( id ) ON DELETE CASCADE, [trackId] INTEGER " " REFERENCES Track ( id ) ON DELETE CASCADE, " "[trackIdInOriginDatabase] INTEGER , [databaseUuid] TEXT , " "[trackNumber] INTEGER )"; db << "CREATE INDEX music.index_PreparelistTrackList_playlistId ON " "PreparelistTrackList ( playlistId )"; db << "CREATE INDEX music.index_PreparelistTrackList_trackId ON " "PreparelistTrackList ( trackId )"; // Historylist db << "CREATE TABLE music.Historylist ( [id] INTEGER, [title] TEXT , " "PRIMARY KEY ( [id] ) )"; db << "CREATE INDEX music.index_Historylist_id ON Historylist ( id )"; // HistorylistTrackList db << "CREATE TABLE music.HistorylistTrackList ( [historylistId] INTEGER " "REFERENCES Historylist ( id ) ON DELETE CASCADE, [trackId] INTEGER " " REFERENCES Track ( id ) ON DELETE CASCADE, " "[trackIdInOriginDatabase] INTEGER , [databaseUuid] TEXT , [date] " "INTEGER )"; db << "CREATE INDEX music.index_HistorylistTrackList_historylistId ON " "HistorylistTrackList ( historylistId )"; db << "CREATE INDEX music.index_HistorylistTrackList_trackId ON " "HistorylistTrackList ( trackId )"; db << "CREATE INDEX music.index_HistorylistTrackList_date ON " "HistorylistTrackList ( date )"; // Crate db << "CREATE TABLE music.Crate ( [id] INTEGER, [title] TEXT , [path] TEXT " ", PRIMARY KEY ( [id] ) )"; db << "CREATE INDEX music.index_Crate_id ON Crate ( id )"; db << "CREATE INDEX music.index_Crate_title ON Crate ( title )"; db << "CREATE INDEX music.index_Crate_path ON Crate ( path )"; // CrateParentList db << "CREATE TABLE music.CrateParentList ( [crateOriginId] INTEGER " "REFERENCES Crate ( id ) ON DELETE CASCADE, [crateParentId] INTEGER " " REFERENCES Crate ( id ) ON DELETE CASCADE)"; db << "CREATE INDEX music.index_CrateParentList_crateOriginId ON " "CrateParentList ( crateOriginId )"; db << "CREATE INDEX music.index_CrateParentList_crateParentId ON " "CrateParentList ( crateParentId )"; // CrateTrackList db << "CREATE TABLE music.CrateTrackList ( [crateId] INTEGER REFERENCES " "Crate ( id ) ON DELETE CASCADE, [trackId] INTEGER REFERENCES " "Track ( id ) ON DELETE CASCADE)"; db << "CREATE INDEX music.index_CrateTrackList_crateId ON CrateTrackList ( " "crateId )"; db << "CREATE INDEX music.index_CrateTrackList_trackId ON CrateTrackList ( " "trackId )"; // CrateHierarchy db << "CREATE TABLE music.CrateHierarchy ( [crateId] INTEGER REFERENCES " "Crate ( id ) ON DELETE CASCADE, [crateIdChild] INTEGER REFERENCES " "Crate ( id ) ON DELETE CASCADE)"; db << "CREATE INDEX music.index_CrateHierarchy_crateId ON CrateHierarchy ( " "crateId )"; db << "CREATE INDEX music.index_CrateHierarchy_crateIdChild ON " "CrateHierarchy ( crateIdChild )"; // AlbumArt db << "CREATE TABLE music.AlbumArt ( [id] INTEGER, [hash] TEXT , " "[albumArt] BLOB , PRIMARY KEY ( [id] ) )"; db << "CREATE INDEX music.index_AlbumArt_id ON AlbumArt ( id )"; db << "CREATE INDEX music.index_AlbumArt_hash ON AlbumArt ( hash )"; // CopiedTrack db << "CREATE TABLE music.CopiedTrack ( [trackId] INTEGER REFERENCES " "Track ( id ) ON DELETE CASCADE, [uuidOfSourceDatabase] TEXT , " "[idOfTrackInSourceDatabase] INTEGER , PRIMARY KEY ( [trackId] ) )"; db << "CREATE INDEX music.index_CopiedTrack_trackId ON CopiedTrack ( " "trackId )"; // Generate UUID for the Information table. auto uuid_str = generate_random_uuid(); // Not yet sure how the "currentPlayedIndiciator" (typo deliberate) value // is formed. auto current_played_indicator_fake_value = 5100658837829259927l; // Insert row into Information db << "INSERT INTO Information ([uuid], [schemaVersionMajor], " "[schemaVersionMinor], [schemaVersionPatch], " "[currentPlayedIndiciator], [lastRekordBoxLibraryImportReadCounter]) " "VALUES (?, ?, ?, ?, ?, ?)" << uuid_str << version_1_7_1.maj << version_1_7_1.min << version_1_7_1.pat << current_played_indicator_fake_value << 0; // Insert default album art entry db << "INSERT INTO AlbumArt VALUES (1, '', NULL)"; // Default history list entry db << "INSERT INTO Historylist VALUES (1, 'History 1')"; // Default prepare list entry db << "INSERT INTO Preparelist VALUES (1, 'Prepare')"; } void create_performance_schema_1_7_1(sqlite::database &db) { // Information db << "DROP TABLE IF EXISTS perfdata.Information"; db << "CREATE TABLE perfdata.Information ( [id] INTEGER, [uuid] TEXT , " "[schemaVersionMajor] INTEGER , [schemaVersionMinor] INTEGER , " "[schemaVersionPatch] INTEGER , [currentPlayedIndiciator] INTEGER , " "[lastRekordBoxLibraryImportReadCounter] INTEGER , PRIMARY KEY ( " "[id] ) )"; db << "CREATE INDEX perfdata.index_Information_id ON Information ( id )"; // PerformanceData db << "DROP TABLE IF EXISTS perfdata.PerformanceData"; db << "CREATE TABLE perfdata.PerformanceData ( [id] INTEGER, [isAnalyzed] " "NUMERIC , [isRendered] NUMERIC , [trackData] BLOB , " "[highResolutionWaveFormData] BLOB , [overviewWaveFormData] BLOB , " "[beatData] BLOB , [quickCues] BLOB , [loops] BLOB , " "[hasSeratoValues] NUMERIC , [hasRekordboxValues] NUMERIC , PRIMARY " "KEY ( [id] ) )"; db << "CREATE INDEX perfdata.index_PerformanceData_id ON PerformanceData ( " "id )"; // Generate UUID for the Information table auto uuid_str = generate_random_uuid(); // Insert row into Information db << "INSERT INTO perfdata.Information ([uuid], [schemaVersionMajor], " "[schemaVersionMinor], [schemaVersionPatch], " "[currentPlayedIndiciator], [lastRekordBoxLibraryImportReadCounter]) " "VALUES (?, ?, ?, ?, ?, ?)" << uuid_str << version_1_7_1.maj << version_1_7_1.min << version_1_7_1.pat << 0 << 0; } } // namespace djinterop::enginelibrary