dbwrap: Convert fetch_int32 to dbwrap_parse_record
authorVolker Lendecke <vl@samba.org>
Tue, 12 Jun 2012 10:58:47 +0000 (12:58 +0200)
committerStefan Metzmacher <metze@samba.org>
Fri, 22 Jun 2012 13:16:52 +0000 (15:16 +0200)
Now dbwrap_fetch_int32 is used in smbd/locking/posix.c is used a
lot more often than before.

Signed-off-by: Stefan Metzmacher <metze@samba.org>
lib/dbwrap/dbwrap_util.c

index 8f2e99744ac2baa927f710e6f3dde55479d13f97..b1efae7221372fd4791af0263b69351955d2da9b 100644 (file)
 #include "dbwrap.h"
 #include "lib/util/util_tdb.h"
 
+struct dbwrap_fetch_int32_state {
+       NTSTATUS status;
+       int32_t result;
+};
+
+static void dbwrap_fetch_int32_parser(TDB_DATA key, TDB_DATA data,
+                                     void *private_data)
+{
+       struct dbwrap_fetch_int32_state *state =
+               (struct dbwrap_fetch_int32_state *)private_data;
+
+       if (data.dsize != sizeof(state->result)) {
+               state->status = NT_STATUS_INTERNAL_DB_CORRUPTION;
+               return;
+       }
+       state->result = IVAL(data.dptr, 0);
+       state->status = NT_STATUS_OK;
+}
+
 NTSTATUS dbwrap_fetch_int32(struct db_context *db, TDB_DATA key,
                            int32_t *result)
 {
-       TDB_DATA dbuf;
-       NTSTATUS status;
+       struct dbwrap_fetch_int32_state state;
 
        if (result == NULL) {
                return NT_STATUS_INVALID_PARAMETER;
        }
 
-       status = dbwrap_fetch(db, talloc_tos(), key, &dbuf);
-       if (!NT_STATUS_IS_OK(status)) {
-               return status;
-       }
+       dbwrap_parse_record(db, key, dbwrap_fetch_int32_parser, &state);
 
-       if ((dbuf.dptr == NULL) || (dbuf.dsize != sizeof(int32_t))) {
-               TALLOC_FREE(dbuf.dptr);
-               return NT_STATUS_NOT_FOUND;
+       if (NT_STATUS_IS_OK(state.status)) {
+               *result = state.result;
        }
-
-       *result = IVAL(dbuf.dptr, 0);
-       TALLOC_FREE(dbuf.dptr);
-       return NT_STATUS_OK;
+       return state.status;
 }
 
 NTSTATUS dbwrap_fetch_int32_bystring(struct db_context *db, const char *keystr,