DatabasePlugin: add interface DatabaseListener
Allow database plugins to announce that they have been modified.
This commit is contained in:
parent
00adf7ff17
commit
114df1f137
@ -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 = \
|
|||||||
$(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;
|
|||||||
static bool is_simple;
|
static bool is_simple;
|
||||||
|
|
||||||
bool
|
bool
|
||||||
DatabaseGlobalInit(const config_param ¶m, Error &error)
|
DatabaseGlobalInit(EventLoop &loop, DatabaseListener &listener,
|
||||||
|
const config_param ¶m, Error &error)
|
||||||
{
|
{
|
||||||
assert(db == nullptr);
|
assert(db == nullptr);
|
||||||
assert(!db_is_open);
|
assert(!db_is_open);
|
||||||
@ -53,7 +54,7 @@ DatabaseGlobalInit(const config_param ¶m, 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 @@
|
|||||||
#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;
|
|||||||
* @param param the database configuration block
|
* @param param the database configuration block
|
||||||
*/
|
*/
|
||||||
bool
|
bool
|
||||||
DatabaseGlobalInit(const config_param ¶m, Error &error);
|
DatabaseGlobalInit(EventLoop &loop, DatabaseListener &listener,
|
||||||
|
const config_param ¶m, Error &error);
|
||||||
|
|
||||||
void
|
void
|
||||||
DatabaseGlobalDeinit(void);
|
DatabaseGlobalDeinit(void);
|
||||||
|
38
src/DatabaseListener.hxx
Normal file
38
src/DatabaseListener.hxx
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
/*
|
||||||
|
* 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;
|
|||||||
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 {
|
|||||||
/**
|
/**
|
||||||
* Allocates and configures a database.
|
* Allocates and configures a database.
|
||||||
*/
|
*/
|
||||||
Database *(*create)(const config_param ¶m,
|
Database *(*create)(EventLoop &loop, DatabaseListener &listener,
|
||||||
|
const config_param ¶m,
|
||||||
Error &error);
|
Error &error);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -48,3 +48,9 @@ Instance::SyncWithPlayer()
|
|||||||
{
|
{
|
||||||
partition->SyncWithPlayer();
|
partition->SyncWithPlayer();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Instance::OnDatabaseModified()
|
||||||
|
{
|
||||||
|
DatabaseModified();
|
||||||
|
}
|
||||||
|
@ -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 {
|
|||||||
* 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)
|
|||||||
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 {
|
|||||||
mutable time_t update_stamp;
|
mutable time_t update_stamp;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
static Database *Create(const config_param ¶m,
|
static Database *Create(EventLoop &loop, DatabaseListener &listener,
|
||||||
|
const config_param ¶m,
|
||||||
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)
|
|||||||
}
|
}
|
||||||
|
|
||||||
Database *
|
Database *
|
||||||
ProxyDatabase::Create(const config_param ¶m, Error &error)
|
ProxyDatabase::Create(gcc_unused EventLoop &loop,
|
||||||
|
gcc_unused DatabaseListener &listener,
|
||||||
|
const config_param ¶m, Error &error)
|
||||||
{
|
{
|
||||||
ProxyDatabase *db = new ProxyDatabase();
|
ProxyDatabase *db = new ProxyDatabase();
|
||||||
if (!db->Configure(param, error)) {
|
if (!db->Configure(param, error)) {
|
||||||
|
@ -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 ¶m, Error &error)
|
SimpleDatabase::Create(gcc_unused EventLoop &loop,
|
||||||
|
gcc_unused DatabaseListener &listener,
|
||||||
|
const config_param ¶m, 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:
|
|||||||
|
|
||||||
bool Save(Error &error);
|
bool Save(Error &error);
|
||||||
|
|
||||||
static Database *Create(const config_param ¶m,
|
static Database *Create(EventLoop &loop, DatabaseListener &listener,
|
||||||
|
const config_param ¶m,
|
||||||
Error &error);
|
Error &error);
|
||||||
|
|
||||||
virtual bool Open(Error &error) override;
|
virtual bool Open(Error &error) override;
|
||||||
|
@ -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 ¶m,
|
static Database *Create(EventLoop &loop, DatabaseListener &listener,
|
||||||
|
const config_param ¶m,
|
||||||
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,
|
|||||||
}
|
}
|
||||||
|
|
||||||
Database *
|
Database *
|
||||||
UpnpDatabase::Create(const config_param ¶m, Error &error)
|
UpnpDatabase::Create(gcc_unused EventLoop &loop,
|
||||||
|
gcc_unused DatabaseListener &listener,
|
||||||
|
const config_param ¶m, 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 @@
|
|||||||
#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 @@
|
|||||||
#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 &)
|
|||||||
}
|
}
|
||||||
#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)
|
|||||||
|
|
||||||
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)
|
|||||||
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;
|
||||||
|
Loading…
Reference in New Issue
Block a user