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