From c064e8d62f0d2b46159570f21708c2546970718d Mon Sep 17 00:00:00 2001
From: Max Kellermann <max@duempel.org>
Date: Fri, 22 Nov 2013 00:35:29 +0100
Subject: [PATCH] DatabasePlugin: add method GetUpdateStamp()

Refactor SimpleDatabase::GetLastModified() to be generic for all
plugins.  Remove the SimpleDatabase assumption from db_stats_print(),
allowing it to be implemented by all database plugins.
---
 src/DatabaseGlue.cxx            |  6 +++---
 src/DatabasePlugin.hxx          |  9 +++++++++
 src/DatabaseSimple.hxx          | 16 ++--------------
 src/Stats.cxx                   |  5 +++--
 src/db/ProxyDatabasePlugin.cxx  |  5 +++++
 src/db/SimpleDatabasePlugin.hxx | 11 ++++-------
 6 files changed, 26 insertions(+), 26 deletions(-)

diff --git a/src/DatabaseGlue.cxx b/src/DatabaseGlue.cxx
index e84503713..013a3e329 100644
--- a/src/DatabaseGlue.cxx
+++ b/src/DatabaseGlue.cxx
@@ -148,12 +148,12 @@ DatabaseGlobalOpen(Error &error)
 	return true;
 }
 
-time_t
-db_get_mtime(void)
+bool
+db_exists()
 {
 	assert(db != nullptr);
 	assert(db_is_open);
 	assert(db_is_simple());
 
-	return ((SimpleDatabase *)db)->GetLastModified();
+	return ((SimpleDatabase *)db)->GetUpdateStamp() > 0;
 }
diff --git a/src/DatabasePlugin.hxx b/src/DatabasePlugin.hxx
index 629dff329..ccf899389 100644
--- a/src/DatabasePlugin.hxx
+++ b/src/DatabasePlugin.hxx
@@ -30,6 +30,8 @@
 #include "tag/TagType.h"
 #include "Compiler.h"
 
+#include <time.h>
+
 struct config_param;
 struct DatabaseSelection;
 struct db_visitor;
@@ -132,6 +134,13 @@ public:
 	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;
 };
 
 struct DatabasePlugin {
diff --git a/src/DatabaseSimple.hxx b/src/DatabaseSimple.hxx
index 124d78a30..6d52ac0b3 100644
--- a/src/DatabaseSimple.hxx
+++ b/src/DatabaseSimple.hxx
@@ -62,25 +62,13 @@ db_get_directory(const char *name);
 bool
 db_save(Error &error);
 
-/**
- * May only be used if db_is_simple() returns true.
- */
-gcc_pure
-time_t
-db_get_mtime(void);
-
 /**
  * Returns true if there is a valid database file on the disk.
  *
  * May only be used if db_is_simple() returns true.
  */
 gcc_pure
-static inline bool
-db_exists(void)
-{
-	/* mtime is set only if the database file was loaded or saved
-	   successfully */
-	return db_get_mtime() > 0;
-}
+bool
+db_exists();
 
 #endif
diff --git a/src/Stats.cxx b/src/Stats.cxx
index d2d18d6a9..f224bdf49 100644
--- a/src/Stats.cxx
+++ b/src/Stats.cxx
@@ -83,10 +83,11 @@ db_stats_print(Client &client)
 		      stats.song_count,
 		      stats.total_duration);
 
-	if (db_is_simple())
+	const time_t update_stamp = GetDatabase()->GetUpdateStamp();
+	if (update_stamp > 0)
 		client_printf(client,
 			      "db_update: %lu\n",
-			      (unsigned long)db_get_mtime());
+			      (unsigned long)update_stamp);
 }
 
 void
diff --git a/src/db/ProxyDatabasePlugin.cxx b/src/db/ProxyDatabasePlugin.cxx
index fc99242ee..d4861623f 100644
--- a/src/db/ProxyDatabasePlugin.cxx
+++ b/src/db/ProxyDatabasePlugin.cxx
@@ -71,6 +71,11 @@ public:
 			      DatabaseStats &stats,
 			      Error &error) const override;
 
+	virtual time_t GetUpdateStamp() const override {
+		// TODO: implement
+		return 0;
+	}
+
 private:
 	bool Configure(const config_param &param, Error &error);
 
diff --git a/src/db/SimpleDatabasePlugin.hxx b/src/db/SimpleDatabasePlugin.hxx
index 24e150a97..dfe981dd8 100644
--- a/src/db/SimpleDatabasePlugin.hxx
+++ b/src/db/SimpleDatabasePlugin.hxx
@@ -26,8 +26,6 @@
 
 #include <cassert>
 
-#include <time.h>
-
 struct Directory;
 
 class SimpleDatabase : public Database {
@@ -55,11 +53,6 @@ public:
 
 	bool Save(Error &error);
 
-	gcc_pure
-	time_t GetLastModified() const {
-		return mtime;
-	}
-
 	static Database *Create(const config_param &param,
 				Error &error);
 
@@ -85,6 +78,10 @@ public:
 			      DatabaseStats &stats,
 			      Error &error) const override;
 
+	virtual time_t GetUpdateStamp() const override {
+		return mtime;
+	}
+
 protected:
 	bool Configure(const config_param &param, Error &error);