DatabasePlugin: add method ReturnSong()
Allow the plugin to allocate the GetSong() return value.
This commit is contained in:
@@ -56,6 +56,8 @@ public:
|
||||
virtual void Close() override;
|
||||
virtual struct song *GetSong(const char *uri_utf8,
|
||||
GError **error_r) const override;
|
||||
virtual void ReturnSong(struct song *song) const;
|
||||
|
||||
virtual bool Visit(const DatabaseSelection &selection,
|
||||
VisitDirectory visit_directory,
|
||||
VisitSong visit_song,
|
||||
@@ -191,6 +193,16 @@ ProxyDatabase::GetSong(const char *uri, GError **error_r) const
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
void
|
||||
ProxyDatabase::ReturnSong(struct song *song) const
|
||||
{
|
||||
assert(song != nullptr);
|
||||
assert(song_in_database(song));
|
||||
assert(song_is_detached(song));
|
||||
|
||||
song_free(song);
|
||||
}
|
||||
|
||||
static bool
|
||||
Visit(struct mpd_connection *connection, const char *uri,
|
||||
bool recursive, VisitDirectory visit_directory, VisitSong visit_song,
|
||||
|
@@ -184,6 +184,10 @@ SimpleDatabase::Open(GError **error_r)
|
||||
root = directory_new_root();
|
||||
mtime = 0;
|
||||
|
||||
#ifndef NDEBUG
|
||||
borrowed_song_count = 0;
|
||||
#endif
|
||||
|
||||
GError *error = NULL;
|
||||
if (!Load(&error)) {
|
||||
directory_free(root);
|
||||
@@ -204,6 +208,7 @@ void
|
||||
SimpleDatabase::Close()
|
||||
{
|
||||
assert(root != NULL);
|
||||
assert(borrowed_song_count == 0);
|
||||
|
||||
directory_free(root);
|
||||
}
|
||||
@@ -219,10 +224,25 @@ SimpleDatabase::GetSong(const char *uri, GError **error_r) const
|
||||
if (song == NULL)
|
||||
g_set_error(error_r, db_quark(), DB_NOT_FOUND,
|
||||
"No such song: %s", uri);
|
||||
#ifndef NDEBUG
|
||||
else
|
||||
++const_cast<unsigned &>(borrowed_song_count);
|
||||
#endif
|
||||
|
||||
return song;
|
||||
}
|
||||
|
||||
void
|
||||
SimpleDatabase::ReturnSong(gcc_unused struct song *song) const
|
||||
{
|
||||
assert(song != nullptr);
|
||||
|
||||
#ifndef NDEBUG
|
||||
assert(borrowed_song_count > 0);
|
||||
--const_cast<unsigned &>(borrowed_song_count);
|
||||
#endif
|
||||
}
|
||||
|
||||
G_GNUC_PURE
|
||||
const struct directory *
|
||||
SimpleDatabase::LookupDirectory(const char *uri) const
|
||||
|
@@ -38,6 +38,10 @@ class SimpleDatabase : public Database {
|
||||
|
||||
time_t mtime;
|
||||
|
||||
#ifndef NDEBUG
|
||||
unsigned borrowed_song_count;
|
||||
#endif
|
||||
|
||||
public:
|
||||
gcc_pure
|
||||
struct directory *GetRoot() {
|
||||
@@ -61,6 +65,8 @@ public:
|
||||
|
||||
virtual struct song *GetSong(const char *uri_utf8,
|
||||
GError **error_r) const override;
|
||||
virtual void ReturnSong(struct song *song) const;
|
||||
|
||||
virtual bool Visit(const DatabaseSelection &selection,
|
||||
VisitDirectory visit_directory,
|
||||
VisitSong visit_song,
|
||||
|
Reference in New Issue
Block a user