summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKeith Bostic <keith@wiredtiger.com>2014-08-10 12:33:13 -0400
committerKeith Bostic <keith@wiredtiger.com>2014-08-10 12:33:13 -0400
commit49b2995d3d368c867cf885155a1e182b0a604c1e (patch)
treedb16aade9022db5060e02ff13a391dc77c2321c4
parentaec0ae8d6f4f3c8f5bfa3bbf45b8ef92206c612a (diff)
downloadmongo-49b2995d3d368c867cf885155a1e182b0a604c1e.tar.gz
Replace the collator comparison #defines with inline functions,
the #defines confuse zoom for some reason I can't figure out, might as well be consistent.
-rw-r--r--src/btree/bt_cursor.c4
-rw-r--r--src/btree/bt_slvg.c47
-rw-r--r--src/btree/bt_vrfy.c7
-rw-r--r--src/btree/bt_vrfy_dsk.c4
-rw-r--r--src/btree/rec_split.c4
-rw-r--r--src/btree/rec_write.c12
-rw-r--r--src/btree/row_srch.c19
-rw-r--r--src/conn/conn_api.c3
-rw-r--r--src/cursor/cur_bulk.c4
-rw-r--r--src/cursor/cur_ds.c3
-rw-r--r--src/include/btree.i43
-rw-r--r--src/lsm/lsm_cursor.c7
12 files changed, 95 insertions, 62 deletions
diff --git a/src/btree/bt_cursor.c b/src/btree/bt_cursor.c
index 95e1b147da8..6acc6c09acd 100644
--- a/src/btree/bt_cursor.c
+++ b/src/btree/bt_cursor.c
@@ -779,8 +779,8 @@ __wt_btcur_compare(WT_CURSOR_BTREE *a_arg, WT_CURSOR_BTREE *b_arg, int *cmpp)
*cmpp = 1;
break;
case BTREE_ROW:
- WT_RET(WT_LEX_CMP(
- session, btree->collator, &a->key, &b->key, *cmpp));
+ WT_RET(__wt_lex_compare_collator(
+ session, btree->collator, &a->key, &b->key, cmpp));
break;
WT_ILLEGAL_VALUE(session);
}
diff --git a/src/btree/bt_slvg.c b/src/btree/bt_slvg.c
index 0fe020e783a..8e4525a4c17 100644
--- a/src/btree/bt_slvg.c
+++ b/src/btree/bt_slvg.c
@@ -1310,9 +1310,10 @@ __slvg_row_range(WT_SESSION_IMPL *session, WT_STUFF *ss)
* We're done if this page starts after our stop, no
* subsequent pages can overlap our page.
*/
- WT_RET(WT_LEX_CMP(session, btree->collator,
+ WT_RET(__wt_lex_compare_collator(
+ session, btree->collator,
&ss->pages[j]->row_start,
- &ss->pages[i]->row_stop, cmp));
+ &ss->pages[i]->row_stop, &cmp));
if (cmp > 0)
break;
@@ -1402,8 +1403,8 @@ __slvg_row_range_overlap(
#define __slvg_key_copy(session, dst, src) \
__wt_buf_set(session, dst, (src)->data, (src)->size)
- WT_RET(WT_LEX_CMP(
- session, btree->collator, A_TRK_START, B_TRK_START, cmp));
+ WT_RET(__wt_lex_compare_collator(
+ session, btree->collator, A_TRK_START, B_TRK_START, &cmp));
if (cmp == 0) { /* Case #1, #4, #9 */
/*
* The secondary sort of the leaf page array was the page's LSN,
@@ -1413,8 +1414,8 @@ __slvg_row_range_overlap(
* this simplifies things, it guarantees a_trk has a higher LSN
* than b_trk.
*/
- WT_RET(WT_LEX_CMP(
- session, btree->collator, A_TRK_STOP, B_TRK_STOP, cmp));
+ WT_RET(__wt_lex_compare_collator(
+ session, btree->collator, A_TRK_STOP, B_TRK_STOP, &cmp));
if (cmp >= 0)
/*
* Case #1, #4: a_trk is a superset of b_trk, and a_trk
@@ -1433,8 +1434,8 @@ __slvg_row_range_overlap(
goto merge;
}
- WT_RET(WT_LEX_CMP(
- session, btree->collator, A_TRK_STOP, B_TRK_STOP, cmp));
+ WT_RET(__wt_lex_compare_collator(
+ session, btree->collator, A_TRK_STOP, B_TRK_STOP, &cmp));
if (cmp == 0) { /* Case #6 */
if (a_trk->gen > b_trk->gen)
/*
@@ -1452,8 +1453,8 @@ __slvg_row_range_overlap(
goto merge;
}
- WT_RET(WT_LEX_CMP(
- session, btree->collator, A_TRK_STOP, B_TRK_STOP, cmp));
+ WT_RET(__wt_lex_compare_collator(
+ session, btree->collator, A_TRK_STOP, B_TRK_STOP, &cmp));
if (cmp < 0) { /* Case #3/7 */
if (a_trk->gen > b_trk->gen) {
/*
@@ -1599,7 +1600,8 @@ __slvg_row_trk_update_start(
WT_ERR(__wt_scr_alloc(session, 0, &key));
WT_ROW_FOREACH(page, rip, i) {
WT_ERR(__wt_row_leaf_key(session, page, rip, key, 0));
- WT_ERR(WT_LEX_CMP(session, btree->collator, key, stop, cmp));
+ WT_ERR(__wt_lex_compare_collator(
+ session, btree->collator, key, stop, &cmp));
if (cmp > 0) {
found = 1;
break;
@@ -1624,8 +1626,8 @@ __slvg_row_trk_update_start(
for (i = slot + 1; i < ss->pages_next; ++i) {
if (ss->pages[i] == NULL)
continue;
- WT_ERR(WT_LEX_CMP(session, btree->collator,
- SLOT_START(i), &trk->row_stop, cmp));
+ WT_ERR(__wt_lex_compare_collator(session,
+ btree->collator, SLOT_START(i), &trk->row_stop, &cmp));
if (cmp > 0)
break;
}
@@ -1769,8 +1771,8 @@ __slvg_row_build_leaf(
/*
* >= is correct: see the comment above.
*/
- WT_ERR(WT_LEX_CMP(session,
- btree->collator, key, &trk->row_start, cmp));
+ WT_ERR(__wt_lex_compare_collator(session,
+ btree->collator, key, &trk->row_start, &cmp));
if (cmp >= 0)
break;
if (WT_VERBOSE_ISSET(session, WT_VERB_SALVAGE)) {
@@ -1792,8 +1794,8 @@ __slvg_row_build_leaf(
/*
* < is correct: see the comment above.
*/
- WT_ERR(WT_LEX_CMP(session,
- btree->collator, key, &trk->row_stop, cmp));
+ WT_ERR(__wt_lex_compare_collator(session,
+ btree->collator, key, &trk->row_stop, &cmp));
if (cmp < 0)
break;
if (WT_VERBOSE_ISSET(session, WT_VERB_SALVAGE)) {
@@ -2121,12 +2123,13 @@ __slvg_trk_compare_key(const void *a, const void *b)
btree = a_trk->ss->btree;
/*
* XXX
- * WT_LEX_CMP can potentially fail, and we're ignoring that
- * error because this routine is called as an underlying qsort
- * routine.
+ * __wt_lex_compare_collator can potentially fail, and we're
+ * ignoring that error because this routine is called as an
+ * underlying qsort routine.
*/
- (void)WT_LEX_CMP(a_trk->ss->session,
- btree->collator, &a_trk->row_start, &b_trk->row_start, cmp);
+ (void)__wt_lex_compare_collator(
+ a_trk->ss->session, btree->collator,
+ &a_trk->row_start, &b_trk->row_start, &cmp);
if (cmp != 0)
return (cmp);
break;
diff --git a/src/btree/bt_vrfy.c b/src/btree/bt_vrfy.c
index 202a07b0b89..ee3dccb01b3 100644
--- a/src/btree/bt_vrfy.c
+++ b/src/btree/bt_vrfy.c
@@ -503,7 +503,8 @@ __verify_row_int_key_order(WT_SESSION_IMPL *session,
__wt_ref_key(parent, ref, &item.data, &item.size);
/* Compare the key against the largest key we've seen so far. */
- WT_RET(WT_LEX_CMP(session, btree->collator, &item, vs->max_key, cmp));
+ WT_RET(__wt_lex_compare_collator(
+ session, btree->collator, &item, vs->max_key, &cmp));
if (cmp <= 0)
WT_RET_MSG(session, WT_ERROR,
"the internal key in entry %" PRIu32 " on the page at %s "
@@ -562,8 +563,8 @@ __verify_row_leaf_key_order(
* we've seen was a key from a previous leaf page, and it's not
* OK to compare equally in that case.
*/
- WT_RET(WT_LEX_CMP(session,
- btree->collator, vs->tmp1, (WT_ITEM *)vs->max_key, cmp));
+ WT_RET(__wt_lex_compare_collator(session,
+ btree->collator, vs->tmp1, (WT_ITEM *)vs->max_key, &cmp));
if (cmp < 0)
WT_RET_MSG(session, WT_ERROR,
"the first key on the page at %s sorts equal to or "
diff --git a/src/btree/bt_vrfy_dsk.c b/src/btree/bt_vrfy_dsk.c
index 6c4d28a03ce..c9766c61c9f 100644
--- a/src/btree/bt_vrfy_dsk.c
+++ b/src/btree/bt_vrfy_dsk.c
@@ -368,8 +368,8 @@ key_compare: /*
*/
if ((dsk->type == WT_PAGE_ROW_INT && cell_num > 3) ||
(dsk->type != WT_PAGE_ROW_INT && cell_num > 1)) {
- WT_ERR(WT_LEX_CMP(
- session, btree->collator, last, current, cmp));
+ WT_ERR(__wt_lex_compare_collator(
+ session, btree->collator, last, current, &cmp));
if (cmp >= 0)
WT_ERR_VRFY(session,
"the %" PRIu32 " and %" PRIu32 " keys on "
diff --git a/src/btree/rec_split.c b/src/btree/rec_split.c
index dac7286e90c..635f4272112 100644
--- a/src/btree/rec_split.c
+++ b/src/btree/rec_split.c
@@ -363,8 +363,8 @@ __split_verify_intl_key_order(WT_SESSION_IMPL *session, WT_PAGE *page)
if (first)
first = 0;
else {
- (void)WT_LEX_CMP(session,
- btree->collator, last, next, cmp);
+ (void)__wt_lex_compare_collator(session,
+ btree->collator, last, next, &cmp);
WT_ASSERT(session, cmp < 0);
}
}
diff --git a/src/btree/rec_write.c b/src/btree/rec_write.c
index 103447c9195..83ca90aefd2 100644
--- a/src/btree/rec_write.c
+++ b/src/btree/rec_write.c
@@ -1654,14 +1654,14 @@ __rec_split_row_promote(
}
/* Compare against the current key, it must be less. */
- WT_ERR(WT_LEX_CMP(
- session, btree->collator, update, r->cur, cmp));
+ WT_ERR(__wt_lex_compare_collator(
+ session, btree->collator, update, r->cur, &cmp));
if (cmp >= 0)
continue;
/* Compare against the last key, it must be greater. */
- WT_ERR(WT_LEX_CMP(
- session, btree->collator, update, r->last, cmp));
+ WT_ERR(__wt_lex_compare_collator(
+ session, btree->collator, update, r->last, &cmp));
if (cmp >= 0)
max = update;
@@ -2564,8 +2564,8 @@ __rec_split_write(WT_SESSION_IMPL *session,
key->data = WT_INSERT_KEY(skip->ins);
key->size = WT_INSERT_KEY_SIZE(skip->ins);
}
- WT_ERR(WT_LEX_CMP(session,
- btree->collator, key, &(bnd + 1)->key, cmp));
+ WT_ERR(__wt_lex_compare_collator(session,
+ btree->collator, key, &(bnd + 1)->key, &cmp));
if (cmp >= 0)
goto skip_check_complete;
break;
diff --git a/src/btree/row_srch.c b/src/btree/row_srch.c
index 3faa337e81c..a830da53607 100644
--- a/src/btree/row_srch.c
+++ b/src/btree/row_srch.c
@@ -31,7 +31,8 @@ __wt_search_insert_append(WT_SESSION_IMPL *session,
key.data = WT_INSERT_KEY(ins);
key.size = WT_INSERT_KEY_SIZE(ins);
- WT_RET(WT_LEX_CMP(session, btree->collator, srch_key, &key, cmp));
+ WT_RET(__wt_lex_compare_collator(
+ session, btree->collator, srch_key, &key, &cmp));
if (cmp >= 0) {
/*
* !!!
@@ -97,8 +98,8 @@ __wt_search_insert(
key.data = WT_INSERT_KEY(ins);
key.size = WT_INSERT_KEY_SIZE(ins);
match = WT_MIN(skiplow, skiphigh);
- WT_RET(WT_LEX_CMP_SKIP(session,
- btree->collator, srch_key, &key, cmp, &match));
+ WT_RET(__wt_lex_compare_skip_collator(session,
+ btree->collator, srch_key, &key, &cmp, &match));
}
if (cmp > 0) { /* Keep going at this level */
@@ -203,8 +204,8 @@ restart: page = parent->page;
if (append_check) {
child = pindex->index[pindex->entries - 1];
__wt_ref_key(page, child, &item->data, &item->size);
- WT_ERR(WT_LEX_CMP(
- session, btree->collator, srch_key, item, cmp));
+ WT_ERR(__wt_lex_compare_collator(
+ session, btree->collator, srch_key, item, &cmp));
if (cmp >= 0)
goto descend;
@@ -257,8 +258,8 @@ restart: page = parent->page;
__wt_ref_key(
page, child, &item->data, &item->size);
- WT_ERR(WT_LEX_CMP(session,
- btree->collator, srch_key, item, cmp));
+ WT_ERR(__wt_lex_compare_collator(session,
+ btree->collator, srch_key, item, &cmp));
if (cmp > 0) {
base = indx + 1;
--limit;
@@ -380,8 +381,8 @@ leaf_only:
rip = page->pg_row_d + indx;
WT_ERR(__wt_row_leaf_key(session, page, rip, item, 1));
- WT_ERR(WT_LEX_CMP(
- session, btree->collator, srch_key, item, cmp));
+ WT_ERR(__wt_lex_compare_collator(
+ session, btree->collator, srch_key, item, &cmp));
if (cmp > 0) {
base = indx + 1;
--limit;
diff --git a/src/conn/conn_api.c b/src/conn/conn_api.c
index e9d641ecf3f..8fdacb41719 100644
--- a/src/conn/conn_api.c
+++ b/src/conn/conn_api.c
@@ -27,7 +27,8 @@ ext_collate(WT_EXTENSION_API *wt_api,
if ((session = (WT_SESSION_IMPL *)wt_session) == NULL)
session = conn->default_session;
- WT_RET(WT_LEX_CMP(session, wt_api->collator, first, second, *cmpp));
+ WT_RET(__wt_lex_compare_collator(
+ session, wt_api->collator, first, second, cmpp));
return (0);
}
diff --git a/src/cursor/cur_bulk.c b/src/cursor/cur_bulk.c
index f68d8899202..b9ac8d83f76 100644
--- a/src/cursor/cur_bulk.c
+++ b/src/cursor/cur_bulk.c
@@ -167,8 +167,8 @@ __curbulk_insert_row(WT_CURSOR *cursor)
* it is only zero before the first row is inserted.
*/
if (cbulk->rle != 0) {
- WT_ERR(WT_LEX_CMP(session,
- btree->collator, &cursor->key, &cbulk->last, cmp));
+ WT_ERR(__wt_lex_compare_collator(session,
+ btree->collator, &cursor->key, &cbulk->last, &cmp));
if (cmp <= 0)
WT_ERR(__bulk_row_keycmp_err(cbulk));
}
diff --git a/src/cursor/cur_ds.c b/src/cursor/cur_ds.c
index 07cd4334c8a..69d76e99ba7 100644
--- a/src/cursor/cur_ds.c
+++ b/src/cursor/cur_ds.c
@@ -161,7 +161,8 @@ __curds_compare(WT_CURSOR *a, WT_CURSOR *b, int *cmpp)
* to be done can be done at this level.
*/
collator = ((WT_CURSOR_DATA_SOURCE *)a)->collator;
- WT_ERR(WT_LEX_CMP(session, collator, &a->key, &b->key, *cmpp));
+ WT_ERR(__wt_lex_compare_collator(
+ session, collator, &a->key, &b->key, cmpp));
}
err: API_END_RET(session, ret);
diff --git a/src/include/btree.i b/src/include/btree.i
index 19910578558..512b261dde1 100644
--- a/src/include/btree.i
+++ b/src/include/btree.i
@@ -1158,14 +1158,26 @@ __wt_lex_compare(const WT_ITEM *user_item, const WT_ITEM *tree_item)
return ((usz == tsz) ? 0 : (usz < tsz) ? -1 : 1);
}
-#define WT_LEX_CMP(s, collator, k1, k2, cmp) \
- ((collator) == NULL ? \
- (((cmp) = __wt_lex_compare((k1), (k2))), 0) : \
- (collator)->compare(collator, &(s)->iface, (k1), (k2), &(cmp)))
+/*
+ * __wt_lex_compare_collator --
+ * The same as __wt_lex_compare, but using the application's collator
+ * function when configured.
+ */
+static inline int
+__wt_lex_compare_collator(WT_SESSION_IMPL *session, WT_COLLATOR *collator,
+ const WT_ITEM *user_item, const WT_ITEM *tree_item, int *cmpp)
+{
+ if (collator == NULL) {
+ *cmpp = __wt_lex_compare(user_item, tree_item);
+ return (0);
+ }
+ return (collator->compare(
+ collator, &session->iface, user_item, tree_item, cmpp));
+}
/*
* __wt_lex_compare_skip --
- * Lexicographic comparison routine, but skipping leading bytes.
+ * Lexicographic comparison routine, skipping leading bytes.
*
* Returns:
* < 0 if user_item is lexicographically < tree_item
@@ -1197,7 +1209,20 @@ __wt_lex_compare_skip(
return ((usz == tsz) ? 0 : (usz < tsz) ? -1 : 1);
}
-#define WT_LEX_CMP_SKIP(s, collator, k1, k2, cmp, matchp) \
- ((collator) == NULL ? \
- (((cmp) = __wt_lex_compare_skip((k1), (k2), matchp)), 0) : \
- (collator)->compare(collator, &(s)->iface, (k1), (k2), &(cmp)))
+/*
+ * __wt_lex_compare_skip_collator --
+ * The same as __wt_lex_compare_skip, but using the application's collator
+ * function when configured.
+ */
+static inline int
+__wt_lex_compare_skip_collator(WT_SESSION_IMPL *session, WT_COLLATOR *collator,
+ const WT_ITEM *user_item, const WT_ITEM *tree_item, int *cmpp,
+ size_t *matchp)
+{
+ if (collator == NULL) {
+ *cmpp = __wt_lex_compare_skip(user_item, tree_item, matchp);
+ return (0);
+ }
+ return (collator->compare(
+ collator, &session->iface, user_item, tree_item, cmpp));
+}
diff --git a/src/lsm/lsm_cursor.c b/src/lsm/lsm_cursor.c
index 1c2cbd0cd33..ec3e4594a2c 100644
--- a/src/lsm/lsm_cursor.c
+++ b/src/lsm/lsm_cursor.c
@@ -12,7 +12,8 @@
if (((c) = (clsm)->cursors[--i]) != NULL)
#define WT_LSM_CURCMP(s, lsm_tree, c1, c2, cmp) \
- WT_LEX_CMP(s, (lsm_tree)->collator, &(c1)->key, &(c2)->key, cmp)
+ __wt_lex_compare_collator( \
+ s, (lsm_tree)->collator, &(c1)->key, &(c2)->key, &cmp)
/*
* LSM API enter: check that the cursor is in sync with the tree.
@@ -768,8 +769,8 @@ __clsm_compare(WT_CURSOR *a, WT_CURSOR *b, int *cmpp)
WT_CURSOR_NEEDKEY(a);
WT_CURSOR_NEEDKEY(b);
- WT_ERR(WT_LEX_CMP(
- session, alsm->lsm_tree->collator, &a->key, &b->key, cmp));
+ WT_ERR(__wt_lex_compare_collator(
+ session, alsm->lsm_tree->collator, &a->key, &b->key, &cmp));
*cmpp = cmp;
err: API_END_RET(session, ret);