kodi
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  FieldVideoAssetTitle,
130  FieldChannelName,
131  FieldChannelNumber,
132  FieldInstruments,
133  FieldBiography,
134  FieldArtistType,
135  FieldGender,
136  FieldDisambiguation,
137  FieldBorn,
138  FieldBandFormed,
139  FieldDisbanded,
140  FieldDied,
141  FieldStereoMode,
142  FieldUserRating,
143  FieldRelevance, // Used for actors' appearances
144  FieldClientChannelOrder,
145  FieldBPM,
146  FieldMusicBitRate,
147  FieldSampleRate,
148  FieldNoOfChannels,
149  FieldAlbumStatus,
150  FieldAlbumDuration,
151  FieldHdrType,
152  FieldProvider,
153  FieldUserPreference,
154  FieldMax
155 } Field;
156 
157 typedef std::set<Field> Fields;
158 typedef std::vector<Field> FieldList;
159 
160 typedef enum {
161  DatabaseQueryPartSelect,
162  DatabaseQueryPartWhere,
163  DatabaseQueryPartOrderBy,
164 } DatabaseQueryPart;
165 
166 typedef std::map<Field, CVariant> DatabaseResult;
167 typedef std::vector<DatabaseResult> DatabaseResults;
168 
170 {
171 public:
172  static MediaType MediaTypeFromVideoContentType(VideoDbContentType videoContentType);
173 
174  static std::string GetField(Field field, const MediaType &mediaType, DatabaseQueryPart queryPart);
175  static int GetField(Field field, const MediaType &mediaType);
176  static int GetFieldIndex(Field field, const MediaType &mediaType);
177  static bool GetSelectFields(const Fields &fields, const MediaType &mediaType, FieldList &selectFields);
178 
179  static bool GetFieldValue(const dbiplus::field_value &fieldValue, CVariant &variantValue);
180  static bool GetDatabaseResults(const MediaType &mediaType, const FieldList &fields, const std::unique_ptr<dbiplus::Dataset> &dataset, DatabaseResults &results);
181 
182  static std::string BuildLimitClause(int end, int start = 0);
183  static std::string BuildLimitClauseOnly(int end, int start = 0);
184  static size_t GetLimitCount(int end, int start);
185 
186 private:
187  static int GetField(Field field, const MediaType &mediaType, bool asIndex);
188 };
Definition: Database.h:11
Definition: Variant.h:31
Definition: DatabaseUtils.h:169
Definition: qry_dat.h:46