summaryrefslogtreecommitdiff
path: root/mg_selection.c
diff options
context:
space:
mode:
Diffstat (limited to 'mg_selection.c')
-rw-r--r--mg_selection.c161
1 files changed, 27 insertions, 134 deletions
diff --git a/mg_selection.c b/mg_selection.c
index 3bb79e1..05904f3 100644
--- a/mg_selection.c
+++ b/mg_selection.c
@@ -14,8 +14,6 @@
#include "vdr_setup.h"
#include "mg_tools.h"
-bool needGenre2;
-bool needGenre2_set;
//! \brief adds string n to string s, using a comma to separate them
static string comma (string & s, string n);
@@ -107,41 +105,6 @@ mgSelection::getKeyType (const unsigned int level) const
return order.getKeyType(level);
}
-MYSQL_RES*
-mgSelection::exec_sql(string query) const
-{
- return ::exec_sql(m_db, query);
-}
-
-/*! \brief executes a query and returns the first columnu of the
- * first row.
- * \param query the SQL query string to be executed
- */
-string mgSelection::get_col0 (string query) const
-{
- return ::get_col0(m_db, query);
-}
-
-
-unsigned long
-mgSelection::exec_count (string query) const
-{
- return ::exec_count(m_db, query);
-}
-
-
-
-string
-mgSelection::sql_string (const string s) const
-{
- char *buf = (char *) malloc (s.size () * 2 + 1);
- mysql_real_escape_string (m_db, buf, s.c_str (), s.size ());
- string result = "'" + std::string (buf) + "'";
- free (buf);
- return result;
-}
-
-
mgContentItem *
mgSelection::getTrack (unsigned int position)
{
@@ -230,28 +193,28 @@ mgSelection::LoopMode mgSelection::toggleLoopMode ()
unsigned int
mgSelection::AddToCollection (const string Name)
{
- if (!m_db) return 0;
+ if (!m_db.Connected()) return 0;
CreateCollection(Name);
- string listid = sql_string (get_col0
- ("SELECT id FROM playlist WHERE title=" + sql_string (Name)));
+ string listid = m_db.sql_string (m_db.get_col0
+ ("SELECT id FROM playlist WHERE title=" + m_db.sql_string (Name)));
unsigned int tracksize = getNumTracks ();
// this code is rather complicated but works in a multi user
// environment:
// insert a unique trackid:
- string trackid = ltos(mysql_thread_id(m_db)+1000000);
- exec_sql("INSERT INTO playlistitem SELECT "+listid+","
+ string trackid = ltos(m_db.thread_id()+1000000);
+ m_db.exec_sql("INSERT INTO playlistitem SELECT "+listid+","
"MAX(tracknumber)+"+ltos(tracksize)+","+trackid+
" FROM playlistitem WHERE playlist="+listid);
// find tracknumber of the trackid we just inserted:
string sql = string("SELECT tracknumber FROM playlistitem WHERE "
"playlist=")+listid+" AND trackid="+trackid;
- long first = atol(get_col0(sql).c_str()) - tracksize + 1;
+ long first = atol(m_db.get_col0(sql).c_str()) - tracksize + 1;
// replace the place holder trackid by the correct value:
- exec_sql("UPDATE playlistitem SET trackid="+ltos(m_tracks[tracksize-1].getId())+
+ m_db.exec_sql("UPDATE playlistitem SET trackid="+ltos(m_tracks[tracksize-1].getId())+
" WHERE playlist="+listid+" AND trackid="+trackid);
// insert all other tracks:
@@ -264,11 +227,11 @@ mgSelection::AddToCollection (const string Name)
comma(sql, item);
if ((i%100)==99)
{
- exec_sql (sql_prefix+sql);
+ m_db.exec_sql (sql_prefix+sql);
sql = "";
}
}
- if (!sql.empty()) exec_sql (sql_prefix+sql);
+ if (!sql.empty()) m_db.exec_sql (sql_prefix+sql);
if (inCollection(Name)) clearCache ();
return tracksize;
}
@@ -277,11 +240,11 @@ mgSelection::AddToCollection (const string Name)
unsigned int
mgSelection::RemoveFromCollection (const string Name)
{
- if (!m_db) return 0;
+ if (!m_db.Connected()) return 0;
mgParts p = order.Parts(m_db,m_level,false);
string sql = p.sql_delete_from_collection(id(keyCollection,Name));
- exec_sql (sql);
- unsigned int removed = mysql_affected_rows (m_db);
+ m_db.exec_sql (sql);
+ unsigned int removed = m_db.affected_rows ();
if (inCollection(Name)) clearCache ();
return removed;
}
@@ -289,30 +252,30 @@ mgSelection::RemoveFromCollection (const string Name)
bool mgSelection::DeleteCollection (const string Name)
{
- if (!m_db) return false;
+ if (!m_db.Connected()) return false;
ClearCollection(Name);
- exec_sql ("DELETE FROM playlist WHERE title=" + sql_string (Name));
+ m_db.exec_sql ("DELETE FROM playlist WHERE title=" + m_db.sql_string (Name));
if (isCollectionlist()) clearCache ();
- return (mysql_affected_rows (m_db) == 1);
+ return (m_db.affected_rows () == 1);
}
void mgSelection::ClearCollection (const string Name)
{
- if (!m_db) return;
+ if (!m_db.Connected()) return;
string listid = id(keyCollection,Name);
- exec_sql ("DELETE FROM playlistitem WHERE playlist="+sql_string(listid));
+ m_db.exec_sql ("DELETE FROM playlistitem WHERE playlist="+m_db.sql_string(listid));
if (inCollection(Name)) clearCache ();
}
bool mgSelection::CreateCollection(const string Name)
{
- if (!m_db) return false;
- string name = sql_string(Name);
- if (exec_count("SELECT count(title) FROM playlist WHERE title = " + name)>0)
+ if (!m_db.Connected()) return false;
+ string name = m_db.sql_string(Name);
+ if (m_db.exec_count("SELECT count(title) FROM playlist WHERE title = " + name)>0)
return false;
- exec_sql ("INSERT playlist VALUES(" + name + ",'VDR',NULL,NULL,NULL)");
+ m_db.exec_sql ("INSERT playlist VALUES(" + name + ",'VDR',NULL,NULL,NULL)");
if (isCollectionlist()) clearCache ();
return true;
}
@@ -503,7 +466,7 @@ string mgSelection::ListFilename ()
const vector < mgContentItem > &
mgSelection::tracks () const
{
- if (!m_db) return m_tracks;
+ if (!m_db.Connected()) return m_tracks;
if (!m_current_tracks.empty()) return m_tracks;
mgParts p = order.Parts(m_db,m_level);
p.fields.clear();
@@ -526,7 +489,7 @@ mgSelection::tracks () const
p += order.Key(i)->Parts(m_db,true);
m_current_tracks = p.sql_select(false);
m_tracks.clear ();
- MYSQL_RES *rows = exec_sql (m_current_tracks);
+ MYSQL_RES *rows = m_db.exec_sql (m_current_tracks);
if (rows)
{
MYSQL_ROW row;
@@ -541,7 +504,6 @@ mgSelection::tracks () const
void mgSelection::InitSelection() {
- setDB(0);
m_Directory=".";
m_level = 0;
m_position = 0;
@@ -563,7 +525,6 @@ void mgSelection::InitSelection() {
mgSelection::mgSelection (const bool fall_through)
{
InitSelection ();
- Connect();
m_fall_through = fall_through;
}
@@ -583,12 +544,6 @@ mgSelection::mgSelection (mgValmap& nv)
}
void
-mgSelection::setDB(MYSQL *db)
-{
- m_db = db;
-}
-
-void
mgSelection::setOrder(mgOrder* o)
{
if (o)
@@ -603,7 +558,6 @@ void
mgSelection::InitFrom(mgValmap& nv)
{
InitSelection();
- Connect();
m_fall_through = nv.getbool("FallThrough");
m_Directory = nv.getstr("Directory");
while (m_level < nv.getuint("Level"))
@@ -624,8 +578,6 @@ mgSelection::InitFrom(mgValmap& nv)
mgSelection::~mgSelection ()
{
- if (m_db)
- mysql_close (m_db);
}
void mgSelection::InitFrom(const mgSelection* s)
@@ -640,7 +592,6 @@ void mgSelection::InitFrom(const mgSelection* s)
m_position = s->m_position;
m_trackid = s->m_trackid;
m_tracks_position = s->m_tracks_position;
- Connect();
setShuffleMode (s->getShuffleMode ());
setLoopMode (s->getLoopMode ());
}
@@ -699,7 +650,7 @@ void
mgSelection::refreshValues () const
{
assert(this);
- if (!m_db)
+ if (!m_db.Connected())
return;
if (m_current_values.empty())
{
@@ -708,7 +659,7 @@ mgSelection::refreshValues () const
values.strings.clear ();
m_ids.clear ();
m_counts.clear();
- MYSQL_RES *rows = exec_sql (m_current_values);
+ MYSQL_RES *rows = m_db.exec_sql (m_current_values);
if (rows)
{
unsigned int num_fields = mysql_num_fields(rows);
@@ -744,63 +695,6 @@ mgSelection::count () const
{
return values.size ();
}
-void
-mgSelection::Connect ()
-{
- if (m_db)
- {
- mysql_close (m_db);
- setDB(0);
- }
- if (the_setup.DbHost == "") return;
- setDB(mysql_init (0));
- if (!m_db)
- return;
- bool success;
- if (the_setup.DbSocket != NULL)
- {
- mgDebug(1,"Using socket %s for connecting to Database %s as user %s.",
- the_setup.DbSocket,
- the_setup.DbName,
- the_setup.DbUser);
- mgDebug(3,"DbPassword is: '%s'",the_setup.DbPass);
- success = (mysql_real_connect( m_db,
- "",
- the_setup.DbUser,
- the_setup.DbPass,
- the_setup.DbName,
- 0,
- the_setup.DbSocket, 0 ) != 0 );
- }
- else
- {
- mgDebug(1,"Using TCP-%s for connecting to Database %s as user %s.",
- the_setup.DbHost,
- the_setup.DbName,
- the_setup.DbUser);
- mgDebug(3,"DbPassword is: '%s'",the_setup.DbPass);
- success = ( mysql_real_connect( m_db,
- the_setup.DbHost,
- the_setup.DbUser,
- the_setup.DbPass,
- the_setup.DbName,
- the_setup.DbPort,
- 0, 0 ) != 0 );
- }
- if (!success)
- {
- mgWarning("Failed to connect to host '%s' as User '%s', Password '%s': Error: %s",
- the_setup.DbHost,the_setup.DbUser,the_setup.DbPass,mysql_error(m_db));
- mysql_close (m_db);
- setDB(0);
- }
- if (!needGenre2_set && m_db)
- {
- needGenre2_set=true;
- needGenre2=exec_count("SELECT COUNT(DISTINCT genre2) from tracks")>1;
- }
- return;
-}
bool mgSelection::enter (unsigned int position)
@@ -1117,7 +1011,7 @@ mgSelection::loadvalues (mgKeyTypes kt) const
map<string,string>& valmap = map_values[kt];
char *b;
asprintf(&b,"select %s,%s from %s;",k->map_idfield().c_str(),k->map_valuefield().c_str(),k->map_valuetable().c_str());
- MYSQL_RES *rows = exec_sql (string(b));
+ MYSQL_RES *rows = m_db.exec_sql (string(b));
free(b);
if (rows)
{
@@ -1141,7 +1035,6 @@ static vector<int> keycounts;
unsigned int
mgSelection::keycount(mgKeyTypes kt)
{
- assert(strlen(m_db->host));
if (keycounts.size()==0)
{
for (unsigned int ki=int(mgKeyTypesLow);ki<=int(mgKeyTypesHigh);ki++)
@@ -1154,7 +1047,7 @@ mgSelection::keycount(mgKeyTypes kt)
{
mgKey* k = ktGenerate(kt);
if (k->Enabled(m_db))
- count = exec_count(k->Parts(m_db,true).sql_count());
+ count = m_db.exec_count(k->Parts(m_db,true).sql_count());
else
count = 0;
delete k;