/* * Copyright (C) 2012-2013 Team XBMC * http://xbmc.org * * This Program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * This Program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with XBMC; see the file COPYING. If not, see * . * */ #include "DatabaseManager.h" #include "utils/log.h" #include "addons/AddonDatabase.h" #include "view/ViewDatabase.h" #include "TextureDatabase.h" #include "music/MusicDatabase.h" #include "video/VideoDatabase.h" #include "pvr/PVRDatabase.h" #include "epg/EpgDatabase.h" #include "settings/AdvancedSettings.h" using namespace std; using namespace EPG; using namespace PVR; CDatabaseManager &CDatabaseManager::Get() { static CDatabaseManager s_manager; return s_manager; } CDatabaseManager::CDatabaseManager() { } CDatabaseManager::~CDatabaseManager() { } void CDatabaseManager::Initialize(bool addonsOnly) { Deinitialize(); { CAddonDatabase db; UpdateDatabase(db); } if (addonsOnly) return; CLog::Log(LOGDEBUG, "%s, updating databases...", __FUNCTION__); // NOTE: Order here is important. In particular, CTextureDatabase has to be updated // before CVideoDatabase. { CViewDatabase db; UpdateDatabase(db); } { CTextureDatabase db; UpdateDatabase(db); } { CMusicDatabase db; UpdateDatabase(db, &g_advancedSettings.m_databaseMusic); } { CVideoDatabase db; UpdateDatabase(db, &g_advancedSettings.m_databaseVideo); } { CPVRDatabase db; UpdateDatabase(db, &g_advancedSettings.m_databaseTV); } { CEpgDatabase db; UpdateDatabase(db, &g_advancedSettings.m_databaseEpg); } CLog::Log(LOGDEBUG, "%s, updating databases... DONE", __FUNCTION__); } void CDatabaseManager::Deinitialize() { CSingleLock lock(m_section); m_dbStatus.clear(); } bool CDatabaseManager::CanOpen(const std::string &name) { CSingleLock lock(m_section); map::const_iterator i = m_dbStatus.find(name); if (i != m_dbStatus.end()) return i->second == DB_READY; return false; // db isn't even attempted to update yet } void CDatabaseManager::UpdateDatabase(CDatabase &db, DatabaseSettings *settings) { std::string name = db.GetBaseDBName(); UpdateStatus(name, DB_UPDATING); if (db.Update(settings ? *settings : DatabaseSettings())) UpdateStatus(name, DB_READY); else UpdateStatus(name, DB_FAILED); } void CDatabaseManager::UpdateStatus(const std::string &name, DB_STATUS status) { CSingleLock lock(m_section); m_dbStatus[name] = status; }