mirror of
https://git.openldap.org/openldap/openldap.git
synced 2025-03-07 14:18:15 +08:00
Merge remote branch 'origin/mdb.master'
This commit is contained in:
commit
0f1522418e
4
libraries/libmdb/.gitignore
vendored
4
libraries/libmdb/.gitignore
vendored
@ -1,5 +1,5 @@
|
||||
mtest
|
||||
mtest[23]
|
||||
mtest[23456]
|
||||
testdb
|
||||
mdb_stat
|
||||
*.[ao]
|
||||
@ -11,3 +11,5 @@ mdb_stat
|
||||
core
|
||||
core.*
|
||||
valgrind.*
|
||||
man/
|
||||
html/
|
||||
|
@ -26,6 +26,7 @@ mtest2: mtest2.o libmdb.a
|
||||
mtest3: mtest3.o libmdb.a
|
||||
mtest4: mtest4.o libmdb.a
|
||||
mtest5: mtest5.o libmdb.a
|
||||
mtest6: mtest6.o libmdb.a
|
||||
|
||||
mdb.o: mdb.c mdb.h midl.h
|
||||
$(CC) $(CFLAGS) -fPIC $(CPPFLAGS) -c mdb.c
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -232,10 +232,10 @@ typedef struct MDB_stat {
|
||||
unsigned int ms_psize; /**< Size of a database page.
|
||||
This is currently the same for all databases. */
|
||||
unsigned int ms_depth; /**< Depth (height) of the B-tree */
|
||||
unsigned long ms_branch_pages; /**< Number of internal (non-leaf) pages */
|
||||
unsigned long ms_leaf_pages; /**< Number of leaf pages */
|
||||
unsigned long ms_overflow_pages; /**< Number of overflow pages */
|
||||
unsigned long ms_entries; /**< Number of data items */
|
||||
size_t ms_branch_pages; /**< Number of internal (non-leaf) pages */
|
||||
size_t ms_leaf_pages; /**< Number of leaf pages */
|
||||
size_t ms_overflow_pages; /**< Number of overflow pages */
|
||||
size_t ms_entries; /**< Number of data items */
|
||||
} MDB_stat;
|
||||
|
||||
/** Return the mdb library version information.
|
||||
@ -414,7 +414,7 @@ int mdb_env_set_mapsize(MDB_env *env, size_t size);
|
||||
* <li>EINVAL - an invalid parameter was specified, or the environment is already open.
|
||||
* </ul>
|
||||
*/
|
||||
int mdb_env_set_maxreaders(MDB_env *env, int readers);
|
||||
int mdb_env_set_maxreaders(MDB_env *env, unsigned int readers);
|
||||
|
||||
/** Get the maximum number of threads for the environment.
|
||||
* @param[in] env An environment handle returned by #mdb_env_create()
|
||||
@ -425,7 +425,7 @@ int mdb_env_set_maxreaders(MDB_env *env, int readers);
|
||||
* <li>EINVAL - an invalid parameter was specified.
|
||||
* </ul>
|
||||
*/
|
||||
int mdb_env_get_maxreaders(MDB_env *env, int *readers);
|
||||
int mdb_env_get_maxreaders(MDB_env *env, unsigned int *readers);
|
||||
|
||||
/** Set the maximum number of databases for the environment.
|
||||
* This function is only needed if multiple databases will be used in the
|
||||
@ -440,7 +440,7 @@ int mdb_env_get_maxreaders(MDB_env *env, int *readers);
|
||||
* <li>EINVAL - an invalid parameter was specified, or the environment is already open.
|
||||
* </ul>
|
||||
*/
|
||||
int mdb_env_set_maxdbs(MDB_env *env, int dbs);
|
||||
int mdb_env_set_maxdbs(MDB_env *env, MDB_dbi dbs);
|
||||
|
||||
/** Create a transaction for use with the environment.
|
||||
* The transaction handle may be discarded using #mdb_txn_abort() or #mdb_txn_commit().
|
||||
@ -542,7 +542,7 @@ int mdb_txn_renew(MDB_txn *txn);
|
||||
* <li>#MDB_INTEGERKEY
|
||||
* Keys are binary integers in native byte order. Setting this option
|
||||
* requires all keys to be the same size, typically sizeof(int)
|
||||
* or sizeof(long).
|
||||
* or sizeof(size_t).
|
||||
* <li>#MDB_DUPFIXED
|
||||
* This flag may only be used in combination with #MDB_DUPSORT. This option
|
||||
* tells the library that the data items for this database are all the same
|
||||
@ -839,7 +839,7 @@ int mdb_cursor_del(MDB_cursor *cursor, unsigned int flags);
|
||||
* <li>EINVAL - cursor is not initialized, or an invalid parameter was specified.
|
||||
* </ul>
|
||||
*/
|
||||
int mdb_cursor_count(MDB_cursor *cursor, unsigned long *countp);
|
||||
int mdb_cursor_count(MDB_cursor *cursor, size_t *countp);
|
||||
|
||||
/** Compare two data items according to a particular database.
|
||||
* This returns a comparison as if the two data items were keys in the
|
||||
|
@ -52,10 +52,10 @@ int main(int argc,char * argv[])
|
||||
rc = mdb_stat(txn, dbi, &mst);
|
||||
printf("Page size: %u\n", mst.ms_psize);
|
||||
printf("Tree depth: %u\n", mst.ms_depth);
|
||||
printf("Branch pages: %lu\n", mst.ms_branch_pages);
|
||||
printf("Leaf pages: %lu\n", mst.ms_leaf_pages);
|
||||
printf("Overflow pages: %lu\n", mst.ms_overflow_pages);
|
||||
printf("Entries: %lu\n", mst.ms_entries);
|
||||
printf("Branch pages: %zu\n", mst.ms_branch_pages);
|
||||
printf("Leaf pages: %zu\n", mst.ms_leaf_pages);
|
||||
printf("Overflow pages: %zu\n", mst.ms_overflow_pages);
|
||||
printf("Entries: %zu\n", mst.ms_entries);
|
||||
mdb_close(txn, dbi);
|
||||
mdb_txn_abort(txn);
|
||||
mdb_env_close(env);
|
||||
|
@ -15,6 +15,7 @@
|
||||
* <http://www.OpenLDAP.org/license.html>.
|
||||
*/
|
||||
|
||||
#include <limits.h>
|
||||
#include <string.h>
|
||||
#include <sys/types.h>
|
||||
#include <assert.h>
|
||||
@ -129,12 +130,13 @@ int mdb_midl_append( IDL ids, ID id )
|
||||
/* Quicksort + Insertion sort for small arrays */
|
||||
|
||||
#define SMALL 8
|
||||
#define SWAP(a,b) itmp=(a);(a)=(b);(b)=itmp
|
||||
#define SWAP(a,b) { itmp=(a); (a)=(b); (b)=itmp; }
|
||||
|
||||
void
|
||||
mdb_midl_sort( ID *ids )
|
||||
{
|
||||
int istack[16*sizeof(int)];
|
||||
/* Max possible depth of int-indexed tree * 2 items/level */
|
||||
int istack[sizeof(int)*CHAR_BIT * 2];
|
||||
int i,j,k,l,ir,jstack;
|
||||
ID a, itmp;
|
||||
|
||||
|
@ -26,19 +26,20 @@
|
||||
#ifndef _MDB_MIDL_H_
|
||||
#define _MDB_MIDL_H_
|
||||
|
||||
#include <stddef.h>
|
||||
|
||||
/** @defgroup internal MDB Internals
|
||||
* @{
|
||||
*/
|
||||
/** ULONG should be the largest integer type supported on a machine.
|
||||
* It should be equal to the size of a pointer.
|
||||
*/
|
||||
#define ULONG unsigned long
|
||||
|
||||
/** @defgroup idls ID List Management
|
||||
* @{
|
||||
*/
|
||||
/** A generic ID number. These were entryIDs in back-bdb.
|
||||
* It should be the largest integer type supported on a machine.
|
||||
* It should be equal to the size of a pointer.
|
||||
*/
|
||||
typedef ULONG ID;
|
||||
typedef size_t 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
|
||||
|
131
libraries/libmdb/mtest6.c
Normal file
131
libraries/libmdb/mtest6.c
Normal file
@ -0,0 +1,131 @@
|
||||
/* 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 "mdb.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, 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, 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, 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;
|
||||
}
|
Loading…
Reference in New Issue
Block a user