summaryrefslogtreecommitdiffstats
path: root/xbmc/view/ViewDatabase.cpp
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-10 18:07:22 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-10 18:07:22 +0000
commitc04dcc2e7d834218ef2d4194331e383402495ae1 (patch)
tree7333e38d10d75386e60f336b80c2443c1166031d /xbmc/view/ViewDatabase.cpp
parentInitial commit. (diff)
downloadkodi-c04dcc2e7d834218ef2d4194331e383402495ae1.tar.xz
kodi-c04dcc2e7d834218ef2d4194331e383402495ae1.zip
Adding upstream version 2:20.4+dfsg.upstream/2%20.4+dfsg
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'xbmc/view/ViewDatabase.cpp')
-rw-r--r--xbmc/view/ViewDatabase.cpp208
1 files changed, 208 insertions, 0 deletions
diff --git a/xbmc/view/ViewDatabase.cpp b/xbmc/view/ViewDatabase.cpp
new file mode 100644
index 0000000..7605cfb
--- /dev/null
+++ b/xbmc/view/ViewDatabase.cpp
@@ -0,0 +1,208 @@
+/*
+ * Copyright (C) 2005-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.
+ */
+
+#include "ViewDatabase.h"
+
+#include <utility>
+
+#include "dbwrappers/dataset.h"
+#include "SortFileItem.h"
+#include "utils/LegacyPathTranslation.h"
+#include "utils/log.h"
+#include "utils/SortUtils.h"
+#include "utils/StringUtils.h"
+#include "utils/URIUtils.h"
+#include "view/ViewState.h"
+
+#ifdef TARGET_POSIX
+#include "platform/posix/ConvUtils.h"
+#endif
+CViewDatabase::CViewDatabase(void) = default;
+
+CViewDatabase::~CViewDatabase(void) = default;
+
+bool CViewDatabase::Open()
+{
+ return CDatabase::Open();
+}
+
+void CViewDatabase::CreateTables()
+{
+ CLog::Log(LOGINFO, "create view table");
+ m_pDS->exec("CREATE TABLE view ("
+ "idView integer primary key,"
+ "window integer,"
+ "path text,"
+ "viewMode integer,"
+ "sortMethod integer,"
+ "sortOrder integer,"
+ "sortAttributes integer,"
+ "skin text)");
+}
+
+void CViewDatabase::CreateAnalytics()
+{
+ CLog::Log(LOGINFO, "{} - creating indices", __FUNCTION__);
+ m_pDS->exec("CREATE INDEX idxViews ON view(path)");
+ m_pDS->exec("CREATE INDEX idxViewsWindow ON view(window)");
+}
+
+void CViewDatabase::UpdateTables(int version)
+{
+ if (version < 4)
+ m_pDS->exec("alter table view add skin text");
+ if (version < 5)
+ {
+ // translate legacy videodb:// and musicdb:// paths
+ std::vector< std::pair<int, std::string> > paths;
+ if (m_pDS->query("SELECT idView, path FROM view"))
+ {
+ while (!m_pDS->eof())
+ {
+ std::string originalPath = m_pDS->fv(1).get_asString();
+ std::string path = originalPath;
+ if (StringUtils::StartsWithNoCase(path, "musicdb://"))
+ path = CLegacyPathTranslation::TranslateMusicDbPath(path);
+ else if (StringUtils::StartsWithNoCase(path, "videodb://"))
+ path = CLegacyPathTranslation::TranslateVideoDbPath(path);
+
+ if (!StringUtils::EqualsNoCase(path, originalPath))
+ paths.emplace_back(m_pDS->fv(0).get_asInt(), path);
+ m_pDS->next();
+ }
+ m_pDS->close();
+
+ for (std::vector< std::pair<int, std::string> >::const_iterator it = paths.begin(); it != paths.end(); ++it)
+ m_pDS->exec(PrepareSQL("UPDATE view SET path='%s' WHERE idView=%d", it->second.c_str(), it->first));
+ }
+ }
+ if (version < 6)
+ {
+ // convert the "path" table
+ m_pDS->exec("ALTER TABLE view RENAME TO tmp_view");
+
+ m_pDS->exec("CREATE TABLE view ("
+ "idView integer primary key,"
+ "window integer,"
+ "path text,"
+ "viewMode integer,"
+ "sortMethod integer,"
+ "sortOrder integer,"
+ "sortAttributes integer,"
+ "skin text)\n");
+
+ m_pDS->query("SELECT * FROM tmp_view");
+ while (!m_pDS->eof())
+ {
+ SortDescription sorting = SortUtils::TranslateOldSortMethod((SORT_METHOD)m_pDS->fv(4).get_asInt());
+
+ std::string sql = PrepareSQL("INSERT INTO view (idView, window, path, viewMode, sortMethod, sortOrder, sortAttributes, skin) VALUES (%i, %i, '%s', %i, %i, %i, %i, '%s')",
+ m_pDS->fv(0).get_asInt(), m_pDS->fv(1).get_asInt(), m_pDS->fv(2).get_asString().c_str(), m_pDS->fv(3).get_asInt(),
+ (int)sorting.sortBy, m_pDS->fv(5).get_asInt(), (int)sorting.sortAttributes, m_pDS->fv(6).get_asString().c_str());
+ m_pDS2->exec(sql);
+
+ m_pDS->next();
+ }
+ m_pDS->exec("DROP TABLE tmp_view");
+ }
+}
+
+bool CViewDatabase::GetViewState(const std::string &path, int window, CViewState &state, const std::string &skin)
+{
+ try
+ {
+ if (nullptr == m_pDB)
+ return false;
+ if (nullptr == m_pDS)
+ return false;
+
+ std::string path1(path);
+ URIUtils::AddSlashAtEnd(path1);
+ if (path1.empty()) path1 = "root://";
+
+ std::string sql;
+ if (skin.empty())
+ sql = PrepareSQL("select * from view where window = %i and path='%s'", window, path1.c_str());
+ else
+ sql = PrepareSQL("select * from view where window = %i and path='%s' and skin='%s'", window, path1.c_str(), skin.c_str());
+ m_pDS->query(sql);
+
+ if (!m_pDS->eof())
+ { // have some information
+ state.m_viewMode = m_pDS->fv("viewMode").get_asInt();
+ state.m_sortDescription.sortBy = (SortBy)m_pDS->fv("sortMethod").get_asInt();
+ state.m_sortDescription.sortOrder = (SortOrder)m_pDS->fv("sortOrder").get_asInt();
+ state.m_sortDescription.sortAttributes = (SortAttribute)m_pDS->fv("sortAttributes").get_asInt();
+ m_pDS->close();
+ return true;
+ }
+ m_pDS->close();
+ }
+ catch (...)
+ {
+ CLog::Log(LOGERROR, "{}, failed on path '{}'", __FUNCTION__, path);
+ }
+ return false;
+}
+
+bool CViewDatabase::SetViewState(const std::string &path, int window, const CViewState &state, const std::string &skin)
+{
+ try
+ {
+ if (nullptr == m_pDB)
+ return false;
+ if (nullptr == m_pDS)
+ return false;
+
+ std::string path1(path);
+ URIUtils::AddSlashAtEnd(path1);
+ if (path1.empty()) path1 = "root://";
+
+ std::string sql = PrepareSQL("select idView from view where window = %i and path='%s' and skin='%s'", window, path1.c_str(), skin.c_str());
+ m_pDS->query(sql);
+ if (!m_pDS->eof())
+ { // update the view
+ int idView = m_pDS->fv("idView").get_asInt();
+ m_pDS->close();
+ sql = PrepareSQL("update view set viewMode=%i,sortMethod=%i,sortOrder=%i,sortAttributes=%i where idView=%i",
+ state.m_viewMode, (int)state.m_sortDescription.sortBy, (int)state.m_sortDescription.sortOrder, (int)state.m_sortDescription.sortAttributes, idView);
+ m_pDS->exec(sql);
+ }
+ else
+ { // add the view
+ m_pDS->close();
+ sql = PrepareSQL("insert into view (idView, path, window, viewMode, sortMethod, sortOrder, sortAttributes, skin) values(NULL, '%s', %i, %i, %i, %i, %i, '%s')",
+ path1.c_str(), window, state.m_viewMode, (int)state.m_sortDescription.sortBy, (int)state.m_sortDescription.sortOrder, (int)state.m_sortDescription.sortAttributes, skin.c_str());
+ m_pDS->exec(sql);
+ }
+ }
+ catch (...)
+ {
+ CLog::Log(LOGERROR, "{} failed on path '{}'", __FUNCTION__, path);
+ }
+ return true;
+}
+
+bool CViewDatabase::ClearViewStates(int windowID)
+{
+ try
+ {
+ if (nullptr == m_pDB)
+ return false;
+ if (nullptr == m_pDS)
+ return false;
+
+ std::string sql = PrepareSQL("delete from view where window = %i", windowID);
+ m_pDS->exec(sql);
+ }
+ catch (...)
+ {
+ CLog::Log(LOGERROR, "{} failed on window '{}'", __FUNCTION__, windowID);
+ }
+ return true;
+}