svn commit: samba r10309 - in branches/tmp/samba4-winsrepl/source/nbt_server/wins: .

metze at samba.org metze at samba.org
Mon Sep 19 09:08:38 GMT 2005


Author: metze
Date: 2005-09-19 09:08:37 +0000 (Mon, 19 Sep 2005)
New Revision: 10309

WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=10309

Log:
- add winsdb_connect() function, so that the winsdb can be opened by the wrepl_server/ code
- remove maintaining of a min_version field, as it was implemented incorrect, and is maybe not needed at all
- fix handling of max_version, (we started with 0, on each server start)

metze
Modified:
   branches/tmp/samba4-winsrepl/source/nbt_server/wins/winsdb.c
   branches/tmp/samba4-winsrepl/source/nbt_server/wins/winsdb.h
   branches/tmp/samba4-winsrepl/source/nbt_server/wins/winsserver.c


Changeset:
Modified: branches/tmp/samba4-winsrepl/source/nbt_server/wins/winsdb.c
===================================================================
--- branches/tmp/samba4-winsrepl/source/nbt_server/wins/winsdb.c	2005-09-19 05:30:46 UTC (rev 10308)
+++ branches/tmp/samba4-winsrepl/source/nbt_server/wins/winsdb.c	2005-09-19 09:08:37 UTC (rev 10309)
@@ -28,63 +28,58 @@
 #include "system/time.h"
 
 /*
-  save the min/max version IDs for the database
+  return the new maxVersion and save it
 */
-static BOOL winsdb_save_version(struct wins_server *winssrv)
+static uint64_t winsdb_allocate_version(struct wins_server *winssrv)
 {
-	int i, ret = 0;
+	int ret;
 	struct ldb_context *ldb = winssrv->wins_db;
-	struct ldb_message *msg = ldb_msg_new(winssrv);
-	if (msg == NULL) goto failed;
+	struct ldb_dn *dn;
+	struct ldb_message **res = NULL;
+	struct ldb_message *msg = NULL;
+	TALLOC_CTX *tmp_ctx = talloc_new(winssrv);
+	uint64_t maxVersion = 0;
 
-	msg->dn = ldb_dn_explode(msg, "CN=VERSION");
-	if (msg->dn == NULL) goto failed;
+	dn = ldb_dn_explode(tmp_ctx, "CN=VERSION");
+	if (!dn) goto failed;
 
-	ret |= ldb_msg_add_fmt(ldb, msg, "minVersion", "%llu", winssrv->min_version);
-	ret |= ldb_msg_add_fmt(ldb, msg, "maxVersion", "%llu", winssrv->max_version);
-	if (ret != 0) goto failed;
+	/* find the record in the WINS database */
+	ret = ldb_search(ldb, dn, LDB_SCOPE_BASE, 
+			 NULL, NULL, &res);
+	if (res != NULL) {
+		talloc_steal(tmp_ctx, res);
+	}
+	if (ret < 0) goto failed;
+	if (ret > 1) goto failed;
 
-	for (i=0;i<msg->num_elements;i++) {
-		msg->elements[i].flags = LDB_FLAG_MOD_REPLACE;
+	if (ret == 1) {
+		maxVersion = ldb_msg_find_uint64(res[0], "maxVersion", 0);
 	}
+	maxVersion++;
 
+	msg = ldb_msg_new(tmp_ctx);
+	if (!msg) goto failed;
+	msg->dn = dn;
+
+
+	ret = ldb_msg_add_empty(ldb, msg, "maxVersion", LDB_FLAG_MOD_REPLACE);
+	if (ret != 0) goto failed;
+	ret = ldb_msg_add_fmt(ldb, msg, "maxVersion", "%llu", maxVersion);
+	if (ret != 0) goto failed;
+
 	ret = ldb_modify(ldb, msg);
 	if (ret != 0) ret = ldb_add(ldb, msg);
 	if (ret != 0) goto failed;
 
-	talloc_free(msg);
-	return True;
+	talloc_free(tmp_ctx);
+	return maxVersion;
 
 failed:
-	talloc_free(msg);
-	return False;
+	talloc_free(tmp_ctx);
+	return 0;
 }
 
 /*
-  allocate a new version id for a record
-*/
-static uint64_t winsdb_allocate_version(struct wins_server *winssrv)
-{
-	winssrv->max_version++;
-	if (!winsdb_save_version(winssrv)) {
-		return 0;
-	}
-	return winssrv->max_version;
-}
-
-/*
-  remove a version id
-*/
-static void winsdb_remove_version(struct wins_server *winssrv, uint64_t version)
-{
-	if (version == winssrv->min_version) {
-		winssrv->min_version++;
-		winsdb_save_version(winssrv);
-	}
-}
-
-
-/*
   return a DN for a nbt_name
 */
 static struct ldb_dn *winsdb_dn(TALLOC_CTX *mem_ctx, struct nbt_name *name)
@@ -267,8 +262,6 @@
 	int ret;
 	const struct ldb_dn *dn;
 
-	winsdb_remove_version(winssrv, rec->version);
-
 	dn = winsdb_dn(tmp_ctx, rec->name);
 	if (dn == NULL) goto failed;
 
@@ -283,16 +276,7 @@
 	return NBT_RCODE_SVR;
 }
 
-
-/*
-  connect to the WINS database
-*/
-NTSTATUS winsdb_init(struct wins_server *winssrv)
+struct ldb_context *winsdb_connect(TALLOC_CTX *mem_ctx)
 {
-	winssrv->wins_db = ldb_wrap_connect(winssrv, lp_wins_url(), 0, NULL);
-	if (winssrv->wins_db == NULL) {
-		return NT_STATUS_INTERNAL_DB_ERROR;
-	}
-
-	return NT_STATUS_OK;
+	return ldb_wrap_connect(mem_ctx, lp_wins_url(), 0, NULL);
 }

Modified: branches/tmp/samba4-winsrepl/source/nbt_server/wins/winsdb.h
===================================================================
--- branches/tmp/samba4-winsrepl/source/nbt_server/wins/winsdb.h	2005-09-19 05:30:46 UTC (rev 10308)
+++ branches/tmp/samba4-winsrepl/source/nbt_server/wins/winsdb.h	2005-09-19 09:08:37 UTC (rev 10309)
@@ -44,9 +44,4 @@
 
 	uint32_t min_ttl;
 	uint32_t max_ttl;
-
-	/* these are the minimum and maximum record version IDs in the
-	   database. They are needed for replication */
-	uint64_t min_version;
-	uint64_t max_version;
 };

Modified: branches/tmp/samba4-winsrepl/source/nbt_server/wins/winsserver.c
===================================================================
--- branches/tmp/samba4-winsrepl/source/nbt_server/wins/winsserver.c	2005-09-19 05:30:46 UTC (rev 10308)
+++ branches/tmp/samba4-winsrepl/source/nbt_server/wins/winsserver.c	2005-09-19 09:08:37 UTC (rev 10309)
@@ -274,15 +274,18 @@
 		return NT_STATUS_OK;
 	}
 
-	nbtsrv->winssrv = talloc(nbtsrv, struct wins_server);
+	nbtsrv->winssrv = talloc_zero(nbtsrv, struct wins_server);
 	NT_STATUS_HAVE_NO_MEMORY(nbtsrv->winssrv);
 
 	nbtsrv->winssrv->max_ttl     = lp_max_wins_ttl();
 	nbtsrv->winssrv->min_ttl     = lp_min_wins_ttl();
-	nbtsrv->winssrv->min_version = 0;
-	nbtsrv->winssrv->max_version = 0;
 
+	nbtsrv->winssrv->wins_db     = winsdb_connect(nbtsrv->winssrv);
+	if (!nbtsrv->winssrv->wins_db) {
+		return NT_STATUS_INTERNAL_DB_ERROR;
+	}
+
 	irpc_add_name(nbtsrv->task->msg_ctx, "wins_server");
 
-	return winsdb_init(nbtsrv->winssrv);
+	return NT_STATUS_OK;
 }



More information about the samba-cvs mailing list