diff --git a/libraries/liblmdb/Makefile b/libraries/liblmdb/Makefile index 2ff3234..859379e 100644 --- a/libraries/liblmdb/Makefile +++ b/libraries/liblmdb/Makefile @@ -39,8 +39,8 @@ mandir = $(datarootdir)/man IHDRS = lmdb.h ILIBS = liblmdb.a liblmdb$(SOEXT) -IPROGS = mdb_stat mdb_copy mdb_dump mdb_load -IDOCS = mdb_stat.1 mdb_copy.1 mdb_dump.1 mdb_load.1 +IPROGS = mdb_stat mdb_copy mdb_dump mdb_load mdb_drop +IDOCS = mdb_stat.1 mdb_copy.1 mdb_dump.1 mdb_load.1 mdb_drop.1 PROGS = $(IPROGS) mtest mtest2 mtest3 mtest4 mtest5 RPROGS = mtest_remap mtest_enc @@ -76,6 +76,7 @@ mdb_stat: mdb_stat.o liblmdb.a mdb_copy: mdb_copy.o liblmdb.a mdb_dump: mdb_dump.o liblmdb.a mdb_load: mdb_load.o liblmdb.a +mdb_drop: mdb_drop.o liblmdb.a mtest: mtest.o liblmdb.a mtest2: mtest2.o liblmdb.a mtest3: mtest3.o liblmdb.a diff --git a/libraries/liblmdb/mdb_drop.1 b/libraries/liblmdb/mdb_drop.1 new file mode 100644 index 0000000..997e291 --- /dev/null +++ b/libraries/liblmdb/mdb_drop.1 @@ -0,0 +1,40 @@ +.TH MDB_DROP 1 "2017/11/19" "LMDB 0.9.70" +.\" Copyright 2014-2017 Howard Chu, Symas Corp. All Rights Reserved. +.\" Copying restrictions apply. See COPYRIGHT/LICENSE. +.SH NAME +mdb_drop \- LMDB database delete tool +.SH SYNOPSIS +.B mdb_drop +[\c +.BR \-V ] +[\c +.BR \-n ] +[\c +.BR \-d ] +[\c +.BI \-s \ subdb\fR] +.BR \ envpath +.SH DESCRIPTION +The +.B mdb_drop +utility empties or deletes a database in the specified +environment. +.SH OPTIONS +.TP +.BR \-V +Write the library version number to the standard output, and exit. +.TP +.BR \-n +Operate on an LMDB database which does not use subdirectories. +.TP +.BR \-d +Delete the specified database, don't just empty it. +.TP +.BR \-s \ subdb +Operate on a specific subdatabase. If no database is specified, only the main database is dropped. +.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 AUTHOR +Howard Chu of Symas Corporation diff --git a/libraries/liblmdb/mdb_drop.c b/libraries/liblmdb/mdb_drop.c new file mode 100644 index 0000000..7258916 --- /dev/null +++ b/libraries/liblmdb/mdb_drop.c @@ -0,0 +1,135 @@ +/* mdb_drop.c - memory-mapped database delete tool */ +/* + * Copyright 2016-2017 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 + * . + */ +#include +#include +#include +#include +#include +#include +#include +#include "lmdb.h" + +static volatile sig_atomic_t gotsig; + +static void dumpsig( int sig ) +{ + gotsig=1; +} + +static void usage(char *prog) +{ + fprintf(stderr, "usage: %s [-V] [-n] [-d] [-s subdb] dbpath\n", prog); + exit(EXIT_FAILURE); +} + +int main(int argc, char *argv[]) +{ + int i, rc; + MDB_env *env; + MDB_txn *txn; + MDB_dbi dbi; + char *prog = argv[0]; + char *envname; + char *subname = NULL; + int envflags = 0, delete = 0; + + if (argc < 2) { + usage(prog); + } + + /* -d: delete the db, don't just empty it + * -s: drop the named subDB + * -n: use NOSUBDIR flag on env_open + * -V: print version and exit + * (default) empty the main DB + */ + while ((i = getopt(argc, argv, "dns:V")) != EOF) { + switch(i) { + case 'V': + printf("%s\n", MDB_VERSION_STRING); + exit(0); + break; + case 'd': + delete = 1; + break; + case 'n': + envflags |= MDB_NOSUBDIR; + break; + case 's': + subname = optarg; + break; + default: + usage(prog); + } + } + + if (optind != argc - 1) + usage(prog); + +#ifdef SIGPIPE + signal(SIGPIPE, dumpsig); +#endif +#ifdef SIGHUP + signal(SIGHUP, dumpsig); +#endif + signal(SIGINT, dumpsig); + signal(SIGTERM, dumpsig); + + envname = argv[optind]; + rc = mdb_env_create(&env); + if (rc) { + fprintf(stderr, "mdb_env_create failed, error %d %s\n", rc, mdb_strerror(rc)); + return EXIT_FAILURE; + } + + mdb_env_set_maxdbs(env, 2); + + rc = mdb_env_open(env, envname, envflags, 0664); + if (rc) { + fprintf(stderr, "mdb_env_open failed, error %d %s\n", rc, mdb_strerror(rc)); + goto env_close; + } + + rc = mdb_txn_begin(env, NULL, 0, &txn); + if (rc) { + fprintf(stderr, "mdb_txn_begin failed, error %d %s\n", rc, mdb_strerror(rc)); + goto env_close; + } + + rc = mdb_open(txn, subname, 0, &dbi); + if (rc) { + fprintf(stderr, "mdb_open failed, error %d %s\n", rc, mdb_strerror(rc)); + goto txn_abort; + } + + rc = mdb_drop(txn, dbi, delete); + if (rc) { + fprintf(stderr, "mdb_drop failed, error %d %s\n", rc, mdb_strerror(rc)); + goto txn_abort; + } + rc = mdb_txn_commit(txn); + if (rc) { + fprintf(stderr, "mdb_txn_commit failed, error %d %s\n", rc, mdb_strerror(rc)); + goto txn_abort; + } + txn = NULL; + +txn_abort: + if (txn) + mdb_txn_abort(txn); +env_close: + mdb_env_close(env); + + return rc ? EXIT_FAILURE : EXIT_SUCCESS; +} diff --git a/libraries/liblmdb/tooltag b/libraries/liblmdb/tooltag index 229bf16..879c14d 100644 --- a/libraries/liblmdb/tooltag +++ b/libraries/liblmdb/tooltag @@ -4,6 +4,11 @@ mdb_copy - environment copy tool mdb_copy.1 + + mdb_drop_1 + mdb_drop - database delete tool + mdb_drop.1 + mdb_dump_1 mdb_dump - environment export tool