From ae594ad92c1a6dc4aee3e83fa4ab94075b0170c1 Mon Sep 17 00:00:00 2001
From: Max Kellermann <max@duempel.org>
Date: Wed, 19 Feb 2014 22:54:52 +0100
Subject: [PATCH] DatabasePlugin: split header

---
 Makefile.am                             |   2 +
 src/PlaylistPrint.cxx                   |   2 +-
 src/PlaylistUpdate.cxx                  |   2 +-
 src/Stats.cxx                           |   3 +-
 src/command/StickerCommands.cxx         |   2 +-
 src/db/DatabasePlaylist.cxx             |   2 +-
 src/db/DatabasePlugin.hxx               | 115 +-----------------------
 src/db/DatabasePrint.cxx                |   2 +-
 src/db/DatabaseQueue.cxx                |   2 +-
 src/db/DatabaseSong.cxx                 |   2 +-
 src/db/Helpers.cxx                      |   3 +-
 src/db/Interface.hxx                    | 111 +++++++++++++++++++++++
 src/db/Registry.cxx                     |   1 +
 src/db/Stats.hxx                        |  51 +++++++++++
 src/db/plugins/LazyDatabase.cxx         |   1 +
 src/db/plugins/LazyDatabase.hxx         |   3 +-
 src/db/plugins/ProxyDatabasePlugin.cxx  |   2 +
 src/db/plugins/SimpleDatabasePlugin.cxx |   1 +
 src/db/plugins/SimpleDatabasePlugin.hxx |   6 +-
 src/db/plugins/UpnpDatabasePlugin.cxx   |   2 +
 src/sticker/SongSticker.cxx             |   2 +-
 test/DumpDatabase.cxx                   |   1 +
 22 files changed, 192 insertions(+), 126 deletions(-)
 create mode 100644 src/db/Interface.hxx
 create mode 100644 src/db/Stats.hxx

diff --git a/Makefile.am b/Makefile.am
index 8e70ff290..5d7171707 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -202,6 +202,8 @@ src_mpd_SOURCES += \
 	src/db/DatabaseError.cxx src/db/DatabaseError.hxx \
 	src/db/DatabaseLock.cxx src/db/DatabaseLock.hxx \
 	src/db/DatabasePlugin.hxx \
+	src/db/Interface.hxx \
+	src/db/Stats.hxx \
 	src/db/DatabaseListener.hxx \
 	src/db/Visitor.hxx \
 	src/db/Selection.cxx src/db/Selection.hxx
diff --git a/src/PlaylistPrint.cxx b/src/PlaylistPrint.cxx
index 2e29ac6a2..9e0dcade0 100644
--- a/src/PlaylistPrint.cxx
+++ b/src/PlaylistPrint.cxx
@@ -25,7 +25,7 @@
 #include "SongPrint.hxx"
 #include "Partition.hxx"
 #include "Instance.hxx"
-#include "db/DatabasePlugin.hxx"
+#include "db/Interface.hxx"
 #include "client/Client.hxx"
 #include "input/InputStream.hxx"
 #include "DetachedSong.hxx"
diff --git a/src/PlaylistUpdate.cxx b/src/PlaylistUpdate.cxx
index 89132ca7b..8876711ef 100644
--- a/src/PlaylistUpdate.cxx
+++ b/src/PlaylistUpdate.cxx
@@ -19,7 +19,7 @@
 
 #include "config.h"
 #include "Playlist.hxx"
-#include "db/DatabasePlugin.hxx"
+#include "db/Interface.hxx"
 #include "db/LightSong.hxx"
 #include "DetachedSong.hxx"
 #include "tag/Tag.hxx"
diff --git a/src/Stats.cxx b/src/Stats.cxx
index c5fcc69e2..8fc626ecb 100644
--- a/src/Stats.cxx
+++ b/src/Stats.cxx
@@ -24,7 +24,8 @@
 #include "Partition.hxx"
 #include "Instance.hxx"
 #include "db/Selection.hxx"
-#include "db/DatabasePlugin.hxx"
+#include "db/Interface.hxx"
+#include "db/Stats.hxx"
 #include "util/Error.hxx"
 #include "system/Clock.hxx"
 #include "Log.hxx"
diff --git a/src/command/StickerCommands.cxx b/src/command/StickerCommands.cxx
index 1825f9157..caae870e9 100644
--- a/src/command/StickerCommands.cxx
+++ b/src/command/StickerCommands.cxx
@@ -20,7 +20,7 @@
 #include "config.h"
 #include "StickerCommands.hxx"
 #include "SongPrint.hxx"
-#include "db/DatabasePlugin.hxx"
+#include "db/Interface.hxx"
 #include "db/DatabaseGlue.hxx"
 #include "sticker/SongSticker.hxx"
 #include "sticker/StickerPrint.hxx"
diff --git a/src/db/DatabasePlaylist.cxx b/src/db/DatabasePlaylist.cxx
index 90a7f7b1a..f1cfdc874 100644
--- a/src/db/DatabasePlaylist.cxx
+++ b/src/db/DatabasePlaylist.cxx
@@ -22,7 +22,7 @@
 #include "DatabaseSong.hxx"
 #include "Selection.hxx"
 #include "PlaylistFile.hxx"
-#include "DatabasePlugin.hxx"
+#include "Interface.hxx"
 #include "DetachedSong.hxx"
 #include "storage/StorageInterface.hxx"
 
diff --git a/src/db/DatabasePlugin.hxx b/src/db/DatabasePlugin.hxx
index b0cb41502..ba6cd1f08 100644
--- a/src/db/DatabasePlugin.hxx
+++ b/src/db/DatabasePlugin.hxx
@@ -26,124 +26,11 @@
 #ifndef MPD_DATABASE_PLUGIN_HXX
 #define MPD_DATABASE_PLUGIN_HXX
 
-#include "Visitor.hxx"
-#include "tag/TagType.h"
-#include "Compiler.h"
-
-#include <time.h>
-
 struct config_param;
-struct DatabaseSelection;
-struct db_visitor;
-struct LightSong;
 class Error;
 class EventLoop;
 class DatabaseListener;
-
-struct DatabaseStats {
-	/**
-	 * Number of songs.
-	 */
-	unsigned song_count;
-
-	/**
-	 * Total duration of all songs (in seconds).
-	 */
-	unsigned long total_duration;
-
-	/**
-	 * Number of distinct artist names.
-	 */
-	unsigned artist_count;
-
-	/**
-	 * Number of distinct album names.
-	 */
-	unsigned album_count;
-
-	void Clear() {
-		song_count = 0;
-		total_duration = 0;
-		artist_count = album_count = 0;
-	}
-};
-
-class Database {
-public:
-	/**
-	 * Free instance data.
-         */
-	virtual ~Database() {}
-
-	/**
-         * Open the database.  Read it into memory if applicable.
-	 */
-	virtual bool Open(gcc_unused Error &error) {
-		return true;
-	}
-
-	/**
-         * Close the database, free allocated memory.
-	 */
-	virtual void Close() {}
-
-	/**
-         * Look up a song (including tag data) in the database.  When
-         * you don't need this anymore, call ReturnSong().
-	 *
-	 * @param uri_utf8 the URI of the song within the music
-	 * directory (UTF-8)
-	 */
-	virtual const LightSong *GetSong(const char *uri_utf8,
-					 Error &error) const = 0;
-
-	/**
-	 * Mark the song object as "unused".  Call this on objects
-	 * returned by GetSong().
-	 */
-	virtual void ReturnSong(const LightSong *song) const = 0;
-
-	/**
-	 * Visit the selected entities.
-	 */
-	virtual bool Visit(const DatabaseSelection &selection,
-			   VisitDirectory visit_directory,
-			   VisitSong visit_song,
-			   VisitPlaylist visit_playlist,
-			   Error &error) const = 0;
-
-	bool Visit(const DatabaseSelection &selection,
-		   VisitDirectory visit_directory,
-		   VisitSong visit_song,
-		   Error &error) const {
-		return Visit(selection, visit_directory, visit_song,
-			     VisitPlaylist(), error);
-	}
-
-	bool Visit(const DatabaseSelection &selection, VisitSong visit_song,
-		   Error &error) const {
-		return Visit(selection, VisitDirectory(), visit_song, error);
-	}
-
-	/**
-	 * Visit all unique tag values.
-	 */
-	virtual bool VisitUniqueTags(const DatabaseSelection &selection,
-				     TagType tag_type,
-				     VisitString visit_string,
-				     Error &error) const = 0;
-
-	virtual bool GetStats(const DatabaseSelection &selection,
-			      DatabaseStats &stats,
-			      Error &error) const = 0;
-
-	/**
-	 * Returns the time stamp of the last database update.
-	 * Returns 0 if that is not not known/available.
-	 */
-	gcc_pure
-	virtual time_t GetUpdateStamp() const = 0;
-};
+class Database;
 
 struct DatabasePlugin {
 	const char *name;
diff --git a/src/db/DatabasePrint.cxx b/src/db/DatabasePrint.cxx
index 669a804be..ccdfbe026 100644
--- a/src/db/DatabasePrint.cxx
+++ b/src/db/DatabasePrint.cxx
@@ -28,7 +28,7 @@
 #include "LightSong.hxx"
 #include "LightDirectory.hxx"
 #include "PlaylistInfo.hxx"
-#include "DatabasePlugin.hxx"
+#include "Interface.hxx"
 
 #include <functional>
 
diff --git a/src/db/DatabaseQueue.cxx b/src/db/DatabaseQueue.cxx
index 77fd57fe3..be012647a 100644
--- a/src/db/DatabaseQueue.cxx
+++ b/src/db/DatabaseQueue.cxx
@@ -20,7 +20,7 @@
 #include "config.h"
 #include "DatabaseQueue.hxx"
 #include "DatabaseSong.hxx"
-#include "DatabasePlugin.hxx"
+#include "Interface.hxx"
 #include "Partition.hxx"
 #include "Instance.hxx"
 #include "util/Error.hxx"
diff --git a/src/db/DatabaseSong.cxx b/src/db/DatabaseSong.cxx
index d9adad7a0..699213835 100644
--- a/src/db/DatabaseSong.cxx
+++ b/src/db/DatabaseSong.cxx
@@ -20,7 +20,7 @@
 #include "config.h"
 #include "DatabaseSong.hxx"
 #include "LightSong.hxx"
-#include "DatabasePlugin.hxx"
+#include "Interface.hxx"
 #include "DetachedSong.hxx"
 #include "storage/StorageInterface.hxx"
 
diff --git a/src/db/Helpers.cxx b/src/db/Helpers.cxx
index 579b83e15..5eb50b4e5 100644
--- a/src/db/Helpers.cxx
+++ b/src/db/Helpers.cxx
@@ -18,7 +18,8 @@
  */
 
 #include "Helpers.hxx"
-#include "DatabasePlugin.hxx"
+#include "Stats.hxx"
+#include "Interface.hxx"
 #include "LightSong.hxx"
 #include "tag/Tag.hxx"
 
diff --git a/src/db/Interface.hxx b/src/db/Interface.hxx
new file mode 100644
index 000000000..4ce927336
--- /dev/null
+++ b/src/db/Interface.hxx
@@ -0,0 +1,111 @@
+/*
+ * 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_INTERFACE_HXX
+#define MPD_DATABASE_INTERFACE_HXX
+
+#include "Visitor.hxx"
+#include "tag/TagType.h"
+#include "Compiler.h"
+
+#include <time.h>
+
+struct DatabaseStats;
+struct DatabaseSelection;
+struct LightSong;
+class Error;
+
+class Database {
+public:
+	/**
+	 * Free instance data.
+         */
+	virtual ~Database() {}
+
+	/**
+         * Open the database.  Read it into memory if applicable.
+	 */
+	virtual bool Open(gcc_unused Error &error) {
+		return true;
+	}
+
+	/**
+         * Close the database, free allocated memory.
+	 */
+	virtual void Close() {}
+
+	/**
+         * Look up a song (including tag data) in the database.  When
+         * you don't need this anymore, call ReturnSong().
+	 *
+	 * @param uri_utf8 the URI of the song within the music
+	 * directory (UTF-8)
+	 */
+	virtual const LightSong *GetSong(const char *uri_utf8,
+					 Error &error) const = 0;
+
+	/**
+	 * Mark the song object as "unused".  Call this on objects
+	 * returned by GetSong().
+	 */
+	virtual void ReturnSong(const LightSong *song) const = 0;
+
+	/**
+	 * Visit the selected entities.
+	 */
+	virtual bool Visit(const DatabaseSelection &selection,
+			   VisitDirectory visit_directory,
+			   VisitSong visit_song,
+			   VisitPlaylist visit_playlist,
+			   Error &error) const = 0;
+
+	bool Visit(const DatabaseSelection &selection,
+		   VisitDirectory visit_directory,
+		   VisitSong visit_song,
+		   Error &error) const {
+		return Visit(selection, visit_directory, visit_song,
+			     VisitPlaylist(), error);
+	}
+
+	bool Visit(const DatabaseSelection &selection, VisitSong visit_song,
+		   Error &error) const {
+		return Visit(selection, VisitDirectory(), visit_song, error);
+	}
+
+	/**
+	 * Visit all unique tag values.
+	 */
+	virtual bool VisitUniqueTags(const DatabaseSelection &selection,
+				     TagType tag_type,
+				     VisitString visit_string,
+				     Error &error) const = 0;
+
+	virtual bool GetStats(const DatabaseSelection &selection,
+			      DatabaseStats &stats,
+			      Error &error) const = 0;
+
+	/**
+	 * Returns the time stamp of the last database update.
+	 * Returns 0 if that is not not known/available.
+	 */
+	gcc_pure
+	virtual time_t GetUpdateStamp() const = 0;
+};
+
+#endif
diff --git a/src/db/Registry.cxx b/src/db/Registry.cxx
index 295d3cf2a..40b6d041a 100644
--- a/src/db/Registry.cxx
+++ b/src/db/Registry.cxx
@@ -19,6 +19,7 @@
 
 #include "config.h"
 #include "Registry.hxx"
+#include "DatabasePlugin.hxx"
 #include "plugins/SimpleDatabasePlugin.hxx"
 #include "plugins/ProxyDatabasePlugin.hxx"
 #include "plugins/UpnpDatabasePlugin.hxx"
diff --git a/src/db/Stats.hxx b/src/db/Stats.hxx
new file mode 100644
index 000000000..107af9d5f
--- /dev/null
+++ b/src/db/Stats.hxx
@@ -0,0 +1,51 @@
+/*
+ * 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_STATS_HXX
+#define MPD_DATABASE_STATS_HXX
+
+struct DatabaseStats {
+	/**
+	 * Number of songs.
+	 */
+	unsigned song_count;
+
+	/**
+	 * Total duration of all songs (in seconds).
+	 */
+	unsigned long total_duration;
+
+	/**
+	 * Number of distinct artist names.
+	 */
+	unsigned artist_count;
+
+	/**
+	 * Number of distinct album names.
+	 */
+	unsigned album_count;
+
+	void Clear() {
+		song_count = 0;
+		total_duration = 0;
+		artist_count = album_count = 0;
+	}
+};
+
+#endif
diff --git a/src/db/plugins/LazyDatabase.cxx b/src/db/plugins/LazyDatabase.cxx
index 6a01ffb82..ffa861e36 100644
--- a/src/db/plugins/LazyDatabase.cxx
+++ b/src/db/plugins/LazyDatabase.cxx
@@ -19,6 +19,7 @@
 
 #include "config.h"
 #include "LazyDatabase.hxx"
+#include "db/Interface.hxx"
 
 #include <assert.h>
 
diff --git a/src/db/plugins/LazyDatabase.hxx b/src/db/plugins/LazyDatabase.hxx
index 336b8558f..f3fbef5f3 100644
--- a/src/db/plugins/LazyDatabase.hxx
+++ b/src/db/plugins/LazyDatabase.hxx
@@ -20,7 +20,8 @@
 #ifndef MPD_LAZY_DATABASE_PLUGIN_HXX
 #define MPD_LAZY_DATABASE_PLUGIN_HXX
 
-#include "db/DatabasePlugin.hxx"
+#include "db/Interface.hxx"
+#include "Compiler.h"
 
 /**
  * A wrapper for a #Database object that gets opened on the first
diff --git a/src/db/plugins/ProxyDatabasePlugin.cxx b/src/db/plugins/ProxyDatabasePlugin.cxx
index cfd90fc5c..c09468869 100644
--- a/src/db/plugins/ProxyDatabasePlugin.cxx
+++ b/src/db/plugins/ProxyDatabasePlugin.cxx
@@ -19,6 +19,7 @@
 
 #include "config.h"
 #include "ProxyDatabasePlugin.hxx"
+#include "db/Interface.hxx"
 #include "db/DatabasePlugin.hxx"
 #include "db/DatabaseListener.hxx"
 #include "db/Selection.hxx"
@@ -26,6 +27,7 @@
 #include "db/PlaylistInfo.hxx"
 #include "db/LightDirectory.hxx"
 #include "db/LightSong.hxx"
+#include "db/Stats.hxx"
 #include "SongFilter.hxx"
 #include "Compiler.h"
 #include "config/ConfigData.hxx"
diff --git a/src/db/plugins/SimpleDatabasePlugin.cxx b/src/db/plugins/SimpleDatabasePlugin.cxx
index 55e08b6d7..cd13b70cb 100644
--- a/src/db/plugins/SimpleDatabasePlugin.cxx
+++ b/src/db/plugins/SimpleDatabasePlugin.cxx
@@ -19,6 +19,7 @@
 
 #include "config.h"
 #include "SimpleDatabasePlugin.hxx"
+#include "db/DatabasePlugin.hxx"
 #include "db/Selection.hxx"
 #include "db/Helpers.hxx"
 #include "db/LightDirectory.hxx"
diff --git a/src/db/plugins/SimpleDatabasePlugin.hxx b/src/db/plugins/SimpleDatabasePlugin.hxx
index 83434393c..49e3d987d 100644
--- a/src/db/plugins/SimpleDatabasePlugin.hxx
+++ b/src/db/plugins/SimpleDatabasePlugin.hxx
@@ -20,14 +20,18 @@
 #ifndef MPD_SIMPLE_DATABASE_PLUGIN_HXX
 #define MPD_SIMPLE_DATABASE_PLUGIN_HXX
 
-#include "db/DatabasePlugin.hxx"
+#include "db/Interface.hxx"
 #include "fs/AllocatedPath.hxx"
 #include "db/LightSong.hxx"
 #include "Compiler.h"
 
 #include <cassert>
 
+struct config_param;
 struct Directory;
+struct DatabasePlugin;
+class EventLoop;
+class DatabaseListener;
 
 class SimpleDatabase : public Database {
 	AllocatedPath path;
diff --git a/src/db/plugins/UpnpDatabasePlugin.cxx b/src/db/plugins/UpnpDatabasePlugin.cxx
index c921d5460..f7d3a1932 100644
--- a/src/db/plugins/UpnpDatabasePlugin.cxx
+++ b/src/db/plugins/UpnpDatabasePlugin.cxx
@@ -26,11 +26,13 @@
 #include "lib/upnp/Util.hxx"
 #include "upnp/Directory.hxx"
 #include "upnp/Tags.hxx"
+#include "db/Interface.hxx"
 #include "db/DatabasePlugin.hxx"
 #include "db/Selection.hxx"
 #include "db/DatabaseError.hxx"
 #include "db/LightDirectory.hxx"
 #include "db/LightSong.hxx"
+#include "db/Stats.hxx"
 #include "config/ConfigData.hxx"
 #include "tag/TagBuilder.hxx"
 #include "tag/TagTable.hxx"
diff --git a/src/sticker/SongSticker.cxx b/src/sticker/SongSticker.cxx
index 7246ec69f..b6f46f167 100644
--- a/src/sticker/SongSticker.cxx
+++ b/src/sticker/SongSticker.cxx
@@ -21,7 +21,7 @@
 #include "SongSticker.hxx"
 #include "StickerDatabase.hxx"
 #include "db/LightSong.hxx"
-#include "db/DatabasePlugin.hxx"
+#include "db/Interface.hxx"
 #include "util/Error.hxx"
 
 #include <glib.h>
diff --git a/test/DumpDatabase.cxx b/test/DumpDatabase.cxx
index d282e9360..d5b6f2223 100644
--- a/test/DumpDatabase.cxx
+++ b/test/DumpDatabase.cxx
@@ -20,6 +20,7 @@
 #include "config.h"
 #include "db/Registry.hxx"
 #include "db/DatabasePlugin.hxx"
+#include "db/Interface.hxx"
 #include "db/Selection.hxx"
 #include "db/DatabaseListener.hxx"
 #include "db/LightDirectory.hxx"