From 26525f174033d9ae23a99534022b8cbe00359172 Mon Sep 17 00:00:00 2001
From: Jan Vcelak <jan.vcelak@nic.cz>
Date: Mon, 22 Jul 2013 15:58:55 +0200
Subject: [PATCH] zone diff: implement knot_zone_tree_create_diff()

- slightly modifies interface for zone contents diffing
  (shorter name, add changesets flags parameter)
- new function works the same with other arguments
---
 src/knot/server/zones.c      |  7 ++++---
 src/libknot/zone/zone-diff.c | 29 ++++++++++++++++++++++++-----
 src/libknot/zone/zone-diff.h | 21 +++++++++++++++++----
 3 files changed, 45 insertions(+), 12 deletions(-)

diff --git a/src/knot/server/zones.c b/src/knot/server/zones.c
index e9ce0325f9..3e440f7e27 100644
--- a/src/knot/server/zones.c
+++ b/src/knot/server/zones.c
@@ -3024,9 +3024,10 @@ int zones_create_and_save_changesets(const knot_zone_t *old_zone,
 	memset(&xfr, 0, sizeof(xfr));
 	xfr.zone = (knot_zone_t *)old_zone;
 	knot_changesets_t *changesets;
-	int ret = knot_zone_diff_create_changesets(old_zone->contents,
-	                                           new_zone->contents,
-	                                           &changesets);
+	int ret = knot_zone_contents_create_diff(old_zone->contents,
+	                                         new_zone->contents,
+	                                         &changesets,
+	                                         KNOT_CHANGESET_TYPE_IXFR);
 	if (ret != KNOT_EOK) {
 		if (ret == KNOT_ERANGE) {
 			dbg_zones_detail("zones: create_changesets: "
diff --git a/src/libknot/zone/zone-diff.c b/src/libknot/zone/zone-diff.c
index fb097973ae..6a2b8c8f79 100644
--- a/src/libknot/zone/zone-diff.c
+++ b/src/libknot/zone/zone-diff.c
@@ -916,7 +916,7 @@ static int knot_zone_diff_load_content(const knot_zone_contents_t *zone1,
 }
 
 
-int knot_zone_contents_diff(const knot_zone_contents_t *zone1,
+static int knot_zone_contents_diff(const knot_zone_contents_t *zone1,
                             const knot_zone_contents_t *zone2,
                             knot_changeset_t *changeset)
 {
@@ -963,9 +963,10 @@ static void knot_zone_diff_dump_changeset(knot_changeset_t *ch)
 #endif
 #endif
 
-int knot_zone_diff_create_changesets(const knot_zone_contents_t *z1,
-                                     const knot_zone_contents_t *z2,
-                                     knot_changesets_t **changesets)
+int knot_zone_contents_create_diff(const knot_zone_contents_t *z1,
+                                   const knot_zone_contents_t *z2,
+                                   knot_changesets_t **changesets,
+                                   uint32_t changesets_flags)
 {
 	if (z1 == NULL || z2 == NULL) {
 		dbg_zonediff("zone_diff: create_changesets: NULL arguments.\n");
@@ -975,7 +976,7 @@ int knot_zone_diff_create_changesets(const knot_zone_contents_t *z1,
 	/* Setting type to IXFR - that's the default, DDNS triggers special
 	 * processing when applied. See #2110 and #2111.
 	 */
-	int ret = knot_changeset_allocate(changesets, KNOT_CHANGESET_TYPE_IXFR);
+	int ret = knot_changeset_allocate(changesets, changesets_flags);
 	if (ret != KNOT_EOK) {
 		dbg_zonediff("zone_diff: create_changesets: "
 		             "Could not allocate changesets."
@@ -1003,3 +1004,21 @@ dbg_zonediff_exec_detail(
 
 	return KNOT_EOK;
 }
+
+int knot_zone_tree_create_diff(knot_zone_tree_t *t1,
+                               knot_zone_tree_t *t2,
+                               knot_changesets_t **changesets,
+                               uint32_t changesets_flags)
+{
+	if (!t1 || !t1 || !changesets)
+		return KNOT_EINVAL;
+
+	int result = knot_changeset_allocate(changesets, changesets_flags);
+	if (result != KNOT_EOK)
+		return result;
+
+	knot_changeset_t *changeset = (*changesets)->sets;
+	memset(changeset, 0, sizeof(knot_changeset_t));
+
+	return knot_zone_diff_load_trees(t1, t2, changeset);
+}
diff --git a/src/libknot/zone/zone-diff.h b/src/libknot/zone/zone-diff.h
index 6e0eb1d5e4..c188255c7d 100644
--- a/src/libknot/zone/zone-diff.h
+++ b/src/libknot/zone/zone-diff.h
@@ -17,12 +17,25 @@
 #ifndef _KNOT_ZONE_DIFF_H_
 #define _KNOT_ZONE_DIFF_H_
 
+#include <stdint.h>
+
 #include "libknot/zone/zone-contents.h"
 #include "libknot/updates/changesets.h"
 
-/*! \brief zone1 -> zone2 */
-int knot_zone_diff_create_changesets(const knot_zone_contents_t *z1,
-                                     const knot_zone_contents_t *z2,
-                                     knot_changesets_t **changesets);
+/*!
+ * \brief Create diff between two zone trees.
+ * */
+int knot_zone_contents_create_diff(const knot_zone_contents_t *z1,
+                                   const knot_zone_contents_t *z2,
+                                   knot_changesets_t **changesets,
+                                   uint32_t changesets_flags);
+
+/*!
+ * \brief Create diff between two zone trees.
+ */
+int knot_zone_tree_create_diff(knot_zone_tree_t *t1,
+                               knot_zone_tree_t *t2,
+                               knot_changesets_t **changesets,
+                               uint32_t changesets_flags);
 
 #endif // _KNOT_ZONE_DIFF_H_
-- 
GitLab