1/*-
2 * See the file LICENSE for redistribution information.
3 *
4 * Copyright (c) 1996,2008 Oracle.  All rights reserved.
5 *
6 * $Id: ex_env.c,v 12.6 2008/01/08 20:58:23 bostic Exp $
7 */
8
9#include <sys/types.h>
10
11#include <stddef.h>
12#include <stdio.h>
13#include <stdlib.h>
14
15#include <db.h>
16
17#ifdef macintosh
18#define	DATABASE_HOME	":database"
19#define	CONFIG_DATA_DIR	":database"
20#else
21#ifdef DB_WIN32
22#define	DATABASE_HOME	"\\tmp\\database"
23#define	CONFIG_DATA_DIR	"\\database\\files"
24#else
25#define	DATABASE_HOME	"/tmp/database"
26#define	CONFIG_DATA_DIR	"/database/files"
27#endif
28#endif
29
30int	db_setup __P((const char *, const char *, FILE *, const char *));
31int	db_teardown __P((const char *, const char *, FILE *, const char *));
32int	main __P((void));
33
34/*
35 * An example of a program creating/configuring a Berkeley DB environment.
36 */
37int
38main()
39{
40	const char *data_dir, *home;
41	const char *progname = "ex_env";		/* Program name. */
42
43	/*
44	 * All of the shared database files live in DATABASE_HOME, but
45	 * data files will live in CONFIG_DATA_DIR.
46	 */
47	home = DATABASE_HOME;
48	data_dir = CONFIG_DATA_DIR;
49
50	printf("Setup env\n");
51	if (db_setup(home, data_dir, stderr, progname) != 0)
52		return (EXIT_FAILURE);
53
54	printf("Teardown env\n");
55	if (db_teardown(home, data_dir, stderr, progname) != 0)
56		return (EXIT_FAILURE);
57
58	return (EXIT_SUCCESS);
59}
60
61int
62db_setup(home, data_dir, errfp, progname)
63	const char *home, *data_dir, *progname;
64	FILE *errfp;
65{
66	DB_ENV *dbenv;
67	int ret;
68
69	/*
70	 * Create an environment object and initialize it for error
71	 * reporting.
72	 */
73	if ((ret = db_env_create(&dbenv, 0)) != 0) {
74		fprintf(errfp, "%s: %s\n", progname, db_strerror(ret));
75		return (1);
76	}
77	dbenv->set_errfile(dbenv, errfp);
78	dbenv->set_errpfx(dbenv, progname);
79
80	/*
81	 * We want to specify the shared memory buffer pool cachesize,
82	 * but everything else is the default.
83	 */
84	if ((ret = dbenv->set_cachesize(dbenv, 0, 64 * 1024, 0)) != 0) {
85		dbenv->err(dbenv, ret, "set_cachesize");
86		dbenv->close(dbenv, 0);
87		return (1);
88	}
89
90	/* Databases are in a subdirectory. */
91	(void)dbenv->set_data_dir(dbenv, data_dir);
92
93	/* Open the environment with full transactional support. */
94	if ((ret = dbenv->open(dbenv, home,
95    DB_CREATE | DB_INIT_LOCK | DB_INIT_LOG | DB_INIT_MPOOL | DB_INIT_TXN,
96	    0)) != 0) {
97		dbenv->err(dbenv, ret, "environment open: %s", home);
98		dbenv->close(dbenv, 0);
99		return (1);
100	}
101
102	/* Do something interesting... */
103
104	/* Close the handle. */
105	if ((ret = dbenv->close(dbenv, 0)) != 0) {
106		fprintf(stderr, "DB_ENV->close: %s\n", db_strerror(ret));
107		return (1);
108	}
109	return (0);
110}
111
112int
113db_teardown(home, data_dir, errfp, progname)
114	const char *home, *data_dir, *progname;
115	FILE *errfp;
116{
117	DB_ENV *dbenv;
118	int ret;
119
120	/* Remove the shared database regions. */
121	if ((ret = db_env_create(&dbenv, 0)) != 0) {
122		fprintf(errfp, "%s: %s\n", progname, db_strerror(ret));
123		return (1);
124	}
125	dbenv->set_errfile(dbenv, errfp);
126	dbenv->set_errpfx(dbenv, progname);
127
128	(void)dbenv->set_data_dir(dbenv, data_dir);
129	if ((ret = dbenv->remove(dbenv, home, 0)) != 0) {
130		fprintf(stderr, "DB_ENV->remove: %s\n", db_strerror(ret));
131		return (1);
132	}
133	return (0);
134}
135