parent
4d5e2d2a2a
commit
55fcd0cfee
@ -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 <http://www.symas.com> |
@ -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 |
||||
* <http://www.OpenLDAP.org/license.html>.
|
||||
*/ |
||||
#include <stdio.h> |
||||
#include <errno.h> |
||||
#include <stdlib.h> |
||||
#include <string.h> |
||||
#include <ctype.h> |
||||
#include <unistd.h> |
||||
#include <signal.h> |
||||
#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; |
||||
} |
Loading…
Reference in new issue