From 4118741536accb0d81cd625f2641c99dbd13015e Mon Sep 17 00:00:00 2001
From: Jan Vcelak <jan.vcelak@nic.cz>
Date: Thu, 16 Oct 2014 15:39:54 +0200
Subject: [PATCH] events: write persistent events from events API

---
 src/knot/zone/events/events.c | 19 ++++++++++++++++++-
 src/knot/zone/events/events.h | 12 +++++++++++-
 tests/zone_events.c           |  2 +-
 3 files changed, 30 insertions(+), 3 deletions(-)

diff --git a/src/knot/zone/events/events.c b/src/knot/zone/events/events.c
index 0a1968033e..c335464066 100644
--- a/src/knot/zone/events/events.c
+++ b/src/knot/zone/events/events.c
@@ -18,12 +18,14 @@
 #include <time.h>
 
 #include "common-knot/evsched.h"
+#include "common/namedb/namedb.h"
 #include "knot/server/server.h"
 #include "knot/worker/pool.h"
 #include "knot/zone/zone.h"
 #include "knot/zone/events/events.h"
 #include "knot/zone/events/handlers.h"
 #include "knot/zone/events/replan.h"
+#include "knot/zone/timers.h"
 
 /* ------------------------- internal timers -------------------------------- */
 
@@ -232,7 +234,8 @@ int zone_events_init(zone_t *zone)
 	return KNOT_EOK;
 }
 
-int zone_events_setup(zone_t *zone, worker_pool_t *workers, evsched_t *scheduler)
+int zone_events_setup(struct zone_t *zone, worker_pool_t *workers,
+                      evsched_t *scheduler, knot_namedb_t *timers_db)
 {
 	if (!zone || !workers || !scheduler) {
 		return KNOT_EINVAL;
@@ -246,6 +249,7 @@ int zone_events_setup(zone_t *zone, worker_pool_t *workers, evsched_t *scheduler
 
 	zone->events.event = event;
 	zone->events.pool = workers;
+	zone->events.timers_db = timers_db;
 
 	return KNOT_EOK;
 }
@@ -409,3 +413,16 @@ void zone_events_replan_ddns(struct zone_t *zone, const struct zone_t *old_zone)
 		replan_update(zone, (zone_t *)old_zone);
 	}
 }
+
+int zone_events_write_persistent(zone_t *zone)
+{
+	if (!zone) {
+		return KNOT_EINVAL;
+	}
+
+	if (zone->events.timers_db == NULL) {
+		return KNOT_EOK;
+	}
+
+	return write_zone_timers(zone->events.timers_db, zone);
+}
diff --git a/src/knot/zone/events/events.h b/src/knot/zone/events/events.h
index 5bb27fe9ac..4d930daa45 100644
--- a/src/knot/zone/events/events.h
+++ b/src/knot/zone/events/events.h
@@ -20,6 +20,7 @@
 #include <stdbool.h>
 
 #include "common-knot/evsched.h"
+#include "common/namedb/namedb.h"
 #include "knot/worker/pool.h"
 
 /* Timer special values. */
@@ -51,6 +52,7 @@ typedef struct zone_events {
 
 	event_t *event;			//!< Scheduler event.
 	worker_pool_t *pool;		//!< Server worker pool.
+	knot_namedb_t *timers_db;	//!< Persistent zone timers database.
 
 	task_t task;			//!< Event execution context.
 	time_t time[ZONE_EVENT_COUNT];	//!< Event execution times.
@@ -74,11 +76,12 @@ int zone_events_init(struct zone_t *zone);
  * \param zone       Zone to setup.
  * \param workers    Worker thread pool.
  * \param scheduler  Event scheduler.
+ * \param timers_db  Persistent timers database. Can be NULL.
  *
  * \return KNOT_E*
  */
 int zone_events_setup(struct zone_t *zone, worker_pool_t *workers,
-                      evsched_t *scheduler);
+                      evsched_t *scheduler, knot_namedb_t *timers_db);
 
 /*!
  * \brief Deinitialize zone events.
@@ -185,3 +188,10 @@ void zone_events_update(struct zone_t *zone, struct zone_t *old_zone);
  * \param old_zone  Zone with old config.
  */
 void zone_events_replan_ddns(struct zone_t *zone, const struct zone_t *old_zone);
+
+/*!
+ * \brief Write persistent timers to timers database.
+ *
+ * \return KNOT_E*
+ */
+int zone_events_write_persistent(struct zone_t *zone);
diff --git a/tests/zone_events.c b/tests/zone_events.c
index 804cf08f5c..2542d05db6 100644
--- a/tests/zone_events.c
+++ b/tests/zone_events.c
@@ -86,7 +86,7 @@ int main(void)
 	r = zone_events_init(&zone);
 	ok(r == KNOT_EOK, "zone events init");
 
-	r = zone_events_setup(&zone, pool, &sched);
+	r = zone_events_setup(&zone, pool, &sched, NULL);
 	ok(r == KNOT_EOK, "zone events setup");
 
 	test_scheduling(&zone);
-- 
GitLab