1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
|
/*-
* Copyright (c) 2008-2014 WiredTiger, Inc.
* All rights reserved.
*
* See the file LICENSE for redistribution information.
*/
#include "wt_internal.h"
/*
* __wt_kv_return --
* Return a page referenced key/value pair to the application.
*/
int
__wt_kv_return(WT_SESSION_IMPL *session, WT_CURSOR_BTREE *cbt, WT_UPDATE *upd)
{
WT_BTREE *btree;
WT_CELL *cell;
WT_CELL_UNPACK unpack;
WT_CURSOR *cursor;
WT_PAGE *page;
WT_ROW *rip;
uint8_t v;
btree = S2BT(session);
page = cbt->ref->page;
cursor = &cbt->iface;
switch (page->type) {
case WT_PAGE_COL_FIX:
/*
* The interface cursor's record has usually been set, but that
* isn't universally true, specifically, cursor.search_near may
* call here without first setting the interface cursor.
*/
cursor->recno = cbt->recno;
/* If the cursor references a WT_UPDATE item, return it. */
if (upd != NULL) {
cursor->value.data = WT_UPDATE_DATA(upd);
cursor->value.size = upd->size;
return (0);
}
/* Take the value from the original page. */
v = __bit_getv_recno(page, cbt->iface.recno, btree->bitcnt);
return (__wt_buf_set(session, &cursor->value, &v, 1));
case WT_PAGE_COL_VAR:
/*
* The interface cursor's record has usually been set, but that
* isn't universally true, specifically, cursor.search_near may
* call here without first setting the interface cursor.
*/
cursor->recno = cbt->recno;
/* If the cursor references a WT_UPDATE item, return it. */
if (upd != NULL) {
cursor->value.data = WT_UPDATE_DATA(upd);
cursor->value.size = upd->size;
return (0);
}
/* Take the value from the original page cell. */
cell = WT_COL_PTR(page, &page->pg_var_d[cbt->slot]);
break;
case WT_PAGE_ROW_LEAF:
rip = &page->pg_row_d[cbt->slot];
/*
* If the cursor references a WT_INSERT item, take its key.
* Else, if we have an exact match, we copied the key in the
* search function, take it from there.
* If we don't have an exact match, take the key from the
* original page.
*/
if (cbt->ins != NULL) {
cursor->key.data = WT_INSERT_KEY(cbt->ins);
cursor->key.size = WT_INSERT_KEY_SIZE(cbt->ins);
} else if (cbt->compare == 0) {
cursor->key.data = cbt->search_key.data;
cursor->key.size = cbt->search_key.size;
} else
WT_RET(__wt_row_leaf_key(
session, page, rip, &cursor->key, 0));
/* If the cursor references a WT_UPDATE item, return it. */
if (upd != NULL) {
cursor->value.data = WT_UPDATE_DATA(upd);
cursor->value.size = upd->size;
return (0);
}
/* Simple values have their location encoded in the WT_ROW. */
if (__wt_row_leaf_value(page, rip, &cursor->value))
return (0);
/*
* Take the value from the original page cell (which may be
* empty).
*/
if ((cell =
__wt_row_leaf_value_cell(page, rip, NULL)) == NULL) {
cursor->value.size = 0;
return (0);
}
break;
WT_ILLEGAL_VALUE(session);
}
/* The value is an on-page cell, unpack and expand it as necessary. */
__wt_cell_unpack(cell, &unpack);
WT_RET(__wt_page_cell_data_ref(session, page, &unpack, &cursor->value));
return (0);
}
|