diff options
Diffstat (limited to 'src/djinterop/enginelibrary/schema/schema_1_6_0.cpp')
-rw-r--r-- | src/djinterop/enginelibrary/schema/schema_1_6_0.cpp | 1098 |
1 files changed, 1098 insertions, 0 deletions
diff --git a/src/djinterop/enginelibrary/schema/schema_1_6_0.cpp b/src/djinterop/enginelibrary/schema/schema_1_6_0.cpp new file mode 100644 index 0000000..2cd86e4 --- /dev/null +++ b/src/djinterop/enginelibrary/schema/schema_1_6_0.cpp @@ -0,0 +1,1098 @@ +/* + 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 <http://www.gnu.org/licenses/>. + */ + +#include <sqlite_modern_cpp.h> + +#include <djinterop/djinterop.hpp> +#include <djinterop/enginelibrary/schema/schema_1_6_0.hpp> +#include <djinterop/enginelibrary/schema/schema_validate_utils.hpp> +#include <djinterop/util.hpp> + +namespace djinterop::enginelibrary::schema +{ +void schema_1_6_0::verify_music_master_list(sqlite::database& db) const +{ + { + master_list items{db, "music", "table"}; + auto iter = items.begin(), end = items.end(); + validate(iter, end, "music", "table", "AlbumArt", "AlbumArt"); + ++iter; + validate(iter, end, "music", "table", "CopiedTrack", "CopiedTrack"); + ++iter; + validate(iter, end, "music", "table", "Crate", "Crate"); + ++iter; + validate( + iter, end, "music", "table", "CrateHierarchy", "CrateHierarchy"); + ++iter; + validate( + iter, end, "music", "table", "CrateParentList", "CrateParentList"); + ++iter; + validate( + iter, end, "music", "table", "CrateTrackList", "CrateTrackList"); + ++iter; + validate(iter, end, "music", "table", "Historylist", "Historylist"); + ++iter; + validate( + iter, end, "music", "table", "HistorylistTrackList", + "HistorylistTrackList"); + ++iter; + validate(iter, end, "music", "table", "Information", "Information"); + ++iter; + validate(iter, end, "music", "table", "MetaData", "MetaData"); + ++iter; + validate( + iter, end, "music", "table", "MetaDataInteger", "MetaDataInteger"); + ++iter; + validate(iter, end, "music", "table", "Playlist", "Playlist"); + ++iter; + validate( + iter, end, "music", "table", "PlaylistTrackList", + "PlaylistTrackList"); + ++iter; + validate(iter, end, "music", "table", "Preparelist", "Preparelist"); + ++iter; + validate( + iter, end, "music", "table", "PreparelistTrackList", + "PreparelistTrackList"); + ++iter; + validate(iter, end, "music", "table", "Track", "Track"); + ++iter; + validate_no_more(iter, end, "master_list", "music"); + } + { + master_list items{db, "music", "view"}; + auto iter = items.begin(), end = items.end(); + validate_no_more(iter, end, "master_list", "music"); + } +} + +void schema_1_6_0::verify_performance_master_list(sqlite::database& db) const +{ + { + master_list items{db, "perfdata", "table"}; + auto iter = items.begin(), end = items.end(); + validate(iter, end, "perfdata", "table", "Information", "Information"); + ++iter; + validate( + iter, end, "perfdata", "table", "PerformanceData", + "PerformanceData"); + ++iter; + validate_no_more(iter, end, "master_list", "perfdata"); + } + { + master_list items{db, "perfdata", "view"}; + auto iter = items.begin(), end = items.end(); + validate_no_more(iter, end, "master_list", "perfdata"); + } +} + +void schema_1_6_0::verify_album_art(sqlite::database& db) const +{ + { + table_info cols{db, "music", "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, "music", "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, "music", "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, "music", "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"); + } +} + +void schema_1_6_0::verify_copied_track(sqlite::database& db) const +{ + { + table_info cols{db, "music", "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, "music", "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, "music", "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"); + } +} + +void schema_1_6_0::verify_crate(sqlite::database& db) const +{ + { + table_info cols{db, "music", "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, "music", "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, "music", "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, "music", "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, "music", "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"); + } +} + +void schema_1_6_0::verify_crate_hierarchy(sqlite::database& db) const +{ + { + table_info cols{db, "music", "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, "music", "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, "music", "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, "music", "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"); + } +} + +void schema_1_6_0::verify_crate_parent_list(sqlite::database& db) const +{ + { + table_info cols{db, "music", "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, "music", "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, "music", "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, "music", "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"); + } +} + +void schema_1_6_0::verify_crate_track_list(sqlite::database& db) const +{ + { + table_info cols{db, "music", "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, "music", "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, "music", "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, "music", "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"); + } +} + +void schema_1_6_0::verify_historylist(sqlite::database& db) const +{ + { + table_info cols{db, "music", "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, "music", "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, "music", "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"); + } +} + +void schema_1_6_0::verify_historylist_track_list(sqlite::database& db) const +{ + { + table_info cols{db, "music", "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, "music", "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, "music", "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, "music", "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, "music", "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"); + } +} + +void schema_1_6_0::verify_information(sqlite::database& db, const std::string& db_name) const +{ + { + table_info cols{db, db_name, "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, "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", db_name + ".Information"); + } + { + index_list indices{db, db_name, "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", db_name + ".Information"); + } + { + index_info ii{db, db_name, "index_Information_id"}; + auto iter = ii.begin(), end = ii.end(); + validate(iter, end, 0, "id"); + ++iter; + validate_no_more( + iter, end, "index_info", db_name + ".index_Information_id"); + } +} + +void schema_1_6_0::verify_meta_data(sqlite::database& db) const +{ + { + table_info cols{db, "music", "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, "music", "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, "music", "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, "music", "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, "music", "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, "music", "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"); + } +} + +void schema_1_6_0::verify_meta_data_integer(sqlite::database& db) const +{ + { + table_info cols{db, "music", "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, "music", "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, "music", "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, "music", "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, "music", "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, "music", "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"); + } +} + +void schema_1_6_0::verify_playlist(sqlite::database& db) const +{ + { + table_info cols{db, "music", "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, "music", "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, "music", "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"); + } +} + +void schema_1_6_0::verify_playlist_track_list(sqlite::database& db) const +{ + { + table_info cols{db, "music", "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, "music", "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, "music", "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, "music", "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"); + } +} + +void schema_1_6_0::verify_preparelist(sqlite::database& db) const +{ + { + table_info cols{db, "music", "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, "music", "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, "music", "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"); + } +} + +void schema_1_6_0::verify_preparelist_track_list(sqlite::database& db) const +{ + { + table_info cols{db, "music", "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, "music", "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, "music", "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, "music", "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"); + } +} + +void schema_1_6_0::verify_track(sqlite::database& db) const +{ + { + table_info cols{db, "music", "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, "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, "music", "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, "music", "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, "music", "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, "music", "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, "music", "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, "music", "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, "music", "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, "music", "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"); + } +} + +void schema_1_6_0::verify_performance_data(sqlite::database& db) const +{ + { + table_info cols{db, "perfdata", "PerformanceData"}; + auto iter = cols.begin(), end = cols.end(); + validate(iter, end, "beatData", "BLOB", 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, "perfdata", "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, "perfdata", "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 schema_1_6_0::verify_music_schema(sqlite::database& db) const +{ + verify_music_master_list(db); + + verify_information(db, "music"); + 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_meta_data(db); + verify_meta_data_integer(db); + verify_playlist(db); + verify_playlist_track_list(db); + verify_preparelist(db); + verify_preparelist_track_list(db); + verify_track(db); +} + +void schema_1_6_0::verify_performance_schema(sqlite::database& db) const +{ + verify_performance_master_list(db); + + verify_information(db, "perfdata"); + verify_performance_data(db); +} + +void schema_1_6_0::create_music_schema(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, 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 , " + "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 )"; |