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