summaryrefslogtreecommitdiffstats
path: root/xbmc/utils/DatabaseUtils.h
diff options
context:
space:
mode:
Diffstat (limited to 'xbmc/utils/DatabaseUtils.h')
-rw-r--r--xbmc/utils/DatabaseUtils.h187
1 files changed, 187 insertions, 0 deletions
diff --git a/xbmc/utils/DatabaseUtils.h b/xbmc/utils/DatabaseUtils.h
new file mode 100644
index 0000000..c9bf6a6
--- /dev/null
+++ b/xbmc/utils/DatabaseUtils.h
@@ -0,0 +1,187 @@
+/*
+ * Copyright (C) 2012-2018 Team Kodi
+ * This file is part of Kodi - https://kodi.tv
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ * See LICENSES/README.md for more information.
+ */
+
+#pragma once
+
+#include "media/MediaType.h"
+
+#include <map>
+#include <memory>
+#include <set>
+#include <string>
+#include <vector>
+
+class CVariant;
+enum class VideoDbContentType;
+
+namespace dbiplus
+{
+ class Dataset;
+ class field_value;
+}
+
+typedef enum
+{
+ // special fields used during sorting
+ FieldUnknown = -1,
+ FieldNone = 0,
+ FieldSort, // used to store the string to use for sorting
+ FieldSortSpecial, // whether the item needs special handling (0 = no, 1 = sort on top, 2 = sort on bottom)
+ FieldLabel,
+ FieldFolder,
+ FieldMediaType,
+ FieldRow, // the row number in a dataset
+
+ // special fields not retrieved from the database
+ FieldSize,
+ FieldDate,
+ FieldDriveType,
+ FieldStartOffset,
+ FieldEndOffset,
+ FieldProgramCount,
+ FieldBitrate,
+ FieldListeners,
+ FieldPlaylist,
+ FieldVirtualFolder,
+ FieldRandom,
+ FieldDateTaken,
+ FieldAudioCount,
+ FieldSubtitleCount,
+
+ FieldInstallDate,
+ FieldLastUpdated,
+ FieldLastUsed,
+
+ // fields retrievable from the database
+ FieldId,
+ FieldGenre,
+ FieldAlbum,
+ FieldDiscTitle,
+ FieldIsBoxset,
+ FieldTotalDiscs,
+ FieldOrigYear,
+ FieldOrigDate,
+ FieldArtist,
+ FieldArtistSort,
+ FieldAlbumArtist,
+ FieldTitle,
+ FieldSortTitle,
+ FieldOriginalTitle,
+ FieldYear,
+ FieldTime,
+ FieldTrackNumber,
+ FieldFilename,
+ FieldPath,
+ FieldPlaycount,
+ FieldLastPlayed,
+ FieldInProgress,
+ FieldRating,
+ FieldComment,
+ FieldRole,
+ FieldDateAdded,
+ FieldDateModified,
+ FieldDateNew,
+ FieldTvShowTitle,
+ FieldPlot,
+ FieldPlotOutline,
+ FieldTagline,
+ FieldTvShowStatus,
+ FieldVotes,
+ FieldDirector,
+ FieldActor,
+ FieldStudio,
+ FieldCountry,
+ FieldMPAA,
+ FieldTop250,
+ FieldSet,
+ FieldNumberOfEpisodes,
+ FieldNumberOfWatchedEpisodes,
+ FieldWriter,
+ FieldAirDate,
+ FieldEpisodeNumber,
+ FieldUniqueId,
+ FieldSeason,
+ FieldEpisodeNumberSpecialSort,
+ FieldSeasonSpecialSort,
+ FieldReview,
+ FieldThemes,
+ FieldMoods,
+ FieldStyles,
+ FieldAlbumType,
+ FieldMusicLabel,
+ FieldCompilation,
+ FieldSource,
+ FieldTrailer,
+ FieldVideoResolution,
+ FieldVideoAspectRatio,
+ FieldVideoCodec,
+ FieldAudioChannels,
+ FieldAudioCodec,
+ FieldAudioLanguage,
+ FieldSubtitleLanguage,
+ FieldProductionCode,
+ FieldTag,
+ FieldChannelName,
+ FieldChannelNumber,
+ FieldInstruments,
+ FieldBiography,
+ FieldArtistType,
+ FieldGender,
+ FieldDisambiguation,
+ FieldBorn,
+ FieldBandFormed,
+ FieldDisbanded,
+ FieldDied,
+ FieldStereoMode,
+ FieldUserRating,
+ FieldRelevance, // Used for actors' appearances
+ FieldClientChannelOrder,
+ FieldBPM,
+ FieldMusicBitRate,
+ FieldSampleRate,
+ FieldNoOfChannels,
+ FieldAlbumStatus,
+ FieldAlbumDuration,
+ FieldHdrType,
+ FieldProvider,
+ FieldUserPreference,
+ FieldMax
+} Field;
+
+typedef std::set<Field> Fields;
+typedef std::vector<Field> FieldList;
+
+typedef enum {
+ DatabaseQueryPartSelect,
+ DatabaseQueryPartWhere,
+ DatabaseQueryPartOrderBy,
+} DatabaseQueryPart;
+
+typedef std::map<Field, CVariant> DatabaseResult;
+typedef std::vector<DatabaseResult> DatabaseResults;
+
+class DatabaseUtils
+{
+public:
+ static MediaType MediaTypeFromVideoContentType(VideoDbContentType videoContentType);
+
+ static std::string GetField(Field field, const MediaType &mediaType, DatabaseQueryPart queryPart);
+ static int GetField(Field field, const MediaType &mediaType);
+ static int GetFieldIndex(Field field, const MediaType &mediaType);
+ static bool GetSelectFields(const Fields &fields, const MediaType &mediaType, FieldList &selectFields);
+
+ static bool GetFieldValue(const dbiplus::field_value &fieldValue, CVariant &variantValue);
+ static bool GetDatabaseResults(const MediaType &mediaType, const FieldList &fields, const std::unique_ptr<dbiplus::Dataset> &dataset, DatabaseResults &results);
+
+ static std::string BuildLimitClause(int end, int start = 0);
+ static std::string BuildLimitClauseOnly(int end, int start = 0);
+ static size_t GetLimitCount(int end, int start);
+
+private:
+ static int GetField(Field field, const MediaType &mediaType, bool asIndex);
+};