tdb: If tdb_parse_record does not find a record, return -1 instead of 0
authorVolker Lendecke <vl@samba.org>
Sat, 27 Feb 2010 18:26:01 +0000 (19:26 +0100)
committerVolker Lendecke <vl@samba.org>
Sun, 28 Feb 2010 16:40:59 +0000 (17:40 +0100)
lib/tdb/common/tdb.c
lib/tdb/docs/README

index 7317a3aa521554c898d12a5e5b8f57c7dafea36f..953c811c7028d78156a79a53f7cd80ce371abf5b 100644 (file)
@@ -222,6 +222,8 @@ TDB_DATA tdb_fetch(struct tdb_context *tdb, TDB_DATA key)
  *
  * This is interesting for all readers of potentially large data structures in
  * the tdb records, ldb indexes being one example.
+ *
+ * Return -1 if the record was not found.
  */
 
 int tdb_parse_record(struct tdb_context *tdb, TDB_DATA key,
@@ -238,9 +240,10 @@ int tdb_parse_record(struct tdb_context *tdb, TDB_DATA key,
        hash = tdb->hash_fn(&key);
 
        if (!(rec_ptr = tdb_find_lock_hash(tdb,key,hash,F_RDLCK,&rec))) {
+               /* record not found */
                tdb_trace_1rec_ret(tdb, "tdb_parse_record", key, -1);
                tdb->ecode = TDB_ERR_NOEXIST;
-               return 0;
+               return -1;
        }
        tdb_trace_1rec_ret(tdb, "tdb_parse_record", key, 0);
 
index c02ee0e030ad9e1ae6b71947d18cbd5b23433705..fe0e2581838a99512d4b85806b37cd6679f496f1 100644 (file)
@@ -104,6 +104,25 @@ TDB_DATA tdb_fetch(TDB_CONTEXT *tdb, TDB_DATA key);
 
    caller must free the resulting data
 
+----------------------------------------------------------------------
+int tdb_parse_record(struct tdb_context *tdb, TDB_DATA key,
+                    int (*parser)(TDB_DATA key, TDB_DATA data,
+                                  void *private_data),
+                    void *private_data);
+
+   Hand a record to a parser function without allocating it.
+
+   This function is meant as a fast tdb_fetch alternative for large records
+   that are frequently read. The "key" and "data" arguments point directly
+   into the tdb shared memory, they are not aligned at any boundary.
+
+   WARNING: The parser is called while tdb holds a lock on the record. DO NOT
+   call other tdb routines from within the parser. Also, for good performance
+   you should make the parser fast to allow parallel operations.
+
+   tdb_parse_record returns -1 if the record was not found.  If the record was
+   found, the return value of "parser" is passed up to the caller.
+
 ----------------------------------------------------------------------
 int tdb_exists(TDB_CONTEXT *tdb, TDB_DATA key);