Esempio n. 1
0
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;
}
Esempio n. 2
0
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;
}