changeset 14676:69ba6977bed8

seq_range_array_add() API changed. Added other functions to provide the less common use cases.
author Timo Sirainen <tss@iki.fi>
date Sun, 24 Jun 2012 21:14:56 +0300
parents f07ba5e7d97d
children 737a49f472d1
files src/doveadm/dsync/dsync-mailbox-export.c src/doveadm/dsync/dsync-mailbox-import.c src/imap/cmd-store.c src/imap/imap-search.c src/lib-index/mail-index-sync-update.c src/lib-index/mail-index-transaction-finish.c src/lib-index/mail-index-transaction-sort-appends.c src/lib-index/mail-index-transaction-update.c src/lib-index/mail-index-view-sync.c src/lib-storage/index/dbox-multi/mdbox-map.c src/lib-storage/index/dbox-multi/mdbox-purge.c src/lib-storage/index/dbox-multi/mdbox-storage-rebuild.c src/lib-storage/index/dbox-multi/mdbox-sync.c src/lib-storage/index/imapc/imapc-save.c src/lib-storage/index/index-search.c src/lib-storage/index/index-sync-search.c src/lib-storage/index/index-sync.c src/lib-storage/mail-search.c src/lib-storage/mailbox-get.c src/lib-storage/mailbox-search-result.c src/lib/seq-range-array.c src/lib/seq-range-array.h src/lib/test-seq-range-array.c src/plugins/fts-lucene/lucene-wrapper.cc src/plugins/fts-solr/solr-connection.c src/plugins/fts-squat/squat-trie.c src/plugins/fts-squat/squat-uidlist.c src/plugins/fts/fts-api.c src/plugins/fts/fts-expunge-log.c src/plugins/fts/fts-search.c src/plugins/virtual/virtual-search.c src/plugins/virtual/virtual-storage.c src/plugins/virtual/virtual-sync.c
diffstat 33 files changed, 95 insertions(+), 80 deletions(-) [+]
line wrap: on
line diff
--- a/src/doveadm/dsync/dsync-mailbox-export.c	Sun Jun 24 20:58:04 2012 +0300
+++ b/src/doveadm/dsync/dsync-mailbox-export.c	Sun Jun 24 21:14:56 2012 +0300
@@ -212,7 +212,7 @@
 
 	if (exporter->auto_export_mails && !exporter->mails_have_guids) {
 		/* GUIDs not supported, mail is requested by UIDs */
-		seq_range_array_add(&exporter->requested_uids, 0, change->uid);
+		seq_range_array_add(&exporter->requested_uids, change->uid);
 		return;
 	}
 	if (*change->guid == '\0') {
@@ -232,7 +232,7 @@
 		if (exporter->auto_export_mails)
 			instances->requested = TRUE;
 	}
-	seq_range_array_add(&instances->seqs, 0, seq);
+	seq_range_array_add(&instances->seqs, seq);
 }
 
 static int
@@ -273,7 +273,7 @@
 		const struct dsync_mail_change *change = value;
 
 		if (change->type == DSYNC_MAIL_CHANGE_TYPE_FLAG_CHANGE)
-			seq_range_array_add(uids, 0, change->uid);
+			seq_range_array_add(uids, change->uid);
 	}
 	hash_table_iterate_deinit(&iter);
 }
@@ -494,7 +494,7 @@
 		seq = uids[0].seq1;
 		if (!instances->searched) {
 			instances->searched = TRUE;
-			seq_range_array_add(&sarg->value.seqset, 0, seq);
+			seq_range_array_add(&sarg->value.seqset, seq);
 		} else if (seq_range_exists(&exporter->expunged_seqs, seq)) {
 			/* we're on a second round, refetching expunged
 			   messages */
@@ -508,7 +508,7 @@
 			}
 			uids = array_idx(&instances->seqs, 0);
 			seq = uids[0].seq1;
-			seq_range_array_add(&sarg->value.seqset, 0, seq);
+			seq_range_array_add(&sarg->value.seqset, seq);
 		}
 	}
 	hash_table_iterate_deinit(&iter);
@@ -608,7 +608,7 @@
 
 	if (*request->guid == '\0') {
 		i_assert(request->uid > 0);
-		seq_range_array_add(&exporter->requested_uids, 0, request->uid);
+		seq_range_array_add(&exporter->requested_uids, request->uid);
 		return;
 	}
 
@@ -648,7 +648,7 @@
 		}
 		/* the message was expunged. if the GUID has another instance,
 		   try sending it later. */
-		seq_range_array_add(&exporter->expunged_seqs, 0, mail->seq);
+		seq_range_array_add(&exporter->expunged_seqs, mail->seq);
 	}
 	/* if some instances of messages were expunged, retry fetching them
 	   with other instances */
--- a/src/doveadm/dsync/dsync-mailbox-import.c	Sun Jun 24 20:58:04 2012 +0300
+++ b/src/doveadm/dsync/dsync-mailbox-import.c	Sun Jun 24 21:14:56 2012 +0300
@@ -199,7 +199,7 @@
 			/* this message exists locally, but remote didn't send
 			   expunge-change for it. if the message's
 			   uid <= last-common-uid, it should be deleted */
-			seq_range_array_add(&importer->maybe_expunge_uids, 0,
+			seq_range_array_add(&importer->maybe_expunge_uids, 
 					    importer->cur_mail->uid);
 		}
 
@@ -751,8 +751,7 @@
 		/* we don't know yet if we should expunge this
 		   message or not. queue it until we do. */
 		i_assert(change->uid > importer->last_common_uid);
-		seq_range_array_add(&importer->maybe_expunge_uids, 0,
-				    change->uid);
+		seq_range_array_add(&importer->maybe_expunge_uids, change->uid);
 	}
 }
 
--- a/src/imap/cmd-store.c	Sun Jun 24 20:58:04 2012 +0300
+++ b/src/imap/cmd-store.c	Sun Jun 24 21:14:56 2012 +0300
@@ -189,8 +189,7 @@
 			/* check early so there's less work for transaction
 			   commit if something has to be cancelled */
 			if (mail_get_modseq(mail) > ctx.max_modseq) {
-				seq_range_array_add(&modified_set, 0,
-						    mail->seq);
+				seq_range_array_add(&modified_set, mail->seq);
 				continue;
 			}
 		}
--- a/src/imap/imap-search.c	Sun Jun 24 20:58:04 2012 +0300
+++ b/src/imap/imap-search.c	Sun Jun 24 21:14:56 2012 +0300
@@ -334,7 +334,7 @@
 	}
 	if ((ctx->return_options & SEARCH_RETURN_SAVE) != 0) {
 		seq_range_array_add(&ctx->cmd->client->search_saved_uidset,
-				    0, mail->uid);
+				    mail->uid);
 	}
 	if ((ctx->return_options & SEARCH_RETURN_RELEVANCY) != 0) {
 		const char *str;
--- a/src/lib-index/mail-index-sync-update.c	Sun Jun 24 20:58:04 2012 +0300
+++ b/src/lib-index/mail-index-sync-update.c	Sun Jun 24 21:14:56 2012 +0300
@@ -545,7 +545,7 @@
 					rec->uid);
 				break;
 			}
-			seq_range_array_add(&uids, 0, rec->uid);
+			seq_range_array_add(&uids, rec->uid);
 		}
 
 		/* do this in reverse so the memmove()s are smaller */
--- a/src/lib-index/mail-index-transaction-finish.c	Sun Jun 24 20:58:04 2012 +0300
+++ b/src/lib-index/mail-index-transaction-finish.c	Sun Jun 24 21:14:56 2012 +0300
@@ -129,7 +129,7 @@
 			if ((rec->flags & u->add_flags) != u->add_flags ||
 			    (rec->flags & u->remove_flags) != 0) {
 				/* keep this change */
-				seq_range_array_add(&keeps, 0, seq);
+				seq_range_array_add(&keeps, seq);
 			}
 		}
 		i = mail_transaction_drop_range(t, updates[i], i, &keeps);
@@ -163,7 +163,7 @@
 			ret1 = mail_index_cancel_flag_updates(t, seq);
 			ret2 = mail_index_cancel_keyword_updates(t, seq);
 			if (ret1 || ret2)
-				seq_range_array_add(t->conflict_seqs, 0, seq);
+				seq_range_array_add(t->conflict_seqs, seq);
 		}
 	}
 	mail_index_transaction_set_log_updates(t);
--- a/src/lib-index/mail-index-transaction-sort-appends.c	Sun Jun 24 20:58:04 2012 +0300
+++ b/src/lib-index/mail-index-transaction-sort-appends.c	Sun Jun 24 21:14:56 2012 +0300
@@ -95,7 +95,7 @@
 		idx1 = range[i].seq1 - first_new_seq;
 		idx2 = range[i].seq2 - first_new_seq;
 		for (idx = idx1; idx <= idx2; idx++)
-			seq_range_array_add(array, 0, old_to_newseq_map[idx]);
+			seq_range_array_add(array, old_to_newseq_map[idx]);
 	}
 	array_free(&old_seqs);
 }
--- a/src/lib-index/mail-index-transaction-update.c	Sun Jun 24 20:58:04 2012 +0300
+++ b/src/lib-index/mail-index-transaction-update.c	Sun Jun 24 21:14:56 2012 +0300
@@ -1089,15 +1089,17 @@
 			seq_range_array_remove(&u->add_seq, seq);
 			/* Don't bother updating remove_seq for new messages,
 			   since their initial state is "no keyword" anyway */
-			if (seq < t->first_new_seq)
-				seq_range_array_add(&u->remove_seq, 16, seq);
+			if (seq < t->first_new_seq) {
+				seq_range_array_add_with_init(&u->remove_seq,
+							      16, seq);
+			}
 		}
 	}
 	if (add_keywords != NULL) {
 		for (i = 0; i < add_keywords->count; i++) {
 			u = array_idx_modifiable(&t->keyword_updates,
 						 add_keywords->idx[i]);
-			seq_range_array_add(&u->add_seq, 16, seq);
+			seq_range_array_add_with_init(&u->add_seq, 16, seq);
 			seq_range_array_remove(&u->remove_seq, seq);
 		}
 	}
--- a/src/lib-index/mail-index-view-sync.c	Sun Jun 24 20:58:04 2012 +0300
+++ b/src/lib-index/mail-index-view-sync.c	Sun Jun 24 21:14:56 2012 +0300
@@ -145,7 +145,7 @@
 
 	src_count = src_size / sizeof(*src);
 	for (i = 0; i < src_count; i++)
-		seq_range_array_add(dest, 0, src[i].uid);
+		seq_range_array_add(dest, src[i].uid);
 }
 
 static int
@@ -394,7 +394,7 @@
 	   be avoided by always keeping a private copy of the map in the view,
 	   but that's a waste of memory for as rare of a problem as this. */
 	if (changed)
-		seq_range_array_add(&ctx->lost_flags, 0, new_rec->uid);
+		seq_range_array_add(&ctx->lost_flags, new_rec->uid);
 	return 0;
 }
 
@@ -437,7 +437,7 @@
 			i++; j++;
 		} else if (old_rec->uid < new_rec->uid) {
 			/* message expunged */
-			seq_range_array_add(&ctx->expunges, 0, old_rec->uid);
+			seq_range_array_add(&ctx->expunges, old_rec->uid);
 			i++;
 		} else {
 			/* new message appeared out of nowhere */
@@ -451,7 +451,7 @@
 	/* if there are old messages left, they're all expunged */
 	for (; i < old_count; i++) {
 		old_rec = MAIL_INDEX_MAP_IDX(old_map, i);
-		seq_range_array_add(&ctx->expunges, 0, old_rec->uid);
+		seq_range_array_add(&ctx->expunges, old_rec->uid);
 	}
 	/* if there are new messages left, they're all new messages */
 	thdr.type = MAIL_TRANSACTION_APPEND | MAIL_TRANSACTION_EXTERNAL;
--- a/src/lib-storage/index/dbox-multi/mdbox-map.c	Sun Jun 24 20:58:04 2012 +0300
+++ b/src/lib-storage/index/dbox-multi/mdbox-map.c	Sun Jun 24 21:14:56 2012 +0300
@@ -444,7 +444,7 @@
 				      &data, &expunged);
 		if (data != NULL && !expunged) {
 			rec = data;
-			seq_range_array_add(file_ids_r, 0, rec->file_id);
+			seq_range_array_add(file_ids_r, rec->file_id);
 		}
 	}
 	return 0;
@@ -971,7 +971,7 @@
 				  &file_id) < 0)
 			continue;
 
-		seq_range_array_add(file_ids_r, 0, file_id);
+		seq_range_array_add(file_ids_r, file_id);
 	}
 	if (errno != 0) {
 		mail_storage_set_critical(storage,
@@ -1023,7 +1023,7 @@
 
 		if (seq_range_exists(&checked_file_ids, rec->file_id))
 			continue;
-		seq_range_array_add(&checked_file_ids, 0, rec->file_id);
+		seq_range_array_add(&checked_file_ids, rec->file_id);
 
 		if (++backwards_lookup_count > MAX_BACKWARDS_LOOKUPS) {
 			/* we've wasted enough time here */
--- a/src/lib-storage/index/dbox-multi/mdbox-purge.c	Sun Jun 24 20:58:04 2012 +0300
+++ b/src/lib-storage/index/dbox-multi/mdbox-purge.c	Sun Jun 24 21:14:56 2012 +0300
@@ -369,7 +369,7 @@
 							 &ext_refs);
 			if (ret <= 0)
 				break;
-			seq_range_array_add(&expunged_map_uids, 0,
+			seq_range_array_add(&expunged_map_uids,
 					    msgs[i].map_uid);
 		} else {
 			/* non-expunged message. write it to output file. */
@@ -534,7 +534,7 @@
 
 		str_truncate(path, dir_len);
 		str_append(path, d->d_name);
-		seq_range_array_add(&ctx->primary_file_ids, 0, file_id);
+		seq_range_array_add(&ctx->primary_file_ids, file_id);
 	}
 	if (array_count(&ctx->primary_file_ids) > 0) {
 		const struct seq_range *range =
@@ -602,7 +602,7 @@
 			hash_table_insert(ctx->altmoves,
 				POINTER_CAST(cur_map_uid),
 				POINTER_CAST(MDBOX_MSG_ACTION_MOVE_TO_ALT));
-			seq_range_array_add(&ctx->purge_file_ids, 0,
+			seq_range_array_add(&ctx->purge_file_ids,
 					    cur_rec.file_id);
 		}
 	}
@@ -634,7 +634,7 @@
 
 		hash_table_insert(ctx->altmoves, POINTER_CAST(cur_map_uid),
 				  POINTER_CAST(MDBOX_MSG_ACTION_MOVE_FROM_ALT));
-		seq_range_array_add(&ctx->purge_file_ids, 0, cur_rec.file_id);
+		seq_range_array_add(&ctx->purge_file_ids, cur_rec.file_id);
 	}
 	ctx->have_altmoves = hash_table_count(ctx->altmoves) > 0;
 	return ret;
--- a/src/lib-storage/index/dbox-multi/mdbox-storage-rebuild.c	Sun Jun 24 20:58:04 2012 +0300
+++ b/src/lib-storage/index/dbox-multi/mdbox-storage-rebuild.c	Sun Jun 24 21:14:56 2012 +0300
@@ -262,7 +262,7 @@
 		if (rebuild_rename_file(ctx, dir, &fname, &file_id) < 0)
 			return -1;
 	}
-	seq_range_array_add(&ctx->seen_file_ids, 0, file_id);
+	seq_range_array_add(&ctx->seen_file_ids, file_id);
 
 	file = mdbox_file_init(ctx->storage, file_id);
 	if ((ret = dbox_file_open(file, &deleted)) > 0 && !deleted)
--- a/src/lib-storage/index/dbox-multi/mdbox-sync.c	Sun Jun 24 20:58:04 2012 +0300
+++ b/src/lib-storage/index/dbox-multi/mdbox-sync.c	Sun Jun 24 21:14:56 2012 +0300
@@ -52,7 +52,7 @@
 {
 	uint32_t map_uid;
 
-	if (seq_range_array_add(&ctx->expunged_seqs, 0, seq)) {
+	if (seq_range_array_try_add(&ctx->expunged_seqs, seq)) {
 		/* already marked as expunged in this sync */
 		return 0;
 	}
--- a/src/lib-storage/index/imapc/imapc-save.c	Sun Jun 24 20:58:04 2012 +0300
+++ b/src/lib-storage/index/imapc/imapc-save.c	Sun Jun 24 21:14:56 2012 +0300
@@ -126,7 +126,7 @@
 		return;
 
 	if (str_to_uint32(args[1], &dest_uid) == 0) {
-		seq_range_array_add(&ctx->dest_saved_uids, 0, dest_uid);
+		seq_range_array_add(&ctx->dest_saved_uids, dest_uid);
 		*uid_r = dest_uid;
 	}
 }
@@ -342,7 +342,7 @@
 		return;
 
 	if (str_to_uint32(args[2], &dest_uid) == 0) {
-		seq_range_array_add(&ctx->dest_saved_uids, 0, dest_uid);
+		seq_range_array_add(&ctx->dest_saved_uids, dest_uid);
 		*uid_r = dest_uid;
 	}
 }
--- a/src/lib-storage/index/index-search.c	Sun Jun 24 20:58:04 2012 +0300
+++ b/src/lib-storage/index/index-search.c	Sun Jun 24 21:14:56 2012 +0300
@@ -717,7 +717,7 @@
 		if (range[count-1].seq2 == (uint32_t)-1) {
 			/* "*" used, make sure the last message is in the range
 			   (e.g. with count+1:* we still want to include it) */
-			seq_range_array_add(seqset, 0, messages_count);
+			seq_range_array_add(seqset, messages_count);
 		}
 		/* remove all nonexistent messages */
 		seq_range_array_remove_range(seqset, messages_count + 1,
@@ -969,7 +969,7 @@
 			if (search_build_subthread(child_iter, uids) < 0)
 				ret = -1;
 		}
-		seq_range_array_add(uids, 0, node->uid);
+		seq_range_array_add(uids, node->uid);
 	}
 	if (mail_thread_iterate_deinit(&iter) < 0)
 		ret = -1;
@@ -1010,7 +1010,7 @@
 	iter = mail_thread_iterate_init(ctx->thread_ctx,
 					arg->value.thread_type, FALSE);
 	while ((node = mail_thread_iterate_next(iter, &child_iter)) != NULL) {
-		seq_range_array_add(&thread_uids, 0, node->uid);
+		seq_range_array_add(&thread_uids, node->uid);
 		if (child_iter != NULL) {
 			if (search_build_subthread(child_iter,
 						   &thread_uids) < 0)
--- a/src/lib-storage/index/index-sync-search.c	Sun Jun 24 20:58:04 2012 +0300
+++ b/src/lib-storage/index/index-sync-search.c	Sun Jun 24 21:14:56 2012 +0300
@@ -28,7 +28,7 @@
 	array_foreach(changes, range) {
 		for (seq = range->seq1; seq <= range->seq2; seq++) {
 			mail_index_lookup_uid(ctx->ctx.box->view, seq, &uid);
-			seq_range_array_add(&ctx->all_flag_update_uids, 0, uid);
+			seq_range_array_add(&ctx->all_flag_update_uids, uid);
 		}
 	}
 }
--- a/src/lib-storage/index/index-sync.c	Sun Jun 24 20:58:04 2012 +0300
+++ b/src/lib-storage/index/index-sync.c	Sun Jun 24 21:14:56 2012 +0300
@@ -53,7 +53,7 @@
 	}
 	ibox->recent_flags_prev_uid = uid;
 
-	seq_range_array_add(&ibox->recent_flags, 64, uid);
+	seq_range_array_add_with_init(&ibox->recent_flags, 64, uid);
 	ibox->recent_flags_count++;
 }
 
--- a/src/lib-storage/mail-search.c	Sun Jun 24 20:58:04 2012 +0300
+++ b/src/lib-storage/mail-search.c	Sun Jun 24 21:14:56 2012 +0300
@@ -57,7 +57,7 @@
 			/* make sure the last message is in the range */
 			mailbox_get_seq_range(box, 1, (uint32_t)-1,
 					      &seq1, &seq2);
-			seq_range_array_add(&arg->value.seqset, 0, seq2);
+			seq_range_array_add(&arg->value.seqset, seq2);
 		}
 	}
 }
--- a/src/lib-storage/mailbox-get.c	Sun Jun 24 20:58:04 2012 +0300
+++ b/src/lib-storage/mailbox-get.c	Sun Jun 24 21:14:56 2012 +0300
@@ -29,7 +29,7 @@
 		}
 		for (seq = range[i].seq1; seq <= range[i].seq2; seq++) {
 			mail_index_lookup_uid(box->view, seq, &uid);
-			seq_range_array_add(uids, 0, uid);
+			seq_range_array_add(uids, uid);
 		}
 	}
 }
@@ -59,7 +59,7 @@
 	end = src + src_size / sizeof(*src);
 	for (; src != end; src++) {
 		if (src->uid >= min_uid)
-			seq_range_array_add(expunged_uids, 0, src->uid);
+			seq_range_array_add(expunged_uids, src->uid);
 	}
 }
 
--- a/src/lib-storage/mailbox-search-result.c	Sun Jun 24 20:58:04 2012 +0300
+++ b/src/lib-storage/mailbox-search-result.c	Sun Jun 24 21:14:56 2012 +0300
@@ -121,9 +121,9 @@
 	if (seq_range_exists(&result->uids, uid))
 		return;
 
-	seq_range_array_add(&result->uids, 0, uid);
+	seq_range_array_add(&result->uids, uid);
 	if (array_is_created(&result->added_uids)) {
-		seq_range_array_add(&result->added_uids, 0, uid);
+		seq_range_array_add(&result->added_uids, uid);
 		seq_range_array_remove(&result->removed_uids, uid);
 	}
 }
@@ -133,7 +133,7 @@
 {
 	if (seq_range_array_remove(&result->uids, uid)) {
 		if (array_is_created(&result->removed_uids)) {
-			seq_range_array_add(&result->removed_uids, 0, uid);
+			seq_range_array_add(&result->removed_uids, uid);
 			seq_range_array_remove(&result->added_uids, uid);
 		}
 	}
@@ -162,7 +162,7 @@
 void mailbox_search_result_never(struct mail_search_result *result,
 				 uint32_t uid)
 {
-	seq_range_array_add(&result->never_uids, 0, uid);
+	seq_range_array_add(&result->never_uids, uid);
 }
 
 void mailbox_search_results_never(struct mail_search_context *ctx,
--- a/src/lib/seq-range-array.c	Sun Jun 24 20:58:04 2012 +0300
+++ b/src/lib/seq-range-array.c	Sun Jun 24 21:14:56 2012 +0300
@@ -33,17 +33,13 @@
 	return FALSE;
 }
 
-bool seq_range_array_add(ARRAY_TYPE(seq_range) *array,
-			 unsigned int init_count, uint32_t seq)
+bool seq_range_array_try_add(ARRAY_TYPE(seq_range) *array, uint32_t seq)
 {
 	struct seq_range *data, value;
 	unsigned int idx, count;
 
 	value.seq1 = value.seq2 = seq;
 
-	if (!array_is_created(array))
-		i_array_init(array, init_count);
-
 	data = array_get_modifiable(array, &count);
 	if (count == 0) {
 		array_append(array, &value, 1);
@@ -104,6 +100,19 @@
 	return FALSE;
 }
 
+void seq_range_array_add(ARRAY_TYPE(seq_range) *array, uint32_t seq)
+{
+	(void)seq_range_array_try_add(array, seq);
+}
+
+void seq_range_array_add_with_init(ARRAY_TYPE(seq_range) *array,
+				   unsigned int init_count, uint32_t seq)
+{
+	if (!array_is_created(array))
+		i_array_init(array, init_count);
+	(void)seq_range_array_try_add(array, seq);
+}
+
 void seq_range_array_add_range(ARRAY_TYPE(seq_range) *array,
 			       uint32_t seq1, uint32_t seq2)
 {
--- a/src/lib/seq-range-array.h	Sun Jun 24 20:58:04 2012 +0300
+++ b/src/lib/seq-range-array.h	Sun Jun 24 21:14:56 2012 +0300
@@ -12,9 +12,15 @@
 };
 
 /* Add sequrence to range. If the array isn't created yet, create it with
-   initial size of init_count. Returns TRUE if seq was already in the array. */
-bool seq_range_array_add(ARRAY_TYPE(seq_range) *array, unsigned int init_count,
-			 uint32_t seq);
+   initial size of init_count. */
+void seq_range_array_add(ARRAY_TYPE(seq_range) *array, uint32_t seq);
+/* Like seq_range_array_add(), but reutrn TRUE if seq was already in the
+   array. */
+bool seq_range_array_try_add(ARRAY_TYPE(seq_range) *array, uint32_t seq);
+/* Like seq_range_array_add(), but if the array isn't already initialized do
+   it with i_array_init(). */
+void seq_range_array_add_with_init(ARRAY_TYPE(seq_range) *array,
+				   unsigned int init_count, uint32_t seq);
 void seq_range_array_add_range(ARRAY_TYPE(seq_range) *array,
 			       uint32_t seq1, uint32_t seq2);
 void seq_range_array_merge(ARRAY_TYPE(seq_range) *dest,
--- a/src/lib/test-seq-range-array.c	Sun Jun 24 20:58:04 2012 +0300
+++ b/src/lib/test-seq-range-array.c	Sun Jun 24 21:14:56 2012 +0300
@@ -12,9 +12,9 @@
 
 	test_begin("seq_range_array_add() merging");
 	t_array_init(&range, 8);
-	seq_range_array_add(&range, 0, 4);
-	seq_range_array_add(&range, 0, 1);
-	seq_range_array_add(&range, 0, 2);
+	seq_range_array_add(&range, 4);
+	seq_range_array_add(&range, 1);
+	seq_range_array_add(&range, 2);
 	test_assert(array_count(&range) == 2);
 	test_end();
 }
@@ -39,7 +39,7 @@
 		test = rand() % 4;
 		switch (test) {
 		case 0:
-			seq_range_array_add(&range, 0, seq1);
+			seq_range_array_add(&range, seq1);
 			shadowbuf[seq1] = 1;
 			break;
 		case 1:
@@ -112,7 +112,7 @@
 		success = TRUE;
 		start = i;
 		for (; input[i] != -1U; i++) {
-			seq_range_array_add(&range, 32, input[i]);
+			seq_range_array_add_with_init(&range, 32, input[i]);
 			for (j = start; j < i; j++) {
 				if (!seq_range_exists(&range, input[j]))
 					success = FALSE;
@@ -142,7 +142,7 @@
 	array_clear(array);
 	for (i = 0; i < 8; i++) {
 		if ((byte & (1 << i)) != 0)
-			seq_range_array_add(array, 0, i + 1);
+			seq_range_array_add(array, i + 1);
 	}
 }
 
--- a/src/plugins/fts-lucene/lucene-wrapper.cc	Sun Jun 24 20:58:04 2012 +0300
+++ b/src/plugins/fts-lucene/lucene-wrapper.cc	Sun Jun 24 21:14:56 2012 +0300
@@ -1237,7 +1237,7 @@
 				score->uid = uid;
 				score->score = hits->score(i);
 			}
-			seq_range_array_add(uids_r, 0, uid);
+			seq_range_array_add(uids_r, uid);
 		}
 		_CLDELETE(hits);
 		return ret;
@@ -1346,7 +1346,7 @@
 				p_array_init(&br->definite_uids, result->pool, 32);
 				p_array_init(&br->scores, result->pool, 32);
 			}
-			seq_range_array_add(&br->definite_uids, 0, uid);
+			seq_range_array_add(&br->definite_uids, uid);
 			score = array_append_space(&br->scores);
 			score->uid = uid;
 			score->score = hits->score(i);
--- a/src/plugins/fts-solr/solr-connection.c	Sun Jun 24 20:58:04 2012 +0300
+++ b/src/plugins/fts-solr/solr-connection.c	Sun Jun 24 21:14:56 2012 +0300
@@ -317,7 +317,7 @@
 	}
 	result = solr_result_get(ctx, box_id);
 
-	seq_range_array_add(&result->uids, 0, ctx->uid);
+	seq_range_array_add(&result->uids, ctx->uid);
 	if (ctx->score != 0) {
 		score = array_append_space(&result->scores);
 		score->uid = ctx->uid;
--- a/src/plugins/fts-squat/squat-trie.c	Sun Jun 24 20:58:04 2012 +0300
+++ b/src/plugins/fts-squat/squat-trie.c	Sun Jun 24 21:14:56 2012 +0300
@@ -1884,7 +1884,7 @@
 	for (i = 0; i < count; i++) {
 		for (uid = src_range[i].seq1; uid <= src_range[i].seq2; uid++) {
 			if ((uid & 1) == mask)
-				seq_range_array_add(dest, 0, uid/2);
+				seq_range_array_add(dest, uid/2);
 		}
 	}
 }
--- a/src/plugins/fts-squat/squat-uidlist.c	Sun Jun 24 20:58:04 2012 +0300
+++ b/src/plugins/fts-squat/squat-uidlist.c	Sun Jun 24 21:14:56 2012 +0300
@@ -1594,7 +1594,7 @@
 				ret = -1;
 				break;
 			}
-			seq_range_array_add(&dest_uids, 0, parent_uid);
+			seq_range_array_add(&dest_uids, parent_uid);
 			for (; parent_idx < parent_count; parent_idx++) {
 				if (parent_range[parent_idx].seq2 <= parent_uid)
 					continue;
--- a/src/plugins/fts/fts-api.c	Sun Jun 24 20:58:04 2012 +0300
+++ b/src/plugins/fts/fts-api.c	Sun Jun 24 21:14:56 2012 +0300
@@ -235,7 +235,7 @@
 	for (i = 0; i < count; i++) {
 		for (seq = range[i].seq1; seq <= range[i].seq2; seq++) {
 			if (seq_range_exists(src_maybe, seq))
-				seq_range_array_add(dest_maybe, 0, seq);
+				seq_range_array_add(dest_maybe, seq);
 		}
 	}
 }
--- a/src/plugins/fts/fts-expunge-log.c	Sun Jun 24 20:58:04 2012 +0300
+++ b/src/plugins/fts/fts-expunge-log.c	Sun Jun 24 21:14:56 2012 +0300
@@ -214,7 +214,7 @@
 			mailbox = fts_expunge_log_mailbox_alloc(ctx, mailbox_guid);
 		ctx->prev_mailbox = mailbox;
 	}
-	if (!seq_range_array_add(&mailbox->uids, 0, uid))
+	if (!seq_range_array_try_add(&mailbox->uids, uid))
 		mailbox->uids_count++;
 }
 
--- a/src/plugins/fts/fts-search.c	Sun Jun 24 20:58:04 2012 +0300
+++ b/src/plugins/fts/fts-search.c	Sun Jun 24 21:14:56 2012 +0300
@@ -72,7 +72,7 @@
 	t_array_init(&vuids_arr, count);
 	t_array_init(&backend_uids, 64);
 	for (i = 0; i < count; i++)
-		seq_range_array_add(&backend_uids, 0, scores[i].uid);
+		seq_range_array_add(&backend_uids, scores[i].uid);
 	vbox->vfuncs.get_virtual_uid_map(&vbox->box, br->box,
 					 &backend_uids, &vuids_arr);
 
--- a/src/plugins/virtual/virtual-search.c	Sun Jun 24 20:58:04 2012 +0300
+++ b/src/plugins/virtual/virtual-search.c	Sun Jun 24 21:14:56 2012 +0300
@@ -79,7 +79,7 @@
 		i_assert(result != 0);
 		if (result > 0) {
 			/* full match, no need to check this any further */
-			seq_range_array_add(&vctx->result, 0, ctx->seq);
+			seq_range_array_add(&vctx->result, ctx->seq);
 		} else {
 			/* possible match, save and check later */
 			mail_index_lookup_ext(mbox->box.view, ctx->seq,
@@ -153,7 +153,7 @@
 		/* the messages won't be returned sorted, so we'll have to
 		   do it ourself */
 		while (index_storage_search_next_nonblock(ctx, mail_r, tryagain_r))
-			seq_range_array_add(&vctx->result, 0, (*mail_r)->seq);
+			seq_range_array_add(&vctx->result, (*mail_r)->seq);
 		if (*tryagain_r)
 			return FALSE;
 
--- a/src/plugins/virtual/virtual-storage.c	Sun Jun 24 20:58:04 2012 +0300
+++ b/src/plugins/virtual/virtual-storage.c	Sun Jun 24 21:14:56 2012 +0300
@@ -424,7 +424,7 @@
 	while (seq_range_array_iter_nth(&iter, n++, &uid)) {
 		while (i < count && uids[i].real_uid < uid) i++;
 		if (i < count && uids[i].real_uid == uid) {
-			seq_range_array_add(virtual_uids_r, 0,
+			seq_range_array_add(virtual_uids_r, 
 					    uids[i].virtual_uid);
 			i++;
 		}
--- a/src/plugins/virtual/virtual-sync.c	Sun Jun 24 20:58:04 2012 +0300
+++ b/src/plugins/virtual/virtual-sync.c	Sun Jun 24 21:14:56 2012 +0300
@@ -659,10 +659,10 @@
 
 			if (mail_index_lookup_seq(bbox->box->view,
 						  vrec->real_uid, &seq)) {
-				seq_range_array_add(&result->uids, 0,
+				seq_range_array_add(&result->uids, 
 						    vrec->real_uid);
 			} else {
-				seq_range_array_add(&result->removed_uids, 0,
+				seq_range_array_add(&result->removed_uids,
 						    vrec->real_uid);
 			}
 		}
@@ -705,7 +705,7 @@
 			modseq = mail_index_modseq_lookup(view, seq);
 			if (modseq > bbox->sync_highest_modseq) {
 				mail_index_lookup_uid(view, seq, &uid);
-				seq_range_array_add(&flag_update_uids, 0, uid);
+				seq_range_array_add(&flag_update_uids, uid);
 			}
 		}
 	}
@@ -755,7 +755,7 @@
 			continue;
 		}
 		if (uidmap[i].real_uid == add_uid) {
-			seq_range_array_add(&drop_uids, 0, add_uid);
+			seq_range_array_add(&drop_uids, add_uid);
 			i++;
 		}
 		if (!seq_range_array_iter_nth(&iter, n++, &add_uid))
@@ -789,7 +789,7 @@
 			continue;
 		}
 		if (uidmap[i].real_uid != remove_uid)
-			seq_range_array_add(&drop_uids, 0, remove_uid);
+			seq_range_array_add(&drop_uids, remove_uid);
 		else
 			i++;
 		if (!seq_range_array_iter_nth(&iter, n++, &remove_uid)) {
@@ -799,7 +799,7 @@
 	}
 	if (!iter_done) {
 		do {
-			seq_range_array_add(&drop_uids, 0, remove_uid);
+			seq_range_array_add(&drop_uids, remove_uid);
 		} while (seq_range_array_iter_nth(&iter, n++, &remove_uid));
 	}
 	seq_range_array_remove_seq_range(removed_uids, &drop_uids);
@@ -913,7 +913,7 @@
 	for (i = idx1; i < count; i++) {
 		if (uidmap[i].real_uid > uid2)
 			break;
-		seq_range_array_add(&ctx->sync_expunges, 0, uidmap[i].real_uid);
+		seq_range_array_add(&ctx->sync_expunges, uidmap[i].real_uid);
 	}
 }
 
@@ -1371,7 +1371,7 @@
 			if (!array_is_created(&bbox->sync_outside_expunges))
 				i_array_init(&bbox->sync_outside_expunges, 32);
 		}
-		seq_range_array_add(&bbox->sync_outside_expunges, 0,
+		seq_range_array_add(&bbox->sync_outside_expunges, 
 				    vrec->real_uid);
 	}
 }