Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Menu
Open sidebar
Joe Martin
OpenLDAP
Commits
b57bb99f
Commit
b57bb99f
authored
Aug 23, 2015
by
Hallvard Furuseth
Browse files
Pass cursor to mdb_page_get(), mdb_node_read().
No change in behavior.
parent
7a8d0f69
Changes
1
Hide whitespace changes
Inline
Side-by-side
libraries/liblmdb/mdb.c
View file @
b57bb99f
...
...
@@ -1301,7 +1301,7 @@ enum {
#define MDB_END_SLOT MDB_NOTLS
/**< release any reader slot if #MDB_NOTLS */
static
void
mdb_txn_end
(
MDB_txn
*
txn
,
unsigned
mode
);
static
int
mdb_page_get
(
MDB_
txn
*
txn
,
pgno_t
pgno
,
MDB_page
**
mp
,
int
*
lvl
);
static
int
mdb_page_get
(
MDB_
cursor
*
mc
,
pgno_t
pgno
,
MDB_page
**
mp
,
int
*
lvl
);
static
int
mdb_page_search_root
(
MDB_cursor
*
mc
,
MDB_val
*
key
,
int
modify
);
#define MDB_PS_MODIFY 1
...
...
@@ -1330,7 +1330,7 @@ static int mdb_node_add(MDB_cursor *mc, indx_t indx,
static
void
mdb_node_del
(
MDB_cursor
*
mc
,
int
ksize
);
static
void
mdb_node_shrink
(
MDB_page
*
mp
,
indx_t
indx
);
static
int
mdb_node_move
(
MDB_cursor
*
csrc
,
MDB_cursor
*
cdst
,
int
fromleft
);
static
int
mdb_node_read
(
MDB_
txn
*
txn
,
MDB_node
*
leaf
,
MDB_val
*
data
);
static
int
mdb_node_read
(
MDB_
cursor
*
mc
,
MDB_node
*
leaf
,
MDB_val
*
data
);
static
size_t
mdb_leaf_size
(
MDB_env
*
env
,
MDB_val
*
key
,
MDB_val
*
data
);
static
size_t
mdb_branch_size
(
MDB_env
*
env
,
MDB_val
*
key
);
...
...
@@ -1846,7 +1846,7 @@ mdb_pages_xkeep(MDB_cursor *mc, unsigned pflags, int all)
{
enum
{
Mask
=
P_SUBP
|
P_DIRTY
|
P_LOOSE
|
P_KEEP
};
MDB_txn
*
txn
=
mc
->
mc_txn
;
MDB_cursor
*
m3
;
MDB_cursor
*
m3
,
*
m0
=
mc
;
MDB_xcursor
*
mx
;
MDB_page
*
dp
,
*
mp
;
MDB_node
*
leaf
;
...
...
@@ -1889,7 +1889,7 @@ mdb_pages_xkeep(MDB_cursor *mc, unsigned pflags, int all)
pgno_t
pgno
=
txn
->
mt_dbs
[
i
].
md_root
;
if
(
pgno
==
P_INVALID
)
continue
;
if
((
rc
=
mdb_page_get
(
txn
,
pgno
,
&
dp
,
&
level
))
!=
MDB_SUCCESS
)
if
((
rc
=
mdb_page_get
(
m0
,
pgno
,
&
dp
,
&
level
))
!=
MDB_SUCCESS
)
break
;
if
((
dp
->
mp_flags
&
Mask
)
==
pflags
&&
level
<=
1
)
dp
->
mp_flags
^=
P_KEEP
;
...
...
@@ -2193,7 +2193,7 @@ mdb_page_alloc(MDB_cursor *mc, int num, MDB_page **mp)
}
np
=
m2
.
mc_pg
[
m2
.
mc_top
];
leaf
=
NODEPTR
(
np
,
m2
.
mc_ki
[
m2
.
mc_top
]);
if
((
rc
=
mdb_node_read
(
txn
,
leaf
,
&
data
))
!=
MDB_SUCCESS
)
if
((
rc
=
mdb_node_read
(
&
m2
,
leaf
,
&
data
))
!=
MDB_SUCCESS
)
return
rc
;
idl
=
(
MDB_ID
*
)
data
.
mv_data
;
...
...
@@ -5219,15 +5219,16 @@ mdb_cursor_push(MDB_cursor *mc, MDB_page *mp)
}
/** Find the address of the page corresponding to a given page number.
* @param[in]
txn
the
transaction for this access
.
* @param[in]
mc
the
cursor accessing the page
.
* @param[in] pgno the page number for the page to retrieve.
* @param[out] ret address of a pointer where the page's address will be stored.
* @param[out] lvl dirty_list inheritance level of found page. 1=current txn, 0=mapped page.
* @return 0 on success, non-zero on failure.
*/
static
int
mdb_page_get
(
MDB_
txn
*
txn
,
pgno_t
pgno
,
MDB_page
**
ret
,
int
*
lvl
)
mdb_page_get
(
MDB_
cursor
*
mc
,
pgno_t
pgno
,
MDB_page
**
ret
,
int
*
lvl
)
{
MDB_txn
*
txn
=
mc
->
mc_txn
;
MDB_env
*
env
=
txn
->
mt_env
;
MDB_page
*
p
=
NULL
;
int
level
;
...
...
@@ -5322,7 +5323,7 @@ mdb_page_search_root(MDB_cursor *mc, MDB_val *key, int flags)
mdb_cassert
(
mc
,
i
<
NUMKEYS
(
mp
));
node
=
NODEPTR
(
mp
,
i
);
if
((
rc
=
mdb_page_get
(
mc
->
mc_txn
,
NODEPGNO
(
node
),
&
mp
,
NULL
))
!=
0
)
if
((
rc
=
mdb_page_get
(
mc
,
NODEPGNO
(
node
),
&
mp
,
NULL
))
!=
0
)
return
rc
;
mc
->
mc_ki
[
mc
->
mc_top
]
=
i
;
...
...
@@ -5364,7 +5365,7 @@ mdb_page_search_lowest(MDB_cursor *mc)
MDB_node
*
node
=
NODEPTR
(
mp
,
0
);
int
rc
;
if
((
rc
=
mdb_page_get
(
mc
->
mc_txn
,
NODEPGNO
(
node
),
&
mp
,
NULL
))
!=
0
)
if
((
rc
=
mdb_page_get
(
mc
,
NODEPGNO
(
node
),
&
mp
,
NULL
))
!=
0
)
return
rc
;
mc
->
mc_ki
[
mc
->
mc_top
]
=
0
;
...
...
@@ -5416,7 +5417,7 @@ mdb_page_search(MDB_cursor *mc, MDB_val *key, int flags)
return
MDB_NOTFOUND
;
if
((
leaf
->
mn_flags
&
(
F_DUPDATA
|
F_SUBDATA
))
!=
F_SUBDATA
)
return
MDB_INCOMPATIBLE
;
/* not a named DB */
rc
=
mdb_node_read
(
mc
->
mc_txn
,
leaf
,
&
data
);
rc
=
mdb_node_read
(
&
mc2
,
leaf
,
&
data
);
if
(
rc
)
return
rc
;
memcpy
(
&
flags
,
((
char
*
)
data
.
mv_data
+
offsetof
(
MDB_db
,
md_flags
)),
...
...
@@ -5440,7 +5441,7 @@ mdb_page_search(MDB_cursor *mc, MDB_val *key, int flags)
mdb_cassert
(
mc
,
root
>
1
);
if
(
!
mc
->
mc_pg
[
0
]
||
mc
->
mc_pg
[
0
]
->
mp_pgno
!=
root
)
if
((
rc
=
mdb_page_get
(
mc
->
mc_txn
,
root
,
&
mc
->
mc_pg
[
0
],
NULL
))
!=
0
)
if
((
rc
=
mdb_page_get
(
mc
,
root
,
&
mc
->
mc_pg
[
0
],
NULL
))
!=
0
)
return
rc
;
mc
->
mc_snum
=
1
;
...
...
@@ -5537,13 +5538,13 @@ release:
}
/** Return the data associated with a given node.
* @param[in]
txn
The
transaction
for this operation.
* @param[in]
mc
The
cursor
for this operation.
* @param[in] leaf The node being read.
* @param[out] data Updated to point to the node's data.
* @return 0 on success, non-zero on failure.
*/
static
int
mdb_node_read
(
MDB_
txn
*
txn
,
MDB_node
*
leaf
,
MDB_val
*
data
)
mdb_node_read
(
MDB_
cursor
*
mc
,
MDB_node
*
leaf
,
MDB_val
*
data
)
{
MDB_page
*
omp
;
/* overflow page */
pgno_t
pgno
;
...
...
@@ -5559,7 +5560,7 @@ mdb_node_read(MDB_txn *txn, MDB_node *leaf, MDB_val *data)
*/
data
->
mv_size
=
NODEDSZ
(
leaf
);
memcpy
(
&
pgno
,
NODEDATA
(
leaf
),
sizeof
(
pgno
));
if
((
rc
=
mdb_page_get
(
txn
,
pgno
,
&
omp
,
NULL
))
!=
0
)
{
if
((
rc
=
mdb_page_get
(
mc
,
pgno
,
&
omp
,
NULL
))
!=
0
)
{
DPRINTF
((
"read overflow page %"
Z
"u failed"
,
pgno
));
return
rc
;
}
...
...
@@ -5633,7 +5634,7 @@ mdb_cursor_sibling(MDB_cursor *mc, int move_right)
mdb_cassert
(
mc
,
IS_BRANCH
(
mc
->
mc_pg
[
mc
->
mc_top
]));
indx
=
NODEPTR
(
mc
->
mc_pg
[
mc
->
mc_top
],
mc
->
mc_ki
[
mc
->
mc_top
]);
if
((
rc
=
mdb_page_get
(
mc
->
mc_txn
,
NODEPGNO
(
indx
),
&
mp
,
NULL
))
!=
0
)
{
if
((
rc
=
mdb_page_get
(
mc
,
NODEPGNO
(
indx
),
&
mp
,
NULL
))
!=
0
)
{
/* mc will be inconsistent if caller does mc_snum++ as above */
mc
->
mc_flags
&=
~
(
C_INITIALIZED
|
C_EOF
);
return
rc
;
...
...
@@ -5716,7 +5717,7 @@ skip:
mdb_xcursor_init1
(
mc
,
leaf
);
}
if
(
data
)
{
if
((
rc
=
mdb_node_read
(
mc
->
mc_txn
,
leaf
,
data
))
!=
MDB_SUCCESS
)
if
((
rc
=
mdb_node_read
(
mc
,
leaf
,
data
))
!=
MDB_SUCCESS
)
return
rc
;
if
(
F_ISSET
(
leaf
->
mn_flags
,
F_DUPDATA
))
{
...
...
@@ -5799,7 +5800,7 @@ mdb_cursor_prev(MDB_cursor *mc, MDB_val *key, MDB_val *data, MDB_cursor_op op)
mdb_xcursor_init1
(
mc
,
leaf
);
}
if
(
data
)
{
if
((
rc
=
mdb_node_read
(
mc
->
mc_txn
,
leaf
,
data
))
!=
MDB_SUCCESS
)
if
((
rc
=
mdb_node_read
(
mc
,
leaf
,
data
))
!=
MDB_SUCCESS
)
return
rc
;
if
(
F_ISSET
(
leaf
->
mn_flags
,
F_DUPDATA
))
{
...
...
@@ -5981,7 +5982,7 @@ set1:
}
else
if
(
op
==
MDB_GET_BOTH
||
op
==
MDB_GET_BOTH_RANGE
)
{
MDB_val
olddata
;
MDB_cmp_func
*
dcmp
;
if
((
rc
=
mdb_node_read
(
mc
->
mc_txn
,
leaf
,
&
olddata
))
!=
MDB_SUCCESS
)
if
((
rc
=
mdb_node_read
(
mc
,
leaf
,
&
olddata
))
!=
MDB_SUCCESS
)
return
rc
;
dcmp
=
mc
->
mc_dbx
->
md_dcmp
;
#if UINT_MAX < SIZE_MAX
...
...
@@ -5999,7 +6000,7 @@ set1:
}
else
{
if
(
mc
->
mc_xcursor
)
mc
->
mc_xcursor
->
mx_cursor
.
mc_flags
&=
~
(
C_INITIALIZED
|
C_EOF
);
if
((
rc
=
mdb_node_read
(
mc
->
mc_txn
,
leaf
,
data
))
!=
MDB_SUCCESS
)
if
((
rc
=
mdb_node_read
(
mc
,
leaf
,
data
))
!=
MDB_SUCCESS
)
return
rc
;
}
}
...
...
@@ -6048,7 +6049,7 @@ mdb_cursor_first(MDB_cursor *mc, MDB_val *key, MDB_val *data)
if
(
rc
)
return
rc
;
}
else
{
if
((
rc
=
mdb_node_read
(
mc
->
mc_txn
,
leaf
,
data
))
!=
MDB_SUCCESS
)
if
((
rc
=
mdb_node_read
(
mc
,
leaf
,
data
))
!=
MDB_SUCCESS
)
return
rc
;
}
}
...
...
@@ -6093,7 +6094,7 @@ mdb_cursor_last(MDB_cursor *mc, MDB_val *key, MDB_val *data)
if
(
rc
)
return
rc
;
}
else
{
if
((
rc
=
mdb_node_read
(
mc
->
mc_txn
,
leaf
,
data
))
!=
MDB_SUCCESS
)
if
((
rc
=
mdb_node_read
(
mc
,
leaf
,
data
))
!=
MDB_SUCCESS
)
return
rc
;
}
}
...
...
@@ -6139,7 +6140,7 @@ mdb_cursor_get(MDB_cursor *mc, MDB_val *key, MDB_val *data,
if
(
F_ISSET
(
leaf
->
mn_flags
,
F_DUPDATA
))
{
rc
=
mdb_cursor_get
(
&
mc
->
mc_xcursor
->
mx_cursor
,
data
,
NULL
,
MDB_GET_CURRENT
);
}
else
{
rc
=
mdb_node_read
(
mc
->
mc_txn
,
leaf
,
data
);
rc
=
mdb_node_read
(
mc
,
leaf
,
data
);
}
}
}
...
...
@@ -6232,7 +6233,7 @@ fetchm:
MDB_node
*
leaf
=
NODEPTR
(
mc
->
mc_pg
[
mc
->
mc_top
],
mc
->
mc_ki
[
mc
->
mc_top
]);
if
(
!
F_ISSET
(
leaf
->
mn_flags
,
F_DUPDATA
))
{
MDB_GET_KEY
(
leaf
,
key
);
rc
=
mdb_node_read
(
mc
->
mc_txn
,
leaf
,
data
);
rc
=
mdb_node_read
(
mc
,
leaf
,
data
);
break
;
}
}
...
...
@@ -6616,7 +6617,7 @@ current:
int
level
,
ovpages
,
dpages
=
OVPAGES
(
data
->
mv_size
,
env
->
me_psize
);
memcpy
(
&
pg
,
olddata
.
mv_data
,
sizeof
(
pg
));
if
((
rc2
=
mdb_page_get
(
mc
->
mc_txn
,
pg
,
&
omp
,
&
level
))
!=
0
)
if
((
rc2
=
mdb_page_get
(
mc
,
pg
,
&
omp
,
&
level
))
!=
0
)
return
rc2
;
ovpages
=
omp
->
mp_pages
;
...
...
@@ -6922,7 +6923,7 @@ mdb_cursor_del(MDB_cursor *mc, unsigned int flags)
pgno_t
pg
;
memcpy
(
&
pg
,
NODEDATA
(
leaf
),
sizeof
(
pg
));
if
((
rc
=
mdb_page_get
(
mc
->
mc_txn
,
pg
,
&
omp
,
NULL
))
||
if
((
rc
=
mdb_page_get
(
mc
,
pg
,
&
omp
,
NULL
))
||
(
rc
=
mdb_ovpage_free
(
mc
,
omp
)))
goto
fail
;
}
...
...
@@ -8081,7 +8082,7 @@ mdb_rebalance(MDB_cursor *mc)
if
(
rc
)
return
rc
;
mc
->
mc_db
->
md_root
=
NODEPGNO
(
NODEPTR
(
mp
,
0
));
rc
=
mdb_page_get
(
mc
->
mc_txn
,
mc
->
mc_db
->
md_root
,
&
mc
->
mc_pg
[
0
],
NULL
);
rc
=
mdb_page_get
(
mc
,
mc
->
mc_db
->
md_root
,
&
mc
->
mc_pg
[
0
],
NULL
);
if
(
rc
)
return
rc
;
mc
->
mc_db
->
md_depth
--
;
...
...
@@ -8142,7 +8143,7 @@ mdb_rebalance(MDB_cursor *mc)
DPUTS
(
"reading right neighbor"
);
mn
.
mc_ki
[
ptop
]
++
;
node
=
NODEPTR
(
mc
->
mc_pg
[
ptop
],
mn
.
mc_ki
[
ptop
]);
rc
=
mdb_page_get
(
mc
->
mc_txn
,
NODEPGNO
(
node
),
&
mn
.
mc_pg
[
mn
.
mc_top
],
NULL
);
rc
=
mdb_page_get
(
mc
,
NODEPGNO
(
node
),
&
mn
.
mc_pg
[
mn
.
mc_top
],
NULL
);
if
(
rc
)
return
rc
;
mn
.
mc_ki
[
mn
.
mc_top
]
=
0
;
...
...
@@ -8154,7 +8155,7 @@ mdb_rebalance(MDB_cursor *mc)
DPUTS
(
"reading left neighbor"
);
mn
.
mc_ki
[
ptop
]
--
;
node
=
NODEPTR
(
mc
->
mc_pg
[
ptop
],
mn
.
mc_ki
[
ptop
]);
rc
=
mdb_page_get
(
mc
->
mc_txn
,
NODEPGNO
(
node
),
&
mn
.
mc_pg
[
mn
.
mc_top
],
NULL
);
rc
=
mdb_page_get
(
mc
,
NODEPGNO
(
node
),
&
mn
.
mc_pg
[
mn
.
mc_top
],
NULL
);
if
(
rc
)
return
rc
;
mn
.
mc_ki
[
mn
.
mc_top
]
=
NUMKEYS
(
mn
.
mc_pg
[
mn
.
mc_top
])
-
1
;
...
...
@@ -8904,7 +8905,6 @@ static int ESECT
mdb_env_cwalk
(
mdb_copy
*
my
,
pgno_t
*
pg
,
int
flags
)
{
MDB_cursor
mc
=
{
0
};
MDB_txn
*
txn
=
my
->
mc_txn
;
MDB_node
*
ni
;
MDB_page
*
mo
,
*
mp
,
*
leaf
;
char
*
buf
,
*
ptr
;
...
...
@@ -8916,9 +8916,9 @@ mdb_env_cwalk(mdb_copy *my, pgno_t *pg, int flags)
return
MDB_SUCCESS
;
mc
.
mc_snum
=
1
;
mc
.
mc_txn
=
txn
;
mc
.
mc_txn
=
my
->
mc_
txn
;
rc
=
mdb_page_get
(
my
->
mc_txn
,
*
pg
,
&
mc
.
mc_pg
[
0
],
NULL
);
rc
=
mdb_page_get
(
&
mc
,
*
pg
,
&
mc
.
mc_pg
[
0
],
NULL
);
if
(
rc
)
return
rc
;
rc
=
mdb_page_search_root
(
&
mc
,
NULL
,
MDB_PS_FIRST
);
...
...
@@ -8962,7 +8962,7 @@ mdb_env_cwalk(mdb_copy *my, pgno_t *pg, int flags)
}
memcpy
(
&
pg
,
NODEDATA
(
ni
),
sizeof
(
pg
));
rc
=
mdb_page_get
(
txn
,
pg
,
&
omp
,
NULL
);
rc
=
mdb_page_get
(
&
mc
,
pg
,
&
omp
,
NULL
);
if
(
rc
)
goto
done
;
if
(
my
->
mc_wlen
[
toggle
]
>=
MDB_WBUF
)
{
...
...
@@ -9013,7 +9013,7 @@ mdb_env_cwalk(mdb_copy *my, pgno_t *pg, int flags)
again:
ni
=
NODEPTR
(
mp
,
mc
.
mc_ki
[
mc
.
mc_top
]);
pg
=
NODEPGNO
(
ni
);
rc
=
mdb_page_get
(
txn
,
pg
,
&
mp
,
NULL
);
rc
=
mdb_page_get
(
&
mc
,
pg
,
&
mp
,
NULL
);
if
(
rc
)
goto
done
;
mc
.
mc_top
++
;
...
...
@@ -9696,7 +9696,7 @@ mdb_drop0(MDB_cursor *mc, int subs)
MDB_page
*
omp
;
pgno_t
pg
;
memcpy
(
&
pg
,
NODEDATA
(
ni
),
sizeof
(
pg
));
rc
=
mdb_page_get
(
txn
,
pg
,
&
omp
,
NULL
);
rc
=
mdb_page_get
(
mc
,
pg
,
&
omp
,
NULL
);
if
(
rc
!=
0
)
goto
done
;
mdb_cassert
(
mc
,
IS_OVERFLOW
(
omp
));
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment