Skip to content
GitLab
Menu
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Menu
Open sidebar
Joe Martin
OpenLDAP
Commits
01c2f781
Commit
01c2f781
authored
Aug 11, 2011
by
Howard Chu
Browse files
More subDB stuff
parent
2fe9fbd1
Changes
3
Hide whitespace changes
Inline
Side-by-side
libraries/libmdb/Makefile
View file @
01c2f781
...
...
@@ -15,6 +15,7 @@ test: all
mdb_stat
:
mdb_stat.o mdb.o idl.o
mtest
:
mtest.o mdb.o idl.o
mtest2
:
mtest2.o mdb.o idl.o
%
:
%.o mdb.o
$(CC)
$(CFLAGS)
$(LDFLAGS)
$^
$(LDLIBS)
-o
$@
...
...
libraries/libmdb/mdb.c
View file @
01c2f781
...
...
@@ -452,8 +452,11 @@ mdb_alloc_page(MDB_txn *txn, MDB_page *parent, unsigned int parent_idx, int num)
{
MDB_dpage
*
dp
;
pgno_t
pgno
=
P_INVALID
;
ULONG
oldest
=
txn
->
mt_txnid
-
2
;
ULONG
oldest
;
if
(
txn
->
mt_txnid
>
2
)
{
oldest
=
txn
->
mt_txnid
-
2
;
if
(
!
txn
->
mt_env
->
me_pghead
&&
txn
->
mt_dbs
[
FREE_DBI
].
md_root
!=
P_INVALID
)
{
/* See if there's anything in the free DB */
MDB_pageparent
mpp
;
...
...
@@ -534,6 +537,7 @@ mdb_alloc_page(MDB_txn *txn, MDB_page *parent, unsigned int parent_idx, int num)
}
}
}
}
if
((
dp
=
malloc
(
txn
->
mt_env
->
me_psize
*
num
+
sizeof
(
MDB_dhead
)))
==
NULL
)
return
NULL
;
...
...
@@ -1101,8 +1105,6 @@ mdbenv_set_mapsize(MDB_env *env, size_t size)
int
mdbenv_set_maxdbs
(
MDB_env
*
env
,
int
dbs
)
{
if
(
env
->
me_map
)
return
EINVAL
;
env
->
me_maxdbs
=
dbs
;
return
MDB_SUCCESS
;
}
...
...
@@ -1598,7 +1600,7 @@ mdb_search_page(MDB_txn *txn, MDB_dbi dbi, MDB_val *key,
/* For sub-databases, update main root first */
if
(
dbi
>
MAIN_DBI
&&
!
txn
->
mt_dbxs
[
dbi
].
md_dirty
)
{
MDB_pageparent
mp2
;
rc
=
mdb_search_page
(
txn
,
0
,
&
txn
->
mt_dbxs
[
dbi
].
md_name
,
rc
=
mdb_search_page
(
txn
,
MAIN_DBI
,
&
txn
->
mt_dbxs
[
dbi
].
md_name
,
NULL
,
1
,
&
mp2
);
if
(
rc
)
return
rc
;
...
...
@@ -3066,7 +3068,7 @@ int mdb_open(MDB_txn *txn, const char *name, unsigned int flags, MDB_dbi *dbi)
{
MDB_val
key
,
data
;
MDB_dbi
i
;
int
rc
;
int
rc
,
dirty
=
0
;
size_t
len
;
/* main DB? */
...
...
@@ -3101,7 +3103,8 @@ int mdb_open(MDB_txn *txn, const char *name, unsigned int flags, MDB_dbi *dbi)
memset
(
&
dummy
,
0
,
sizeof
(
dummy
));
dummy
.
md_root
=
P_INVALID
;
dummy
.
md_flags
=
flags
&
0xffff
;
rc
=
mdb_put
(
txn
,
0
,
&
key
,
&
data
,
0
);
rc
=
mdb_put
(
txn
,
MAIN_DBI
,
&
key
,
&
data
,
0
);
dirty
=
1
;
}
/* OK, got info, add to table */
...
...
@@ -3112,7 +3115,7 @@ int mdb_open(MDB_txn *txn, const char *name, unsigned int flags, MDB_dbi *dbi)
txn
->
mt_dbxs
[
txn
->
mt_numdbs
].
md_dcmp
=
NULL
;
txn
->
mt_dbxs
[
txn
->
mt_numdbs
].
md_rel
=
NULL
;
txn
->
mt_dbxs
[
txn
->
mt_numdbs
].
md_parent
=
MAIN_DBI
;
txn
->
mt_dbxs
[
txn
->
mt_numdbs
].
md_dirty
=
0
;
txn
->
mt_dbxs
[
txn
->
mt_numdbs
].
md_dirty
=
dirty
;
memcpy
(
&
txn
->
mt_dbs
[
txn
->
mt_numdbs
],
data
.
mv_data
,
sizeof
(
MDB_db
));
*
dbi
=
txn
->
mt_numdbs
;
txn
->
mt_numdbs
++
;
...
...
libraries/libmdb/mtest2.c
0 → 100644
View file @
01c2f781
/* mtest.c - memory-mapped database tester/toy */
/*
* Copyright 2011 Howard Chu, Symas Corp.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted only as authorized by the OpenLDAP
* Public License.
*
* A copy of this license is available in the file LICENSE in the
* top-level directory of the distribution or, alternatively, at
* <http://www.OpenLDAP.org/license.html>.
*/
#define _XOPEN_SOURCE 500
/* srandom(), random() */
#include
<stdio.h>
#include
<stdlib.h>
#include
<time.h>
#include
"mdb.h"
int
main
(
int
argc
,
char
*
argv
[])
{
int
i
=
0
,
j
=
0
,
rc
;
MDB_env
*
env
;
MDB_dbi
dbi
;
MDB_val
key
,
data
;
MDB_txn
*
txn
;
MDB_stat
mst
;
MDB_cursor
*
cursor
,
*
cur2
;
int
count
;
int
*
values
;
char
sval
[
32
];
srandom
(
time
(
NULL
));
count
=
(
random
()
%
384
)
+
64
;
values
=
(
int
*
)
malloc
(
count
*
sizeof
(
int
));
for
(
i
=
0
;
i
<
count
;
i
++
)
{
values
[
i
]
=
random
()
%
1024
;
}
rc
=
mdbenv_create
(
&
env
);
rc
=
mdbenv_set_mapsize
(
env
,
10485760
);
rc
=
mdbenv_set_maxdbs
(
env
,
4
);
rc
=
mdbenv_open
(
env
,
"./testdb"
,
MDB_FIXEDMAP
|
MDB_NOSYNC
,
0664
);
rc
=
mdb_txn_begin
(
env
,
0
,
&
txn
);
rc
=
mdb_open
(
txn
,
"id1"
,
MDB_CREATE
,
&
dbi
);
key
.
mv_size
=
sizeof
(
int
);
key
.
mv_data
=
sval
;
data
.
mv_size
=
sizeof
(
sval
);
data
.
mv_data
=
sval
;
printf
(
"Adding %d values
\n
"
,
count
);
for
(
i
=
0
;
i
<
count
;
i
++
)
{
sprintf
(
sval
,
"%03x %d foo bar"
,
values
[
i
],
values
[
i
]);
rc
=
mdb_put
(
txn
,
dbi
,
&
key
,
&
data
,
MDB_NOOVERWRITE
);
if
(
rc
)
j
++
;
}
if
(
j
)
printf
(
"%d duplicates skipped
\n
"
,
j
);
rc
=
mdb_txn_commit
(
txn
);
rc
=
mdbenv_stat
(
env
,
&
mst
);
rc
=
mdb_txn_begin
(
env
,
1
,
&
txn
);
rc
=
mdb_cursor_open
(
txn
,
dbi
,
&
cursor
);
while
((
rc
=
mdb_cursor_get
(
cursor
,
&
key
,
&
data
,
MDB_NEXT
))
==
0
)
{
printf
(
"key: %p %.*s, data: %p %.*s
\n
"
,
key
.
mv_data
,
(
int
)
key
.
mv_size
,
(
char
*
)
key
.
mv_data
,
data
.
mv_data
,
(
int
)
data
.
mv_size
,
(
char
*
)
data
.
mv_data
);
}
mdb_cursor_close
(
cursor
);
mdb_txn_abort
(
txn
);
j
=
0
;
key
.
mv_data
=
sval
;
for
(
i
=
count
-
1
;
i
>
-
1
;
i
-=
(
random
()
%
5
))
{
j
++
;
txn
=
NULL
;
rc
=
mdb_txn_begin
(
env
,
0
,
&
txn
);
sprintf
(
sval
,
"%03x "
,
values
[
i
]);
rc
=
mdb_del
(
txn
,
dbi
,
&
key
,
NULL
,
0
);
if
(
rc
)
{
j
--
;
mdb_txn_abort
(
txn
);
}
else
{
rc
=
mdb_txn_commit
(
txn
);
}
}
free
(
values
);
printf
(
"Deleted %d values
\n
"
,
j
);
rc
=
mdbenv_stat
(
env
,
&
mst
);
rc
=
mdb_txn_begin
(
env
,
1
,
&
txn
);
rc
=
mdb_cursor_open
(
txn
,
dbi
,
&
cursor
);
printf
(
"Cursor next
\n
"
);
while
((
rc
=
mdb_cursor_get
(
cursor
,
&
key
,
&
data
,
MDB_NEXT
))
==
0
)
{
printf
(
"key: %.*s, data: %.*s
\n
"
,
(
int
)
key
.
mv_size
,
(
char
*
)
key
.
mv_data
,
(
int
)
data
.
mv_size
,
(
char
*
)
data
.
mv_data
);
}
printf
(
"Cursor prev
\n
"
);
while
((
rc
=
mdb_cursor_get
(
cursor
,
&
key
,
&
data
,
MDB_PREV
))
==
0
)
{
printf
(
"key: %.*s, data: %.*s
\n
"
,
(
int
)
key
.
mv_size
,
(
char
*
)
key
.
mv_data
,
(
int
)
data
.
mv_size
,
(
char
*
)
data
.
mv_data
);
}
mdb_cursor_close
(
cursor
);
mdb_close
(
txn
,
dbi
);
mdb_txn_abort
(
txn
);
mdbenv_close
(
env
);
return
0
;
}
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a 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