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 <[email protected]>
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 <[email protected]>
    
    Autobuild-User: Michael Adam <[email protected]>
    Autobuild-Date: Thu Dec 15 17:41:53 CET 2011 on sn-devel-104

commit f6d8f7440c4f7e25574045a4e42a770d48d4c43d
Author: Volker Lendecke <[email protected]>
Date:   Thu Dec 8 16:46:09 2011 +0100

    s3-dbwrap: Remove the "fetch" db_context callback
    
    Signed-off-by: Michael Adam <[email protected]>

commit b5d056ca231f67b4c6fd608ecbe6f83f1823a33b
Author: Volker Lendecke <[email protected]>
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 <[email protected]>

commit 77dca703504044412872b7e9ad4d2c9c1971ba32
Author: Volker Lendecke <[email protected]>
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 <[email protected]>

commit daa365493e3fd7b7a664628e48438e7938fa4628
Author: Volker Lendecke <[email protected]>
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 <[email protected]>

commit 29f62bbed792da4236a299100d0e227df5e423a5
Author: Volker Lendecke <[email protected]>
Date:   Thu Dec 8 16:04:19 2011 +0100

    s3-dbwrap: Fix some blank line endings
    
    Signed-off-by: Michael Adam <[email protected]>

commit 098048a89c4ce14b17a0151dcb64c7cdf06f4152
Author: Volker Lendecke <[email protected]>
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 <[email protected]>

commit 26fc72921f7b72dfebfe8394baa85b81ef66d26d
Author: Volker Lendecke <[email protected]>
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 <[email protected]>

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

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

Reply via email to