summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorworo <woro@e10066b5-e1e2-0310-b819-94efdf66514b>2008-04-13 05:48:48 +0000
committerworo <woro@e10066b5-e1e2-0310-b819-94efdf66514b>2008-04-13 05:48:48 +0000
commit3dc9b33fb7a0acf44c5bece2824b7cbb31658f17 (patch)
treee6032c867a992201a93f0cec172b546ed026deca
parent2ab0a3acf1540aff556d76331791858e0b1000f4 (diff)
downloadvdr-plugin-muggle-3dc9b33fb7a0acf44c5bece2824b7cbb31658f17.tar.gz
vdr-plugin-muggle-3dc9b33fb7a0acf44c5bece2824b7cbb31658f17.tar.bz2
SQLite3: in some situations, muggle opened/closed the database
very often. And sqlite did not close the file descriptor. Now open/close it less often git-svn-id: https://vdr-muggle.svn.sourceforge.net/svnroot/vdr-muggle/trunk/muggle-plugin@1179 e10066b5-e1e2-0310-b819-94efdf66514b
-rw-r--r--mg_db.c17
-rw-r--r--mg_db.h5
-rw-r--r--mg_db_gd_sqlite.c4
3 files changed, 20 insertions, 6 deletions
diff --git a/mg_db.c b/mg_db.c
index e0462f0..30f7b73 100644
--- a/mg_db.c
+++ b/mg_db.c
@@ -512,24 +512,33 @@ mgKeyNormal::AddIdClause(mgDb *db,mgParts &result,string what) const
}
bool
-mgKey::LoadMap() const
+mgKey::LoadMapFrom(mgDb *db) const
{
if (map_sql().empty())
return false;
- mgDb *db = GenerateDB();
db->LoadMapInto(map_sql(), &map_ids[Type()], &map_values[Type()]);
- delete db;
return true;
}
+mgKeyMaps::mgKeyMaps() {
+ kmdb = 0;
+}
+
+mgKeyMaps::~mgKeyMaps() {
+ delete kmdb;
+}
+
mgKeyMaps KeyMaps;
+
bool
mgKeyMaps::loadvalues (mgKeyTypes kt) const
{
if (map_ids[kt].size()>0)
return true;
mgKey* k = ktGenerate(kt);
- bool result = k->LoadMap();
+ if (!kmdb)
+ kmdb = GenerateDB();
+ bool result = k->LoadMapFrom(kmdb);
delete k;
return result;
}
diff --git a/mg_db.h b/mg_db.h
index d358618..eb26c0e 100644
--- a/mg_db.h
+++ b/mg_db.h
@@ -256,7 +256,7 @@ class mgKey
virtual mgKeyTypes Type() const = 0;
virtual mgSortBy SortBy() const { return mgSortByValue; }
virtual bool Enabled(mgDb *db) { return true; }
- virtual bool LoadMap() const;
+ virtual bool LoadMapFrom(mgDb *db) const;
protected:
virtual string map_sql() const { return ""; }
};
@@ -317,7 +317,10 @@ class mgKeyMaps
public:
string value(mgKeyTypes kt, string idstr) const;
string id(mgKeyTypes kt, string valstr) const;
+ mgKeyMaps();
+ ~mgKeyMaps();
private:
+ mutable mgDb* kmdb;
bool loadvalues (mgKeyTypes kt) const;
};
diff --git a/mg_db_gd_sqlite.c b/mg_db_gd_sqlite.c
index a7a6198..68fb03e 100644
--- a/mg_db_gd_sqlite.c
+++ b/mg_db_gd_sqlite.c
@@ -98,6 +98,8 @@ mgDbGd::mgDbGd(bool SeparateThread) {
mgDbGd::~mgDbGd() {
sqlite3_close (m_db);
+// this does not release all fds even if no transaction is pending!
+// try not to call sqlite3_open more often than necessary
m_db = 0;
}
@@ -282,10 +284,10 @@ mgDbGd::ConnectDatabase () {
if (stat(the_setup.DbDatadir,&stbuf))
mkdir(the_setup.DbDatadir,0755);
char *s=sqlite3_mprintf("%s/%s.sqlite",the_setup.DbDatadir,the_setup.DbName);
- mgDebug(1,"%X opening data base %s",m_db,s);
// rework this when sqlite3.5 is available, use sqlite3_open_v2
// and do not try to create db here
int rc = sqlite3_open(s,&m_db);
+ mgDebug(1,"opening data base %s with handle %04X",s,m_db);
if (rc!=SQLITE_OK)
mgWarning("Cannot open/create SQLite database %s:%d/%s",
s,rc,sqlite3_errmsg(m_db));