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
HAMANO Tsukasa
OpenLDAP
Commits
76d7ca8c
Commit
76d7ca8c
authored
Aug 11, 2011
by
Howard Chu
Browse files
Rationalize mdbenv namespace
parent
c378b252
Changes
6
Hide whitespace changes
Inline
Side-by-side
libraries/libmdb/mdb.c
View file @
76d7ca8c
...
...
@@ -345,9 +345,9 @@ static int mdb_search_page(MDB_txn *txn,
MDB_cursor
*
cursor
,
int
modify
,
MDB_pageparent
*
mpp
);
static
int
mdbenv_read_header
(
MDB_env
*
env
,
MDB_meta
*
meta
);
static
int
mdbenv_read_meta
(
MDB_env
*
env
,
int
*
which
);
static
int
mdbenv_write_meta
(
MDB_txn
*
txn
);
static
int
mdb
_
env_read_header
(
MDB_env
*
env
,
MDB_meta
*
meta
);
static
int
mdb
_
env_read_meta
(
MDB_env
*
env
,
int
*
which
);
static
int
mdb
_
env_write_meta
(
MDB_txn
*
txn
);
static
MDB_page
*
mdb_get_page
(
MDB_txn
*
txn
,
pgno_t
pgno
);
static
MDB_node
*
mdb_search_node
(
MDB_txn
*
txn
,
MDB_dbi
dbi
,
MDB_page
*
mp
,
...
...
@@ -596,7 +596,7 @@ mdb_touch(MDB_txn *txn, MDB_pageparent *pp)
}
int
mdbenv_sync
(
MDB_env
*
env
)
mdb
_
env_sync
(
MDB_env
*
env
)
{
int
rc
=
0
;
if
(
!
F_ISSET
(
env
->
me_flags
,
MDB_NOSYNC
))
{
...
...
@@ -662,7 +662,7 @@ mdb_txn_begin(MDB_env *env, int rdonly, MDB_txn **ret)
txn
->
mt_env
=
env
;
if
((
rc
=
mdbenv_read_meta
(
env
,
&
toggle
))
!=
MDB_SUCCESS
)
{
if
((
rc
=
mdb
_
env_read_meta
(
env
,
&
toggle
))
!=
MDB_SUCCESS
)
{
mdb_txn_abort
(
txn
);
return
rc
;
}
...
...
@@ -899,9 +899,9 @@ mdb_txn_commit(MDB_txn *txn)
free
(
dp
);
}
if
((
n
=
mdbenv_sync
(
env
))
!=
0
||
(
n
=
mdbenv_write_meta
(
txn
))
!=
MDB_SUCCESS
||
(
n
=
mdbenv_sync
(
env
))
!=
0
)
{
if
((
n
=
mdb
_
env_sync
(
env
))
!=
0
||
(
n
=
mdb
_
env_write_meta
(
txn
))
!=
MDB_SUCCESS
||
(
n
=
mdb
_
env_sync
(
env
))
!=
0
)
{
mdb_txn_abort
(
txn
);
return
n
;
}
...
...
@@ -940,7 +940,7 @@ done:
}
static
int
mdbenv_read_header
(
MDB_env
*
env
,
MDB_meta
*
meta
)
mdb
_
env_read_header
(
MDB_env
*
env
,
MDB_meta
*
meta
)
{
char
page
[
PAGESIZE
];
MDB_page
*
p
;
...
...
@@ -985,7 +985,7 @@ mdbenv_read_header(MDB_env *env, MDB_meta *meta)
}
static
int
mdbenv_init_meta
(
MDB_env
*
env
,
MDB_meta
*
meta
)
mdb
_
env_init_meta
(
MDB_env
*
env
,
MDB_meta
*
meta
)
{
MDB_page
*
p
,
*
q
;
MDB_meta
*
m
;
...
...
@@ -1025,7 +1025,7 @@ mdbenv_init_meta(MDB_env *env, MDB_meta *meta)
}
static
int
mdbenv_write_meta
(
MDB_txn
*
txn
)
mdb
_
env_write_meta
(
MDB_txn
*
txn
)
{
MDB_env
*
env
;
MDB_meta
meta
;
...
...
@@ -1066,7 +1066,7 @@ mdbenv_write_meta(MDB_txn *txn)
}
static
int
mdbenv_read_meta
(
MDB_env
*
env
,
int
*
which
)
mdb
_
env_read_meta
(
MDB_env
*
env
,
int
*
which
)
{
int
toggle
=
0
;
...
...
@@ -1086,7 +1086,7 @@ mdbenv_read_meta(MDB_env *env, int *which)
}
int
mdbenv_create
(
MDB_env
**
env
)
mdb
_
env_create
(
MDB_env
**
env
)
{
MDB_env
*
e
;
...
...
@@ -1102,7 +1102,7 @@ mdbenv_create(MDB_env **env)
}
int
mdbenv_set_mapsize
(
MDB_env
*
env
,
size_t
size
)
mdb
_
env_set_mapsize
(
MDB_env
*
env
,
size_t
size
)
{
if
(
env
->
me_map
)
return
EINVAL
;
...
...
@@ -1111,21 +1111,21 @@ mdbenv_set_mapsize(MDB_env *env, size_t size)
}
int
mdbenv_set_maxdbs
(
MDB_env
*
env
,
int
dbs
)
mdb
_
env_set_maxdbs
(
MDB_env
*
env
,
int
dbs
)
{
env
->
me_maxdbs
=
dbs
;
return
MDB_SUCCESS
;
}
int
mdbenv_set_maxreaders
(
MDB_env
*
env
,
int
readers
)
mdb
_
env_set_maxreaders
(
MDB_env
*
env
,
int
readers
)
{
env
->
me_maxreaders
=
readers
;
return
MDB_SUCCESS
;
}
int
mdbenv_get_maxreaders
(
MDB_env
*
env
,
int
*
readers
)
mdb
_
env_get_maxreaders
(
MDB_env
*
env
,
int
*
readers
)
{
if
(
!
env
||
!
readers
)
return
EINVAL
;
...
...
@@ -1134,7 +1134,7 @@ mdbenv_get_maxreaders(MDB_env *env, int *readers)
}
static
int
mdbenv_open2
(
MDB_env
*
env
,
unsigned
int
flags
)
mdb
_
env_open2
(
MDB_env
*
env
,
unsigned
int
flags
)
{
int
i
,
newenv
=
0
;
MDB_meta
meta
;
...
...
@@ -1144,7 +1144,7 @@ mdbenv_open2(MDB_env *env, unsigned int flags)
memset
(
&
meta
,
0
,
sizeof
(
meta
));
if
((
i
=
mdbenv_read_header
(
env
,
&
meta
))
!=
0
)
{
if
((
i
=
mdb
_
env_read_header
(
env
,
&
meta
))
!=
0
)
{
if
(
i
!=
ENOENT
)
return
i
;
DPRINTF
(
"new mdbenv"
);
...
...
@@ -1167,7 +1167,7 @@ mdbenv_open2(MDB_env *env, unsigned int flags)
meta
.
mm_mapsize
=
env
->
me_mapsize
;
if
(
flags
&
MDB_FIXEDMAP
)
meta
.
mm_address
=
env
->
me_map
;
i
=
mdbenv_init_meta
(
env
,
&
meta
);
i
=
mdb
_
env_init_meta
(
env
,
&
meta
);
if
(
i
!=
MDB_SUCCESS
)
{
munmap
(
env
->
me_map
,
env
->
me_mapsize
);
return
i
;
...
...
@@ -1179,7 +1179,7 @@ mdbenv_open2(MDB_env *env, unsigned int flags)
env
->
me_metas
[
0
]
=
METADATA
(
p
);
env
->
me_metas
[
1
]
=
(
MDB_meta
*
)((
char
*
)
env
->
me_metas
[
0
]
+
meta
.
mm_psize
);
if
((
i
=
mdbenv_read_meta
(
env
,
NULL
))
!=
0
)
if
((
i
=
mdb
_
env_read_meta
(
env
,
NULL
))
!=
0
)
return
i
;
DPRINTF
(
"opened database version %u, pagesize %u"
,
...
...
@@ -1195,7 +1195,7 @@ mdbenv_open2(MDB_env *env, unsigned int flags)
}
static
void
mdbenv_reader_dest
(
void
*
ptr
)
mdb
_
env_reader_dest
(
void
*
ptr
)
{
MDB_reader
*
reader
=
ptr
;
...
...
@@ -1206,7 +1206,7 @@ mdbenv_reader_dest(void *ptr)
/* downgrade the exclusive lock on the region back to shared */
static
void
mdbenv_share_locks
(
MDB_env
*
env
)
mdb
_
env_share_locks
(
MDB_env
*
env
)
{
struct
flock
lock_info
;
...
...
@@ -1221,7 +1221,7 @@ mdbenv_share_locks(MDB_env *env)
}
static
int
mdbenv_setup_locks
(
MDB_env
*
env
,
char
*
lpath
,
int
mode
,
int
*
excl
)
mdb
_
env_setup_locks
(
MDB_env
*
env
,
char
*
lpath
,
int
mode
,
int
*
excl
)
{
int
rc
;
off_t
size
,
rsize
;
...
...
@@ -1310,7 +1310,7 @@ fail:
#define LOCKNAME "/lock.mdb"
#define DATANAME "/data.mdb"
int
mdbenv_open
(
MDB_env
*
env
,
const
char
*
path
,
unsigned
int
flags
,
mode_t
mode
)
mdb
_
env_open
(
MDB_env
*
env
,
const
char
*
path
,
unsigned
int
flags
,
mode_t
mode
)
{
int
oflags
,
rc
,
len
,
excl
;
char
*
lpath
,
*
dpath
;
...
...
@@ -1323,7 +1323,7 @@ mdbenv_open(MDB_env *env, const char *path, unsigned int flags, mode_t mode)
sprintf
(
lpath
,
"%s"
LOCKNAME
,
path
);
sprintf
(
dpath
,
"%s"
DATANAME
,
path
);
rc
=
mdbenv_setup_locks
(
env
,
lpath
,
mode
,
&
excl
);
rc
=
mdb
_
env_setup_locks
(
env
,
lpath
,
mode
,
&
excl
);
if
(
rc
)
goto
leave
;
...
...
@@ -1335,15 +1335,15 @@ mdbenv_open(MDB_env *env, const char *path, unsigned int flags, mode_t mode)
if
((
env
->
me_fd
=
open
(
dpath
,
oflags
,
mode
))
==
-
1
)
return
errno
;
if
((
rc
=
mdbenv_open2
(
env
,
flags
))
!=
MDB_SUCCESS
)
{
if
((
rc
=
mdb
_
env_open2
(
env
,
flags
))
!=
MDB_SUCCESS
)
{
close
(
env
->
me_fd
);
env
->
me_fd
=
-
1
;
}
else
{
env
->
me_path
=
strdup
(
path
);
DPRINTF
(
"opened dbenv %p"
,
(
void
*
)
env
);
pthread_key_create
(
&
env
->
me_txkey
,
mdbenv_reader_dest
);
pthread_key_create
(
&
env
->
me_txkey
,
mdb
_
env_reader_dest
);
if
(
excl
)
mdbenv_share_locks
(
env
);
mdb
_
env_share_locks
(
env
);
env
->
me_dbxs
=
calloc
(
env
->
me_maxdbs
,
sizeof
(
MDB_dbx
));
env
->
me_dbs
[
0
]
=
calloc
(
env
->
me_maxdbs
,
sizeof
(
MDB_db
));
env
->
me_dbs
[
1
]
=
calloc
(
env
->
me_maxdbs
,
sizeof
(
MDB_db
));
...
...
@@ -1356,7 +1356,7 @@ leave:
}
void
mdbenv_close
(
MDB_env
*
env
)
mdb
_
env_close
(
MDB_env
*
env
)
{
if
(
env
==
NULL
)
return
;
...
...
@@ -1366,12 +1366,19 @@ mdbenv_close(MDB_env *env)
free
(
env
->
me_dbxs
);
free
(
env
->
me_path
);
pthread_key_delete
(
env
->
me_txkey
);
if
(
env
->
me_map
)
{
munmap
(
env
->
me_map
,
env
->
me_mapsize
);
}
close
(
env
->
me_fd
);
if
(
env
->
me_txns
)
{
pid_t
pid
=
getpid
();
size_t
size
=
(
env
->
me_maxreaders
-
1
)
*
sizeof
(
MDB_reader
)
+
sizeof
(
MDB_txninfo
);
int
i
;
for
(
i
=
0
;
i
<
env
->
me_txns
->
mti_numreaders
;
i
++
)
if
(
env
->
me_txns
->
mti_readers
[
i
].
mr_pid
==
pid
)
env
->
me_txns
->
mti_readers
[
i
].
mr_pid
=
0
;
munmap
(
env
->
me_txns
,
size
);
}
close
(
env
->
me_lfd
);
...
...
@@ -3089,7 +3096,7 @@ mdb_put(MDB_txn *txn, MDB_dbi dbi,
}
int
mdbenv_get_flags
(
MDB_env
*
env
,
unsigned
int
*
arg
)
mdb
_
env_get_flags
(
MDB_env
*
env
,
unsigned
int
*
arg
)
{
if
(
!
env
||
!
arg
)
return
EINVAL
;
...
...
@@ -3099,7 +3106,7 @@ mdbenv_get_flags(MDB_env *env, unsigned int *arg)
}
int
mdbenv_get_path
(
MDB_env
*
env
,
const
char
**
arg
)
mdb
_
env_get_path
(
MDB_env
*
env
,
const
char
**
arg
)
{
if
(
!
env
||
!
arg
)
return
EINVAL
;
...
...
@@ -3121,7 +3128,7 @@ mdb_stat0(MDB_env *env, MDB_db *db, MDB_stat *arg)
return
MDB_SUCCESS
;
}
int
mdbenv_stat
(
MDB_env
*
env
,
MDB_stat
*
arg
)
mdb
_
env_stat
(
MDB_env
*
env
,
MDB_stat
*
arg
)
{
if
(
env
==
NULL
||
arg
==
NULL
)
return
EINVAL
;
...
...
libraries/libmdb/mdb.h
View file @
76d7ca8c
...
...
@@ -103,17 +103,17 @@ typedef struct MDB_stat {
unsigned
long
ms_entries
;
}
MDB_stat
;
int
mdbenv_create
(
MDB_env
**
env
);
int
mdbenv_open
(
MDB_env
*
env
,
const
char
*
path
,
unsigned
int
flags
,
mode_t
mode
);
int
mdbenv_stat
(
MDB_env
*
env
,
MDB_stat
*
stat
);
int
mdbenv_sync
(
MDB_env
*
env
);
void
mdbenv_close
(
MDB_env
*
env
);
int
mdbenv_get_flags
(
MDB_env
*
env
,
unsigned
int
*
flags
);
int
mdbenv_get_path
(
MDB_env
*
env
,
const
char
**
path
);
int
mdbenv_set_mapsize
(
MDB_env
*
env
,
size_t
size
);
int
mdbenv_set_maxreaders
(
MDB_env
*
env
,
int
readers
);
int
mdbenv_get_maxreaders
(
MDB_env
*
env
,
int
*
readers
);
int
mdbenv_set_maxdbs
(
MDB_env
*
env
,
int
dbs
);
int
mdb
_
env_create
(
MDB_env
**
env
);
int
mdb
_
env_open
(
MDB_env
*
env
,
const
char
*
path
,
unsigned
int
flags
,
mode_t
mode
);
int
mdb
_
env_stat
(
MDB_env
*
env
,
MDB_stat
*
stat
);
int
mdb
_
env_sync
(
MDB_env
*
env
);
void
mdb
_
env_close
(
MDB_env
*
env
);
int
mdb
_
env_get_flags
(
MDB_env
*
env
,
unsigned
int
*
flags
);
int
mdb
_
env_get_path
(
MDB_env
*
env
,
const
char
**
path
);
int
mdb
_
env_set_mapsize
(
MDB_env
*
env
,
size_t
size
);
int
mdb
_
env_set_maxreaders
(
MDB_env
*
env
,
int
readers
);
int
mdb
_
env_get_maxreaders
(
MDB_env
*
env
,
int
*
readers
);
int
mdb
_
env_set_maxdbs
(
MDB_env
*
env
,
int
dbs
);
int
mdb_txn_begin
(
MDB_env
*
env
,
int
rdonly
,
MDB_txn
**
txn
);
int
mdb_txn_commit
(
MDB_txn
*
txn
);
...
...
libraries/libmdb/mdb_stat.c
View file @
76d7ca8c
...
...
@@ -26,16 +26,16 @@ int main(int argc,char * argv[])
char
*
envname
=
argv
[
1
];
char
*
subname
=
NULL
;
rc
=
mdbenv_create
(
&
env
);
rc
=
mdb
_
env_create
(
&
env
);
if
(
argc
>
2
)
{
mdbenv_set_maxdbs
(
env
,
4
);
mdb
_
env_set_maxdbs
(
env
,
4
);
subname
=
argv
[
2
];
}
rc
=
mdbenv_open
(
env
,
envname
,
MDB_RDONLY
,
0
);
rc
=
mdb
_
env_open
(
env
,
envname
,
MDB_RDONLY
,
0
);
if
(
rc
)
{
printf
(
"mdbenv_open failed, error %d
\n
"
,
rc
);
printf
(
"mdb
_
env_open failed, error %d
\n
"
,
rc
);
exit
(
1
);
}
rc
=
mdb_txn_begin
(
env
,
1
,
&
txn
);
...
...
@@ -58,7 +58,7 @@ int main(int argc,char * argv[])
printf
(
"Entries: %lu
\n
"
,
mst
.
ms_entries
);
mdb_close
(
txn
,
dbi
);
mdb_txn_abort
(
txn
);
mdbenv_close
(
env
);
mdb
_
env_close
(
env
);
return
0
;
}
libraries/libmdb/mtest.c
View file @
76d7ca8c
...
...
@@ -39,9 +39,9 @@ int main(int argc,char * argv[])
values
[
i
]
=
random
()
%
1024
;
}
rc
=
mdbenv_create
(
&
env
);
rc
=
mdbenv_set_mapsize
(
env
,
10485760
);
rc
=
mdbenv_open
(
env
,
"./testdb"
,
MDB_FIXEDMAP
|
MDB_NOSYNC
,
0664
);
rc
=
mdb
_
env_create
(
&
env
);
rc
=
mdb
_
env_set_mapsize
(
env
,
10485760
);
rc
=
mdb
_
env_open
(
env
,
"./testdb"
,
MDB_FIXEDMAP
|
MDB_NOSYNC
,
0664
);
rc
=
mdb_txn_begin
(
env
,
0
,
&
txn
);
rc
=
mdb_open
(
txn
,
NULL
,
0
,
&
dbi
);
...
...
@@ -58,7 +58,7 @@ int main(int argc,char * argv[])
}
if
(
j
)
printf
(
"%d duplicates skipped
\n
"
,
j
);
rc
=
mdb_txn_commit
(
txn
);
rc
=
mdbenv_stat
(
env
,
&
mst
);
rc
=
mdb
_
env_stat
(
env
,
&
mst
);
rc
=
mdb_txn_begin
(
env
,
1
,
&
txn
);
rc
=
mdb_cursor_open
(
txn
,
dbi
,
&
cursor
);
...
...
@@ -88,7 +88,7 @@ int main(int argc,char * argv[])
free
(
values
);
printf
(
"Deleted %d values
\n
"
,
j
);
rc
=
mdbenv_stat
(
env
,
&
mst
);
rc
=
mdb
_
env_stat
(
env
,
&
mst
);
rc
=
mdb_txn_begin
(
env
,
1
,
&
txn
);
rc
=
mdb_cursor_open
(
txn
,
dbi
,
&
cursor
);
printf
(
"Cursor next
\n
"
);
...
...
@@ -149,7 +149,7 @@ int main(int argc,char * argv[])
mdb_close
(
txn
,
dbi
);
mdb_txn_abort
(
txn
);
mdbenv_close
(
env
);
mdb
_
env_close
(
env
);
return
0
;
}
libraries/libmdb/mtest2.c
View file @
76d7ca8c
...
...
@@ -42,10 +42,10 @@ int main(int argc,char * argv[])
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
_
env_create
(
&
env
);
rc
=
mdb
_
env_set_mapsize
(
env
,
10485760
);
rc
=
mdb
_
env_set_maxdbs
(
env
,
4
);
rc
=
mdb
_
env_open
(
env
,
"./testdb"
,
MDB_FIXEDMAP
|
MDB_NOSYNC
,
0664
);
rc
=
mdb_txn_begin
(
env
,
0
,
&
txn
);
rc
=
mdb_open
(
txn
,
"id1"
,
MDB_CREATE
,
&
dbi
);
...
...
@@ -62,7 +62,7 @@ int main(int argc,char * argv[])
}
if
(
j
)
printf
(
"%d duplicates skipped
\n
"
,
j
);
rc
=
mdb_txn_commit
(
txn
);
rc
=
mdbenv_stat
(
env
,
&
mst
);
rc
=
mdb
_
env_stat
(
env
,
&
mst
);
rc
=
mdb_txn_begin
(
env
,
1
,
&
txn
);
rc
=
mdb_cursor_open
(
txn
,
dbi
,
&
cursor
);
...
...
@@ -92,7 +92,7 @@ int main(int argc,char * argv[])
free
(
values
);
printf
(
"Deleted %d values
\n
"
,
j
);
rc
=
mdbenv_stat
(
env
,
&
mst
);
rc
=
mdb
_
env_stat
(
env
,
&
mst
);
rc
=
mdb_txn_begin
(
env
,
1
,
&
txn
);
rc
=
mdb_cursor_open
(
txn
,
dbi
,
&
cursor
);
printf
(
"Cursor next
\n
"
);
...
...
@@ -111,7 +111,7 @@ int main(int argc,char * argv[])
mdb_close
(
txn
,
dbi
);
mdb_txn_abort
(
txn
);
mdbenv_close
(
env
);
mdb
_
env_close
(
env
);
return
0
;
}
libraries/libmdb/mtest3.c
View file @
76d7ca8c
...
...
@@ -45,10 +45,10 @@ int main(int argc,char * argv[])
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
_
env_create
(
&
env
);
rc
=
mdb
_
env_set_mapsize
(
env
,
10485760
);
rc
=
mdb
_
env_set_maxdbs
(
env
,
4
);
rc
=
mdb
_
env_open
(
env
,
"./testdb"
,
MDB_FIXEDMAP
|
MDB_NOSYNC
,
0664
);
rc
=
mdb_txn_begin
(
env
,
0
,
&
txn
);
rc
=
mdb_open
(
txn
,
"id2"
,
MDB_CREATE
|
MDB_DUPSORT
,
&
dbi
);
...
...
@@ -67,7 +67,7 @@ int main(int argc,char * argv[])
}
if
(
j
)
printf
(
"%d duplicates skipped
\n
"
,
j
);
rc
=
mdb_txn_commit
(
txn
);
rc
=
mdbenv_stat
(
env
,
&
mst
);
rc
=
mdb
_
env_stat
(
env
,
&
mst
);
rc
=
mdb_txn_begin
(
env
,
1
,
&
txn
);
rc
=
mdb_cursor_open
(
txn
,
dbi
,
&
cursor
);
...
...
@@ -102,7 +102,7 @@ int main(int argc,char * argv[])
free
(
values
);
printf
(
"Deleted %d values
\n
"
,
j
);
rc
=
mdbenv_stat
(
env
,
&
mst
);
rc
=
mdb
_
env_stat
(
env
,
&
mst
);
rc
=
mdb_txn_begin
(
env
,
1
,
&
txn
);
rc
=
mdb_cursor_open
(
txn
,
dbi
,
&
cursor
);
printf
(
"Cursor next
\n
"
);
...
...
@@ -121,7 +121,7 @@ int main(int argc,char * argv[])
mdb_close
(
txn
,
dbi
);
mdb_txn_abort
(
txn
);
mdbenv_close
(
env
);
mdb
_
env_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