1 /* 2 * Copyright (C) 2012-2018 Team Kodi 3 * This file is part of Kodi - https://kodi.tv 4 * 5 * SPDX-License-Identifier: GPL-2.0-or-later 6 * See LICENSES/README.md for more information. 7 */ 8 9 #pragma once 10 11 #include "media/MediaType.h" 12 13 #include <map> 14 #include <memory> 15 #include <set> 16 #include <string> 17 #include <vector> 18 19 class CVariant; 20 21 namespace dbiplus 22 { 23 class Dataset; 24 class field_value; 25 } 26 27 typedef enum { 28 // special fields used during sorting 29 FieldUnknown = -1, 30 FieldNone = 0, 31 FieldSort, // used to store the string to use for sorting 32 FieldSortSpecial, // whether the item needs special handling (0 = no, 1 = sort on top, 2 = sort on bottom) 33 FieldLabel, 34 FieldFolder, 35 FieldMediaType, 36 FieldRow, // the row number in a dataset 37 38 // special fields not retrieved from the database 39 FieldSize, 40 FieldDate, 41 FieldDriveType, 42 FieldStartOffset, 43 FieldEndOffset, 44 FieldProgramCount, 45 FieldBitrate, 46 FieldListeners, 47 FieldPlaylist, 48 FieldVirtualFolder, 49 FieldRandom, 50 FieldDateTaken, 51 FieldAudioCount, 52 FieldSubtitleCount, 53 54 FieldInstallDate, 55 FieldLastUpdated, 56 FieldLastUsed, 57 58 // fields retrievable from the database 59 FieldId, 60 FieldGenre, 61 FieldAlbum, 62 FieldDiscTitle, 63 FieldIsBoxset, 64 FieldTotalDiscs, 65 FieldOrigYear, 66 FieldOrigDate, 67 FieldArtist, 68 FieldArtistSort, 69 FieldAlbumArtist, 70 FieldTitle, 71 FieldSortTitle, 72 FieldOriginalTitle, 73 FieldYear, 74 FieldTime, 75 FieldTrackNumber, 76 FieldFilename, 77 FieldPath, 78 FieldPlaycount, 79 FieldLastPlayed, 80 FieldInProgress, 81 FieldRating, 82 FieldComment, 83 FieldRole, 84 FieldDateAdded, 85 FieldDateModified, 86 FieldDateNew, 87 FieldTvShowTitle, 88 FieldPlot, 89 FieldPlotOutline, 90 FieldTagline, 91 FieldTvShowStatus, 92 FieldVotes, 93 FieldDirector, 94 FieldActor, 95 FieldStudio, 96 FieldCountry, 97 FieldMPAA, 98 FieldTop250, 99 FieldSet, 100 FieldNumberOfEpisodes, 101 FieldNumberOfWatchedEpisodes, 102 FieldWriter, 103 FieldAirDate, 104 FieldEpisodeNumber, 105 FieldUniqueId, 106 FieldSeason, 107 FieldEpisodeNumberSpecialSort, 108 FieldSeasonSpecialSort, 109 FieldReview, 110 FieldThemes, 111 FieldMoods, 112 FieldStyles, 113 FieldAlbumType, 114 FieldMusicLabel, 115 FieldCompilation, 116 FieldSource, 117 FieldTrailer, 118 FieldVideoResolution, 119 FieldVideoAspectRatio, 120 FieldVideoCodec, 121 FieldAudioChannels, 122 FieldAudioCodec, 123 FieldAudioLanguage, 124 FieldSubtitleLanguage, 125 FieldProductionCode, 126 FieldTag, 127 FieldChannelName, 128 FieldChannelNumber, 129 FieldInstruments, 130 FieldBiography, 131 FieldArtistType, 132 FieldGender, 133 FieldDisambiguation, 134 FieldBorn, 135 FieldBandFormed, 136 FieldDisbanded, 137 FieldDied, 138 FieldStereoMode, 139 FieldUserRating, 140 FieldRelevance, // Used for actors' appearances 141 FieldClientChannelOrder, 142 FieldBPM, 143 FieldMusicBitRate, 144 FieldSampleRate, 145 FieldNoOfChannels, 146 FieldAlbumStatus, 147 FieldAlbumDuration, 148 FieldMax 149 } Field; 150 151 typedef std::set<Field> Fields; 152 typedef std::vector<Field> FieldList; 153 154 typedef enum { 155 DatabaseQueryPartSelect, 156 DatabaseQueryPartWhere, 157 DatabaseQueryPartOrderBy, 158 } DatabaseQueryPart; 159 160 typedef std::map<Field, CVariant> DatabaseResult; 161 typedef std::vector<DatabaseResult> DatabaseResults; 162 163 class DatabaseUtils 164 { 165 public: 166 static MediaType MediaTypeFromVideoContentType(int videoContentType); 167 168 static std::string GetField(Field field, const MediaType &mediaType, DatabaseQueryPart queryPart); 169 static int GetField(Field field, const MediaType &mediaType); 170 static int GetFieldIndex(Field field, const MediaType &mediaType); 171 static bool GetSelectFields(const Fields &fields, const MediaType &mediaType, FieldList &selectFields); 172 173 static bool GetFieldValue(const dbiplus::field_value &fieldValue, CVariant &variantValue); 174 static bool GetDatabaseResults(const MediaType &mediaType, const FieldList &fields, const std::unique_ptr<dbiplus::Dataset> &dataset, DatabaseResults &results); 175 176 static std::string BuildLimitClause(int end, int start = 0); 177 static std::string BuildLimitClauseOnly(int end, int start = 0); 178 static size_t GetLimitCount(int end, int start); 179 180 private: 181 static int GetField(Field field, const MediaType &mediaType, bool asIndex); 182 }; 183