[SCM] Samba Shared Repository - branch master updated

Michael Adam obnox at samba.org
Thu Dec 15 09:42:04 MST 2011


The branch, master has been updated
       via  8eeb3ff s3-dbwrap: All relevant backends provide parse_record(). Remove the fallback.
       via  f6d8f74 s3-dbwrap: Remove the "fetch" db_context callback
       via  b5d056c s3-dbwrap: Rewrite dbwrap_fetch in terms of dbwrap_parse_record
       via  77dca70 s3-dbwrap: Rewrite dbwrap_fallback_parse_record based on dbwrap_fetch_locked
       via  daa3654 s3-dbwrap: For nostalgic reasons, make dbwrap_file.c compile at least
       via  29f62bb s3-dbwrap: Fix some blank line endings
       via  098048a s3-dbwrap: Implement db_ctdb_parse_record in terms of db_ctdb_fetch
       via  26fc729 s3-dbwrap: Make dbwrap_parse_record return NTSTATUS
      from  19078b9 s3:smbd/globals: remove unused msg_ctx_to_sconn()

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 8eeb3ff753b36f8d33ae55a9ab2d8cc52fffa1a4
Author: Volker Lendecke <vl at samba.org>
Date:   Fri Dec 9 11:22:50 2011 +0100

    s3-dbwrap: All relevant backends provide parse_record(). Remove the fallback.
    
    Signed-off-by: Michael Adam <obnox at samba.org>
    
    Autobuild-User: Michael Adam <obnox at samba.org>
    Autobuild-Date: Thu Dec 15 17:41:53 CET 2011 on sn-devel-104

commit f6d8f7440c4f7e25574045a4e42a770d48d4c43d
Author: Volker Lendecke <vl at samba.org>
Date:   Thu Dec 8 16:46:09 2011 +0100

    s3-dbwrap: Remove the "fetch" db_context callback
    
    Signed-off-by: Michael Adam <obnox at samba.org>

commit b5d056ca231f67b4c6fd608ecbe6f83f1823a33b
Author: Volker Lendecke <vl at samba.org>
Date:   Thu Dec 8 16:43:40 2011 +0100

    s3-dbwrap: Rewrite dbwrap_fetch in terms of dbwrap_parse_record
    
    Signed-off-by: Michael Adam <obnox at samba.org>

commit 77dca703504044412872b7e9ad4d2c9c1971ba32
Author: Volker Lendecke <vl at samba.org>
Date:   Thu Dec 8 16:37:40 2011 +0100

    s3-dbwrap: Rewrite dbwrap_fallback_parse_record based on dbwrap_fetch_locked
    
    This is in preparation to remove the db_context->fetch function pointer
    
    Signed-off-by: Michael Adam <obnox at samba.org>

commit daa365493e3fd7b7a664628e48438e7938fa4628
Author: Volker Lendecke <vl at samba.org>
Date:   Thu Dec 8 16:05:08 2011 +0100

    s3-dbwrap: For nostalgic reasons, make dbwrap_file.c compile at least
    
    Signed-off-by: Michael Adam <obnox at samba.org>

commit 29f62bbed792da4236a299100d0e227df5e423a5
Author: Volker Lendecke <vl at samba.org>
Date:   Thu Dec 8 16:04:19 2011 +0100

    s3-dbwrap: Fix some blank line endings
    
    Signed-off-by: Michael Adam <obnox at samba.org>

commit 098048a89c4ce14b17a0151dcb64c7cdf06f4152
Author: Volker Lendecke <vl at samba.org>
Date:   Thu Dec 8 15:56:35 2011 +0100

    s3-dbwrap: Implement db_ctdb_parse_record in terms of db_ctdb_fetch
    
    Signed-off-by: Michael Adam <obnox at samba.org>

commit 26fc72921f7b72dfebfe8394baa85b81ef66d26d
Author: Volker Lendecke <vl at samba.org>
Date:   Thu Dec 8 15:50:33 2011 +0100

    s3-dbwrap: Make dbwrap_parse_record return NTSTATUS
    
    Also, the parser now returns void. The parser is called if and only if
    dbwrap_parse_record returns NT_STATUS_OK.
    
    Signed-off-by: Michael Adam <obnox at samba.org>

-----------------------------------------------------------------------

Summary of changes:
 source3/lib/dbwrap/dbwrap.c         |  100 +++++++++++++---------------------
 source3/lib/dbwrap/dbwrap.h         |    8 ++--
 source3/lib/dbwrap/dbwrap_ctdb.c    |   20 +++++++-
 source3/lib/dbwrap/dbwrap_file.c    |   33 +++++++-----
 source3/lib/dbwrap/dbwrap_private.h |   10 ++--
 source3/lib/dbwrap/dbwrap_rbt.c     |   33 ++----------
 source3/lib/dbwrap/dbwrap_tdb.c     |  101 +++++++++++------------------------
 source3/lib/serverid.c              |   10 ++--
 8 files changed, 126 insertions(+), 189 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/lib/dbwrap/dbwrap.c b/source3/lib/dbwrap/dbwrap.c
index a806c6a..c551bfd 100644
--- a/source3/lib/dbwrap/dbwrap.c
+++ b/source3/lib/dbwrap/dbwrap.c
@@ -25,61 +25,15 @@
 #include "util_tdb.h"
 
 /*
- * Fall back using fetch_locked if no genuine fetch operation is provided
- */
-
-static NTSTATUS dbwrap_fallback_fetch(struct db_context *db,
-				      TALLOC_CTX *mem_ctx,
-				      TDB_DATA key, TDB_DATA *data)
-{
-	struct db_record *rec;
-
-	rec = dbwrap_fetch_locked(db, mem_ctx, key);
-	if (rec == NULL) {
-		return NT_STATUS_UNSUCCESSFUL;
-	}
-
-	data->dsize = rec->value.dsize;
-	data->dptr = talloc_move(mem_ctx, &rec->value.dptr);
-	TALLOC_FREE(rec);
-	return NT_STATUS_OK;
-}
-
-/*
  * Fall back using fetch if no genuine exists operation is provided
  */
 
 static int dbwrap_fallback_exists(struct db_context *db, TDB_DATA key)
 {
-	int res = dbwrap_parse_record(db, key, NULL, NULL);
-	return  ( res == -1) ? 0 : 1;
+	NTSTATUS status = dbwrap_parse_record(db, key, NULL, NULL);
+	return NT_STATUS_IS_OK(status) ? 1 : 0;
 }
 
-/*
- * Fall back using fetch if no genuine parse operation is provided
- */
-
-static int dbwrap_fallback_parse_record(struct db_context *db, TDB_DATA key,
-					int (*parser)(TDB_DATA key,
-						      TDB_DATA data,
-						      void *private_data),
-					void *private_data)
-{
-	TDB_DATA data;
-	int res;
-	NTSTATUS status;
-
-	status = dbwrap_fetch(db, talloc_tos(), key, &data);
-	if (!NT_STATUS_IS_OK(status)) {
-		return -1;
-	}
-
-	res = parser(key, data, private_data);
-	TALLOC_FREE(data.dptr);
-	return res;
-}
-
-
 static int delete_record(struct db_record *rec, void *data)
 {
 	NTSTATUS status = dbwrap_record_delete(rec);
@@ -128,16 +82,43 @@ struct db_record *dbwrap_fetch_locked(struct db_context *db,
 	return db->fetch_locked(db, mem_ctx, key);
 }
 
+struct dbwrap_fetch_state {
+	TALLOC_CTX *mem_ctx;
+	TDB_DATA data;
+};
+
+static void dbwrap_fetch_parser(TDB_DATA key, TDB_DATA data,
+				void *private_data)
+{
+	struct dbwrap_fetch_state *state =
+		(struct dbwrap_fetch_state *)private_data;
+
+	state->data.dsize = data.dsize;
+	state->data.dptr = (uint8_t *)talloc_memdup(state->mem_ctx, data.dptr,
+						    data.dsize);
+}
+
 NTSTATUS dbwrap_fetch(struct db_context *db, TALLOC_CTX *mem_ctx,
 		      TDB_DATA key, TDB_DATA *value)
 {
+	struct dbwrap_fetch_state state;
+	NTSTATUS status;
+
 	if (value == NULL) {
 		return NT_STATUS_INVALID_PARAMETER;
 	}
-	if (db->fetch == NULL) {
-		return dbwrap_fallback_fetch(db, mem_ctx, key, value);
+
+	state.mem_ctx = mem_ctx;
+
+	status = dbwrap_parse_record(db, key, dbwrap_fetch_parser, &state);
+	if (!NT_STATUS_IS_OK(status)) {
+		return status;
+	}
+	if ((state.data.dsize != 0) && (state.data.dptr == NULL)) {
+		return NT_STATUS_NO_MEMORY;
 	}
-	return db->fetch(db, mem_ctx, key, value);
+	*value = state.data;
+	return NT_STATUS_OK;
 }
 
 bool dbwrap_exists(struct db_context *db, TDB_DATA key)
@@ -217,24 +198,19 @@ NTSTATUS dbwrap_traverse_read(struct db_context *db,
 	return NT_STATUS_OK;
 }
 
-static int dbwrap_null_parser(TDB_DATA key, TDB_DATA val, void* data)
+static void dbwrap_null_parser(TDB_DATA key, TDB_DATA val, void* data)
 {
-	return 0;
+	return;
 }
 
-int dbwrap_parse_record(struct db_context *db, TDB_DATA key,
-			int (*parser)(TDB_DATA key, TDB_DATA data,
-				      void *private_data),
-			void *private_data)
+NTSTATUS dbwrap_parse_record(struct db_context *db, TDB_DATA key,
+			     void (*parser)(TDB_DATA key, TDB_DATA data,
+					    void *private_data),
+			     void *private_data)
 {
 	if (parser == NULL) {
 		parser = dbwrap_null_parser;
 	}
-
-	if (db->parse_record == NULL) {
-		return dbwrap_fallback_parse_record(db, key, parser,
-						    private_data);
-	}
 	return db->parse_record(db, key, parser, private_data);
 }
 
diff --git a/source3/lib/dbwrap/dbwrap.h b/source3/lib/dbwrap/dbwrap.h
index 41e6833..386a9fa 100644
--- a/source3/lib/dbwrap/dbwrap.h
+++ b/source3/lib/dbwrap/dbwrap.h
@@ -49,10 +49,10 @@ NTSTATUS dbwrap_traverse_read(struct db_context *db,
 			      int (*f)(struct db_record*, void*),
 			      void *private_data,
 			      int *count);
-int dbwrap_parse_record(struct db_context *db, TDB_DATA key,
-			int (*parser)(TDB_DATA key, TDB_DATA data,
-				      void *private_data),
-			void *private_data);
+NTSTATUS dbwrap_parse_record(struct db_context *db, TDB_DATA key,
+			     void (*parser)(TDB_DATA key, TDB_DATA data,
+					    void *private_data),
+			     void *private_data);
 int dbwrap_wipe(struct db_context *db);
 int dbwrap_get_seqnum(struct db_context *db);
 int dbwrap_get_flags(struct db_context *db);
diff --git a/source3/lib/dbwrap/dbwrap_ctdb.c b/source3/lib/dbwrap/dbwrap_ctdb.c
index 7262b87..0acaf67 100644
--- a/source3/lib/dbwrap/dbwrap_ctdb.c
+++ b/source3/lib/dbwrap/dbwrap_ctdb.c
@@ -1196,6 +1196,24 @@ static NTSTATUS db_ctdb_fetch(struct db_context *db, TALLOC_CTX *mem_ctx,
 	return status;
 }
 
+static NTSTATUS db_ctdb_parse_record(struct db_context *db, TDB_DATA key,
+				     void (*parser)(TDB_DATA key,
+						    TDB_DATA data,
+						    void *private_data),
+				     void *private_data)
+{
+	NTSTATUS status;
+	TDB_DATA data;
+
+	status = db_ctdb_fetch(db, talloc_tos(), key, &data);
+	if (!NT_STATUS_IS_OK(status)) {
+		return status;
+	}
+	parser(key, data, private_data);
+	TALLOC_FREE(data.dptr);
+	return NT_STATUS_OK;
+}
+
 struct traverse_state {
 	struct db_context *db;
 	int (*fn)(struct db_record *rec, void *private_data);
@@ -1490,7 +1508,7 @@ struct db_context *db_open_ctdb(TALLOC_CTX *mem_ctx,
 
 	result->private_data = (void *)db_ctdb;
 	result->fetch_locked = db_ctdb_fetch_locked;
-	result->fetch = db_ctdb_fetch;
+	result->parse_record = db_ctdb_parse_record;
 	result->traverse = db_ctdb_traverse;
 	result->traverse_read = db_ctdb_traverse_read;
 	result->get_seqnum = db_ctdb_get_seqnum;
diff --git a/source3/lib/dbwrap/dbwrap_file.c b/source3/lib/dbwrap/dbwrap_file.c
index 2be7b98..f7d207b 100644
--- a/source3/lib/dbwrap/dbwrap_file.c
+++ b/source3/lib/dbwrap/dbwrap_file.c
@@ -1,24 +1,27 @@
-/* 
+/*
    Unix SMB/CIFS implementation.
    Database interface using a file per record
    Copyright (C) Volker Lendecke 2005
-   
+
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
-   
+
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
-   
+
    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
 
 #include "includes.h"
+#include "dbwrap/dbwrap.h"
 #include "dbwrap/dbwrap_file.h"
+#include "dbwrap/dbwrap_private.h"
+#include "lib/util/tdb_wrap.h"
 
 struct db_file_ctx {
 	const char *dirname;
@@ -75,7 +78,6 @@ static struct db_record *db_file_fetch_locked(struct db_context *db,
 	struct db_locked_file *file;
 	struct flock fl;
 	SMB_STRUCT_STAT statbuf;
-	ssize_t nread;
 	int ret;
 
 	SMB_ASSERT(ctx->locked_record == NULL);
@@ -151,14 +153,14 @@ static struct db_record *db_file_fetch_locked(struct db_context *db,
 		return NULL;
 	}
 
-	if (sys_fstat(file->fd, &statbuf) != 0) {
+	if (sys_fstat(file->fd, &statbuf, false) != 0) {
 		DEBUG(3, ("Could not fstat %s: %s\n",
 			  file->path, strerror(errno)));
 		TALLOC_FREE(result);
 		return NULL;
 	}
 
-	if (statbuf.st_nlink == 0) {
+	if (statbuf.st_ex_nlink == 0) {
 		/* Someone has deleted it under the lock, retry */
 		TALLOC_FREE(result);
 		goto again;
@@ -167,20 +169,23 @@ static struct db_record *db_file_fetch_locked(struct db_context *db,
 	result->value.dsize = 0;
 	result->value.dptr = NULL;
 
-	if (statbuf.st_size != 0) {
-		result->value.dsize = statbuf.st_size;
+	if (statbuf.st_ex_size != 0) {
+		NTSTATUS status;
+
+		result->value.dsize = statbuf.st_ex_size;
 		result->value.dptr = talloc_array(result, uint8,
-						  statbuf.st_size);
+						  statbuf.st_ex_size);
 		if (result->value.dptr == NULL) {
 			DEBUG(1, ("talloc failed\n"));
 			TALLOC_FREE(result);
 			return NULL;
 		}
 
-		nread = read_data(file->fd, (char *)result->value.dptr,
+		status = read_data(file->fd, (char *)result->value.dptr,
 				  result->value.dsize);
-		if (nread != result->value.dsize) {
-			DEBUG(3, ("read_data failed: %s\n", strerror(errno)));
+		if (!NT_STATUS_IS_OK(status)) {
+			DEBUG(3, ("read_data failed: %s\n",
+				  nt_errstr(status)));
 			TALLOC_FREE(result);
 			return NULL;
 		}
@@ -254,7 +259,7 @@ static int db_file_traverse(struct db_context *db,
 	struct db_file_ctx *ctx = talloc_get_type_abort(db->private_data,
 							struct db_file_ctx);
 	TALLOC_CTX *mem_ctx = talloc_init("traversal %s\n", ctx->dirname);
-	
+
 	int i;
 	int count = 0;
 
diff --git a/source3/lib/dbwrap/dbwrap_private.h b/source3/lib/dbwrap/dbwrap_private.h
index 1491a13..4806618 100644
--- a/source3/lib/dbwrap/dbwrap_private.h
+++ b/source3/lib/dbwrap/dbwrap_private.h
@@ -34,8 +34,6 @@ struct db_context {
 	struct db_record *(*fetch_locked)(struct db_context *db,
 					  TALLOC_CTX *mem_ctx,
 					  TDB_DATA key);
-	NTSTATUS (*fetch)(struct db_context *db, TALLOC_CTX *mem_ctx,
-			  TDB_DATA key, TDB_DATA *data);
 	int (*traverse)(struct db_context *db,
 			int (*f)(struct db_record *rec,
 				 void *private_data),
@@ -49,10 +47,10 @@ struct db_context {
 	int (*transaction_start)(struct db_context *db);
 	int (*transaction_commit)(struct db_context *db);
 	int (*transaction_cancel)(struct db_context *db);
-	int (*parse_record)(struct db_context *db, TDB_DATA key,
-			    int (*parser)(TDB_DATA key, TDB_DATA data,
-					  void *private_data),
-			    void *private_data);
+	NTSTATUS (*parse_record)(struct db_context *db, TDB_DATA key,
+				 void (*parser)(TDB_DATA key, TDB_DATA data,
+						void *private_data),
+				 void *private_data);
 	int (*exists)(struct db_context *db,TDB_DATA key);
 	int (*wipe)(struct db_context *db);
 	void *private_data;
diff --git a/source3/lib/dbwrap/dbwrap_rbt.c b/source3/lib/dbwrap/dbwrap_rbt.c
index 3f280c2..2460418 100644
--- a/source3/lib/dbwrap/dbwrap_rbt.c
+++ b/source3/lib/dbwrap/dbwrap_rbt.c
@@ -330,40 +330,18 @@ static int db_rbt_wipe(struct db_context *db)
 	return 0;
 }
 
-static int db_rbt_parse_record(struct db_context *db, TDB_DATA key,
-			       int (*parser)(TDB_DATA key, TDB_DATA data,
-					     void *private_data),
-			       void *private_data)
-{
-	struct db_rbt_search_result res;
-	bool found = db_rbt_search_internal(db, key, &res);
-
-	if (!found) {
-		return -1;
-	}
-	return parser(res.key, res.val, private_data);
-}
-
-static NTSTATUS db_rbt_fetch(struct db_context *db, TALLOC_CTX *mem_ctx,
-			     TDB_DATA key, TDB_DATA *data)
+static NTSTATUS db_rbt_parse_record(struct db_context *db, TDB_DATA key,
+				    void (*parser)(TDB_DATA key, TDB_DATA data,
+						   void *private_data),
+				    void *private_data)
 {
-	uint8_t *result;
 	struct db_rbt_search_result res;
-
 	bool found = db_rbt_search_internal(db, key, &res);
 
 	if (!found) {
-		*data = tdb_null;
 		return NT_STATUS_NOT_FOUND;
 	}
-
-	result = (uint8_t*)talloc_memdup(mem_ctx, res.val.dptr, res.val.dsize);
-	if (result == NULL) {
-		return NT_STATUS_NO_MEMORY;
-	}
-
-	data->dptr = result;
-	data->dsize = res.val.dsize;
+	parser(res.key, res.val, private_data);
 	return NT_STATUS_OK;
 }
 
@@ -448,7 +426,6 @@ struct db_context *db_open_rbt(TALLOC_CTX *mem_ctx)
 	}
 
 	result->fetch_locked = db_rbt_fetch_locked;
-	result->fetch = db_rbt_fetch;
 	result->traverse = db_rbt_traverse;
 	result->traverse_read = db_rbt_traverse;
 	result->get_seqnum = db_rbt_get_seqnum;
diff --git a/source3/lib/dbwrap/dbwrap_tdb.c b/source3/lib/dbwrap/dbwrap_tdb.c
index fbb05cc..d38c377 100644
--- a/source3/lib/dbwrap/dbwrap_tdb.c
+++ b/source3/lib/dbwrap/dbwrap_tdb.c
@@ -140,70 +140,6 @@ static struct db_record *db_tdb_fetch_locked(struct db_context *db,
 	return state.result;
 }
 
-struct tdb_fetch_state {
-	TALLOC_CTX *mem_ctx;
-	NTSTATUS result;
-	TDB_DATA data;
-};
-
-static int db_tdb_fetch_parse(TDB_DATA key, TDB_DATA data,
-			      void *private_data)
-{
-	struct tdb_fetch_state *state =
-		(struct tdb_fetch_state *)private_data;
-
-	if (data.dptr == NULL) {
-		/* should not happen */
-		state->result = NT_STATUS_INTERNAL_DB_ERROR;
-		return -1;
-	}
-
-	state->data.dptr = (uint8 *)talloc_memdup(state->mem_ctx, data.dptr,
-						  data.dsize);
-	if (state->data.dptr == NULL) {
-		state->result = NT_STATUS_NO_MEMORY;
-		return -1;
-	}
-
-	state->data.dsize = data.dsize;
-	return 0;
-}
-
-static NTSTATUS db_tdb_fetch(struct db_context *db, TALLOC_CTX *mem_ctx,
-			     TDB_DATA key, TDB_DATA *pdata)
-{
-	struct db_tdb_ctx *ctx = talloc_get_type_abort(
-		db->private_data, struct db_tdb_ctx);
-
-	struct tdb_fetch_state state;
-	int ret;
-
-	state.mem_ctx = mem_ctx;
-	state.result = NT_STATUS_OK;
-	state.data = tdb_null;
-
-	ret = tdb_parse_record(ctx->wtdb->tdb, key, db_tdb_fetch_parse, &state);
-
-	if (ret != 0) {
-		NTSTATUS status;
-
-		if (!NT_STATUS_IS_OK(state.result)) {
-			/* the parser has set an error code. return it */
-			return state.result;
-		}
-
-		status = map_nt_error_from_tdb(tdb_error(ctx->wtdb->tdb));
-		return status;
-	}
-
-	if (!NT_STATUS_IS_OK(state.result)) {
-		return state.result;
-	}
-
-	*pdata = state.data;
-	return NT_STATUS_OK;
-}
-
 static int db_tdb_exists(struct db_context *db, TDB_DATA key)
 {
 	struct db_tdb_ctx *ctx = talloc_get_type_abort(
@@ -218,15 +154,41 @@ static int db_tdb_wipe(struct db_context *db)
 	return tdb_wipe_all(ctx->wtdb->tdb);
 }
 
-static int db_tdb_parse(struct db_context *db, TDB_DATA key,
-			int (*parser)(TDB_DATA key, TDB_DATA data,
-				      void *private_data),
-			void *private_data)
+struct db_tdb_parse_state {
+	void (*parser)(TDB_DATA key, TDB_DATA data,
+		       void *private_data);
+	void *private_data;
+};
+
+/*
+ * tdb_parse_record expects a parser returning int, mixing up tdb and
+ * parser errors. Wrap around that by always returning 0 and have
+ * dbwrap_parse_record expect a parser returning void.
+ */
+
+static int db_tdb_parser(TDB_DATA key, TDB_DATA data, void *private_data)
+{
+	struct db_tdb_parse_state *state =
+		(struct db_tdb_parse_state *)private_data;
+	state->parser(key, data, state->private_data);
+	return 0;
+}
+
+static NTSTATUS db_tdb_parse(struct db_context *db, TDB_DATA key,
+			     void (*parser)(TDB_DATA key, TDB_DATA data,
+					   void *private_data),
+			     void *private_data)
 {
 	struct db_tdb_ctx *ctx = talloc_get_type_abort(
 		db->private_data, struct db_tdb_ctx);
+	struct db_tdb_parse_state state;


-- 
Samba Shared Repository


More information about the samba-cvs mailing list