Commit 114df1f1 authored by Max Kellermann's avatar Max Kellermann

DatabasePlugin: add interface DatabaseListener

Allow database plugins to announce that they have been modified.
parent 00adf7ff
...@@ -114,6 +114,7 @@ src_mpd_SOURCES = \ ...@@ -114,6 +114,7 @@ src_mpd_SOURCES = \
src/DatabaseLock.cxx src/DatabaseLock.hxx \ src/DatabaseLock.cxx src/DatabaseLock.hxx \
src/DatabaseSave.cxx src/DatabaseSave.hxx \ src/DatabaseSave.cxx src/DatabaseSave.hxx \
src/DatabasePlugin.hxx \ src/DatabasePlugin.hxx \
src/DatabaseListener.hxx \
src/DatabaseVisitor.hxx \ src/DatabaseVisitor.hxx \
src/DatabaseSelection.cxx src/DatabaseSelection.hxx \ src/DatabaseSelection.cxx src/DatabaseSelection.hxx \
src/ExcludeList.cxx src/ExcludeList.hxx \ src/ExcludeList.cxx src/ExcludeList.hxx \
...@@ -1202,6 +1203,7 @@ test_DumpDatabase_LDADD = \ ...@@ -1202,6 +1203,7 @@ test_DumpDatabase_LDADD = \
$(TAG_LIBS) \ $(TAG_LIBS) \
libconf.a \ libconf.a \
libutil.a \ libutil.a \
libevent.a \
libsystem.a \ libsystem.a \
libfs.a \ libfs.a \
$(GLIB_LIBS) $(GLIB_LIBS)
......
...@@ -37,7 +37,8 @@ static bool db_is_open; ...@@ -37,7 +37,8 @@ static bool db_is_open;
static bool is_simple; static bool is_simple;
bool bool
DatabaseGlobalInit(const config_param &param, Error &error) DatabaseGlobalInit(EventLoop &loop, DatabaseListener &listener,
const config_param &param, Error &error)
{ {
assert(db == nullptr); assert(db == nullptr);
assert(!db_is_open); assert(!db_is_open);
...@@ -53,7 +54,7 @@ DatabaseGlobalInit(const config_param &param, Error &error) ...@@ -53,7 +54,7 @@ DatabaseGlobalInit(const config_param &param, Error &error)
return false; return false;
} }
db = plugin->create(param, error); db = plugin->create(loop, listener, param, error);
return db != nullptr; return db != nullptr;
} }
......
...@@ -23,6 +23,8 @@ ...@@ -23,6 +23,8 @@
#include "Compiler.h" #include "Compiler.h"
struct config_param; struct config_param;
class EventLoop;
class DatabaseListener;
class Database; class Database;
class Error; class Error;
...@@ -32,7 +34,8 @@ class Error; ...@@ -32,7 +34,8 @@ class Error;
* @param param the database configuration block * @param param the database configuration block
*/ */
bool bool
DatabaseGlobalInit(const config_param &param, Error &error); DatabaseGlobalInit(EventLoop &loop, DatabaseListener &listener,
const config_param &param, Error &error);
void void
DatabaseGlobalDeinit(void); DatabaseGlobalDeinit(void);
......
/*
* Copyright (C) 2003-2014 The Music Player Daemon Project
* http://www.musicpd.org
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#ifndef MPD_DATABASE_CLIENT_HXX
#define MPD_DATABASE_CLIENT_HXX
/**
* An object that listens to events from the #Database.
*
* @see #Instance
*/
class DatabaseListener {
public:
/**
* The database has been modified. This must be called in the
* thread that has created the #Database instance and that
* runs the #EventLoop.
*/
virtual void OnDatabaseModified() = 0;
};
#endif
...@@ -37,6 +37,8 @@ struct DatabaseSelection; ...@@ -37,6 +37,8 @@ struct DatabaseSelection;
struct db_visitor; struct db_visitor;
struct Song; struct Song;
class Error; class Error;
class EventLoop;
class DatabaseListener;
struct DatabaseStats { struct DatabaseStats {
/** /**
...@@ -149,7 +151,8 @@ struct DatabasePlugin { ...@@ -149,7 +151,8 @@ struct DatabasePlugin {
/** /**
* Allocates and configures a database. * Allocates and configures a database.
*/ */
Database *(*create)(const config_param &param, Database *(*create)(EventLoop &loop, DatabaseListener &listener,
const config_param &param,
Error &error); Error &error);
}; };
......
...@@ -48,3 +48,9 @@ Instance::SyncWithPlayer() ...@@ -48,3 +48,9 @@ Instance::SyncWithPlayer()
{ {
partition->SyncWithPlayer(); partition->SyncWithPlayer();
} }
void
Instance::OnDatabaseModified()
{
DatabaseModified();
}
...@@ -21,11 +21,13 @@ ...@@ -21,11 +21,13 @@
#define MPD_INSTANCE_HXX #define MPD_INSTANCE_HXX
#include "check.h" #include "check.h"
#include "DatabaseListener.hxx"
#include "Compiler.h"
class ClientList; class ClientList;
struct Partition; struct Partition;
struct Instance { struct Instance final : public DatabaseListener {
ClientList *client_list; ClientList *client_list;
Partition *partition; Partition *partition;
...@@ -48,6 +50,9 @@ struct Instance { ...@@ -48,6 +50,9 @@ struct Instance {
* Synchronize the player with the play queue. * Synchronize the player with the play queue.
*/ */
void SyncWithPlayer(); void SyncWithPlayer();
private:
virtual void OnDatabaseModified();
}; };
#endif #endif
...@@ -186,7 +186,7 @@ glue_db_init_and_load(void) ...@@ -186,7 +186,7 @@ glue_db_init_and_load(void)
return true; return true;
Error error; Error error;
if (!DatabaseGlobalInit(*param, error)) if (!DatabaseGlobalInit(*main_loop, *instance, *param, error))
FatalError(error); FatalError(error);
delete allocated; delete allocated;
......
...@@ -49,7 +49,8 @@ class ProxyDatabase : public Database { ...@@ -49,7 +49,8 @@ class ProxyDatabase : public Database {
mutable time_t update_stamp; mutable time_t update_stamp;
public: public:
static Database *Create(const config_param &param, static Database *Create(EventLoop &loop, DatabaseListener &listener,
const config_param &param,
Error &error); Error &error);
virtual bool Open(Error &error) override; virtual bool Open(Error &error) override;
...@@ -218,7 +219,9 @@ SendConstraints(mpd_connection *connection, const DatabaseSelection &selection) ...@@ -218,7 +219,9 @@ SendConstraints(mpd_connection *connection, const DatabaseSelection &selection)
} }
Database * Database *
ProxyDatabase::Create(const config_param &param, Error &error) ProxyDatabase::Create(gcc_unused EventLoop &loop,
gcc_unused DatabaseListener &listener,
const config_param &param, Error &error)
{ {
ProxyDatabase *db = new ProxyDatabase(); ProxyDatabase *db = new ProxyDatabase();
if (!db->Configure(param, error)) { if (!db->Configure(param, error)) {
......
...@@ -38,7 +38,9 @@ ...@@ -38,7 +38,9 @@
static constexpr Domain simple_db_domain("simple_db"); static constexpr Domain simple_db_domain("simple_db");
Database * Database *
SimpleDatabase::Create(const config_param &param, Error &error) SimpleDatabase::Create(gcc_unused EventLoop &loop,
gcc_unused DatabaseListener &listener,
const config_param &param, Error &error)
{ {
SimpleDatabase *db = new SimpleDatabase(); SimpleDatabase *db = new SimpleDatabase();
if (!db->Configure(param, error)) { if (!db->Configure(param, error)) {
......
...@@ -53,7 +53,8 @@ public: ...@@ -53,7 +53,8 @@ public:
bool Save(Error &error); bool Save(Error &error);
static Database *Create(const config_param &param, static Database *Create(EventLoop &loop, DatabaseListener &listener,
const config_param &param,
Error &error); Error &error);
virtual bool Open(Error &error) override; virtual bool Open(Error &error) override;
......
...@@ -69,7 +69,8 @@ public: ...@@ -69,7 +69,8 @@ public:
: m_lib(0), m_superdir(0), m_root(0) : m_lib(0), m_superdir(0), m_root(0)
{} {}
static Database *Create(const config_param &param, static Database *Create(EventLoop &loop, DatabaseListener &listener,
const config_param &param,
Error &error); Error &error);
virtual bool Open(Error &error) override; virtual bool Open(Error &error) override;
...@@ -182,7 +183,9 @@ stringToTokens(const std::string &str, ...@@ -182,7 +183,9 @@ stringToTokens(const std::string &str,
} }
Database * Database *
UpnpDatabase::Create(const config_param &param, Error &error) UpnpDatabase::Create(gcc_unused EventLoop &loop,
gcc_unused DatabaseListener &listener,
const config_param &param, Error &error)
{ {
UpnpDatabase *db = new UpnpDatabase(); UpnpDatabase *db = new UpnpDatabase();
if (db && !db->Configure(param, error)) { if (db && !db->Configure(param, error)) {
......
...@@ -21,6 +21,7 @@ ...@@ -21,6 +21,7 @@
#include "DatabaseRegistry.hxx" #include "DatabaseRegistry.hxx"
#include "DatabasePlugin.hxx" #include "DatabasePlugin.hxx"
#include "DatabaseSelection.hxx" #include "DatabaseSelection.hxx"
#include "DatabaseListener.hxx"
#include "Directory.hxx" #include "Directory.hxx"
#include "Song.hxx" #include "Song.hxx"
#include "PlaylistVector.hxx" #include "PlaylistVector.hxx"
...@@ -28,6 +29,7 @@ ...@@ -28,6 +29,7 @@
#include "ConfigData.hxx" #include "ConfigData.hxx"
#include "tag/TagConfig.hxx" #include "tag/TagConfig.hxx"
#include "fs/Path.hxx" #include "fs/Path.hxx"
#include "event/Loop.hxx"
#include "util/Error.hxx" #include "util/Error.hxx"
#include <glib.h> #include <glib.h>
...@@ -48,6 +50,13 @@ InputStream::LockRead(void *, size_t, Error &) ...@@ -48,6 +50,13 @@ InputStream::LockRead(void *, size_t, Error &)
} }
#endif #endif
class MyDatabaseListener final : public DatabaseListener {
public:
virtual void OnDatabaseModified() override {
cout << "DatabaseModified" << endl;
}
};
static bool static bool
DumpDirectory(const Directory &directory, Error &) DumpDirectory(const Directory &directory, Error &)
{ {
...@@ -108,6 +117,9 @@ main(int argc, char **argv) ...@@ -108,6 +117,9 @@ main(int argc, char **argv)
TagLoadConfig(); TagLoadConfig();
EventLoop event_loop;
MyDatabaseListener database_listener;
/* do it */ /* do it */
const struct config_param *path = config_get_param(CONF_DB_FILE); const struct config_param *path = config_get_param(CONF_DB_FILE);
...@@ -115,7 +127,8 @@ main(int argc, char **argv) ...@@ -115,7 +127,8 @@ main(int argc, char **argv)
if (path != nullptr) if (path != nullptr)
param.AddBlockParam("path", path->value.c_str(), path->line); param.AddBlockParam("path", path->value.c_str(), path->line);
Database *db = plugin->create(param, error); Database *db = plugin->create(event_loop, database_listener,
param, error);
if (db == nullptr) { if (db == nullptr) {
cerr << error.GetMessage() << endl; cerr << error.GetMessage() << endl;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment