tdb: add utility function check_merge_with_left_record()
authorMichael Adam <obnox@samba.org>
Wed, 11 Jun 2014 10:00:48 +0000 (12:00 +0200)
committerVolker Lendecke <vl@samba.org>
Thu, 26 Jun 2014 08:00:11 +0000 (10:00 +0200)
Check whether the record left of a given freelist record is
also a freelist record, and if so, merge the two records.

Signed-off-by: Michael Adam <obnox@samba.org>
Reviewed-by: Volker Lendecke <vl@samba.org>
lib/tdb/common/freelist.c

index 41986b9284eccd8f5eb6bebd8851717c6069d06c..69b3c66ab83ce1b71f409c71dd1fefe95af91546 100644 (file)
@@ -190,6 +190,56 @@ static int merge_with_left_record(struct tdb_context *tdb,
        return 0;
 }
 
+/**
+ * Check whether the record left of a given freelist record is
+ * also a freelist record, and if so, merge the two records.
+ *
+ * Return code:
+ *  -1 upon error
+ *   0 if left was not a free record
+ *   1 if left was free and successfully merged.
+ *
+ * The currend record is handed in with pointer and fully read record.
+ *
+ * The left record pointer and struct can be retrieved as result
+ * in lp and lr;
+ */
+static int check_merge_with_left_record(struct tdb_context *tdb,
+                                       tdb_off_t rec_ptr,
+                                       struct tdb_record *rec,
+                                       tdb_off_t *lp,
+                                       struct tdb_record *lr)
+{
+       tdb_off_t left_ptr;
+       struct tdb_record left_rec;
+       int ret;
+
+       ret = read_record_on_left(tdb, rec_ptr, &left_ptr, &left_rec);
+       if (ret != 0) {
+               return 0;
+       }
+
+       if (left_rec.magic != TDB_FREE_MAGIC) {
+               return 0;
+       }
+
+       /* It's free - expand to include it. */
+       ret = merge_with_left_record(tdb, left_ptr, &left_rec, rec);
+       if (ret != 0) {
+               return -1;
+       }
+
+       if (lp != NULL) {
+               *lp = left_ptr;
+       }
+
+       if (lr != NULL) {
+               *lr = left_rec;
+       }
+
+       return 1;
+}
+
 /**
  * Add an element into the freelist.
  *