mirror of
https://github.com/XRPLF/rippled.git
synced 2025-11-21 03:26:01 +00:00
Remove LightningDB database and backend
This commit is contained in:
@@ -94,7 +94,6 @@ SOURCES += \
|
|||||||
../../src/ripple_data/ripple_data.cpp \
|
../../src/ripple_data/ripple_data.cpp \
|
||||||
../../src/ripple_hyperleveldb/ripple_hyperleveldb.cpp \
|
../../src/ripple_hyperleveldb/ripple_hyperleveldb.cpp \
|
||||||
../../src/ripple_leveldb/ripple_leveldb.cpp \
|
../../src/ripple_leveldb/ripple_leveldb.cpp \
|
||||||
../../src/ripple_mdb/ripple_mdb.c \
|
|
||||||
../../src/ripple_net/ripple_net.cpp \
|
../../src/ripple_net/ripple_net.cpp \
|
||||||
../../src/ripple_websocket/ripple_websocket.cpp
|
../../src/ripple_websocket/ripple_websocket.cpp
|
||||||
|
|
||||||
|
|||||||
@@ -1493,12 +1493,6 @@
|
|||||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
|
||||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClCompile Include="..\..\src\ripple_core\nodestore\backend\MdbFactory.cpp">
|
|
||||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
|
|
||||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
|
|
||||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
|
|
||||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="..\..\src\ripple_core\nodestore\backend\MemoryFactory.cpp">
|
<ClCompile Include="..\..\src\ripple_core\nodestore\backend\MemoryFactory.cpp">
|
||||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
|
||||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
|
||||||
@@ -1677,7 +1671,6 @@
|
|||||||
<ClCompile Include="..\..\src\ripple_data\ripple_data.cpp" />
|
<ClCompile Include="..\..\src\ripple_data\ripple_data.cpp" />
|
||||||
<ClCompile Include="..\..\src\ripple_hyperleveldb\ripple_hyperleveldb.cpp" />
|
<ClCompile Include="..\..\src\ripple_hyperleveldb\ripple_hyperleveldb.cpp" />
|
||||||
<ClCompile Include="..\..\src\ripple_leveldb\ripple_leveldb.cpp" />
|
<ClCompile Include="..\..\src\ripple_leveldb\ripple_leveldb.cpp" />
|
||||||
<ClCompile Include="..\..\src\ripple_mdb\ripple_mdb.c" />
|
|
||||||
<ClCompile Include="..\..\src\ripple_net\basics\RippleSSLContext.cpp">
|
<ClCompile Include="..\..\src\ripple_net\basics\RippleSSLContext.cpp">
|
||||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
|
||||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
|
||||||
@@ -2461,7 +2454,6 @@
|
|||||||
<ClInclude Include="..\..\src\ripple_core\nodestore\backend\HyperDBFactory.h" />
|
<ClInclude Include="..\..\src\ripple_core\nodestore\backend\HyperDBFactory.h" />
|
||||||
<ClInclude Include="..\..\src\ripple_core\nodestore\backend\KeyvaDBFactory.h" />
|
<ClInclude Include="..\..\src\ripple_core\nodestore\backend\KeyvaDBFactory.h" />
|
||||||
<ClInclude Include="..\..\src\ripple_core\nodestore\backend\LevelDBFactory.h" />
|
<ClInclude Include="..\..\src\ripple_core\nodestore\backend\LevelDBFactory.h" />
|
||||||
<ClInclude Include="..\..\src\ripple_core\nodestore\backend\MdbFactory.h" />
|
|
||||||
<ClInclude Include="..\..\src\ripple_core\nodestore\backend\MemoryFactory.h" />
|
<ClInclude Include="..\..\src\ripple_core\nodestore\backend\MemoryFactory.h" />
|
||||||
<ClInclude Include="..\..\src\ripple_core\nodestore\backend\NullFactory.h" />
|
<ClInclude Include="..\..\src\ripple_core\nodestore\backend\NullFactory.h" />
|
||||||
<ClInclude Include="..\..\src\ripple_core\nodestore\impl\BatchWriter.h" />
|
<ClInclude Include="..\..\src\ripple_core\nodestore\impl\BatchWriter.h" />
|
||||||
@@ -2495,7 +2487,6 @@
|
|||||||
<ClInclude Include="..\..\src\ripple_data\utility\UptimeTimerAdapter.h" />
|
<ClInclude Include="..\..\src\ripple_data\utility\UptimeTimerAdapter.h" />
|
||||||
<ClInclude Include="..\..\src\ripple_hyperleveldb\ripple_hyperleveldb.h" />
|
<ClInclude Include="..\..\src\ripple_hyperleveldb\ripple_hyperleveldb.h" />
|
||||||
<ClInclude Include="..\..\src\ripple_leveldb\ripple_leveldb.h" />
|
<ClInclude Include="..\..\src\ripple_leveldb\ripple_leveldb.h" />
|
||||||
<ClInclude Include="..\..\src\ripple_mdb\ripple_mdb.h" />
|
|
||||||
<ClInclude Include="..\..\src\ripple_net\basics\impl\MultiSocketType.h" />
|
<ClInclude Include="..\..\src\ripple_net\basics\impl\MultiSocketType.h" />
|
||||||
<ClInclude Include="..\..\src\ripple_net\basics\impl\RPCServerImp.h" />
|
<ClInclude Include="..\..\src\ripple_net\basics\impl\RPCServerImp.h" />
|
||||||
<ClInclude Include="..\..\src\ripple_net\basics\RippleSSLContext.h" />
|
<ClInclude Include="..\..\src\ripple_net\basics\RippleSSLContext.h" />
|
||||||
|
|||||||
@@ -130,9 +130,6 @@
|
|||||||
<Filter Include="[2] Old Ripple\ripple_net\rpc">
|
<Filter Include="[2] Old Ripple\ripple_net\rpc">
|
||||||
<UniqueIdentifier>{045285aa-9043-4cee-b8ca-cc8881e52f6a}</UniqueIdentifier>
|
<UniqueIdentifier>{045285aa-9043-4cee-b8ca-cc8881e52f6a}</UniqueIdentifier>
|
||||||
</Filter>
|
</Filter>
|
||||||
<Filter Include="[2] Old Ripple\ripple_mdb">
|
|
||||||
<UniqueIdentifier>{6a769530-8edf-4836-afc8-8836fe315603}</UniqueIdentifier>
|
|
||||||
</Filter>
|
|
||||||
<Filter Include="[2] Old Ripple\ripple_hyperleveldb">
|
<Filter Include="[2] Old Ripple\ripple_hyperleveldb">
|
||||||
<UniqueIdentifier>{571acd5b-065c-4202-8de3-8692735171dc}</UniqueIdentifier>
|
<UniqueIdentifier>{571acd5b-065c-4202-8de3-8692735171dc}</UniqueIdentifier>
|
||||||
</Filter>
|
</Filter>
|
||||||
@@ -933,9 +930,6 @@
|
|||||||
<ClCompile Include="..\..\src\ripple_hyperleveldb\ripple_hyperleveldb.cpp">
|
<ClCompile Include="..\..\src\ripple_hyperleveldb\ripple_hyperleveldb.cpp">
|
||||||
<Filter>[2] Old Ripple\ripple_hyperleveldb</Filter>
|
<Filter>[2] Old Ripple\ripple_hyperleveldb</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClCompile Include="..\..\src\ripple_mdb\ripple_mdb.c">
|
|
||||||
<Filter>[2] Old Ripple\ripple_mdb</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="..\..\src\ripple_net\ripple_net.cpp">
|
<ClCompile Include="..\..\src\ripple_net\ripple_net.cpp">
|
||||||
<Filter>[2] Old Ripple\ripple_net</Filter>
|
<Filter>[2] Old Ripple\ripple_net</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
@@ -996,9 +990,6 @@
|
|||||||
<ClCompile Include="..\..\src\ripple_core\nodestore\backend\MemoryFactory.cpp">
|
<ClCompile Include="..\..\src\ripple_core\nodestore\backend\MemoryFactory.cpp">
|
||||||
<Filter>[2] Old Ripple\ripple_core\nodestore\backend</Filter>
|
<Filter>[2] Old Ripple\ripple_core\nodestore\backend</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClCompile Include="..\..\src\ripple_core\nodestore\backend\MdbFactory.cpp">
|
|
||||||
<Filter>[2] Old Ripple\ripple_core\nodestore\backend</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="..\..\src\ripple_core\nodestore\backend\LevelDBFactory.cpp">
|
<ClCompile Include="..\..\src\ripple_core\nodestore\backend\LevelDBFactory.cpp">
|
||||||
<Filter>[2] Old Ripple\ripple_core\nodestore\backend</Filter>
|
<Filter>[2] Old Ripple\ripple_core\nodestore\backend</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
@@ -2157,9 +2148,6 @@
|
|||||||
<ClInclude Include="..\..\src\ripple_leveldb\ripple_leveldb.h">
|
<ClInclude Include="..\..\src\ripple_leveldb\ripple_leveldb.h">
|
||||||
<Filter>[2] Old Ripple\ripple_leveldb</Filter>
|
<Filter>[2] Old Ripple\ripple_leveldb</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
<ClInclude Include="..\..\src\ripple_mdb\ripple_mdb.h">
|
|
||||||
<Filter>[2] Old Ripple\ripple_mdb</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="..\..\src\ripple_net\ripple_net.h">
|
<ClInclude Include="..\..\src\ripple_net\ripple_net.h">
|
||||||
<Filter>[2] Old Ripple\ripple_net</Filter>
|
<Filter>[2] Old Ripple\ripple_net</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
@@ -2250,9 +2238,6 @@
|
|||||||
<ClInclude Include="..\..\src\ripple_core\nodestore\backend\MemoryFactory.h">
|
<ClInclude Include="..\..\src\ripple_core\nodestore\backend\MemoryFactory.h">
|
||||||
<Filter>[2] Old Ripple\ripple_core\nodestore\backend</Filter>
|
<Filter>[2] Old Ripple\ripple_core\nodestore\backend</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
<ClInclude Include="..\..\src\ripple_core\nodestore\backend\MdbFactory.h">
|
|
||||||
<Filter>[2] Old Ripple\ripple_core\nodestore\backend</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="..\..\src\ripple_core\nodestore\backend\LevelDBFactory.h">
|
<ClInclude Include="..\..\src\ripple_core\nodestore\backend\LevelDBFactory.h">
|
||||||
<Filter>[2] Old Ripple\ripple_core\nodestore\backend</Filter>
|
<Filter>[2] Old Ripple\ripple_core\nodestore\backend</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
|||||||
@@ -187,7 +187,6 @@ COMPILED_FILES.extend([
|
|||||||
'src/ripple_data/ripple_data.cpp',
|
'src/ripple_data/ripple_data.cpp',
|
||||||
'src/ripple_hyperleveldb/ripple_hyperleveldb.cpp',
|
'src/ripple_hyperleveldb/ripple_hyperleveldb.cpp',
|
||||||
'src/ripple_leveldb/ripple_leveldb.cpp',
|
'src/ripple_leveldb/ripple_leveldb.cpp',
|
||||||
'src/ripple_mdb/ripple_mdb.c',
|
|
||||||
'src/ripple_net/ripple_net.cpp',
|
'src/ripple_net/ripple_net.cpp',
|
||||||
'src/ripple_websocket/ripple_websocket.cpp'
|
'src/ripple_websocket/ripple_websocket.cpp'
|
||||||
])
|
])
|
||||||
|
|||||||
@@ -655,7 +655,6 @@
|
|||||||
# Choices for 'type' (not case-sensitive)
|
# Choices for 'type' (not case-sensitive)
|
||||||
# HyperLevelDB Use an improved version of LevelDB (preferred)
|
# HyperLevelDB Use an improved version of LevelDB (preferred)
|
||||||
# LevelDB Use Google's LevelDB database (deprecated)
|
# LevelDB Use Google's LevelDB database (deprecated)
|
||||||
# MDB Use MDB
|
|
||||||
# none Use no backend
|
# none Use no backend
|
||||||
# RocksDB Use Facebook's RocksDB database
|
# RocksDB Use Facebook's RocksDB database
|
||||||
# SQLite Use SQLite
|
# SQLite Use SQLite
|
||||||
|
|||||||
16
src/mdb/libraries/liblmdb/.gitignore
vendored
16
src/mdb/libraries/liblmdb/.gitignore
vendored
@@ -1,16 +0,0 @@
|
|||||||
mtest
|
|
||||||
mtest[23456]
|
|
||||||
testdb
|
|
||||||
mdb_copy
|
|
||||||
mdb_stat
|
|
||||||
*.[ao]
|
|
||||||
*.so
|
|
||||||
*[~#]
|
|
||||||
*.bak
|
|
||||||
*.orig
|
|
||||||
*.rej
|
|
||||||
core
|
|
||||||
core.*
|
|
||||||
valgrind.*
|
|
||||||
man/
|
|
||||||
html/
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
Copyright 2011-2013 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>.
|
|
||||||
|
|
||||||
OpenLDAP is a registered trademark of the OpenLDAP Foundation.
|
|
||||||
|
|
||||||
Individual files and/or contributed packages may be copyright by
|
|
||||||
other parties and/or subject to additional restrictions.
|
|
||||||
|
|
||||||
This work also contains materials derived from public sources.
|
|
||||||
|
|
||||||
Additional information about OpenLDAP can be obtained at
|
|
||||||
<http://www.openldap.org/>.
|
|
||||||
File diff suppressed because it is too large
Load Diff
Binary file not shown.
@@ -1,88 +0,0 @@
|
|||||||
# Makefile for liblmdb (Lightning memory-mapped database library).
|
|
||||||
|
|
||||||
########################################################################
|
|
||||||
# Configuration. The compiler options must enable threaded compilation.
|
|
||||||
#
|
|
||||||
# Preprocessor macros (for CPPFLAGS) of interest...
|
|
||||||
# Note that the defaults should already be correct for most
|
|
||||||
# platforms; you should not need to change any of these:
|
|
||||||
#
|
|
||||||
# To compile successfully if the default does not:
|
|
||||||
# - MDB_USE_POSIX_SEM (enabled by default on BSD, Apple)
|
|
||||||
# Define if shared mutexes are unsupported. Note that Posix
|
|
||||||
# semaphores and shared mutexes have different behaviors and
|
|
||||||
# different problems, see the Caveats section in lmdb.h.
|
|
||||||
#
|
|
||||||
# For best performance or to compile successfully:
|
|
||||||
# - MDB_DSYNC = "O_DSYNC" (default) or "O_SYNC" (less efficient)
|
|
||||||
# If O_DSYNC is undefined but exists in /usr/include,
|
|
||||||
# preferably set some compiler flag to get the definition.
|
|
||||||
# - MDB_FDATASYNC = "fdatasync" or "fsync"
|
|
||||||
# Function for flushing the data of a file. Define this to
|
|
||||||
# "fsync" if fdatasync() is not supported. fdatasync is
|
|
||||||
# default except on BSD, Apple, Android which use fsync.
|
|
||||||
# - MDB_USE_PWRITEV
|
|
||||||
# Define if the pwritev() function is supported.
|
|
||||||
#
|
|
||||||
# Data format:
|
|
||||||
# - MDB_MAXKEYSIZE
|
|
||||||
# Controls data packing and limits, see mdb.c.
|
|
||||||
# You might need to change this if the default size is too small.
|
|
||||||
#
|
|
||||||
CC = gcc
|
|
||||||
W = -W -Wall -Wno-unused-parameter -Wbad-function-cast
|
|
||||||
THREADS = -pthread
|
|
||||||
OPT = -O2 -g
|
|
||||||
CFLAGS = $(THREADS) $(OPT) $(W) $(XCFLAGS)
|
|
||||||
LDLIBS =
|
|
||||||
SOLIBS =
|
|
||||||
prefix = /usr/local
|
|
||||||
|
|
||||||
########################################################################
|
|
||||||
|
|
||||||
IHDRS = lmdb.h
|
|
||||||
ILIBS = liblmdb.a liblmdb.so
|
|
||||||
IPROGS = mdb_stat mdb_copy
|
|
||||||
IDOCS = mdb_stat.1 mdb_copy.1
|
|
||||||
PROGS = $(IPROGS) mtest mtest2 mtest3 mtest4 mtest5
|
|
||||||
all: $(ILIBS) $(PROGS)
|
|
||||||
|
|
||||||
install: $(ILIBS) $(IPROGS) $(IHDRS)
|
|
||||||
cp $(IPROGS) $(DESTDIR)$(prefix)/bin
|
|
||||||
cp $(ILIBS) $(DESTDIR)$(prefix)/lib
|
|
||||||
cp $(IHDRS) $(DESTDIR)$(prefix)/include
|
|
||||||
cp $(IDOCS) $(DESTDIR)$(prefix)/man/man1
|
|
||||||
|
|
||||||
clean:
|
|
||||||
rm -rf $(PROGS) *.[ao] *.so *~ testdb
|
|
||||||
|
|
||||||
test: all
|
|
||||||
mkdir testdb
|
|
||||||
./mtest && ./mdb_stat testdb
|
|
||||||
|
|
||||||
liblmdb.a: mdb.o midl.o
|
|
||||||
ar rs $@ mdb.o midl.o
|
|
||||||
|
|
||||||
liblmdb.so: mdb.o midl.o
|
|
||||||
$(CC) $(LDFLAGS) -pthread -shared -o $@ mdb.o midl.o $(SOLIBS)
|
|
||||||
|
|
||||||
mdb_stat: mdb_stat.o liblmdb.a
|
|
||||||
mdb_copy: mdb_copy.o liblmdb.a
|
|
||||||
mtest: mtest.o liblmdb.a
|
|
||||||
mtest2: mtest2.o liblmdb.a
|
|
||||||
mtest3: mtest3.o liblmdb.a
|
|
||||||
mtest4: mtest4.o liblmdb.a
|
|
||||||
mtest5: mtest5.o liblmdb.a
|
|
||||||
mtest6: mtest6.o liblmdb.a
|
|
||||||
|
|
||||||
mdb.o: mdb.c lmdb.h midl.h
|
|
||||||
$(CC) $(CFLAGS) -fPIC $(CPPFLAGS) -c mdb.c
|
|
||||||
|
|
||||||
midl.o: midl.c midl.h
|
|
||||||
$(CC) $(CFLAGS) -fPIC $(CPPFLAGS) -c midl.c
|
|
||||||
|
|
||||||
%: %.o
|
|
||||||
$(CC) $(CFLAGS) $(LDFLAGS) $^ $(LDLIBS) -o $@
|
|
||||||
|
|
||||||
%.o: %.c lmdb.h
|
|
||||||
$(CC) $(CFLAGS) $(CPPFLAGS) -c $<
|
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,28 +0,0 @@
|
|||||||
.TH MDB_COPY 1 "2012/12/12" "LMDB 0.9.5"
|
|
||||||
.\" Copyright 2012 Howard Chu, Symas Corp. All Rights Reserved.
|
|
||||||
.\" Copying restrictions apply. See COPYRIGHT/LICENSE.
|
|
||||||
.SH NAME
|
|
||||||
mdb_copy \- LMDB environment copy tool
|
|
||||||
.SH SYNOPSIS
|
|
||||||
.B mdb_copy
|
|
||||||
.I srcpath\ [dstpath]
|
|
||||||
.SH DESCRIPTION
|
|
||||||
The
|
|
||||||
.B mdb_copy
|
|
||||||
utility copies an LMDB environment. The environment can
|
|
||||||
be copied regardless of whether it is currently in use.
|
|
||||||
|
|
||||||
If
|
|
||||||
.I dstpath
|
|
||||||
is specified it must be the path of an empty directory
|
|
||||||
for storing the backup. Otherwise, the backup will be
|
|
||||||
written to stdout.
|
|
||||||
|
|
||||||
.SH DIAGNOSTICS
|
|
||||||
Exit status is zero if no errors occur.
|
|
||||||
Errors result in a non-zero exit status and
|
|
||||||
a diagnostic message being written to standard error.
|
|
||||||
.SH "SEE ALSO"
|
|
||||||
.BR mdb_stat (1)
|
|
||||||
.SH AUTHOR
|
|
||||||
Howard Chu of Symas Corporation <http://www.symas.com>
|
|
||||||
@@ -1,66 +0,0 @@
|
|||||||
/* mdb_copy.c - memory-mapped database backup tool */
|
|
||||||
/*
|
|
||||||
* Copyright 2012 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>.
|
|
||||||
*/
|
|
||||||
#ifdef _WIN32
|
|
||||||
#include <windows.h>
|
|
||||||
#define MDB_STDOUT GetStdHandle(STD_OUTPUT_HANDLE)
|
|
||||||
#else
|
|
||||||
#define MDB_STDOUT 1
|
|
||||||
#endif
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <signal.h>
|
|
||||||
#include "lmdb.h"
|
|
||||||
|
|
||||||
static void
|
|
||||||
sighandle(int sig)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(int argc,char * argv[])
|
|
||||||
{
|
|
||||||
int rc;
|
|
||||||
MDB_env *env;
|
|
||||||
char *envname = argv[1];
|
|
||||||
|
|
||||||
if (argc<2 || argc>3) {
|
|
||||||
fprintf(stderr, "usage: %s srcpath [dstpath]\n", argv[0]);
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef SIGPIPE
|
|
||||||
signal(SIGPIPE, sighandle);
|
|
||||||
#endif
|
|
||||||
#ifdef SIGHUP
|
|
||||||
signal(SIGHUP, sighandle);
|
|
||||||
#endif
|
|
||||||
signal(SIGINT, sighandle);
|
|
||||||
signal(SIGTERM, sighandle);
|
|
||||||
|
|
||||||
rc = mdb_env_create(&env);
|
|
||||||
|
|
||||||
rc = mdb_env_open(env, envname, MDB_RDONLY, 0);
|
|
||||||
if (rc) {
|
|
||||||
printf("mdb_env_open failed, error %d %s\n", rc, mdb_strerror(rc));
|
|
||||||
} else {
|
|
||||||
if (argc == 2)
|
|
||||||
rc = mdb_env_copyfd(env, MDB_STDOUT);
|
|
||||||
else
|
|
||||||
rc = mdb_env_copy(env, argv[2]);
|
|
||||||
if (rc)
|
|
||||||
printf("mdb_env_copy failed, error %d %s\n", rc, mdb_strerror(rc));
|
|
||||||
}
|
|
||||||
mdb_env_close(env);
|
|
||||||
|
|
||||||
return rc ? EXIT_FAILURE : EXIT_SUCCESS;
|
|
||||||
}
|
|
||||||
@@ -1,59 +0,0 @@
|
|||||||
.TH MDB_STAT 1 "2012/12/12" "LMDB 0.9.5"
|
|
||||||
.\" Copyright 2012 Howard Chu, Symas Corp. All Rights Reserved.
|
|
||||||
.\" Copying restrictions apply. See COPYRIGHT/LICENSE.
|
|
||||||
.SH NAME
|
|
||||||
mdb_stat \- LMDB environment status tool
|
|
||||||
.SH SYNOPSIS
|
|
||||||
.B mdb_stat
|
|
||||||
.BR \ envpath
|
|
||||||
[\c
|
|
||||||
.BR \-e ]
|
|
||||||
[\c
|
|
||||||
.BR \-f [ f [ f ]]]
|
|
||||||
[\c
|
|
||||||
.BR \-n ]
|
|
||||||
[\c
|
|
||||||
.BR \-r [ r ]]
|
|
||||||
[\c
|
|
||||||
.BR \-a \ |
|
|
||||||
.BI \-s \ subdb\fR]
|
|
||||||
.SH DESCRIPTION
|
|
||||||
The
|
|
||||||
.B mdb_stat
|
|
||||||
utility displays the status of an LMDB environment.
|
|
||||||
.SH OPTIONS
|
|
||||||
.TP
|
|
||||||
.BR \-e
|
|
||||||
Display information about the database environment.
|
|
||||||
.TP
|
|
||||||
.BR \-f
|
|
||||||
Display information about the environment freelist.
|
|
||||||
If \fB\-ff\fP is given, summarize each freelist entry.
|
|
||||||
If \fB\-fff\fP is given, display the full list of page IDs in the freelist.
|
|
||||||
.TP
|
|
||||||
.BR \-n
|
|
||||||
Display the status of an LMDB database which does not use subdirectories.
|
|
||||||
.TP
|
|
||||||
.BR \-r
|
|
||||||
Display information about the environment reader table.
|
|
||||||
Shows the process ID, thread ID, and transaction ID for each active
|
|
||||||
reader slot. The process ID and transaction ID are in decimal, the
|
|
||||||
thread ID is in hexadecimal. The transaction ID is displayed as "-"
|
|
||||||
if the reader does not currently have a read transaction open.
|
|
||||||
If \fB\-rr\fP is given, check for stale entries in the reader
|
|
||||||
table and clear them. The reader table will be printed again
|
|
||||||
after the check is performed.
|
|
||||||
.TP
|
|
||||||
.BR \-a
|
|
||||||
Display the status of all of the subdatabases in the environment.
|
|
||||||
.TP
|
|
||||||
.BR \-s \ subdb
|
|
||||||
Display the status of a specific subdatabase.
|
|
||||||
.SH DIAGNOSTICS
|
|
||||||
Exit status is zero if no errors occur.
|
|
||||||
Errors result in a non-zero exit status and
|
|
||||||
a diagnostic message being written to standard error.
|
|
||||||
.SH "SEE ALSO"
|
|
||||||
.BR mdb_copy (1)
|
|
||||||
.SH AUTHOR
|
|
||||||
Howard Chu of Symas Corporation <http://www.symas.com>
|
|
||||||
@@ -1,248 +0,0 @@
|
|||||||
/* mdb_stat.c - memory-mapped database status tool */
|
|
||||||
/*
|
|
||||||
* Copyright 2011-2013 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>.
|
|
||||||
*/
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include "lmdb.h"
|
|
||||||
|
|
||||||
static void prstat(MDB_stat *ms)
|
|
||||||
{
|
|
||||||
#if 0
|
|
||||||
printf(" Page size: %u\n", ms->ms_psize);
|
|
||||||
#endif
|
|
||||||
printf(" Tree depth: %u\n", ms->ms_depth);
|
|
||||||
printf(" Branch pages: %zu\n", ms->ms_branch_pages);
|
|
||||||
printf(" Leaf pages: %zu\n", ms->ms_leaf_pages);
|
|
||||||
printf(" Overflow pages: %zu\n", ms->ms_overflow_pages);
|
|
||||||
printf(" Entries: %zu\n", ms->ms_entries);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void usage(char *prog)
|
|
||||||
{
|
|
||||||
fprintf(stderr, "usage: %s dbpath [-n] [-e] [-r[r]] [-f[f[f]]] [-a|-s subdb]\n", prog);
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
|
||||||
{
|
|
||||||
int i, rc;
|
|
||||||
MDB_env *env;
|
|
||||||
MDB_txn *txn;
|
|
||||||
MDB_dbi dbi;
|
|
||||||
MDB_stat mst;
|
|
||||||
MDB_envinfo mei;
|
|
||||||
char *prog = argv[0];
|
|
||||||
char *envname;
|
|
||||||
char *subname = NULL;
|
|
||||||
int alldbs = 0, envinfo = 0, envflags = 0, freinfo = 0, rdrinfo = 0;
|
|
||||||
|
|
||||||
if (argc < 2) {
|
|
||||||
usage(prog);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -a: print stat of main DB and all subDBs
|
|
||||||
* -s: print stat of only the named subDB
|
|
||||||
* -e: print env info
|
|
||||||
* -f: print freelist info
|
|
||||||
* -r: print reader info
|
|
||||||
* -n: use NOSUBDIR flag on env_open
|
|
||||||
* (default) print stat of only the main DB
|
|
||||||
*/
|
|
||||||
while ((i = getopt(argc, argv, "aefnrs:")) != EOF) {
|
|
||||||
switch(i) {
|
|
||||||
case 'a':
|
|
||||||
if (subname)
|
|
||||||
usage(prog);
|
|
||||||
alldbs++;
|
|
||||||
break;
|
|
||||||
case 'e':
|
|
||||||
envinfo++;
|
|
||||||
break;
|
|
||||||
case 'f':
|
|
||||||
freinfo++;
|
|
||||||
break;
|
|
||||||
case 'n':
|
|
||||||
envflags |= MDB_NOSUBDIR;
|
|
||||||
break;
|
|
||||||
case 'r':
|
|
||||||
rdrinfo++;
|
|
||||||
break;
|
|
||||||
case 's':
|
|
||||||
if (alldbs)
|
|
||||||
usage(prog);
|
|
||||||
subname = optarg;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
usage(prog);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (optind != argc - 1)
|
|
||||||
usage(prog);
|
|
||||||
|
|
||||||
envname = argv[optind];
|
|
||||||
rc = mdb_env_create(&env);
|
|
||||||
|
|
||||||
if (alldbs || subname) {
|
|
||||||
mdb_env_set_maxdbs(env, 4);
|
|
||||||
}
|
|
||||||
|
|
||||||
rc = mdb_env_open(env, envname, envflags | MDB_RDONLY, 0664);
|
|
||||||
if (rc) {
|
|
||||||
printf("mdb_env_open failed, error %d %s\n", rc, mdb_strerror(rc));
|
|
||||||
goto env_close;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (envinfo) {
|
|
||||||
rc = mdb_env_stat(env, &mst);
|
|
||||||
rc = mdb_env_info(env, &mei);
|
|
||||||
printf("Environment Info\n");
|
|
||||||
printf(" Map address: %p\n", mei.me_mapaddr);
|
|
||||||
printf(" Map size: %zu\n", mei.me_mapsize);
|
|
||||||
printf(" Page size: %u\n", mst.ms_psize);
|
|
||||||
printf(" Max pages: %zu\n", mei.me_mapsize / mst.ms_psize);
|
|
||||||
printf(" Number of pages used: %zu\n", mei.me_last_pgno+1);
|
|
||||||
printf(" Last transaction ID: %zu\n", mei.me_last_txnid);
|
|
||||||
printf(" Max readers: %u\n", mei.me_maxreaders);
|
|
||||||
printf(" Number of readers used: %u\n", mei.me_numreaders);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (rdrinfo) {
|
|
||||||
printf("Reader Table Status\n");
|
|
||||||
rc = mdb_reader_list(env, (MDB_msg_func *)fputs, stdout);
|
|
||||||
if (rdrinfo > 1) {
|
|
||||||
int dead;
|
|
||||||
mdb_reader_check(env, &dead);
|
|
||||||
printf(" %d stale readers cleared.\n", dead);
|
|
||||||
rc = mdb_reader_list(env, (MDB_msg_func *)fputs, stdout);
|
|
||||||
}
|
|
||||||
if (!(subname || alldbs || freinfo))
|
|
||||||
goto env_close;
|
|
||||||
}
|
|
||||||
|
|
||||||
rc = mdb_txn_begin(env, NULL, MDB_RDONLY, &txn);
|
|
||||||
if (rc) {
|
|
||||||
printf("mdb_txn_begin failed, error %d %s\n", rc, mdb_strerror(rc));
|
|
||||||
goto env_close;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (freinfo) {
|
|
||||||
MDB_cursor *cursor;
|
|
||||||
MDB_val key, data;
|
|
||||||
size_t pages = 0, *iptr;
|
|
||||||
|
|
||||||
printf("Freelist Status\n");
|
|
||||||
dbi = 0;
|
|
||||||
rc = mdb_cursor_open(txn, dbi, &cursor);
|
|
||||||
if (rc) {
|
|
||||||
printf("mdb_cursor_open failed, error %d %s\n", rc, mdb_strerror(rc));
|
|
||||||
goto txn_abort;
|
|
||||||
}
|
|
||||||
rc = mdb_stat(txn, dbi, &mst);
|
|
||||||
if (rc) {
|
|
||||||
printf("mdb_stat failed, error %d %s\n", rc, mdb_strerror(rc));
|
|
||||||
goto txn_abort;
|
|
||||||
}
|
|
||||||
prstat(&mst);
|
|
||||||
while ((rc = mdb_cursor_get(cursor, &key, &data, MDB_NEXT)) == 0) {
|
|
||||||
iptr = data.mv_data;
|
|
||||||
pages += *iptr;
|
|
||||||
if (freinfo > 1) {
|
|
||||||
char *bad = "";
|
|
||||||
size_t pg, prev;
|
|
||||||
ssize_t i, j, span = 0;
|
|
||||||
j = *iptr++;
|
|
||||||
for (i = j, prev = 1; --i >= 0; ) {
|
|
||||||
pg = iptr[i];
|
|
||||||
if (pg <= prev)
|
|
||||||
bad = " [bad sequence]";
|
|
||||||
prev = pg;
|
|
||||||
pg += span;
|
|
||||||
for (; i >= span && iptr[i-span] == pg; span++, pg++) ;
|
|
||||||
}
|
|
||||||
printf(" Transaction %zu, %zd pages, maxspan %zd%s\n",
|
|
||||||
*(size_t *)key.mv_data, j, span, bad);
|
|
||||||
if (freinfo > 2) {
|
|
||||||
for (--j; j >= 0; ) {
|
|
||||||
pg = iptr[j];
|
|
||||||
for (span=1; --j >= 0 && iptr[j] == pg+span; span++) ;
|
|
||||||
printf(span>1 ? " %9zu[%zd]\n" : " %9zu\n",
|
|
||||||
pg, span);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
mdb_cursor_close(cursor);
|
|
||||||
printf(" Free pages: %zu\n", pages);
|
|
||||||
}
|
|
||||||
|
|
||||||
rc = mdb_open(txn, subname, 0, &dbi);
|
|
||||||
if (rc) {
|
|
||||||
printf("mdb_open failed, error %d %s\n", rc, mdb_strerror(rc));
|
|
||||||
goto txn_abort;
|
|
||||||
}
|
|
||||||
|
|
||||||
rc = mdb_stat(txn, dbi, &mst);
|
|
||||||
if (rc) {
|
|
||||||
printf("mdb_stat failed, error %d %s\n", rc, mdb_strerror(rc));
|
|
||||||
goto txn_abort;
|
|
||||||
}
|
|
||||||
printf("Status of %s\n", subname ? subname : "Main DB");
|
|
||||||
prstat(&mst);
|
|
||||||
|
|
||||||
if (alldbs) {
|
|
||||||
MDB_cursor *cursor;
|
|
||||||
MDB_val key;
|
|
||||||
|
|
||||||
rc = mdb_cursor_open(txn, dbi, &cursor);
|
|
||||||
if (rc) {
|
|
||||||
printf("mdb_cursor_open failed, error %d %s\n", rc, mdb_strerror(rc));
|
|
||||||
goto txn_abort;
|
|
||||||
}
|
|
||||||
while ((rc = mdb_cursor_get(cursor, &key, NULL, MDB_NEXT_NODUP)) == 0) {
|
|
||||||
char *str;
|
|
||||||
MDB_dbi db2;
|
|
||||||
if (memchr(key.mv_data, '\0', key.mv_size))
|
|
||||||
continue;
|
|
||||||
str = malloc(key.mv_size+1);
|
|
||||||
memcpy(str, key.mv_data, key.mv_size);
|
|
||||||
str[key.mv_size] = '\0';
|
|
||||||
rc = mdb_open(txn, str, 0, &db2);
|
|
||||||
if (rc == MDB_SUCCESS)
|
|
||||||
printf("Status of %s\n", str);
|
|
||||||
free(str);
|
|
||||||
if (rc) continue;
|
|
||||||
rc = mdb_stat(txn, db2, &mst);
|
|
||||||
if (rc) {
|
|
||||||
printf("mdb_stat failed, error %d %s\n", rc, mdb_strerror(rc));
|
|
||||||
goto txn_abort;
|
|
||||||
}
|
|
||||||
prstat(&mst);
|
|
||||||
mdb_close(env, db2);
|
|
||||||
}
|
|
||||||
mdb_cursor_close(cursor);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (rc == MDB_NOTFOUND)
|
|
||||||
rc = MDB_SUCCESS;
|
|
||||||
|
|
||||||
mdb_close(env, dbi);
|
|
||||||
txn_abort:
|
|
||||||
mdb_txn_abort(txn);
|
|
||||||
env_close:
|
|
||||||
mdb_env_close(env);
|
|
||||||
|
|
||||||
return rc ? EXIT_FAILURE : EXIT_SUCCESS;
|
|
||||||
}
|
|
||||||
@@ -1,348 +0,0 @@
|
|||||||
/** @file midl.c
|
|
||||||
* @brief ldap bdb back-end ID List functions */
|
|
||||||
/* $OpenLDAP$ */
|
|
||||||
/* This work is part of OpenLDAP Software <http://www.openldap.org/>.
|
|
||||||
*
|
|
||||||
* Copyright 2000-2013 The OpenLDAP Foundation.
|
|
||||||
* 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>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <limits.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <errno.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <assert.h>
|
|
||||||
#include "midl.h"
|
|
||||||
|
|
||||||
/** @defgroup internal MDB Internals
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/** @defgroup idls ID List Management
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
#define CMP(x,y) ( (x) < (y) ? -1 : (x) > (y) )
|
|
||||||
|
|
||||||
unsigned mdb_midl_search( MDB_IDL ids, MDB_ID id )
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* binary search of id in ids
|
|
||||||
* if found, returns position of id
|
|
||||||
* if not found, returns first position greater than id
|
|
||||||
*/
|
|
||||||
unsigned base = 0;
|
|
||||||
unsigned cursor = 1;
|
|
||||||
int val = 0;
|
|
||||||
unsigned n = ids[0];
|
|
||||||
|
|
||||||
while( 0 < n ) {
|
|
||||||
unsigned pivot = n >> 1;
|
|
||||||
cursor = base + pivot + 1;
|
|
||||||
val = CMP( ids[cursor], id );
|
|
||||||
|
|
||||||
if( val < 0 ) {
|
|
||||||
n = pivot;
|
|
||||||
|
|
||||||
} else if ( val > 0 ) {
|
|
||||||
base = cursor;
|
|
||||||
n -= pivot + 1;
|
|
||||||
|
|
||||||
} else {
|
|
||||||
return cursor;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if( val > 0 ) {
|
|
||||||
++cursor;
|
|
||||||
}
|
|
||||||
return cursor;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if 0 /* superseded by append/sort */
|
|
||||||
int mdb_midl_insert( MDB_IDL ids, MDB_ID id )
|
|
||||||
{
|
|
||||||
unsigned x, i;
|
|
||||||
|
|
||||||
x = mdb_midl_search( ids, id );
|
|
||||||
assert( x > 0 );
|
|
||||||
|
|
||||||
if( x < 1 ) {
|
|
||||||
/* internal error */
|
|
||||||
return -2;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( x <= ids[0] && ids[x] == id ) {
|
|
||||||
/* duplicate */
|
|
||||||
assert(0);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( ++ids[0] >= MDB_IDL_DB_MAX ) {
|
|
||||||
/* no room */
|
|
||||||
--ids[0];
|
|
||||||
return -2;
|
|
||||||
|
|
||||||
} else {
|
|
||||||
/* insert id */
|
|
||||||
for (i=ids[0]; i>x; i--)
|
|
||||||
ids[i] = ids[i-1];
|
|
||||||
ids[x] = id;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
MDB_IDL mdb_midl_alloc(int num)
|
|
||||||
{
|
|
||||||
MDB_IDL ids = malloc((num+2) * sizeof(MDB_ID));
|
|
||||||
if (ids) {
|
|
||||||
*ids++ = num;
|
|
||||||
*ids = 0;
|
|
||||||
}
|
|
||||||
return ids;
|
|
||||||
}
|
|
||||||
|
|
||||||
void mdb_midl_free(MDB_IDL ids)
|
|
||||||
{
|
|
||||||
if (ids)
|
|
||||||
free(ids-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
int mdb_midl_shrink( MDB_IDL *idp )
|
|
||||||
{
|
|
||||||
MDB_IDL ids = *idp;
|
|
||||||
if (*(--ids) > MDB_IDL_UM_MAX &&
|
|
||||||
(ids = realloc(ids, (MDB_IDL_UM_MAX+1) * sizeof(MDB_ID))))
|
|
||||||
{
|
|
||||||
*ids++ = MDB_IDL_UM_MAX;
|
|
||||||
*idp = ids;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int mdb_midl_grow( MDB_IDL *idp, int num )
|
|
||||||
{
|
|
||||||
MDB_IDL idn = *idp-1;
|
|
||||||
/* grow it */
|
|
||||||
idn = realloc(idn, (*idn + num + 2) * sizeof(MDB_ID));
|
|
||||||
if (!idn)
|
|
||||||
return ENOMEM;
|
|
||||||
*idn++ += num;
|
|
||||||
*idp = idn;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int mdb_midl_need( MDB_IDL *idp, unsigned num )
|
|
||||||
{
|
|
||||||
MDB_IDL ids = *idp;
|
|
||||||
num += ids[0];
|
|
||||||
if (num > ids[-1]) {
|
|
||||||
num = (num + num/4 + (256 + 2)) & -256;
|
|
||||||
if (!(ids = realloc(ids-1, num * sizeof(MDB_ID))))
|
|
||||||
return ENOMEM;
|
|
||||||
*ids++ = num -= 2;
|
|
||||||
*idp = ids;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int mdb_midl_append( MDB_IDL *idp, MDB_ID id )
|
|
||||||
{
|
|
||||||
MDB_IDL ids = *idp;
|
|
||||||
/* Too big? */
|
|
||||||
if (ids[0] >= ids[-1]) {
|
|
||||||
if (mdb_midl_grow(idp, MDB_IDL_UM_MAX))
|
|
||||||
return ENOMEM;
|
|
||||||
ids = *idp;
|
|
||||||
}
|
|
||||||
ids[0]++;
|
|
||||||
ids[ids[0]] = id;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int mdb_midl_append_list( MDB_IDL *idp, MDB_IDL app )
|
|
||||||
{
|
|
||||||
MDB_IDL ids = *idp;
|
|
||||||
/* Too big? */
|
|
||||||
if (ids[0] + app[0] >= ids[-1]) {
|
|
||||||
if (mdb_midl_grow(idp, app[0]))
|
|
||||||
return ENOMEM;
|
|
||||||
ids = *idp;
|
|
||||||
}
|
|
||||||
memcpy(&ids[ids[0]+1], &app[1], app[0] * sizeof(MDB_ID));
|
|
||||||
ids[0] += app[0];
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int mdb_midl_append_range( MDB_IDL *idp, MDB_ID id, unsigned n )
|
|
||||||
{
|
|
||||||
MDB_ID *ids = *idp, len = ids[0];
|
|
||||||
/* Too big? */
|
|
||||||
if (len + n > ids[-1]) {
|
|
||||||
if (mdb_midl_grow(idp, n | MDB_IDL_UM_MAX))
|
|
||||||
return ENOMEM;
|
|
||||||
ids = *idp;
|
|
||||||
}
|
|
||||||
ids[0] = len + n;
|
|
||||||
ids += len;
|
|
||||||
while (n)
|
|
||||||
ids[n--] = id++;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Quicksort + Insertion sort for small arrays */
|
|
||||||
|
|
||||||
#define SMALL 8
|
|
||||||
#define SWAP(a,b) { itmp=(a); (a)=(b); (b)=itmp; }
|
|
||||||
|
|
||||||
void
|
|
||||||
mdb_midl_sort( MDB_IDL ids )
|
|
||||||
{
|
|
||||||
/* Max possible depth of int-indexed tree * 2 items/level */
|
|
||||||
int istack[sizeof(int)*CHAR_BIT * 2];
|
|
||||||
int i,j,k,l,ir,jstack;
|
|
||||||
MDB_ID a, itmp;
|
|
||||||
|
|
||||||
ir = (int)ids[0];
|
|
||||||
l = 1;
|
|
||||||
jstack = 0;
|
|
||||||
for(;;) {
|
|
||||||
if (ir - l < SMALL) { /* Insertion sort */
|
|
||||||
for (j=l+1;j<=ir;j++) {
|
|
||||||
a = ids[j];
|
|
||||||
for (i=j-1;i>=1;i--) {
|
|
||||||
if (ids[i] >= a) break;
|
|
||||||
ids[i+1] = ids[i];
|
|
||||||
}
|
|
||||||
ids[i+1] = a;
|
|
||||||
}
|
|
||||||
if (jstack == 0) break;
|
|
||||||
ir = istack[jstack--];
|
|
||||||
l = istack[jstack--];
|
|
||||||
} else {
|
|
||||||
k = (l + ir) >> 1; /* Choose median of left, center, right */
|
|
||||||
SWAP(ids[k], ids[l+1]);
|
|
||||||
if (ids[l] < ids[ir]) {
|
|
||||||
SWAP(ids[l], ids[ir]);
|
|
||||||
}
|
|
||||||
if (ids[l+1] < ids[ir]) {
|
|
||||||
SWAP(ids[l+1], ids[ir]);
|
|
||||||
}
|
|
||||||
if (ids[l] < ids[l+1]) {
|
|
||||||
SWAP(ids[l], ids[l+1]);
|
|
||||||
}
|
|
||||||
i = l+1;
|
|
||||||
j = ir;
|
|
||||||
a = ids[l+1];
|
|
||||||
for(;;) {
|
|
||||||
do i++; while(ids[i] > a);
|
|
||||||
do j--; while(ids[j] < a);
|
|
||||||
if (j < i) break;
|
|
||||||
SWAP(ids[i],ids[j]);
|
|
||||||
}
|
|
||||||
ids[l+1] = ids[j];
|
|
||||||
ids[j] = a;
|
|
||||||
jstack += 2;
|
|
||||||
if (ir-i+1 >= j-l) {
|
|
||||||
istack[jstack] = ir;
|
|
||||||
istack[jstack-1] = i;
|
|
||||||
ir = j-1;
|
|
||||||
} else {
|
|
||||||
istack[jstack] = j-1;
|
|
||||||
istack[jstack-1] = l;
|
|
||||||
l = i;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned mdb_mid2l_search( MDB_ID2L ids, MDB_ID id )
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* binary search of id in ids
|
|
||||||
* if found, returns position of id
|
|
||||||
* if not found, returns first position greater than id
|
|
||||||
*/
|
|
||||||
unsigned base = 0;
|
|
||||||
unsigned cursor = 1;
|
|
||||||
int val = 0;
|
|
||||||
unsigned n = (unsigned)ids[0].mid;
|
|
||||||
|
|
||||||
while( 0 < n ) {
|
|
||||||
unsigned pivot = n >> 1;
|
|
||||||
cursor = base + pivot + 1;
|
|
||||||
val = CMP( id, ids[cursor].mid );
|
|
||||||
|
|
||||||
if( val < 0 ) {
|
|
||||||
n = pivot;
|
|
||||||
|
|
||||||
} else if ( val > 0 ) {
|
|
||||||
base = cursor;
|
|
||||||
n -= pivot + 1;
|
|
||||||
|
|
||||||
} else {
|
|
||||||
return cursor;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if( val > 0 ) {
|
|
||||||
++cursor;
|
|
||||||
}
|
|
||||||
return cursor;
|
|
||||||
}
|
|
||||||
|
|
||||||
int mdb_mid2l_insert( MDB_ID2L ids, MDB_ID2 *id )
|
|
||||||
{
|
|
||||||
unsigned x, i;
|
|
||||||
|
|
||||||
x = mdb_mid2l_search( ids, id->mid );
|
|
||||||
assert( x > 0 );
|
|
||||||
|
|
||||||
if( x < 1 ) {
|
|
||||||
/* internal error */
|
|
||||||
return -2;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( x <= ids[0].mid && ids[x].mid == id->mid ) {
|
|
||||||
/* duplicate */
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( ids[0].mid >= MDB_IDL_UM_MAX ) {
|
|
||||||
/* too big */
|
|
||||||
return -2;
|
|
||||||
|
|
||||||
} else {
|
|
||||||
/* insert id */
|
|
||||||
ids[0].mid++;
|
|
||||||
for (i=(unsigned)ids[0].mid; i>x; i--)
|
|
||||||
ids[i] = ids[i-1];
|
|
||||||
ids[x] = *id;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int mdb_mid2l_append( MDB_ID2L ids, MDB_ID2 *id )
|
|
||||||
{
|
|
||||||
/* Too big? */
|
|
||||||
if (ids[0].mid >= MDB_IDL_UM_MAX) {
|
|
||||||
return -2;
|
|
||||||
}
|
|
||||||
ids[0].mid++;
|
|
||||||
ids[ids[0].mid] = *id;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** @} */
|
|
||||||
/** @} */
|
|
||||||
@@ -1,177 +0,0 @@
|
|||||||
/** @file midl.h
|
|
||||||
* @brief mdb ID List header file.
|
|
||||||
*
|
|
||||||
* This file was originally part of back-bdb but has been
|
|
||||||
* modified for use in libmdb. Most of the macros defined
|
|
||||||
* in this file are unused, just left over from the original.
|
|
||||||
*
|
|
||||||
* This file is only used internally in libmdb and its definitions
|
|
||||||
* are not exposed publicly.
|
|
||||||
*/
|
|
||||||
/* $OpenLDAP$ */
|
|
||||||
/* This work is part of OpenLDAP Software <http://www.openldap.org/>.
|
|
||||||
*
|
|
||||||
* Copyright 2000-2013 The OpenLDAP Foundation.
|
|
||||||
* 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>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _MDB_MIDL_H_
|
|
||||||
#define _MDB_MIDL_H_
|
|
||||||
|
|
||||||
#include <stddef.h>
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/** @defgroup internal MDB Internals
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup idls ID List Management
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/** A generic ID number. These were entryIDs in back-bdb.
|
|
||||||
* Preferably it should have the same size as a pointer.
|
|
||||||
*/
|
|
||||||
typedef size_t MDB_ID;
|
|
||||||
|
|
||||||
/** An IDL is an ID List, a sorted array of IDs. The first
|
|
||||||
* element of the array is a counter for how many actual
|
|
||||||
* IDs are in the list. In the original back-bdb code, IDLs are
|
|
||||||
* sorted in ascending order. For libmdb IDLs are sorted in
|
|
||||||
* descending order.
|
|
||||||
*/
|
|
||||||
typedef MDB_ID *MDB_IDL;
|
|
||||||
|
|
||||||
/* IDL sizes - likely should be even bigger
|
|
||||||
* limiting factors: sizeof(ID), thread stack size
|
|
||||||
*/
|
|
||||||
#define MDB_IDL_LOGN 16 /* DB_SIZE is 2^16, UM_SIZE is 2^17 */
|
|
||||||
#define MDB_IDL_DB_SIZE (1<<MDB_IDL_LOGN)
|
|
||||||
#define MDB_IDL_UM_SIZE (1<<(MDB_IDL_LOGN+1))
|
|
||||||
|
|
||||||
#define MDB_IDL_DB_MAX (MDB_IDL_DB_SIZE-1)
|
|
||||||
#define MDB_IDL_UM_MAX (MDB_IDL_UM_SIZE-1)
|
|
||||||
|
|
||||||
#define MDB_IDL_SIZEOF(ids) (((ids)[0]+1) * sizeof(MDB_ID))
|
|
||||||
#define MDB_IDL_IS_ZERO(ids) ( (ids)[0] == 0 )
|
|
||||||
#define MDB_IDL_CPY( dst, src ) (memcpy( dst, src, MDB_IDL_SIZEOF( src ) ))
|
|
||||||
#define MDB_IDL_FIRST( ids ) ( (ids)[1] )
|
|
||||||
#define MDB_IDL_LAST( ids ) ( (ids)[(ids)[0]] )
|
|
||||||
|
|
||||||
/** Append ID to IDL. The IDL must be big enough. */
|
|
||||||
#define mdb_midl_xappend(idl, id) do { \
|
|
||||||
MDB_ID *xidl = (idl), xlen = ++(xidl[0]); \
|
|
||||||
xidl[xlen] = (id); \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
/** Search for an ID in an IDL.
|
|
||||||
* @param[in] ids The IDL to search.
|
|
||||||
* @param[in] id The ID to search for.
|
|
||||||
* @return The index of the first ID greater than or equal to \b id.
|
|
||||||
*/
|
|
||||||
unsigned mdb_midl_search( MDB_IDL ids, MDB_ID id );
|
|
||||||
|
|
||||||
/** Allocate an IDL.
|
|
||||||
* Allocates memory for an IDL of the given size.
|
|
||||||
* @return IDL on success, NULL on failure.
|
|
||||||
*/
|
|
||||||
MDB_IDL mdb_midl_alloc(int num);
|
|
||||||
|
|
||||||
/** Free an IDL.
|
|
||||||
* @param[in] ids The IDL to free.
|
|
||||||
*/
|
|
||||||
void mdb_midl_free(MDB_IDL ids);
|
|
||||||
|
|
||||||
/** Shrink an IDL.
|
|
||||||
* Return the IDL to the default size if it has grown larger.
|
|
||||||
* @param[in,out] idp Address of the IDL to shrink.
|
|
||||||
* @return 0 on no change, non-zero if shrunk.
|
|
||||||
*/
|
|
||||||
int mdb_midl_shrink(MDB_IDL *idp);
|
|
||||||
|
|
||||||
/** Make room for num additional elements in an IDL.
|
|
||||||
* @param[in,out] idp Address of the IDL.
|
|
||||||
* @param[in] num Number of elements to make room for.
|
|
||||||
* @return 0 on success, ENOMEM on failure.
|
|
||||||
*/
|
|
||||||
int mdb_midl_need(MDB_IDL *idp, unsigned num);
|
|
||||||
|
|
||||||
/** Append an ID onto an IDL.
|
|
||||||
* @param[in,out] idp Address of the IDL to append to.
|
|
||||||
* @param[in] id The ID to append.
|
|
||||||
* @return 0 on success, ENOMEM if the IDL is too large.
|
|
||||||
*/
|
|
||||||
int mdb_midl_append( MDB_IDL *idp, MDB_ID id );
|
|
||||||
|
|
||||||
/** Append an IDL onto an IDL.
|
|
||||||
* @param[in,out] idp Address of the IDL to append to.
|
|
||||||
* @param[in] app The IDL to append.
|
|
||||||
* @return 0 on success, ENOMEM if the IDL is too large.
|
|
||||||
*/
|
|
||||||
int mdb_midl_append_list( MDB_IDL *idp, MDB_IDL app );
|
|
||||||
|
|
||||||
/** Append an ID range onto an IDL.
|
|
||||||
* @param[in,out] idp Address of the IDL to append to.
|
|
||||||
* @param[in] id The lowest ID to append.
|
|
||||||
* @param[in] n Number of IDs to append.
|
|
||||||
* @return 0 on success, ENOMEM if the IDL is too large.
|
|
||||||
*/
|
|
||||||
int mdb_midl_append_range( MDB_IDL *idp, MDB_ID id, unsigned n );
|
|
||||||
|
|
||||||
/** Sort an IDL.
|
|
||||||
* @param[in,out] ids The IDL to sort.
|
|
||||||
*/
|
|
||||||
void mdb_midl_sort( MDB_IDL ids );
|
|
||||||
|
|
||||||
/** An ID2 is an ID/pointer pair.
|
|
||||||
*/
|
|
||||||
typedef struct MDB_ID2 {
|
|
||||||
MDB_ID mid; /**< The ID */
|
|
||||||
void *mptr; /**< The pointer */
|
|
||||||
} MDB_ID2;
|
|
||||||
|
|
||||||
/** An ID2L is an ID2 List, a sorted array of ID2s.
|
|
||||||
* The first element's \b mid member is a count of how many actual
|
|
||||||
* elements are in the array. The \b mptr member of the first element is unused.
|
|
||||||
* The array is sorted in ascending order by \b mid.
|
|
||||||
*/
|
|
||||||
typedef MDB_ID2 *MDB_ID2L;
|
|
||||||
|
|
||||||
/** Search for an ID in an ID2L.
|
|
||||||
* @param[in] ids The ID2L to search.
|
|
||||||
* @param[in] id The ID to search for.
|
|
||||||
* @return The index of the first ID2 whose \b mid member is greater than or equal to \b id.
|
|
||||||
*/
|
|
||||||
unsigned mdb_mid2l_search( MDB_ID2L ids, MDB_ID id );
|
|
||||||
|
|
||||||
|
|
||||||
/** Insert an ID2 into a ID2L.
|
|
||||||
* @param[in,out] ids The ID2L to insert into.
|
|
||||||
* @param[in] id The ID2 to insert.
|
|
||||||
* @return 0 on success, -1 if the ID was already present in the ID2L.
|
|
||||||
*/
|
|
||||||
int mdb_mid2l_insert( MDB_ID2L ids, MDB_ID2 *id );
|
|
||||||
|
|
||||||
/** Append an ID2 into a ID2L.
|
|
||||||
* @param[in,out] ids The ID2L to append into.
|
|
||||||
* @param[in] id The ID2 to append.
|
|
||||||
* @return 0 on success, -2 if the ID2L is too big.
|
|
||||||
*/
|
|
||||||
int mdb_mid2l_append( MDB_ID2L ids, MDB_ID2 *id );
|
|
||||||
|
|
||||||
/** @} */
|
|
||||||
/** @} */
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#endif /* _MDB_MIDL_H_ */
|
|
||||||
@@ -1,176 +0,0 @@
|
|||||||
/* 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 "lmdb.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 = 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, NULL, 0, &txn);
|
|
||||||
rc = mdb_open(txn, NULL, 0, &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++;
|
|
||||||
data.mv_size = sizeof(sval);
|
|
||||||
data.mv_data = sval;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (j) printf("%d duplicates skipped\n", j);
|
|
||||||
rc = mdb_txn_commit(txn);
|
|
||||||
rc = mdb_env_stat(env, &mst);
|
|
||||||
|
|
||||||
rc = mdb_txn_begin(env, NULL, 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, NULL, 0, &txn);
|
|
||||||
sprintf(sval, "%03x ", values[i]);
|
|
||||||
rc = mdb_del(txn, dbi, &key, NULL);
|
|
||||||
if (rc) {
|
|
||||||
j--;
|
|
||||||
mdb_txn_abort(txn);
|
|
||||||
} else {
|
|
||||||
rc = mdb_txn_commit(txn);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
free(values);
|
|
||||||
printf("Deleted %d values\n", j);
|
|
||||||
|
|
||||||
rc = mdb_env_stat(env, &mst);
|
|
||||||
rc = mdb_txn_begin(env, NULL, 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 last\n");
|
|
||||||
rc = mdb_cursor_get(cursor, &key, &data, MDB_LAST);
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
printf("Cursor last/prev\n");
|
|
||||||
rc = mdb_cursor_get(cursor, &key, &data, MDB_LAST);
|
|
||||||
printf("key: %.*s, data: %.*s\n",
|
|
||||||
(int) key.mv_size, (char *) key.mv_data,
|
|
||||||
(int) data.mv_size, (char *) data.mv_data);
|
|
||||||
rc = mdb_cursor_get(cursor, &key, &data, MDB_PREV);
|
|
||||||
printf("key: %.*s, data: %.*s\n",
|
|
||||||
(int) key.mv_size, (char *) key.mv_data,
|
|
||||||
(int) data.mv_size, (char *) data.mv_data);
|
|
||||||
|
|
||||||
mdb_txn_abort(txn);
|
|
||||||
|
|
||||||
printf("Deleting with cursor\n");
|
|
||||||
rc = mdb_txn_begin(env, NULL, 0, &txn);
|
|
||||||
rc = mdb_cursor_open(txn, dbi, &cur2);
|
|
||||||
for (i=0; i<50; i++) {
|
|
||||||
rc = mdb_cursor_get(cur2, &key, &data, MDB_NEXT);
|
|
||||||
if (rc)
|
|
||||||
break;
|
|
||||||
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);
|
|
||||||
rc = mdb_del(txn, dbi, &key, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
printf("Restarting cursor in txn\n");
|
|
||||||
rc = mdb_cursor_get(cur2, &key, &data, MDB_FIRST);
|
|
||||||
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);
|
|
||||||
for (i=0; i<32; i++) {
|
|
||||||
rc = mdb_cursor_get(cur2, &key, &data, MDB_NEXT);
|
|
||||||
if (rc) break;
|
|
||||||
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(cur2);
|
|
||||||
rc = mdb_txn_commit(txn);
|
|
||||||
|
|
||||||
printf("Restarting cursor outside txn\n");
|
|
||||||
rc = mdb_txn_begin(env, NULL, 0, &txn);
|
|
||||||
rc = mdb_cursor_open(txn, dbi, &cursor);
|
|
||||||
rc = mdb_cursor_get(cursor, &key, &data, MDB_FIRST);
|
|
||||||
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);
|
|
||||||
for (i=0; i<32; i++) {
|
|
||||||
rc = mdb_cursor_get(cursor, &key, &data, MDB_NEXT);
|
|
||||||
if (rc) break;
|
|
||||||
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_close(env, dbi);
|
|
||||||
|
|
||||||
mdb_txn_abort(txn);
|
|
||||||
mdb_env_close(env);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
@@ -1,117 +0,0 @@
|
|||||||
/* mtest2.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>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Just like mtest.c, but using a subDB instead of the main DB */
|
|
||||||
|
|
||||||
#define _XOPEN_SOURCE 500 /* srandom(), random() */
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <time.h>
|
|
||||||
#include "lmdb.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;
|
|
||||||
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 = 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, NULL, 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 = mdb_env_stat(env, &mst);
|
|
||||||
|
|
||||||
rc = mdb_txn_begin(env, NULL, 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, NULL, 0, &txn);
|
|
||||||
sprintf(sval, "%03x ", values[i]);
|
|
||||||
rc = mdb_del(txn, dbi, &key, NULL);
|
|
||||||
if (rc) {
|
|
||||||
j--;
|
|
||||||
mdb_txn_abort(txn);
|
|
||||||
} else {
|
|
||||||
rc = mdb_txn_commit(txn);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
free(values);
|
|
||||||
printf("Deleted %d values\n", j);
|
|
||||||
|
|
||||||
rc = mdb_env_stat(env, &mst);
|
|
||||||
rc = mdb_txn_begin(env, NULL, 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(env, dbi);
|
|
||||||
|
|
||||||
mdb_txn_abort(txn);
|
|
||||||
mdb_env_close(env);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
@@ -1,127 +0,0 @@
|
|||||||
/* mtest3.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>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Tests for sorted duplicate DBs */
|
|
||||||
#define _XOPEN_SOURCE 500 /* srandom(), random() */
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <time.h>
|
|
||||||
#include "lmdb.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;
|
|
||||||
int count;
|
|
||||||
int *values;
|
|
||||||
char sval[32];
|
|
||||||
char kval[sizeof(int)];
|
|
||||||
|
|
||||||
srandom(time(NULL));
|
|
||||||
|
|
||||||
memset(sval, 0, sizeof(sval));
|
|
||||||
|
|
||||||
count = (random()%384) + 64;
|
|
||||||
values = (int *)malloc(count*sizeof(int));
|
|
||||||
|
|
||||||
for(i = 0;i<count;i++) {
|
|
||||||
values[i] = random()%1024;
|
|
||||||
}
|
|
||||||
|
|
||||||
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, NULL, 0, &txn);
|
|
||||||
rc = mdb_open(txn, "id2", MDB_CREATE|MDB_DUPSORT, &dbi);
|
|
||||||
|
|
||||||
key.mv_size = sizeof(int);
|
|
||||||
key.mv_data = kval;
|
|
||||||
data.mv_size = sizeof(sval);
|
|
||||||
data.mv_data = sval;
|
|
||||||
|
|
||||||
printf("Adding %d values\n", count);
|
|
||||||
for (i=0;i<count;i++) {
|
|
||||||
if (!(i & 0x0f))
|
|
||||||
sprintf(kval, "%03x", values[i]);
|
|
||||||
sprintf(sval, "%03x %d foo bar", values[i], values[i]);
|
|
||||||
rc = mdb_put(txn, dbi, &key, &data, MDB_NODUPDATA);
|
|
||||||
if (rc) j++;
|
|
||||||
}
|
|
||||||
if (j) printf("%d duplicates skipped\n", j);
|
|
||||||
rc = mdb_txn_commit(txn);
|
|
||||||
rc = mdb_env_stat(env, &mst);
|
|
||||||
|
|
||||||
rc = mdb_txn_begin(env, NULL, 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;
|
|
||||||
|
|
||||||
for (i= count - 1; i > -1; i-= (random()%5)) {
|
|
||||||
j++;
|
|
||||||
txn=NULL;
|
|
||||||
rc = mdb_txn_begin(env, NULL, 0, &txn);
|
|
||||||
sprintf(kval, "%03x", values[i & ~0x0f]);
|
|
||||||
sprintf(sval, "%03x %d foo bar", values[i], values[i]);
|
|
||||||
key.mv_size = sizeof(int);
|
|
||||||
key.mv_data = kval;
|
|
||||||
data.mv_size = sizeof(sval);
|
|
||||||
data.mv_data = sval;
|
|
||||||
rc = mdb_del(txn, dbi, &key, &data);
|
|
||||||
if (rc) {
|
|
||||||
j--;
|
|
||||||
mdb_txn_abort(txn);
|
|
||||||
} else {
|
|
||||||
rc = mdb_txn_commit(txn);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
free(values);
|
|
||||||
printf("Deleted %d values\n", j);
|
|
||||||
|
|
||||||
rc = mdb_env_stat(env, &mst);
|
|
||||||
rc = mdb_txn_begin(env, NULL, 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(env, dbi);
|
|
||||||
|
|
||||||
mdb_txn_abort(txn);
|
|
||||||
mdb_env_close(env);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
@@ -1,161 +0,0 @@
|
|||||||
/* mtest4.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>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Tests for sorted duplicate DBs with fixed-size keys */
|
|
||||||
#define _XOPEN_SOURCE 500 /* srandom(), random() */
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <time.h>
|
|
||||||
#include "lmdb.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;
|
|
||||||
int count;
|
|
||||||
int *values;
|
|
||||||
char sval[8];
|
|
||||||
char kval[sizeof(int)];
|
|
||||||
|
|
||||||
memset(sval, 0, sizeof(sval));
|
|
||||||
|
|
||||||
count = 510;
|
|
||||||
values = (int *)malloc(count*sizeof(int));
|
|
||||||
|
|
||||||
for(i = 0;i<count;i++) {
|
|
||||||
values[i] = i*5;
|
|
||||||
}
|
|
||||||
|
|
||||||
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, NULL, 0, &txn);
|
|
||||||
rc = mdb_open(txn, "id2", MDB_CREATE|MDB_DUPSORT|MDB_DUPFIXED, &dbi);
|
|
||||||
|
|
||||||
key.mv_size = sizeof(int);
|
|
||||||
key.mv_data = kval;
|
|
||||||
data.mv_size = sizeof(sval);
|
|
||||||
data.mv_data = sval;
|
|
||||||
|
|
||||||
printf("Adding %d values\n", count);
|
|
||||||
strcpy(kval, "001");
|
|
||||||
for (i=0;i<count;i++) {
|
|
||||||
sprintf(sval, "%07x", values[i]);
|
|
||||||
rc = mdb_put(txn, dbi, &key, &data, MDB_NODUPDATA);
|
|
||||||
if (rc) j++;
|
|
||||||
}
|
|
||||||
if (j) printf("%d duplicates skipped\n", j);
|
|
||||||
rc = mdb_txn_commit(txn);
|
|
||||||
rc = mdb_env_stat(env, &mst);
|
|
||||||
|
|
||||||
/* there should be one full page of dups now.
|
|
||||||
*/
|
|
||||||
rc = mdb_txn_begin(env, NULL, 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);
|
|
||||||
|
|
||||||
/* test all 3 branches of split code:
|
|
||||||
* 1: new key in lower half
|
|
||||||
* 2: new key at split point
|
|
||||||
* 3: new key in upper half
|
|
||||||
*/
|
|
||||||
|
|
||||||
key.mv_size = sizeof(int);
|
|
||||||
key.mv_data = kval;
|
|
||||||
data.mv_size = sizeof(sval);
|
|
||||||
data.mv_data = sval;
|
|
||||||
|
|
||||||
sprintf(sval, "%07x", values[3]+1);
|
|
||||||
rc = mdb_txn_begin(env, NULL, 0, &txn);
|
|
||||||
rc = mdb_put(txn, dbi, &key, &data, MDB_NODUPDATA);
|
|
||||||
mdb_txn_abort(txn);
|
|
||||||
|
|
||||||
sprintf(sval, "%07x", values[255]+1);
|
|
||||||
rc = mdb_txn_begin(env, NULL, 0, &txn);
|
|
||||||
rc = mdb_put(txn, dbi, &key, &data, MDB_NODUPDATA);
|
|
||||||
mdb_txn_abort(txn);
|
|
||||||
|
|
||||||
sprintf(sval, "%07x", values[500]+1);
|
|
||||||
rc = mdb_txn_begin(env, NULL, 0, &txn);
|
|
||||||
rc = mdb_put(txn, dbi, &key, &data, MDB_NODUPDATA);
|
|
||||||
rc = mdb_txn_commit(txn);
|
|
||||||
|
|
||||||
/* Try MDB_NEXT_MULTIPLE */
|
|
||||||
rc = mdb_txn_begin(env, NULL, 0, &txn);
|
|
||||||
rc = mdb_cursor_open(txn, dbi, &cursor);
|
|
||||||
while ((rc = mdb_cursor_get(cursor, &key, &data, MDB_NEXT_MULTIPLE)) == 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_txn_abort(txn);
|
|
||||||
j=0;
|
|
||||||
|
|
||||||
for (i= count - 1; i > -1; i-= (random()%3)) {
|
|
||||||
j++;
|
|
||||||
txn=NULL;
|
|
||||||
rc = mdb_txn_begin(env, NULL, 0, &txn);
|
|
||||||
sprintf(sval, "%07x", values[i]);
|
|
||||||
key.mv_size = sizeof(int);
|
|
||||||
key.mv_data = kval;
|
|
||||||
data.mv_size = sizeof(sval);
|
|
||||||
data.mv_data = sval;
|
|
||||||
rc = mdb_del(txn, dbi, &key, &data);
|
|
||||||
if (rc) {
|
|
||||||
j--;
|
|
||||||
mdb_txn_abort(txn);
|
|
||||||
} else {
|
|
||||||
rc = mdb_txn_commit(txn);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
free(values);
|
|
||||||
printf("Deleted %d values\n", j);
|
|
||||||
|
|
||||||
rc = mdb_env_stat(env, &mst);
|
|
||||||
rc = mdb_txn_begin(env, NULL, 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(env, dbi);
|
|
||||||
|
|
||||||
mdb_txn_abort(txn);
|
|
||||||
mdb_env_close(env);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
@@ -1,129 +0,0 @@
|
|||||||
/* mtest5.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>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Tests for sorted duplicate DBs using cursor_put */
|
|
||||||
#define _XOPEN_SOURCE 500 /* srandom(), random() */
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <time.h>
|
|
||||||
#include "lmdb.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;
|
|
||||||
int count;
|
|
||||||
int *values;
|
|
||||||
char sval[32];
|
|
||||||
char kval[sizeof(int)];
|
|
||||||
|
|
||||||
srandom(time(NULL));
|
|
||||||
|
|
||||||
memset(sval, 0, sizeof(sval));
|
|
||||||
|
|
||||||
count = (random()%384) + 64;
|
|
||||||
values = (int *)malloc(count*sizeof(int));
|
|
||||||
|
|
||||||
for(i = 0;i<count;i++) {
|
|
||||||
values[i] = random()%1024;
|
|
||||||
}
|
|
||||||
|
|
||||||
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, NULL, 0, &txn);
|
|
||||||
rc = mdb_open(txn, "id2", MDB_CREATE|MDB_DUPSORT, &dbi);
|
|
||||||
rc = mdb_cursor_open(txn, dbi, &cursor);
|
|
||||||
|
|
||||||
key.mv_size = sizeof(int);
|
|
||||||
key.mv_data = kval;
|
|
||||||
data.mv_size = sizeof(sval);
|
|
||||||
data.mv_data = sval;
|
|
||||||
|
|
||||||
printf("Adding %d values\n", count);
|
|
||||||
for (i=0;i<count;i++) {
|
|
||||||
if (!(i & 0x0f))
|
|
||||||
sprintf(kval, "%03x", values[i]);
|
|
||||||
sprintf(sval, "%03x %d foo bar", values[i], values[i]);
|
|
||||||
rc = mdb_cursor_put(cursor, &key, &data, MDB_NODUPDATA);
|
|
||||||
if (rc) j++;
|
|
||||||
}
|
|
||||||
if (j) printf("%d duplicates skipped\n", j);
|
|
||||||
mdb_cursor_close(cursor);
|
|
||||||
rc = mdb_txn_commit(txn);
|
|
||||||
rc = mdb_env_stat(env, &mst);
|
|
||||||
|
|
||||||
rc = mdb_txn_begin(env, NULL, 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;
|
|
||||||
|
|
||||||
for (i= count - 1; i > -1; i-= (random()%5)) {
|
|
||||||
j++;
|
|
||||||
txn=NULL;
|
|
||||||
rc = mdb_txn_begin(env, NULL, 0, &txn);
|
|
||||||
sprintf(kval, "%03x", values[i & ~0x0f]);
|
|
||||||
sprintf(sval, "%03x %d foo bar", values[i], values[i]);
|
|
||||||
key.mv_size = sizeof(int);
|
|
||||||
key.mv_data = kval;
|
|
||||||
data.mv_size = sizeof(sval);
|
|
||||||
data.mv_data = sval;
|
|
||||||
rc = mdb_del(txn, dbi, &key, &data);
|
|
||||||
if (rc) {
|
|
||||||
j--;
|
|
||||||
mdb_txn_abort(txn);
|
|
||||||
} else {
|
|
||||||
rc = mdb_txn_commit(txn);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
free(values);
|
|
||||||
printf("Deleted %d values\n", j);
|
|
||||||
|
|
||||||
rc = mdb_env_stat(env, &mst);
|
|
||||||
rc = mdb_txn_begin(env, NULL, 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(env, dbi);
|
|
||||||
|
|
||||||
mdb_txn_abort(txn);
|
|
||||||
mdb_env_close(env);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
@@ -1,131 +0,0 @@
|
|||||||
/* mtest6.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>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Tests for DB splits and merges */
|
|
||||||
#define _XOPEN_SOURCE 500 /* srandom(), random() */
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <time.h>
|
|
||||||
#include "lmdb.h"
|
|
||||||
|
|
||||||
char dkbuf[1024];
|
|
||||||
|
|
||||||
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;
|
|
||||||
int count;
|
|
||||||
int *values;
|
|
||||||
long kval;
|
|
||||||
char *sval;
|
|
||||||
|
|
||||||
srandom(time(NULL));
|
|
||||||
|
|
||||||
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, NULL, 0, &txn);
|
|
||||||
rc = mdb_open(txn, "id2", MDB_CREATE|MDB_INTEGERKEY, &dbi);
|
|
||||||
rc = mdb_cursor_open(txn, dbi, &cursor);
|
|
||||||
rc = mdb_stat(txn, dbi, &mst);
|
|
||||||
|
|
||||||
sval = calloc(1, mst.ms_psize / 4);
|
|
||||||
key.mv_size = sizeof(long);
|
|
||||||
key.mv_data = &kval;
|
|
||||||
data.mv_size = mst.ms_psize / 4 - 30;
|
|
||||||
data.mv_data = sval;
|
|
||||||
|
|
||||||
printf("Adding 12 values, should yield 3 splits\n");
|
|
||||||
for (i=0;i<12;i++) {
|
|
||||||
kval = i*5;
|
|
||||||
sprintf(sval, "%08x", kval);
|
|
||||||
rc = mdb_cursor_put(cursor, &key, &data, MDB_NOOVERWRITE);
|
|
||||||
}
|
|
||||||
printf("Adding 12 more values, should yield 3 splits\n");
|
|
||||||
for (i=0;i<12;i++) {
|
|
||||||
kval = i*5+4;
|
|
||||||
sprintf(sval, "%08x", kval);
|
|
||||||
rc = mdb_cursor_put(cursor, &key, &data, MDB_NOOVERWRITE);
|
|
||||||
}
|
|
||||||
printf("Adding 12 more values, should yield 3 splits\n");
|
|
||||||
for (i=0;i<12;i++) {
|
|
||||||
kval = i*5+1;
|
|
||||||
sprintf(sval, "%08x", kval);
|
|
||||||
rc = mdb_cursor_put(cursor, &key, &data, MDB_NOOVERWRITE);
|
|
||||||
}
|
|
||||||
rc = mdb_cursor_get(cursor, &key, &data, MDB_FIRST);
|
|
||||||
|
|
||||||
do {
|
|
||||||
printf("key: %p %s, data: %p %.*s\n",
|
|
||||||
key.mv_data, mdb_dkey(&key, dkbuf),
|
|
||||||
data.mv_data, (int) data.mv_size, (char *) data.mv_data);
|
|
||||||
} while ((rc = mdb_cursor_get(cursor, &key, &data, MDB_NEXT)) == 0);
|
|
||||||
mdb_cursor_close(cursor);
|
|
||||||
mdb_txn_commit(txn);
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
j=0;
|
|
||||||
|
|
||||||
for (i= count - 1; i > -1; i-= (random()%5)) {
|
|
||||||
j++;
|
|
||||||
txn=NULL;
|
|
||||||
rc = mdb_txn_begin(env, NULL, 0, &txn);
|
|
||||||
sprintf(kval, "%03x", values[i & ~0x0f]);
|
|
||||||
sprintf(sval, "%03x %d foo bar", values[i], values[i]);
|
|
||||||
key.mv_size = sizeof(int);
|
|
||||||
key.mv_data = kval;
|
|
||||||
data.mv_size = sizeof(sval);
|
|
||||||
data.mv_data = sval;
|
|
||||||
rc = mdb_del(txn, dbi, &key, &data);
|
|
||||||
if (rc) {
|
|
||||||
j--;
|
|
||||||
mdb_txn_abort(txn);
|
|
||||||
} else {
|
|
||||||
rc = mdb_txn_commit(txn);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
free(values);
|
|
||||||
printf("Deleted %d values\n", j);
|
|
||||||
|
|
||||||
rc = mdb_env_stat(env, &mst);
|
|
||||||
rc = mdb_txn_begin(env, NULL, 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);
|
|
||||||
#endif
|
|
||||||
mdb_env_close(env);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
@@ -1,71 +0,0 @@
|
|||||||
/* sample-bdb.c - BerkeleyDB toy/sample
|
|
||||||
*
|
|
||||||
* Do a line-by-line comparison of this and sample-mdb.c
|
|
||||||
*/
|
|
||||||
/*
|
|
||||||
* Copyright 2012 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>.
|
|
||||||
*/
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <db.h>
|
|
||||||
|
|
||||||
int main(int argc,char * argv[])
|
|
||||||
{
|
|
||||||
int rc;
|
|
||||||
DB_ENV *env;
|
|
||||||
DB *dbi;
|
|
||||||
DBT key, data;
|
|
||||||
DB_TXN *txn;
|
|
||||||
DBC *cursor;
|
|
||||||
char sval[32], kval[32];
|
|
||||||
|
|
||||||
#define FLAGS (DB_INIT_LOCK|DB_INIT_LOG|DB_INIT_TXN|DB_INIT_MPOOL|DB_CREATE|DB_THREAD)
|
|
||||||
rc = db_env_create(&env, 0);
|
|
||||||
rc = env->open(env, "./testdb", FLAGS, 0664);
|
|
||||||
rc = db_create(&dbi, env, 0);
|
|
||||||
rc = env->txn_begin(env, NULL, &txn, 0);
|
|
||||||
rc = dbi->open(dbi, txn, "test.bdb", NULL, DB_BTREE, DB_CREATE, 0664);
|
|
||||||
|
|
||||||
memset(&key, 0, sizeof(DBT));
|
|
||||||
memset(&data, 0, sizeof(DBT));
|
|
||||||
key.size = sizeof(int);
|
|
||||||
key.data = sval;
|
|
||||||
data.size = sizeof(sval);
|
|
||||||
data.data = sval;
|
|
||||||
|
|
||||||
sprintf(sval, "%03x %d foo bar", 32, 3141592);
|
|
||||||
rc = dbi->put(dbi, txn, &key, &data, 0);
|
|
||||||
rc = txn->commit(txn, 0);
|
|
||||||
if (rc) {
|
|
||||||
fprintf(stderr, "txn->commit: (%d) %s\n", rc, db_strerror(rc));
|
|
||||||
goto leave;
|
|
||||||
}
|
|
||||||
rc = env->txn_begin(env, NULL, &txn, 0);
|
|
||||||
rc = dbi->cursor(dbi, txn, &cursor, 0);
|
|
||||||
key.flags = DB_DBT_USERMEM;
|
|
||||||
key.data = kval;
|
|
||||||
key.ulen = sizeof(kval);
|
|
||||||
data.flags = DB_DBT_USERMEM;
|
|
||||||
data.data = sval;
|
|
||||||
data.ulen = sizeof(sval);
|
|
||||||
while ((rc = cursor->c_get(cursor, &key, &data, DB_NEXT)) == 0) {
|
|
||||||
printf("key: %p %.*s, data: %p %.*s\n",
|
|
||||||
key.data, (int) key.size, (char *) key.data,
|
|
||||||
data.data, (int) data.size, (char *) data.data);
|
|
||||||
}
|
|
||||||
rc = cursor->c_close(cursor);
|
|
||||||
rc = txn->abort(txn);
|
|
||||||
leave:
|
|
||||||
rc = dbi->close(dbi, 0);
|
|
||||||
rc = env->close(env, 0);
|
|
||||||
return rc;
|
|
||||||
}
|
|
||||||
@@ -1,60 +0,0 @@
|
|||||||
/* sample-mdb.c - MDB toy/sample
|
|
||||||
*
|
|
||||||
* Do a line-by-line comparison of this and sample-bdb.c
|
|
||||||
*/
|
|
||||||
/*
|
|
||||||
* Copyright 2012 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>.
|
|
||||||
*/
|
|
||||||
#include <stdio.h>
|
|
||||||
#include "lmdb.h"
|
|
||||||
|
|
||||||
int main(int argc,char * argv[])
|
|
||||||
{
|
|
||||||
int rc;
|
|
||||||
MDB_env *env;
|
|
||||||
MDB_dbi dbi;
|
|
||||||
MDB_val key, data;
|
|
||||||
MDB_txn *txn;
|
|
||||||
MDB_cursor *cursor;
|
|
||||||
char sval[32];
|
|
||||||
|
|
||||||
rc = mdb_env_create(&env);
|
|
||||||
rc = mdb_env_open(env, "./testdb", 0, 0664);
|
|
||||||
rc = mdb_txn_begin(env, NULL, 0, &txn);
|
|
||||||
rc = mdb_open(txn, NULL, 0, &dbi);
|
|
||||||
|
|
||||||
key.mv_size = sizeof(int);
|
|
||||||
key.mv_data = sval;
|
|
||||||
data.mv_size = sizeof(sval);
|
|
||||||
data.mv_data = sval;
|
|
||||||
|
|
||||||
sprintf(sval, "%03x %d foo bar", 32, 3141592);
|
|
||||||
rc = mdb_put(txn, dbi, &key, &data, 0);
|
|
||||||
rc = mdb_txn_commit(txn);
|
|
||||||
if (rc) {
|
|
||||||
fprintf(stderr, "mdb_txn_commit: (%d) %s\n", rc, mdb_strerror(rc));
|
|
||||||
goto leave;
|
|
||||||
}
|
|
||||||
rc = mdb_txn_begin(env, NULL, MDB_RDONLY, &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);
|
|
||||||
leave:
|
|
||||||
mdb_close(env, dbi);
|
|
||||||
mdb_env_close(env);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
@@ -21,7 +21,6 @@
|
|||||||
#include "beast/modules/beast_db/beast_db.h"
|
#include "beast/modules/beast_db/beast_db.h"
|
||||||
#include "../ripple_hyperleveldb/ripple_hyperleveldb.h"
|
#include "../ripple_hyperleveldb/ripple_hyperleveldb.h"
|
||||||
#include "../ripple_leveldb/ripple_leveldb.h"
|
#include "../ripple_leveldb/ripple_leveldb.h"
|
||||||
#include "../ripple_mdb/ripple_mdb.h"
|
|
||||||
#include "../ripple/rocksdb/ripple_rocksdb.h"
|
#include "../ripple/rocksdb/ripple_rocksdb.h"
|
||||||
|
|
||||||
namespace ripple {
|
namespace ripple {
|
||||||
@@ -39,8 +38,6 @@ namespace ripple {
|
|||||||
#include "backend/MemoryFactory.cpp"
|
#include "backend/MemoryFactory.cpp"
|
||||||
# include "backend/NullFactory.h"
|
# include "backend/NullFactory.h"
|
||||||
#include "backend/NullFactory.cpp"
|
#include "backend/NullFactory.cpp"
|
||||||
# include "backend/MdbFactory.h"
|
|
||||||
#include "backend/MdbFactory.cpp"
|
|
||||||
# include "backend/RocksDBFactory.h"
|
# include "backend/RocksDBFactory.h"
|
||||||
#include "backend/RocksDBFactory.cpp"
|
#include "backend/RocksDBFactory.cpp"
|
||||||
|
|
||||||
|
|||||||
@@ -1,291 +0,0 @@
|
|||||||
//------------------------------------------------------------------------------
|
|
||||||
/*
|
|
||||||
This file is part of rippled: https://github.com/ripple/rippled
|
|
||||||
Copyright (c) 2012, 2013 Ripple Labs Inc.
|
|
||||||
|
|
||||||
Permission to use, copy, modify, and/or distribute this software for any
|
|
||||||
purpose with or without fee is hereby granted, provided that the above
|
|
||||||
copyright notice and this permission notice appear in all copies.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
||||||
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
||||||
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
||||||
ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
||||||
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
||||||
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
|
||||||
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
||||||
*/
|
|
||||||
//==============================================================================
|
|
||||||
|
|
||||||
#if RIPPLE_MDB_AVAILABLE
|
|
||||||
|
|
||||||
namespace NodeStore
|
|
||||||
{
|
|
||||||
|
|
||||||
class MdbFactory::BackendImp
|
|
||||||
: public Backend
|
|
||||||
, public BatchWriter::Callback
|
|
||||||
, public LeakChecked <MdbFactory::BackendImp>
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
explicit BackendImp (size_t keyBytes,
|
|
||||||
Parameters const& keyValues,
|
|
||||||
Scheduler& scheduler)
|
|
||||||
: m_keyBytes (keyBytes)
|
|
||||||
, m_scheduler (scheduler)
|
|
||||||
, m_batch (*this, scheduler)
|
|
||||||
, m_env (nullptr)
|
|
||||||
{
|
|
||||||
String path (keyValues ["path"]);
|
|
||||||
|
|
||||||
if (path.isEmpty ())
|
|
||||||
Throw (std::runtime_error ("Missing path in MDB backend"));
|
|
||||||
|
|
||||||
m_basePath = path.toStdString();
|
|
||||||
|
|
||||||
// Regarding the path supplied to mdb_env_open:
|
|
||||||
// This directory must already exist and be writable.
|
|
||||||
//
|
|
||||||
File dir (File::getCurrentWorkingDirectory().getChildFile (path));
|
|
||||||
Result result = dir.createDirectory ();
|
|
||||||
|
|
||||||
if (result.wasOk ())
|
|
||||||
{
|
|
||||||
int error = mdb_env_create (&m_env);
|
|
||||||
|
|
||||||
// Should use the size of the file plus the free space on the disk
|
|
||||||
if (error == 0)
|
|
||||||
error = mdb_env_set_mapsize (m_env, 512L * 1024L * 1024L * 1024L);
|
|
||||||
|
|
||||||
if (error == 0)
|
|
||||||
error = mdb_env_open (
|
|
||||||
m_env,
|
|
||||||
m_basePath.c_str (),
|
|
||||||
MDB_NOTLS,
|
|
||||||
0664);
|
|
||||||
|
|
||||||
MDB_txn* txn;
|
|
||||||
|
|
||||||
if (error == 0)
|
|
||||||
error = mdb_txn_begin (m_env, NULL, 0, &txn);
|
|
||||||
|
|
||||||
if (error == 0)
|
|
||||||
error = mdb_dbi_open (txn, NULL, 0, &m_dbi);
|
|
||||||
|
|
||||||
if (error == 0)
|
|
||||||
error = mdb_txn_commit (txn);
|
|
||||||
|
|
||||||
if (error != 0)
|
|
||||||
{
|
|
||||||
String s;
|
|
||||||
s << "Error #" << error << " creating mdb environment";
|
|
||||||
Throw (std::runtime_error (s.toStdString ()));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
String s;
|
|
||||||
s << "MDB Backend failed to create directory, " << result.getErrorMessage ();
|
|
||||||
Throw (std::runtime_error (s.toStdString().c_str()));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
~BackendImp ()
|
|
||||||
{
|
|
||||||
if (m_env != nullptr)
|
|
||||||
{
|
|
||||||
mdb_dbi_close (m_env, m_dbi);
|
|
||||||
mdb_env_close (m_env);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string getName()
|
|
||||||
{
|
|
||||||
return m_basePath;
|
|
||||||
}
|
|
||||||
|
|
||||||
//--------------------------------------------------------------------------
|
|
||||||
|
|
||||||
template <class T>
|
|
||||||
unsigned char* mdb_cast (T* p)
|
|
||||||
{
|
|
||||||
return const_cast <unsigned char*> (static_cast <unsigned char const*> (p));
|
|
||||||
}
|
|
||||||
|
|
||||||
Status fetch (void const* key, NodeObject::Ptr* pObject)
|
|
||||||
{
|
|
||||||
pObject->reset ();
|
|
||||||
|
|
||||||
Status status (ok);
|
|
||||||
|
|
||||||
MDB_txn* txn = nullptr;
|
|
||||||
|
|
||||||
int error = 0;
|
|
||||||
|
|
||||||
error = mdb_txn_begin (m_env, NULL, MDB_RDONLY, &txn);
|
|
||||||
|
|
||||||
if (error == 0)
|
|
||||||
{
|
|
||||||
MDB_val dbkey;
|
|
||||||
MDB_val data;
|
|
||||||
|
|
||||||
dbkey.mv_size = m_keyBytes;
|
|
||||||
dbkey.mv_data = mdb_cast (key);
|
|
||||||
|
|
||||||
error = mdb_get (txn, m_dbi, &dbkey, &data);
|
|
||||||
|
|
||||||
if (error == 0)
|
|
||||||
{
|
|
||||||
DecodedBlob decoded (key, data.mv_data, data.mv_size);
|
|
||||||
|
|
||||||
if (decoded.wasOk ())
|
|
||||||
{
|
|
||||||
*pObject = decoded.createObject ();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
status = dataCorrupt;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (error == MDB_NOTFOUND)
|
|
||||||
{
|
|
||||||
status = notFound;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
status = unknown;
|
|
||||||
|
|
||||||
WriteLog (lsWARNING, NodeObject) << "MDB txn failed, code=" << error;
|
|
||||||
}
|
|
||||||
|
|
||||||
mdb_txn_abort (txn);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
status = unknown;
|
|
||||||
|
|
||||||
WriteLog (lsWARNING, NodeObject) << "MDB txn failed, code=" << error;
|
|
||||||
}
|
|
||||||
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
|
|
||||||
void store (NodeObject::ref object)
|
|
||||||
{
|
|
||||||
m_batch.store (object);
|
|
||||||
}
|
|
||||||
|
|
||||||
void storeBatch (Batch const& batch)
|
|
||||||
{
|
|
||||||
MDB_txn* txn = nullptr;
|
|
||||||
|
|
||||||
int error = 0;
|
|
||||||
|
|
||||||
error = mdb_txn_begin (m_env, NULL, 0, &txn);
|
|
||||||
|
|
||||||
if (error == 0)
|
|
||||||
{
|
|
||||||
EncodedBlob::Pool::ScopedItem item (m_blobPool);
|
|
||||||
|
|
||||||
BOOST_FOREACH (NodeObject::Ptr const& object, batch)
|
|
||||||
{
|
|
||||||
EncodedBlob& encoded (item.getObject ());
|
|
||||||
|
|
||||||
encoded.prepare (object);
|
|
||||||
|
|
||||||
MDB_val key;
|
|
||||||
key.mv_size = m_keyBytes;
|
|
||||||
key.mv_data = mdb_cast (encoded.getKey ());
|
|
||||||
|
|
||||||
MDB_val data;
|
|
||||||
data.mv_size = encoded.getSize ();
|
|
||||||
data.mv_data = mdb_cast (encoded.getData ());
|
|
||||||
|
|
||||||
error = mdb_put (txn, m_dbi, &key, &data, 0);
|
|
||||||
|
|
||||||
if (error != 0)
|
|
||||||
{
|
|
||||||
WriteLog (lsWARNING, NodeObject) << "mdb_put failed, error=" << error;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (error == 0)
|
|
||||||
{
|
|
||||||
error = mdb_txn_commit(txn);
|
|
||||||
|
|
||||||
if (error != 0)
|
|
||||||
{
|
|
||||||
WriteLog (lsWARNING, NodeObject) << "mdb_txn_commit failed, error=" << error;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
mdb_txn_abort (txn);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
WriteLog (lsWARNING, NodeObject) << "mdb_txn_begin failed, error=" << error;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void visitAll (VisitCallback& callback)
|
|
||||||
{
|
|
||||||
// VFALCO TODO Implement this!
|
|
||||||
bassertfalse;
|
|
||||||
}
|
|
||||||
|
|
||||||
int getWriteLoad ()
|
|
||||||
{
|
|
||||||
return m_batch.getWriteLoad ();
|
|
||||||
}
|
|
||||||
|
|
||||||
//--------------------------------------------------------------------------
|
|
||||||
|
|
||||||
void writeBatch (Batch const& batch)
|
|
||||||
{
|
|
||||||
storeBatch (batch);
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
size_t const m_keyBytes;
|
|
||||||
Scheduler& m_scheduler;
|
|
||||||
BatchWriter m_batch;
|
|
||||||
EncodedBlob::Pool m_blobPool;
|
|
||||||
std::string m_basePath;
|
|
||||||
MDB_env* m_env;
|
|
||||||
MDB_dbi m_dbi;
|
|
||||||
};
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
MdbFactory::MdbFactory ()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
MdbFactory::~MdbFactory ()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
MdbFactory* MdbFactory::getInstance ()
|
|
||||||
{
|
|
||||||
return new MdbFactory;
|
|
||||||
}
|
|
||||||
|
|
||||||
String MdbFactory::getName () const
|
|
||||||
{
|
|
||||||
return "mdb";
|
|
||||||
}
|
|
||||||
|
|
||||||
Backend* MdbFactory::createInstance (
|
|
||||||
size_t keyBytes,
|
|
||||||
Parameters const& keyValues,
|
|
||||||
Scheduler& scheduler)
|
|
||||||
{
|
|
||||||
return new MdbFactory::BackendImp (keyBytes, keyValues, scheduler);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,56 +0,0 @@
|
|||||||
//------------------------------------------------------------------------------
|
|
||||||
/*
|
|
||||||
This file is part of rippled: https://github.com/ripple/rippled
|
|
||||||
Copyright (c) 2012, 2013 Ripple Labs Inc.
|
|
||||||
|
|
||||||
Permission to use, copy, modify, and/or distribute this software for any
|
|
||||||
purpose with or without fee is hereby granted, provided that the above
|
|
||||||
copyright notice and this permission notice appear in all copies.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
||||||
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
||||||
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
||||||
ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
||||||
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
||||||
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
|
||||||
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
||||||
*/
|
|
||||||
//==============================================================================
|
|
||||||
|
|
||||||
#ifndef RIPPLE_NODESTORE_MDBFACTORY_H_INCLUDED
|
|
||||||
#define RIPPLE_NODESTORE_MDBFACTORY_H_INCLUDED
|
|
||||||
|
|
||||||
#if RIPPLE_MDB_AVAILABLE
|
|
||||||
|
|
||||||
namespace NodeStore
|
|
||||||
{
|
|
||||||
|
|
||||||
/** Factory to produce a backend using MDB.
|
|
||||||
|
|
||||||
@note MDB is not currently available for Win32
|
|
||||||
|
|
||||||
@see Database
|
|
||||||
*/
|
|
||||||
class MdbFactory : public Factory
|
|
||||||
{
|
|
||||||
private:
|
|
||||||
MdbFactory ();
|
|
||||||
~MdbFactory ();
|
|
||||||
|
|
||||||
public:
|
|
||||||
class BackendImp;
|
|
||||||
|
|
||||||
static MdbFactory* getInstance ();
|
|
||||||
|
|
||||||
String getName () const;
|
|
||||||
|
|
||||||
Backend* createInstance (size_t keyBytes,
|
|
||||||
Parameters const& keyValues,
|
|
||||||
Scheduler& scheduler);
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -340,10 +340,6 @@ void Database::addAvailableBackends ()
|
|||||||
addFactory (HyperDBFactory::getInstance ());
|
addFactory (HyperDBFactory::getInstance ());
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if RIPPLE_MDB_AVAILABLE
|
|
||||||
addFactory (MdbFactory::getInstance ());
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if RIPPLE_ROCKSDB_AVAILABLE
|
#if RIPPLE_ROCKSDB_AVAILABLE
|
||||||
addFactory (RocksDBFactory::New ());
|
addFactory (RocksDBFactory::New ());
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -91,10 +91,6 @@ public:
|
|||||||
testBackend ("hyperleveldb", seedValue);
|
testBackend ("hyperleveldb", seedValue);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if RIPPLE_MDB_AVAILABLE
|
|
||||||
testBackend ("mdb", seedValue, 200);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if RIPPLE_ROCKSDB_AVAILABLE
|
#if RIPPLE_ROCKSDB_AVAILABLE
|
||||||
testBackend ("rocksdb", seedValue);
|
testBackend ("rocksdb", seedValue);
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -184,10 +184,6 @@ public:
|
|||||||
testNodeStore ("hyperleveldb", useEphemeralDatabase, true, seedValue);
|
testNodeStore ("hyperleveldb", useEphemeralDatabase, true, seedValue);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if RIPPLE_MDB_AVAILABLE
|
|
||||||
testNodeStore ("mdb", useEphemeralDatabase, true, seedValue, 200);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if RIPPLE_ROCKSDB_AVAILABLE
|
#if RIPPLE_ROCKSDB_AVAILABLE
|
||||||
testNodeStore ("rocksdb", useEphemeralDatabase, true, seedValue);
|
testNodeStore ("rocksdb", useEphemeralDatabase, true, seedValue);
|
||||||
#endif
|
#endif
|
||||||
@@ -209,12 +205,6 @@ public:
|
|||||||
testImport ("hyperleveldb", "hyperleveldb", seedValue);
|
testImport ("hyperleveldb", "hyperleveldb", seedValue);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
|
||||||
#if RIPPLE_MDB_AVAILABLE
|
|
||||||
testImport ("mdb", "mdb", seedValue);
|
|
||||||
#endif
|
|
||||||
*/
|
|
||||||
|
|
||||||
testImport ("sqlite", "sqlite", seedValue);
|
testImport ("sqlite", "sqlite", seedValue);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -122,12 +122,6 @@ public:
|
|||||||
testBackend ("rocksdb", seedValue);
|
testBackend ("rocksdb", seedValue);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
|
||||||
#if RIPPLE_MDB_AVAILABLE
|
|
||||||
testBackend ("mdb", seedValue);
|
|
||||||
#endif
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
testBackend ("sqlite", seedValue);
|
testBackend ("sqlite", seedValue);
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -1,41 +0,0 @@
|
|||||||
//------------------------------------------------------------------------------
|
|
||||||
/*
|
|
||||||
This file is part of rippled: https://github.com/ripple/rippled
|
|
||||||
Copyright (c) 2012, 2013 Ripple Labs Inc.
|
|
||||||
|
|
||||||
Permission to use, copy, modify, and/or distribute this software for any
|
|
||||||
purpose with or without fee is hereby granted, provided that the above
|
|
||||||
copyright notice and this permission notice appear in all copies.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
||||||
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
||||||
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
||||||
ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
||||||
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
||||||
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
|
||||||
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
||||||
*/
|
|
||||||
//==============================================================================
|
|
||||||
|
|
||||||
// Unity build file for MDB
|
|
||||||
|
|
||||||
#include "BeastConfig.h"
|
|
||||||
|
|
||||||
#include "ripple_mdb.h"
|
|
||||||
|
|
||||||
#if RIPPLE_MDB_AVAILABLE
|
|
||||||
|
|
||||||
#if BEAST_GCC
|
|
||||||
#pragma GCC diagnostic push
|
|
||||||
#pragma GCC diagnostic ignored "-Wunused-but-set-variable"
|
|
||||||
#pragma GCC diagnostic ignored "-Waddress"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "mdb/libraries/liblmdb/mdb.c"
|
|
||||||
#include "mdb/libraries/liblmdb/midl.c"
|
|
||||||
|
|
||||||
#if BEAST_GCC
|
|
||||||
#pragma GCC diagnostic pop
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,36 +0,0 @@
|
|||||||
//------------------------------------------------------------------------------
|
|
||||||
/*
|
|
||||||
This file is part of rippled: https://github.com/ripple/rippled
|
|
||||||
Copyright (c) 2012, 2013 Ripple Labs Inc.
|
|
||||||
|
|
||||||
Permission to use, copy, modify, and/or distribute this software for any
|
|
||||||
purpose with or without fee is hereby granted, provided that the above
|
|
||||||
copyright notice and this permission notice appear in all copies.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
||||||
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
||||||
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
||||||
ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
||||||
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
||||||
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
|
||||||
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
||||||
*/
|
|
||||||
//==============================================================================
|
|
||||||
|
|
||||||
#ifndef RIPPLE_MDB_H_INCLUDED
|
|
||||||
#define RIPPLE_MDB_H_INCLUDED
|
|
||||||
|
|
||||||
#include "beast/beast/Config.h"
|
|
||||||
|
|
||||||
#if ! BEAST_WIN32
|
|
||||||
#define RIPPLE_MDB_AVAILABLE 1
|
|
||||||
|
|
||||||
#include "mdb/libraries/liblmdb/lmdb.h"
|
|
||||||
|
|
||||||
#else
|
|
||||||
// mdb is unsupported on Win32
|
|
||||||
#define RIPPLE_MDB_AVAILBLE 0
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
||||||
Reference in New Issue
Block a user