Implement very basic grouped fetches of objects from the cloud.
[bluesky.git] / bluesky / util.c
index 4e8b011..c5618b9 100644 (file)
@@ -292,3 +292,47 @@ const BlueSkyRangesetItem *bluesky_rangeset_lookup(BlueSkyRangeset *rangeset,
     else
         return NULL;
 }
+
+/* Look up the first rangeset item starting at or following the given address.
+ * Can be used to iterate through a rangeset. */
+const BlueSkyRangesetItem *bluesky_rangeset_lookup_next(BlueSkyRangeset *rangeset, uint64_t offset)
+{
+    GSequenceIter *i;
+    i = g_sequence_search(rangeset->seq, &offset, compare64, NULL);
+    i = g_sequence_iter_prev(i);
+    if (g_sequence_iter_is_end(i))
+        return NULL;
+    BlueSkyRangesetItem *item = (BlueSkyRangesetItem *)g_sequence_get(i);
+    if (item->start < offset) {
+        i = g_sequence_iter_next(i);
+        if (g_sequence_iter_is_end(i))
+            item = NULL;
+        else
+            item = (BlueSkyRangesetItem *)g_sequence_get(i);
+    }
+    return item;
+}
+
+/* Determine the full extent of a rangeset--the smallest offset covered and the
+ * length needed to extend to the end of the last item. */
+void bluesky_rangeset_get_extents(BlueSkyRangeset *rangeset,
+                                  uint64_t *start, uint64_t *length)
+{
+    GSequenceIter *i;
+    BlueSkyRangesetItem *item;
+
+    i = g_sequence_get_begin_iter(rangeset->seq);
+    if (g_sequence_iter_is_end(i)) {
+        *start = 0;
+        *length = 0;
+        return;
+    }
+
+    item = (BlueSkyRangesetItem *)g_sequence_get(i);
+    *start = item->start;
+
+    i = g_sequence_get_end_iter(rangeset->seq);
+    i = g_sequence_iter_prev(i);
+    item = (BlueSkyRangesetItem *)g_sequence_get(i);
+    *length = (item->start + item->length) - *start;
+}