summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorworo <woro@e10066b5-e1e2-0310-b819-94efdf66514b>2008-02-09 16:38:49 +0000
committerworo <woro@e10066b5-e1e2-0310-b819-94efdf66514b>2008-02-09 16:38:49 +0000
commit83c77787298c759e542fe57b506209292e5d18a8 (patch)
tree35774dadd3febcacf84591080eecee41f9ee7393
parent9d1cb38d2119999987514b7b90828260ff1475bb (diff)
downloadvdr-plugin-muggle-83c77787298c759e542fe57b506209292e5d18a8.tar.gz
vdr-plugin-muggle-83c77787298c759e542fe57b506209292e5d18a8.tar.bz2
restructure code for database connection and creation,
also fixes mugglei -c - it never deleted existing databases as the help info says git-svn-id: https://vdr-muggle.svn.sourceforge.net/svnroot/vdr-muggle/trunk/muggle-plugin@1011 e10066b5-e1e2-0310-b819-94efdf66514b
-rw-r--r--mg_db.c30
-rw-r--r--mg_db.h7
-rw-r--r--mg_db_gd_mysql.c27
-rw-r--r--mg_db_gd_mysql.h2
-rw-r--r--mg_db_gd_pg.c34
-rw-r--r--mg_db_gd_pg.h2
-rw-r--r--mg_db_gd_sqlite.c35
-rw-r--r--mg_db_gd_sqlite.h2
8 files changed, 54 insertions, 85 deletions
diff --git a/mg_db.c b/mg_db.c
index 9315230..8ef0757 100644
--- a/mg_db.c
+++ b/mg_db.c
@@ -299,6 +299,36 @@ optimize (string & spar)
}
bool
+mgDb::Connect ()
+{
+ if (m_database_found)
+ return true;
+ if (!ServerConnect())
+ return false;
+ if (time(0)<m_create_time+10)
+ return false;
+ m_create_time=time(0);
+ m_database_found=ConnectDatabase();
+ if (!m_database_found)
+ mgWarning("database not found");
+ if (the_setup.IsMugglei())
+ {
+ if (the_setup.CreateMode)
+ m_database_found = Create();
+ }
+ else
+ {
+ if (!m_database_found)
+ {
+ extern bool create_question();
+ if (create_question())
+ m_database_found = Create();
+ }
+ }
+ return m_database_found;
+}
+
+bool
mgDb::SyncStart()
{
if (!Connect())
diff --git a/mg_db.h b/mg_db.h
index 0b5a051..68b81c2 100644
--- a/mg_db.h
+++ b/mg_db.h
@@ -171,9 +171,9 @@ class mgDb {
*/
unsigned long exec_count(const string sql);
virtual bool ServerConnect() { return true; }
- virtual bool Connect() = 0;
+ bool Connect();
+ virtual bool ConnectDatabase() = 0;
bool HasFolderFields() const { return m_hasfolderfields;}
- virtual bool Create() = 0;
virtual int AddToCollection( const string Name,const vector<mgItem*>&items,mgParts* what=0);
virtual int RemoveFromCollection( const string Name,const vector<mgItem*>&items,mgParts* what=0);
virtual bool DeleteCollection( const string Name);
@@ -200,12 +200,12 @@ class mgDb {
int m_cols;
virtual void SyncEnd() {}
bool SyncFile(const char *filename);
- bool m_database_found;
bool m_hasfolderfields;
bool m_separate_thread;
time_t m_connect_time;
time_t m_create_time;
string get_col0(const string sql);
+ virtual bool Create() = 0;
void FillTables();
virtual void StartTransaction() {};
virtual void Commit() {};
@@ -225,6 +225,7 @@ class mgDb {
const mgSQLString& c_artist);
map<string,string> m_Genres;
map<string,string> m_GenreIds;
+ bool m_database_found;
};
diff --git a/mg_db_gd_mysql.c b/mg_db_gd_mysql.c
index e6a4ff8..8acda12 100644
--- a/mg_db_gd_mysql.c
+++ b/mg_db_gd_mysql.c
@@ -421,7 +421,7 @@ mgDbGd::Create()
if (!ServerConnect())
return false;
// create database and tables
- mgDebug(1,"Dropping and recreating database %s",the_setup.DbName);
+ mgWarning("Dropping and recreating database %s",the_setup.DbName);
char buffer[500];
sprintf(buffer,"DROP DATABASE IF EXISTS %s",the_setup.DbName);
if (strlen(buffer)>400)
@@ -454,8 +454,8 @@ mgDbGd::Create()
return false;
}
}
- m_database_found=true;
FillTables();
+ mgWarning("new database successfully created");
return true;
}
@@ -517,28 +517,9 @@ UsingEmbeddedMySQL()
}
bool
-mgDbGd::Connect ()
+mgDbGd::ConnectDatabase ()
{
- if (m_database_found)
- return true;
- if (!ServerConnect())
- return false;
- if (time(0)<m_create_time+10)
- return false;
- m_create_time=time(0);
- m_database_found = mysql_select_db(m_db,the_setup.DbName)==0;
- if (m_database_found)
- return true;
- extern bool create_question();
- if (!create_question())
- {
- mgWarning("Database not created");
- return false;
- }
- m_database_found = Create();
- if (!m_database_found)
- mgWarning("Cannot create database:%s",mysql_error(m_db));
- return m_database_found;
+ return mysql_select_db(m_db,the_setup.DbName)==0;
}
bool
diff --git a/mg_db_gd_mysql.h b/mg_db_gd_mysql.h
index d5516c2..803320d 100644
--- a/mg_db_gd_mysql.h
+++ b/mg_db_gd_mysql.h
@@ -25,7 +25,7 @@ class mgDbGd : public mgDb {
mgDbGd (bool SeparateThread=false);
~mgDbGd();
bool ServerConnect();
- bool Connect();
+ bool ConnectDatabase();
bool Create();
int AddToCollection( const string Name,const vector<mgItem*>&items,mgParts* what);
int RemoveFromCollection( const string Name,const vector<mgItem*>&items,mgParts* what);
diff --git a/mg_db_gd_pg.c b/mg_db_gd_pg.c
index a8c88d9..d17282d 100644
--- a/mg_db_gd_pg.c
+++ b/mg_db_gd_pg.c
@@ -22,6 +22,7 @@
#include "mg_setup.h"
#include "mg_item_gd.h"
#include "mg_db_gd_pg.h"
+#include <libpq-fe.h>
#include <pg_config.h>
@@ -253,14 +254,6 @@ mgDbGd::Commit()
bool
mgDbGd::Create()
{
- if (!Connect())
- return false;
- return myCreate();
-}
-
-bool
-mgDbGd::myCreate()
-{
// create database and tables
int len = sizeof( db_cmds ) / sizeof( char* );
for( int i=0; i < len; i ++ )
@@ -269,8 +262,8 @@ mgDbGd::myCreate()
if (!q.ErrorMessage().empty())
return false;
}
- m_database_found=true;
FillTables();
+ mgWarning("new database successfully created");
return true;
}
@@ -282,10 +275,8 @@ mgDbGd::ServerConnect ()
bool
-mgDbGd::Connect ()
+mgDbGd::ConnectDatabase ()
{
- if (m_database_found)
- return true;
char conninfo[500];
char port[20];
char host[200];
@@ -312,23 +303,8 @@ mgDbGd::Connect ()
mgWarning("Failed to connect to postgres server using %s:%s",conninfo,PQerrorMessage(m_db));
return false;
}
- m_database_found = true; // otherwise we get into a recursion
- m_database_found = exec_count("SELECT COUNT(*) FROM information_schema.tables WHERE table_name='album'");
- if (m_database_found)
- return true;
- if (time(0)<m_create_time+10)
- return false;
- m_create_time=time(0);
- extern bool create_question();
- if (!create_question())
- {
- mgWarning("Database not created");
- return false;
- }
- m_database_found = myCreate();
- if (!m_database_found)
- mgWarning("Cannot create database:%s",PQerrorMessage(m_db));
- return m_database_found;
+ return atol (get_col0 ("SELECT COUNT(*) FROM information_schema.tables WHERE table_name='album'").c_str ())==1;
+ // do not use exec_count because it calls Connect()
}
bool
diff --git a/mg_db_gd_pg.h b/mg_db_gd_pg.h
index 73996db..7cf3221 100644
--- a/mg_db_gd_pg.h
+++ b/mg_db_gd_pg.h
@@ -48,7 +48,7 @@ class mgDbGd : public mgDb {
mgDbGd (bool SeparateThread=false);
~mgDbGd();
bool ServerConnect();
- bool Connect();
+ bool ConnectDatabase();
bool Create();
bool NeedGenre2();
diff --git a/mg_db_gd_sqlite.c b/mg_db_gd_sqlite.c
index d83c6d8..c62c737 100644
--- a/mg_db_gd_sqlite.c
+++ b/mg_db_gd_sqlite.c
@@ -243,8 +243,8 @@ mgDbGd::Create()
return false;
}
}
- m_database_found=true;
FillTables();
+ mgWarning("new database successfully created");
return true;
}
@@ -290,28 +290,20 @@ mgSubstring(sqlite3_context *context, int argc, sqlite3_value **argv)
}
bool
-mgDbGd::Connect ()
+mgDbGd::ConnectDatabase ()
{
- if (m_database_found)
- return true;
- if (time(0)<m_create_time+10)
- return false;
- m_create_time=time(0);
- struct stat stbuf; // TODO das hier in die Parentklasse?
+ struct stat stbuf;
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);
int rc = sqlite3_open(s,&m_db);
- m_database_found = rc==SQLITE_OK;
- if (!m_database_found)
- {
+ if (rc!=SQLITE_OK)
mgWarning("Cannot open/create SQLite database %s:%d/%s",
s,rc,sqlite3_errmsg(m_db));
- sqlite3_free(s);
+ sqlite3_free(s);
+ if (rc!=SQLITE_OK)
return false;
- }
- sqlite3_free(s);
rc = sqlite3_create_function(m_db,"mgDirectory",1,SQLITE_UTF8,
0,&mgDirectory,0,0);
if (rc!=SQLITE_OK)
@@ -334,19 +326,8 @@ mgDbGd::Connect ()
return false;
}
if (!FieldExists("tracks","id"))
- m_database_found=false;
- if (m_database_found)
- return true;
- extern bool create_question();
- if (!create_question())
- {
- mgWarning("Database not created");
- return false;
- }
- m_database_found = Create();
- if (!m_database_found)
- mgWarning("Cannot create database:%s",sqlite3_errmsg);
- return m_database_found;
+ return false;
+ return true;
}
bool
diff --git a/mg_db_gd_sqlite.h b/mg_db_gd_sqlite.h
index 81d8516..a21ac01 100644
--- a/mg_db_gd_sqlite.h
+++ b/mg_db_gd_sqlite.h
@@ -46,7 +46,7 @@ class mgDbGd : public mgDb {
public:
mgDbGd (bool SeparateThread=false);
~mgDbGd();
- bool Connect();
+ bool ConnectDatabase();
bool Create();
bool NeedGenre2();