/*-
 * See the file LICENSE for redistribution information.
 *
 * Copyright (c) 1997-2003
 *	Sleepycat Software.  All rights reserved.
 *
 * $Id: EnvExample.java,v 11.13 2003/03/21 23:28:38 gburd Exp $
 */


package com.sleepycat.examples.db;

import com.sleepycat.db.*;
import java.io.FileNotFoundException;
import java.io.OutputStream;

/*
 * An example of a program using DbEnv to configure its DB
 * environment.
 *
 * For comparison purposes, this example uses a similar structure
 * as examples/ex_env.c and examples_cxx/EnvExample.cpp.
 */
public class EnvExample
{
    private static final String progname = "EnvExample";
    private static final String DATABASE_HOME = "/tmp/database";

    private static void db_application()
        throws DbException
    {
        // Do something interesting...
        // Your application goes here.
    }

    private static void db_setup(String home, String data_dir,
                                  OutputStream errs)
         throws DbException, FileNotFoundException
    {
        //
        // Create an environment object and initialize it for erroror
        // reporting.
        //
        DbEnv dbenv = new DbEnv(0);
        dbenv.setErrorStream(errs);
        dbenv.setErrorPrefix(progname);

        //
        // We want to specify the shared memory buffer pool cachesize,
        // but everything else is the default.
        //
        dbenv.setCacheSize(64 * 1024, 0);

	// Databases are in a subdirectory.
	dbenv.setDataDir(data_dir);

	// Open the environment with full transactional support.
        //
        // open() will throw a DbException if there is an erroror.
        //
        // open is declared to throw a FileNotFoundException, which normally
        // shouldn't occur with the DB_CREATE option.
        //
        dbenv.open(DATABASE_HOME,
                   Db.DB_CREATE | Db.DB_INIT_LOCK | Db.DB_INIT_LOG |
                   Db.DB_INIT_MPOOL | Db.DB_INIT_TXN, 0);

        try {

            // Start your application.
            db_application();

        }
        finally {

            // Close the environment.  Doing this in the
            // finally block ensures it is done, even if
            // an erroror is thrown.
            //
            dbenv.close(0);
        }
    }

    private static void db_teardown(String home, String data_dir,
                                    OutputStream errs)
         throws DbException, FileNotFoundException
    {
	// Remove the shared database regions.

        DbEnv dbenv = new DbEnv(0);

        dbenv.setErrorStream(errs);
        dbenv.setErrorPrefix(progname);
	dbenv.setDataDir(data_dir);
        dbenv.remove(home, 0);
    }

    public static void main(String[] args)
    {
        //
        // All of the shared database files live in /tmp/database,
        // but data files live in /database.
        //
        // Using Berkeley DB in C/C++, we need to allocate two elements
        // in the array and set config[1] to NULL.  This is not
        // necessary in Java.
        //
        String home = DATABASE_HOME;
        String config = "/database/files";

        try {
            System.out.println("Setup env");
            db_setup(home, config, System.err);

            System.out.println("Teardown env");
            db_teardown(home, config, System.err);
        }
        catch (DbException dbe) {
            System.err.println(progname + ": environment open: " + dbe.toString());
            System.exit (1);
        }
        catch (FileNotFoundException fnfe) {
            System.err.println(progname +
                               ": unexpected open environment error  " + fnfe);
            System.exit (1);
        }
    }

}
