00001 #include <mythtv/mythcontext.h>
00002 #include <mythtv/mythdbcon.h>
00003
00004 #include "metadata.h"
00005 #include "metadatalistmanager.h"
00006
00007 #include <list>
00008 #include <map>
00009
00010 class MetadataListManagerImp
00011 {
00012 public:
00013 typedef MetadataListManager::MetadataPtr MetadataPtr;
00014 typedef MetadataListManager::metadata_list metadata_list;
00015
00016 private:
00017 typedef std::map<unsigned int, metadata_list::iterator> int_to_meta;
00018 typedef std::map<QString, metadata_list::iterator> string_to_meta;
00019
00020 public:
00021 void setList(metadata_list &list)
00022 {
00023 m_id_map.clear();
00024 m_file_map.clear();
00025 m_meta_list.swap(list);
00026
00027 for (metadata_list::iterator p = m_meta_list.begin();
00028 p != m_meta_list.end(); ++p)
00029 {
00030 m_id_map.insert(int_to_meta::value_type((*p)->ID(), p));
00031 m_file_map.insert(string_to_meta::value_type((*p)->Filename(), p));
00032 }
00033 }
00034
00035 const metadata_list &getList() const
00036 {
00037 return m_meta_list;
00038 }
00039
00040
00041 MetadataPtr byFilename(const QString &file_name) const
00042 {
00043 string_to_meta::const_iterator p = m_file_map.find(file_name);
00044 if (p != m_file_map.end())
00045 {
00046 return *(p->second);
00047 }
00048 return MetadataPtr();
00049 }
00050
00051 MetadataPtr byID(unsigned int db_id) const
00052 {
00053 int_to_meta::const_iterator p = m_id_map.find(db_id);
00054 if (p != m_id_map.end())
00055 {
00056 return *(p->second);
00057 }
00058 return MetadataPtr();
00059 }
00060
00061 bool purgeByFilename(const QString &file_name)
00062 {
00063 return purge_entry(byFilename(file_name));
00064 }
00065
00066 bool purgeByID(unsigned int db_id)
00067 {
00068 return purge_entry(byID(db_id));
00069 }
00070
00071 private:
00072 bool purge_entry(MetadataPtr metadata)
00073 {
00074 if (metadata)
00075 {
00076 int_to_meta::iterator im = m_id_map.find(metadata->ID());
00077
00078 if (im != m_id_map.end())
00079 {
00080 metadata_list::iterator mdi = im->second;
00081 (*mdi)->dropFromDB();
00082
00083 m_id_map.erase(im);
00084 string_to_meta::iterator sm =
00085 m_file_map.find(metadata->Filename());
00086 if (sm != m_file_map.end())
00087 m_file_map.erase(sm);
00088 m_meta_list.erase(mdi);
00089 return true;
00090 }
00091 }
00092
00093 return false;
00094 }
00095
00096 private:
00097 metadata_list m_meta_list;
00098 int_to_meta m_id_map;
00099 string_to_meta m_file_map;
00100 };
00101
00102 MetadataListManager::MetadataListManager()
00103 {
00104 m_imp = new MetadataListManagerImp();
00105 }
00106
00107 MetadataListManager::~MetadataListManager()
00108 {
00109 delete m_imp;
00110 }
00111
00112 void MetadataListManager::loadAllFromDatabase(metadata_list &items)
00113 {
00114 MSqlQuery query(MSqlQuery::InitCon());
00115 query.setForwardOnly(true);
00116 const QString BaseMetadataQuery(
00117 "SELECT title, director, plot, rating, year, userrating,"
00118 "length, filename, showlevel, coverfile, inetref, childid,"
00119 "browse, playcommand, category, intid FROM videometadata");
00120
00121 query.prepare(BaseMetadataQuery);
00122
00123 if (query.exec() && query.isActive())
00124 {
00125 while (query.next())
00126 {
00127 items.push_back(MetadataPtr(new Metadata(query)));
00128 }
00129 }
00130 else
00131 {
00132 MythContext::DBError("Querying video metadata", query);
00133 }
00134 }
00135
00136 void MetadataListManager::setList(metadata_list &list)
00137 {
00138 m_imp->setList(list);
00139 }
00140
00141 const MetadataListManager::metadata_list &
00142 MetadataListManager::getList() const
00143 {
00144 return m_imp->getList();
00145 }
00146
00147 MetadataListManager::MetadataPtr
00148 MetadataListManager::byFilename(const QString &file_name) const
00149 {
00150 return m_imp->byFilename(file_name);
00151 }
00152
00153 MetadataListManager::MetadataPtr
00154 MetadataListManager::byID(unsigned int db_id) const
00155 {
00156 return m_imp->byID(db_id);
00157 }
00158
00159 bool MetadataListManager::purgeByFilename(const QString &file_name)
00160 {
00161 return m_imp->purgeByFilename(file_name);
00162 }
00163
00164 bool MetadataListManager::purgeByID(unsigned int db_id)
00165 {
00166 return m_imp->purgeByID(db_id);
00167 }