nostrdb

an unfairly fast embedded nostr database backed by lmdb
git clone git://jb55.com/nostrdb
Log | Files | Refs | Submodules | README | LICENSE

mdb_copy.c (1954B)


      1 /* mdb_copy.c - memory-mapped database backup tool */
      2 /*
      3  * Copyright 2012-2021 Howard Chu, Symas Corp.
      4  * All rights reserved.
      5  *
      6  * Redistribution and use in source and binary forms, with or without
      7  * modification, are permitted only as authorized by the OpenLDAP
      8  * Public License.
      9  *
     10  * A copy of this license is available in the file LICENSE in the
     11  * top-level directory of the distribution or, alternatively, at
     12  * <http://www.OpenLDAP.org/license.html>.
     13  */
     14 #ifdef _WIN32
     15 #include <windows.h>
     16 #define	MDB_STDOUT	GetStdHandle(STD_OUTPUT_HANDLE)
     17 #else
     18 #define	MDB_STDOUT	1
     19 #endif
     20 #include <stdio.h>
     21 #include <stdlib.h>
     22 #include <signal.h>
     23 #include "lmdb.h"
     24 
     25 static void
     26 sighandle(int sig)
     27 {
     28 }
     29 
     30 int main(int argc,char * argv[])
     31 {
     32 	int rc;
     33 	MDB_env *env;
     34 	const char *progname = argv[0], *act;
     35 	unsigned flags = MDB_RDONLY;
     36 	unsigned cpflags = 0;
     37 
     38 	for (; argc > 1 && argv[1][0] == '-'; argc--, argv++) {
     39 		if (argv[1][1] == 'n' && argv[1][2] == '\0')
     40 			flags |= MDB_NOSUBDIR;
     41 		else if (argv[1][1] == 'c' && argv[1][2] == '\0')
     42 			cpflags |= MDB_CP_COMPACT;
     43 		else if (argv[1][1] == 'V' && argv[1][2] == '\0') {
     44 			printf("%s\n", MDB_VERSION_STRING);
     45 			exit(0);
     46 		} else
     47 			argc = 0;
     48 	}
     49 
     50 	if (argc<2 || argc>3) {
     51 		fprintf(stderr, "usage: %s [-V] [-c] [-n] srcpath [dstpath]\n", progname);
     52 		exit(EXIT_FAILURE);
     53 	}
     54 
     55 #ifdef SIGPIPE
     56 	signal(SIGPIPE, sighandle);
     57 #endif
     58 #ifdef SIGHUP
     59 	signal(SIGHUP, sighandle);
     60 #endif
     61 	signal(SIGINT, sighandle);
     62 	signal(SIGTERM, sighandle);
     63 
     64 	act = "opening environment";
     65 	rc = mdb_env_create(&env);
     66 	if (rc == MDB_SUCCESS) {
     67 		rc = mdb_env_open(env, argv[1], flags, 0600);
     68 	}
     69 	if (rc == MDB_SUCCESS) {
     70 		act = "copying";
     71 		if (argc == 2)
     72 			rc = mdb_env_copyfd2(env, MDB_STDOUT, cpflags);
     73 		else
     74 			rc = mdb_env_copy2(env, argv[2], cpflags);
     75 	}
     76 	if (rc)
     77 		fprintf(stderr, "%s: %s failed, error %d (%s)\n",
     78 			progname, act, rc, mdb_strerror(rc));
     79 	mdb_env_close(env);
     80 
     81 	return rc ? EXIT_FAILURE : EXIT_SUCCESS;
     82 }