[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