int main(int argc,char * argv[]) { int rc; MDB_env *env; const char *progname = argv[0], *act; unsigned flags = MDB_RDONLY; unsigned cpflags = 0; for (; argc > 1 && argv[1][0] == '-'; argc--, argv++) { if (argv[1][1] == 'n' && argv[1][2] == '\0') flags |= MDB_NOSUBDIR; else if (argv[1][1] == 'c' && argv[1][2] == '\0') cpflags |= MDB_CP_COMPACT; else if (argv[1][1] == 'V' && argv[1][2] == '\0') { printf("%s\n", MDB_VERSION_STRING); exit(0); } else argc = 0; } if (argc<2 || argc>3) { fprintf(stderr, "usage: %s [-V] [-c] [-n] srcpath [dstpath]\n", progname); exit(EXIT_FAILURE); } #ifdef SIGPIPE signal(SIGPIPE, sighandle); #endif #ifdef SIGHUP signal(SIGHUP, sighandle); #endif signal(SIGINT, sighandle); signal(SIGTERM, sighandle); act = "opening environment"; rc = mdb_env_create(&env); if (rc == MDB_SUCCESS) { rc = mdb_env_open(env, argv[1], flags, 0600); } if (rc == MDB_SUCCESS) { act = "copying"; if (argc == 2) rc = mdb_env_copyfd2(env, MDB_STDOUT, cpflags); else rc = mdb_env_copy2(env, argv[2], cpflags); } if (rc) fprintf(stderr, "%s: %s failed, error %d (%s)\n", progname, act, rc, mdb_strerror(rc)); mdb_env_close(env); return rc ? EXIT_FAILURE : EXIT_SUCCESS; }
int db_snapshot_to_fd(db_t db, int fd, int compact){ int r; pthread_mutex_lock(&db->mutex); db->txns++; pthread_mutex_unlock(&db->mutex); r = mdb_env_copyfd2(db->env, fd, compact ? MDB_CP_COMPACT : 0); while(MDB_MAP_RESIZED == r){ pthread_mutex_lock(&db->mutex); while(db->txns > 1) pthread_cond_wait(&db->cond, &db->mutex); mdb_env_set_mapsize(db->env, 0); pthread_mutex_unlock(&db->mutex); r = mdb_env_copyfd2(db->env, fd, compact ? MDB_CP_COMPACT : 0); } pthread_mutex_lock(&db->mutex); if(1 == db->txns--) pthread_cond_signal(&db->cond); pthread_mutex_unlock(&db->mutex); return r; }