MythTV  master
dbaccess.cpp
Go to the documentation of this file.
1 #include <algorithm>
2 #include <vector>
3 #include <map>
4 
5 #include "libmythbase/mythdb.h"
7 
8 #include "cleanup.h"
9 #include "dbaccess.h"
10 
11 namespace
12 {
13  template <typename T, typename arg_type>
14  struct call_sort
15  {
16  explicit call_sort(T &c) : m_c(c) {}
17 
18  bool operator()(const arg_type &lhs, const arg_type &rhs)
19  {
20  return m_c.sort(lhs, rhs);
21  }
22 
23  T &m_c;
24  };
25 }
26 
28 {
29  public:
31  using entry_list = std::vector<entry>;
32 
33  private:
34  using entry_map = std::map<int, QString>;
35 
36  public:
37  SingleValueImp(QString table_name, QString id_name, QString value_name)
38  : m_tableName(std::move(table_name)), m_idName(std::move(id_name)),
39  m_valueName(std::move(value_name)), m_cleanStub(this)
40  {
41  m_insertSql = QString("INSERT INTO %1 (%2) VALUES (:NAME)")
42  .arg(m_tableName, m_valueName);
43  m_fillSql = QString("SELECT %1, %2 FROM %3")
45  m_deleteSql = QString("DELETE FROM %1 WHERE %2 = :ID")
46  .arg(m_tableName, m_idName);
47  }
48 
49  virtual ~SingleValueImp() = default;
50 
51  mutable QMutex m_mutex;
52 
53  void load_data()
54  {
55  QMutexLocker locker(&m_mutex);
56  if (!m_ready)
57  {
58  fill_from_db();
59  m_ready = true;
60  }
61  }
62 
63  int add(const QString &name)
64  {
65  int id = 0;
66 
67  if (!exists(name, &id))
68  {
70  query.prepare(m_insertSql);
71  query.bindValue(":NAME", name);
72  if (query.exec())
73  {
74  if (query.exec("SELECT LAST_INSERT_ID()") && query.next())
75  {
76  id = query.value(0).toInt();
77  m_entries.insert(entry_map::value_type(id, name));
78  m_dirty = true;
79  }
80  else
81  MythDB::DBError("get last id", query);
82  }
83  }
84 
85  return id;
86  }
87 
88  bool get(int id, QString &value)
89  {
90  auto p = m_entries.find(id);
91  if (p != m_entries.end())
92  {
93  value = p->second;
94  return true;
95  }
96  return false;
97  }
98 
99  void remove(int id)
100  {
101  auto p = m_entries.find(id);
102  if (p != m_entries.end())
103  {
104  MSqlQuery query(MSqlQuery::InitCon());
105  query.prepare(m_deleteSql);
106  query.bindValue(":ID", p->first);
107  if (query.exec())
108  {
109  m_dirty = true;
110  m_entries.erase(p);
111  }
112  }
113  }
114 
115  bool exists(int id)
116  {
117  return m_entries.find(id) != m_entries.end();
118  }
119 
120  bool exists(const QString &name, int *id = nullptr)
121  {
122  auto p = find(name);
123  if (p != m_entries.end())
124  {
125  if (id)
126  *id = p->first;
127  return true;
128  }
129  return false;
130  }
131 
133  {
134  if (m_dirty)
135  {
136  m_dirty = false;
137  m_retEntries.clear();
138 
139  for (auto & item : m_entries)
140  {
141  m_retEntries.emplace_back(item.first, item.second);
142  }
143  std::sort(m_retEntries.begin(), m_retEntries.end(),
144  call_sort<SingleValueImp, entry>(*this));
145  }
146 
147  return m_retEntries;
148  }
149 
150  virtual bool sort(const entry &lhs, const entry &rhs)
151  {
152  return StringUtil::naturalSortCompare(lhs.second, rhs.second);
153  }
154 
155  void cleanup()
156  {
157  m_ready = false;
158  m_dirty = true;
159  m_retEntries.clear();
160  m_entries.clear();
161  }
162 
163  private:
164  entry_map::iterator find(const QString &name)
165  {
166  for (auto p = m_entries.begin(); p != m_entries.end(); ++p)
167  {
168  if (p->second == name)
169  return p;
170  }
171  return m_entries.end();
172  }
173 
175  {
176  m_entries.clear();
177 
178  MSqlQuery query(MSqlQuery::InitCon());
179 
180  if (query.exec(m_fillSql))
181  {
182  while (query.next())
183  {
184  int id = query.value(0).toInt();
185  QString val = query.value(1).toString();
186  m_entries.insert(entry_map::value_type(id, val));
187  }
188  }
189  }
190 
191  private:
192  QString m_tableName;
193  QString m_idName;
194  QString m_valueName;
195 
196  QString m_insertSql;
197  QString m_fillSql;
198  QString m_deleteSql;
199 
200  bool m_ready {false};
201  bool m_dirty {true};
205 };
206 
208 
210 {
211  delete m_imp;
212 }
213 
214 int SingleValue::add(const QString &name)
215 {
216  return m_imp->add(name);
217 }
218 
219 bool SingleValue::get(int id, QString &category)
220 {
221  return m_imp->get(id, category);
222 }
223 
225 {
226  m_imp->remove(id);
227 }
228 
230 {
231  return m_imp->exists(id);
232 }
233 
234 bool SingleValue::exists(const QString &name)
235 {
236  return m_imp->exists(name);
237 }
238 
240 {
241  return m_imp->getList();
242 }
243 
245 {
246  m_imp->load_data();
247 }
248 
250 
252 {
253  public:
255 
256  private:
257  using id_map = std::map<int, entry>;
258 
259  public:
260  MultiValueImp(QString table_name, QString id_name,
261  QString value_name) : m_tableName(std::move(table_name)),
262  m_idName(std::move(id_name)), m_valueName(std::move(value_name)),
263  m_cleanStub(this)
264  {
265  m_insertSql = QString("INSERT INTO %1 (%2, %3) VALUES (:ID, :VALUE)")
267  m_fillSql = QString("SELECT %1, %2 FROM %3 ORDER BY %4")
269  }
270 
271  mutable QMutex m_mutex;
272 
273  void load_data()
274  {
275  QMutexLocker locker(&m_mutex);
276  if (!m_ready)
277  {
278  fill_from_db();
279  m_ready = true;
280  }
281  }
282 
283  void cleanup()
284  {
285  m_ready = false;
286  m_valMap.clear();
287  }
288 
289  int add(int id, int value)
290  {
291  bool db_insert = false;
292  auto p = m_valMap.find(id);
293  if (p != m_valMap.end())
294  {
295  entry::values_type &va = p->second.values;
296  auto v = std::find(va.begin(), va.end(), value);
297  if (v == va.end())
298  {
299  va.push_back(value);
300  db_insert = true;
301  }
302  }
303  else
304  {
305  entry e;
306  e.id = id;
307  e.values.push_back(value);
308  m_valMap.insert(id_map::value_type(id, e));
309  db_insert = true;
310  }
311 
312  if (db_insert)
313  {
314  MSqlQuery query(MSqlQuery::InitCon());
315  query.prepare(m_insertSql);
316  query.bindValue(":ID", id);
317  query.bindValue(":VALUE", value);
318  if (!query.exec())
319  MythDB::DBError("multi value insert", query);
320  }
321 
322  return id;
323  }
324 
325  bool get(int id, entry &values)
326  {
327  auto p = m_valMap.find(id);
328  if (p != m_valMap.end())
329  {
330  values = p->second;
331  return true;
332  }
333  return false;
334  }
335 
336  void remove(int id, int value)
337  {
338  auto p = m_valMap.find(id);
339  if (p != m_valMap.end())
340  {
341  auto vp = std::find(p->second.values.begin(),
342  p->second.values.end(), value);
343  if (vp != p->second.values.end())
344  {
345  MSqlQuery query(MSqlQuery::InitCon());
346  QString del_query = QString("DELETE FROM %1 WHERE %2 = :ID AND "
347  "%3 = :VALUE")
349  query.prepare(del_query);
350  query.bindValue(":ID", p->first);
351  query.bindValue(":VALUE", int(*vp));
352  if (!query.exec() || !query.isActive())
353  {
354  MythDB::DBError("multivalue remove", query);
355  }
356  p->second.values.erase(vp);
357  }
358  }
359  }
360 
361  void remove(int id)
362  {
363  auto p = m_valMap.find(id);
364  if (p != m_valMap.end())
365  {
366  MSqlQuery query(MSqlQuery::InitCon());
367  QString del_query = QString("DELETE FROM %1 WHERE %2 = :ID")
368  .arg(m_tableName, m_idName);
369  query.prepare(del_query);
370  query.bindValue(":ID", p->first);
371  if (!query.exec() || !query.isActive())
372  {
373  MythDB::DBError("multivalue remove", query);
374  }
375  m_valMap.erase(p);
376  }
377  }
378 
379  bool exists(int id, int value)
380  {
381  auto p = m_valMap.find(id);
382  if (p != m_valMap.end())
383  {
384  auto vp =
385  std::find(p->second.values.begin(), p->second.values.end(),
386  value);
387  return vp != p->second.values.end();
388  }
389  return false;
390  }
391 
392  bool exists(int id)
393  {
394  return m_valMap.find(id) != m_valMap.end();
395  }
396 
397  private:
399  {
400  m_valMap.clear();
401 
402  MSqlQuery query(MSqlQuery::InitCon());
403 
404  if (query.exec(m_fillSql) && query.size() > 0)
405  {
406  auto p = m_valMap.end();
407  while (query.next())
408  {
409  int id = query.value(0).toInt();
410  int val = query.value(1).toInt();
411 
412  if (p == m_valMap.end() ||
413  (p != m_valMap.end() && p->first != id))
414  {
415  p = m_valMap.find(id);
416  if (p == m_valMap.end())
417  {
418  entry e;
419  e.id = id;
420  p = m_valMap.insert(id_map::value_type(id, e)).first;
421  }
422  }
423  p->second.values.push_back(val);
424  }
425  }
426  }
427 
428  private:
430 
431  QString m_tableName;
432  QString m_idName;
433  QString m_valueName;
434 
435  QString m_insertSql;
436  QString m_fillSql;
437  QString m_idSql;
438 
439  bool m_ready {false};
441 };
442 
444 
445 int MultiValue::add(int id, int value)
446 {
447  return m_imp->add(id, value);
448 }
449 
450 bool MultiValue::get(int id, entry &values)
451 {
452  return m_imp->get(id, values);
453 }
454 
455 void MultiValue::remove(int id, int value)
456 {
457  m_imp->remove(id, value);
458 }
459 
460 void MultiValue::remove(int id)
461 {
462  m_imp->remove(id);
463 }
464 
465 bool MultiValue::exists(int id, int value)
466 {
467  return m_imp->exists(id, value);
468 }
469 
470 bool MultiValue::exists(int id)
471 {
472  return m_imp->exists(id);
473 }
474 
476 {
477  m_imp->load_data();
478 }
479 
481 
483  SingleValue(new SingleValueImp("videocategory", "intid", "category"))
484 {
485 }
486 
488 {
489  static VideoCategory s_vc;
490  s_vc.load_data();
491  return s_vc;
492 }
493 
495 
497  SingleValue(new SingleValueImp("videocountry", "intid", "country"))
498 {
499 }
500 
502 {
503  static VideoCountry s_vc;
504  s_vc.load_data();
505  return s_vc;
506 }
507 
509 
511  SingleValue(new SingleValueImp("videogenre", "intid", "genre"))
512 {
513 }
514 
516 {
517  static VideoGenre s_vg;
518  s_vg.load_data();
519  return s_vg;
520 }
521 
523 
525  SingleValue(new SingleValueImp("videocast", "intid", "cast"))
526 {
527 }
528 
530 {
531  static VideoCast s_vc;
532  s_vc.load_data();
533  return s_vc;
534 }
535 
537 
539  MultiValue(new MultiValueImp("videometadatagenre", "idvideo", "idgenre"))
540 {
541 }
542 
544 {
545  static VideoGenreMap s_vgm;
546  s_vgm.load_data();
547  return s_vgm;
548 }
549 
551 
553  MultiValue(new MultiValueImp("videometadatacountry", "idvideo",
554  "idcountry"))
555 {
556 }
557 
559 {
560  static VideoCountryMap s_vcm;
561  s_vcm.load_data();
562  return s_vcm;
563 }
564 
566 
568  MultiValue(new MultiValueImp("videometadatacast", "idvideo",
569  "idcast"))
570 {
571 }
572 
574 {
575  static VideoCastMap s_vcm;
576  s_vcm.load_data();
577  return s_vcm;
578 }
579 
581 
583 {
584  public:
588 
589  public:
590  FileAssociationsImp() = default;
591 
593  {
594  file_association ret_fa(fa);
595 
596  file_association *existing_fa = nullptr;
597  MSqlQuery query(MSqlQuery::InitCon());
598 
599  auto p = find(ret_fa.extension);
600  if (p != m_fileAssociations.end())
601  {
602  ret_fa.id = p->id;
603  existing_fa = &(*p);
604 
605  query.prepare("UPDATE videotypes SET extension = :EXT, "
606  "playcommand = :PLAYCMD, f_ignore = :IGNORED, "
607  "use_default = :USEDEFAULT WHERE intid = :ID");
608  query.bindValue(":ID", ret_fa.id);
609  }
610  else
611  {
612  query.prepare("INSERT INTO videotypes (extension, playcommand, "
613  "f_ignore, use_default) VALUES "
614  "(:EXT, :PLAYCMD, :IGNORED, :USEDEFAULT)");
615  }
616 
617  query.bindValue(":EXT", ret_fa.extension);
618  query.bindValue(":PLAYCMD", ret_fa.playcommand);
619  query.bindValue(":IGNORED", ret_fa.ignore);
620  query.bindValue(":USEDEFAULT", ret_fa.use_default);
621 
622  if (query.exec() && query.isActive())
623  {
624  if (!existing_fa)
625  {
626  if (query.exec("SELECT LAST_INSERT_ID()") && query.next())
627  {
628  ret_fa.id = query.value(0).toUInt();
629  m_fileAssociations.push_back(ret_fa);
630  }
631  else
632  return false;
633  }
634  else
635  *existing_fa = ret_fa;
636 
637  fa = ret_fa;
638  return true;
639  }
640 
641  return false;
642  }
643 
644  bool get(unsigned int id, file_association &val) const
645  {
646  auto p = cfind(id);
647  if (p != m_fileAssociations.end())
648  {
649  val = *p;
650  return true;
651  }
652  return false;
653  }
654 
655  bool get(const QString &ext, file_association &val) const
656  {
657  auto p = cfind(ext);
658  if (p != m_fileAssociations.end())
659  {
660  val = *p;
661  return true;
662  }
663  return false;
664  }
665 
666  bool remove(unsigned int id)
667  {
668  auto p = find(id);
669  if (p != m_fileAssociations.end())
670  {
671  MSqlQuery query(MSqlQuery::InitCon());
672  query.prepare("DELETE FROM videotypes WHERE intid = :ID");
673  query.bindValue(":ID", p->id);
674  if (query.exec())
675  {
676  m_fileAssociations.erase(p);
677  return true;
678  }
679  }
680  return false;
681  }
682 
683  const association_list &getList() const
684  {
685  return m_fileAssociations;
686  }
687 
688  void getExtensionIgnoreList(ext_ignore_list &ext_ignore) const
689  {
690  for (const auto & fa : m_fileAssociations)
691  ext_ignore.emplace_back(fa.extension, fa.ignore);
692  }
693 
694  mutable QMutex m_mutex;
695 
696  void load_data()
697  {
698  QMutexLocker locker(&m_mutex);
699  if (!m_ready)
700  {
701  fill_from_db();
702  m_ready = true;
703  }
704  }
705 
706  void cleanup()
707  {
708  m_ready = false;
709  m_fileAssociations.clear();
710  }
711 
712  private:
714  {
715  MSqlQuery query(MSqlQuery::InitCon());
716  if (query.exec("SELECT intid, extension, playcommand, f_ignore, "
717  "use_default FROM videotypes"))
718  {
719  while (query.next())
720  {
721  file_association fa(query.value(0).toUInt(),
722  query.value(1).toString(),
723  query.value(2).toString(),
724  query.value(3).toBool(),
725  query.value(4).toBool());
726  m_fileAssociations.push_back(fa);
727  }
728  }
729  }
730 
731  association_list::iterator find(const QString &ext)
732  {
733  for (auto p = m_fileAssociations.begin();
734  p != m_fileAssociations.end(); ++p)
735  {
736  if (p->extension.length() == ext.length() &&
737  ext.indexOf(p->extension) == 0)
738  {
739  return p;
740  }
741  }
742  return m_fileAssociations.end();
743  }
744 
745  association_list::iterator find(unsigned int id)
746  {
747  for (auto p = m_fileAssociations.begin();
748  p != m_fileAssociations.end(); ++p)
749  {
750  if (p->id == id) return p;
751  }
752  return m_fileAssociations.end();
753  }
754 
755  association_list::const_iterator cfind(const QString &ext) const
756  {
757  for (auto p = m_fileAssociations.cbegin();
758  p != m_fileAssociations.cend(); ++p)
759  {
760  if (p->extension.length() == ext.length() &&
761  ext.indexOf(p->extension) == 0)
762  {
763  return p;
764  }
765  }
766  return m_fileAssociations.cend();
767  }
768 
769  association_list::const_iterator cfind(unsigned int id) const
770  {
771  for (auto p = m_fileAssociations.cbegin();
772  p != m_fileAssociations.cend(); ++p)
773  {
774  if (p->id == id) return p;
775  }
776  return m_fileAssociations.cend();
777  }
778 
779  private:
781  bool m_ready {false};
782 };
783 
784 
786 {
787  return m_imp->add(fa);
788 }
789 
790 bool FileAssociations::get(unsigned int id, file_association &val) const
791 {
792  return m_imp->get(id, val);
793 }
794 
795 bool FileAssociations::get(const QString &ext, file_association &val) const
796 {
797  return m_imp->get(ext, val);
798 }
799 
800 bool FileAssociations::remove(unsigned int id)
801 {
802  return m_imp->remove(id);
803 }
804 
806 {
807  return m_imp->getList();
808 }
809 
811 {
812  m_imp->getExtensionIgnoreList(ext_ignore);
813 }
814 
816 {
817  m_imp->load_data();
818 }
819 
821 {
823 }
824 
826 {
827  delete m_imp;
828 }
829 
831 {
832  static FileAssociations s_fa;
833  s_fa.load_data();
834  return s_fa;
835 }
FileAssociations::~FileAssociations
~FileAssociations()
Definition: dbaccess.cpp:825
MSqlQuery::isActive
bool isActive(void) const
Definition: mythdbcon.h:215
MSqlQuery::next
bool next(void)
Wrap QSqlQuery::next() so we can display the query results.
Definition: mythdbcon.cpp:813
MSqlQuery
QSqlQuery wrapper that fetches a DB connection from the connection pool.
Definition: mythdbcon.h:127
SingleValueImp::getList
const entry_list & getList()
Definition: dbaccess.cpp:132
MultiValueImp::fill_from_db
void fill_from_db()
Definition: dbaccess.cpp:398
SingleValueImp::m_deleteSql
QString m_deleteSql
Definition: dbaccess.cpp:198
FileAssociationsImp::fill_from_db
void fill_from_db()
Definition: dbaccess.cpp:713
SingleValue::~SingleValue
virtual ~SingleValue()
Definition: dbaccess.cpp:209
MSqlQuery::size
int size(void) const
Definition: mythdbcon.h:214
MultiValue::exists
bool exists(int id, int value)
Definition: dbaccess.cpp:465
SingleValueImp::m_dirty
bool m_dirty
Definition: dbaccess.cpp:201
FileAssociations::getExtensionIgnoreList
void getExtensionIgnoreList(ext_ignore_list &ext_ignore) const
Definition: dbaccess.cpp:810
SingleValue::add
int add(const QString &name)
Definition: dbaccess.cpp:214
StringUtil::naturalSortCompare
bool naturalSortCompare(const QString &a, const QString &b, Qt::CaseSensitivity caseSensitivity=Qt::CaseSensitive)
naturalCompare as a std::sort compatible function (ignoring the third parameter, which is never used)...
Definition: stringutil.h:54
mythdb.h
VideoCategory
Definition: dbaccess.h:66
FileAssociationsImp::getExtensionIgnoreList
void getExtensionIgnoreList(ext_ignore_list &ext_ignore) const
Definition: dbaccess.cpp:688
VideoCountry
Definition: dbaccess.h:76
FileAssociations::file_association::extension
QString extension
Definition: dbaccess.h:142
SingleValueImp::m_cleanStub
SimpleCleanup< SingleValueImp > m_cleanStub
Definition: dbaccess.cpp:204
MultiValueImp::cleanup
void cleanup()
Definition: dbaccess.cpp:283
VideoCastMap::VideoCastMap
VideoCastMap()
Definition: dbaccess.cpp:567
SingleValueImp::remove
void remove(int id)
Definition: dbaccess.cpp:99
SingleValueImp::m_tableName
QString m_tableName
Definition: dbaccess.cpp:192
SingleValueImp::fill_from_db
void fill_from_db()
Definition: dbaccess.cpp:174
FileAssociationsImp::cfind
association_list::const_iterator cfind(unsigned int id) const
Definition: dbaccess.cpp:769
VideoCast
Definition: dbaccess.h:116
SingleValue::remove
void remove(int id)
Definition: dbaccess.cpp:224
VideoCountry::VideoCountry
VideoCountry()
Definition: dbaccess.cpp:496
MSqlQuery::value
QVariant value(int i) const
Definition: mythdbcon.h:204
MultiValueImp::MultiValueImp
MultiValueImp(QString table_name, QString id_name, QString value_name)
Definition: dbaccess.cpp:260
SingleValueImp::load_data
void load_data()
Definition: dbaccess.cpp:53
FileAssociationsImp::add
bool add(file_association &fa)
Definition: dbaccess.cpp:592
MSqlQuery::exec
bool exec(void)
Wrap QSqlQuery::exec() so we can display SQL.
Definition: mythdbcon.cpp:619
MultiValueImp::m_cleanStub
SimpleCleanup< MultiValueImp > m_cleanStub
Definition: dbaccess.cpp:440
FileAssociations::remove
bool remove(unsigned int id)
Definition: dbaccess.cpp:800
FileAssociationsImp
Definition: dbaccess.cpp:582
FileAssociations::getList
const association_list & getList() const
Definition: dbaccess.cpp:805
FileAssociations
Definition: dbaccess.h:136
SingleValueImp::find
entry_map::iterator find(const QString &name)
Definition: dbaccess.cpp:164
SingleValueImp::SingleValueImp
SingleValueImp(QString table_name, QString id_name, QString value_name)
Definition: dbaccess.cpp:37
cleanup.h
MultiValue::m_imp
MultiValueImp * m_imp
Definition: dbaccess.h:63
MultiValueImp::m_insertSql
QString m_insertSql
Definition: dbaccess.cpp:435
SingleValueImp::m_idName
QString m_idName
Definition: dbaccess.cpp:193
MultiValueImp::m_mutex
QMutex m_mutex
Definition: dbaccess.cpp:271
SingleValueImp::m_retEntries
entry_list m_retEntries
Definition: dbaccess.cpp:202
SingleValueImp::entry_map
std::map< int, QString > entry_map
Definition: dbaccess.cpp:34
MultiValue::load_data
void load_data()
Definition: dbaccess.cpp:475
FileAssociationsImp::cleanup
void cleanup()
Definition: dbaccess.cpp:706
MultiValueImp::m_idName
QString m_idName
Definition: dbaccess.cpp:432
dbaccess.h
FileAssociationsImp::find
association_list::iterator find(const QString &ext)
Definition: dbaccess.cpp:731
VideoGenreMap::getGenreMap
static VideoGenreMap & getGenreMap()
Definition: dbaccess.cpp:543
FileAssociations::file_association::playcommand
QString playcommand
Definition: dbaccess.h:143
SingleValueImp::add
int add(const QString &name)
Definition: dbaccess.cpp:63
SingleValueImp::get
bool get(int id, QString &value)
Definition: dbaccess.cpp:88
VideoGenre::getGenre
static VideoGenre & getGenre()
Definition: dbaccess.cpp:515
VideoCategory::VideoCategory
VideoCategory()
Definition: dbaccess.cpp:482
VideoGenreMap::VideoGenreMap
VideoGenreMap()
Definition: dbaccess.cpp:538
MultiValue::add
int add(int id, int value)
Definition: dbaccess.cpp:445
MultiValueImp::exists
bool exists(int id, int value)
Definition: dbaccess.cpp:379
FileAssociationsImp::m_ready
bool m_ready
Definition: dbaccess.cpp:781
hardwareprofile.config.p
p
Definition: config.py:33
SingleValueImp::entry_list
std::vector< entry > entry_list
Definition: dbaccess.cpp:31
FileAssociations::ext_ignore_list
std::vector< std::pair< QString, bool > > ext_ignore_list
Definition: dbaccess.h:155
FileAssociations::get
bool get(unsigned int id, file_association &val) const
Definition: dbaccess.cpp:790
MSqlQuery::InitCon
static MSqlQueryInfo InitCon(ConnectionReuse _reuse=kNormalConnection)
Only use this in combination with MSqlQuery constructor.
Definition: mythdbcon.cpp:551
FileAssociations::association_list
std::vector< file_association > association_list
Definition: dbaccess.h:154
SingleValueImp::cleanup
void cleanup()
Definition: dbaccess.cpp:155
MythDB::DBError
static void DBError(const QString &where, const MSqlQuery &query)
Definition: mythdb.cpp:226
FileAssociationsImp::load_data
void load_data()
Definition: dbaccess.cpp:696
MultiValueImp::m_fillSql
QString m_fillSql
Definition: dbaccess.cpp:436
FileAssociations::FileAssociations
FileAssociations()
Definition: dbaccess.cpp:820
FileAssociationsImp::FileAssociationsImp
FileAssociationsImp()=default
SimpleCleanup< SingleValueImp >
stringutil.h
MultiValueImp::load_data
void load_data()
Definition: dbaccess.cpp:273
SingleValueImp::m_fillSql
QString m_fillSql
Definition: dbaccess.cpp:197
VideoCastMap
Definition: dbaccess.h:126
VideoCountryMap::VideoCountryMap
VideoCountryMap()
Definition: dbaccess.cpp:552
VideoCountry::getCountry
static VideoCountry & getCountry()
Definition: dbaccess.cpp:501
SingleValueImp::exists
bool exists(int id)
Definition: dbaccess.cpp:115
SingleValueImp::m_entries
entry_map m_entries
Definition: dbaccess.cpp:203
FileAssociationsImp::get
bool get(const QString &ext, file_association &val) const
Definition: dbaccess.cpp:655
MultiValueImp::m_ready
bool m_ready
Definition: dbaccess.cpp:439
FileAssociationsImp::find
association_list::iterator find(unsigned int id)
Definition: dbaccess.cpp:745
SingleValue::exists
bool exists(int id)
Definition: dbaccess.cpp:229
VideoCategory::GetCategory
static VideoCategory & GetCategory()
Definition: dbaccess.cpp:487
VideoGenre
Definition: dbaccess.h:86
MultiValueImp
Definition: dbaccess.cpp:251
SingleValue
Definition: dbaccess.h:12
FileAssociationsImp::m_fileAssociations
association_list m_fileAssociations
Definition: dbaccess.cpp:780
SingleValueImp::m_insertSql
QString m_insertSql
Definition: dbaccess.cpp:196
FileAssociationsImp::association_list
FileAssociations::association_list association_list
Definition: dbaccess.cpp:586
MultiValue::entry::values_type
std::vector< long > values_type
Definition: dbaccess.h:43
SingleValue::entry
std::pair< int, QString > entry
Definition: dbaccess.h:15
MultiValueImp::remove
void remove(int id)
Definition: dbaccess.cpp:361
MultiValueImp::m_tableName
QString m_tableName
Definition: dbaccess.cpp:431
FileAssociations::file_association::ignore
bool ignore
Definition: dbaccess.h:144
SingleValueImp::entry
SingleValue::entry entry
Definition: dbaccess.cpp:30
FileAssociationsImp::cfind
association_list::const_iterator cfind(const QString &ext) const
Definition: dbaccess.cpp:755
FileAssociations::load_data
void load_data()
Definition: dbaccess.cpp:815
VideoCountryMap::getCountryMap
static VideoCountryMap & getCountryMap()
Definition: dbaccess.cpp:558
SingleValueImp::exists
bool exists(const QString &name, int *id=nullptr)
Definition: dbaccess.cpp:120
FileAssociations::getFileAssociation
static FileAssociations & getFileAssociation()
Definition: dbaccess.cpp:830
FileAssociationsImp::ext_ignore_list
FileAssociations::ext_ignore_list ext_ignore_list
Definition: dbaccess.cpp:587
FileAssociationsImp::m_mutex
QMutex m_mutex
Definition: dbaccess.cpp:694
MultiValueImp::m_valMap
id_map m_valMap
Definition: dbaccess.cpp:429
MultiValueImp::remove
void remove(int id, int value)
Definition: dbaccess.cpp:336
SingleValue::load_data
void load_data()
Definition: dbaccess.cpp:244
SingleValue::getList
const entry_list & getList()
Definition: dbaccess.cpp:239
MultiValueImp::m_idSql
QString m_idSql
Definition: dbaccess.cpp:437
SingleValueImp::~SingleValueImp
virtual ~SingleValueImp()=default
SingleValueImp
Definition: dbaccess.cpp:27
MultiValue::entry::id
int id
Definition: dbaccess.h:42
VideoCast::GetCast
static VideoCast & GetCast()
Definition: dbaccess.cpp:529
MultiValueImp::get
bool get(int id, entry &values)
Definition: dbaccess.cpp:325
SingleValueImp::sort
virtual bool sort(const entry &lhs, const entry &rhs)
Definition: dbaccess.cpp:150
MultiValueImp::exists
bool exists(int id)
Definition: dbaccess.cpp:392
MSqlQuery::bindValue
void bindValue(const QString &placeholder, const QVariant &val)
Add a single binding.
Definition: mythdbcon.cpp:889
std
Definition: mythchrono.h:23
MultiValue::get
bool get(int id, entry &values)
Definition: dbaccess.cpp:450
MultiValue::remove
void remove(int id, int value)
Definition: dbaccess.cpp:455
SingleValueImp::m_mutex
QMutex m_mutex
Definition: dbaccess.cpp:51
VideoGenre::VideoGenre
VideoGenre()
Definition: dbaccess.cpp:510
FileAssociations::m_imp
class FileAssociationsImp * m_imp
Definition: dbaccess.h:177
FileAssociations::file_association::use_default
bool use_default
Definition: dbaccess.h:145
FileAssociationsImp::remove
bool remove(unsigned int id)
Definition: dbaccess.cpp:666
MultiValueImp::add
int add(int id, int value)
Definition: dbaccess.cpp:289
SingleValue::m_imp
SingleValueImp * m_imp
Definition: dbaccess.h:33
MultiValue::entry::values
values_type values
Definition: dbaccess.h:44
SingleValueImp::m_ready
bool m_ready
Definition: dbaccess.cpp:200
FileAssociationsImp::get
bool get(unsigned int id, file_association &val) const
Definition: dbaccess.cpp:644
SingleValue::entry_list
std::vector< entry > entry_list
Definition: dbaccess.h:16
VideoCastMap::getCastMap
static VideoCastMap & getCastMap()
Definition: dbaccess.cpp:573
VideoCast::VideoCast
VideoCast()
Definition: dbaccess.cpp:524
VideoCountryMap
Definition: dbaccess.h:106
FileAssociations::file_association
Definition: dbaccess.h:139
MultiValue
Definition: dbaccess.h:37
FileAssociationsImp::getList
const association_list & getList() const
Definition: dbaccess.cpp:683
FileAssociations::add
bool add(file_association &fa)
Definition: dbaccess.cpp:785
MultiValueImp::id_map
std::map< int, entry > id_map
Definition: dbaccess.cpp:257
SingleValue::get
bool get(int id, QString &category)
Definition: dbaccess.cpp:219
find
static pid_list_t::iterator find(const PIDInfoMap &map, pid_list_t &list, pid_list_t::iterator begin, pid_list_t::iterator end, bool find_open)
Definition: dvbstreamhandler.cpp:363
FileAssociations::file_association::id
unsigned int id
Definition: dbaccess.h:141
VideoGenreMap
Definition: dbaccess.h:96
SingleValueImp::m_valueName
QString m_valueName
Definition: dbaccess.cpp:194
MultiValue::entry
Definition: dbaccess.h:40
MSqlQuery::prepare
bool prepare(const QString &query)
QSqlQuery::prepare() is not thread safe in Qt <= 3.3.2.
Definition: mythdbcon.cpp:838
MultiValueImp::m_valueName
QString m_valueName
Definition: dbaccess.cpp:433