From e265dcb466a11353dc5ebe0818670da316a49721 Mon Sep 17 00:00:00 2001
From: vogelor <vogelor@ispconfig3>
Date: Sun, 14 Dec 2008 09:43:58 -0500
Subject: [PATCH] Fixed a bug in the jobqueue - viewer Fixed a bug in deleting old record from the syslog and the sys_datalog

---
 server/cron_daily.php |   45 ++++++++++++++++++++++++++++++++++++---------
 1 files changed, 36 insertions(+), 9 deletions(-)

diff --git a/server/cron_daily.php b/server/cron_daily.php
index 1d615da..3c85c84 100644
--- a/server/cron_daily.php
+++ b/server/cron_daily.php
@@ -126,18 +126,45 @@
 }
 
 #######################################################################################################
-// Cleanup logs in database
+// Cleanup logs in master database (only the "master-server")
 #######################################################################################################
-//* Keep 7 days in sys_log
-$tstamp = time() - (60*60*24*7);
-$sql = "DELETE FROM sys_log WHERE tstamp < $tstamp AND server_id != 0";
-$app->db->query($sql);
 
-//* Keep 7 days in sys_datalog
-$tstamp = time() - (60*60*24*7);
-$sql = "DELETE FROM sys_datalog WHERE tstamp < $tstamp AND server_id != 0";
-$app->db->query($sql);
+if ($app->dbmaster == $app->db) {
+	/** 7 days */
+	$tstamp = time() - (60*60*24*7);
 
+	/*
+	 *  Keep 7 days in sys_log
+	 * (we can delete the old items, because if they are OK, they don't interrest anymore
+	 * if they are NOT ok, the server will try to process them in 1 minute and so the
+	 * error appears again after 1 minute. So it is no problem to delete the old one!
+	 */
+	$sql = "DELETE FROM sys_log WHERE tstamp < $tstamp AND server_id != 0";
+	$app->dbmaster->query($sql);
+
+	/*
+	 * The sys_datalog is more difficult.
+	 * 1) We have to keet ALL entries with
+	 *    server_id=0, because they depend on ALL servers (even if they are not
+	 *    actually in the system (and will be insered in 3 days or so).
+	 * 2) We have to keey ALL entries which are not actually precessed by the
+	 *    server never mind how old they are!
+	 */
+
+	/* First we need all servers and the last sys_datalog-id they processed */
+	$sql = "SELECT server_id, updated FROM server ORDER BY server_id";
+	$records = $app->dbmaster->queryAllRecords($sql);
+
+	/* Then delete server by server */
+	foreach($records as $server) {
+		$sql = "DELETE FROM sys_datalog WHERE tstamp < " . $tstamp .
+			" AND server_id != 0 " . // to be more secure!
+			" AND server_id = " . intval($server['server_id']) .
+			" AND datalog_id < " . intval($server['updated']);
+//		echo $sql . "\n";
+		$app->dbmaster->query($sql);
+	}
+}
 
 die("finished.\n");
 ?>
\ No newline at end of file

--
Gitblit v1.9.1