ジャナ・ビジネス・コンサルティング有限会社トップページへ
/*
 * Berkeley DB XML .NET API
 * 
 * Copyright (C) 2007 Jana Business Consulting Ltd. All rights reserved.
 * 
 * For more information, see http://www.janabiz.com.
 * 
 */

using JanaBiz.Db;
using JanaBiz.DbXml;
using JanaBiz.DbXml.Exceptions;

public class DeleteIndex
{

    private static string theContainer = "namespaceExampleData.dbxml";

    // Method that deletes all documents from a DB XML container that match a given
    // XQuery.
    private static void deleteIndex(XmlManager mgr, XmlContainer container, 
        string URI, string nodeName, string indexType, XmlTransaction txn) 
    {
        System.Console.WriteLine("Deleting index type '" + indexType +
            "' from node '" + nodeName + "'.");

        // Retrieve the index specification from the container
        using(XmlIndexSpecification idxSpec = container.GetIndexSpecification(txn))
        {
            // See what indexes exist on the container
            int count = 0;
            System.Console.WriteLine("Before the delete, the following indexes are maintained for the container:");
            // Loop over the indexes and report what's there.
            while(idxSpec.MoveNext())
            {
                System.Console.WriteLine("\tFor node '" + idxSpec.Current.Name +
                    "', found index: '" + idxSpec.Current.Index + "'.");
                ++count;
            }    
            System.Console.WriteLine(count + " indexes found.");
    
            // Delete the indexes from the specification.
            idxSpec.DeleteIndex(URI, nodeName, indexType);
            
            // Get an update context.
            using(XmlUpdateContext updateContext = mgr.CreateUpdateContext()) 
            {
                // Set the specification back to the container
                container.SetIndexSpecification(txn, idxSpec, updateContext);
            }
        }
    
        // Retrieve the index specification from the container
        using(XmlIndexSpecification idxSpec = container.GetIndexSpecification(txn))
        {
            // Look at the indexes again to make sure our deletion took.
            int count = 0;
            System.Console.WriteLine("After the delete, the following indexes are maintained for the container:");
            while(idxSpec.MoveNext())
            {
                System.Console.WriteLine("\tFor node '" + idxSpec.Current.Name +
                    "', found index: '" + idxSpec.Current.Index + "'.");
                ++count;
            }
            System.Console.WriteLine(count + " indexes found.");
        }
    }

    public static void Main(string[] args) 
    {

        string envdir = parseArguments(args);

        DbEnvironment dbEnv = null;
        XmlManager mgr = null;
        XmlContainer container = null;
        
        try 
        {
            // Open an environment
            dbEnv = CreateDbEnvironment(envdir);
            
            // Open a manager
            using(mgr = CreateManager(dbEnv)) 
            {

                // Open a transactional container
                XmlContainerConfig containerconfig = new XmlContainerConfig();
                containerconfig.Transactional = true;
                using(container = mgr.OpenContainer(null, theContainer,
                          containerconfig)) 
                {

                    // Start a transaction
                    using(XmlTransaction txn = mgr.CreateTransaction()) 
                    {
                        // Delete an string equality index for the "product" element node.
                        deleteIndex(mgr, container, "", "product", 
                            "node-element-equality-string", txn);

                        // Commit the index delete
                        txn.Commit();
                    }

                    // Perform the deletes in two different transactions for 
                    // no particular reason
                    using(XmlTransaction txn = mgr.CreateTransaction()) 
                    {
                        // Delete an edge presence index for the product node
                        deleteIndex(mgr, container, "", "product", 
                            "edge-element-presence-none", txn);

                        // Commit the index delete
                        txn.Commit();
                    }
                }
            }
        }
        catch(DbXmlException e) 
        {
            System.Console.WriteLine("Error deleting indexes from container " + theContainer);
            System.Console.WriteLine(e.ToString());
        }
        finally
        {
            if(container != null)
            {
                container.Close();
            }
            if(mgr != null)
            {
                mgr.Close();
            }
            if(dbEnv != null)
            {
                dbEnv.Close();
            }
        }
    }
    
    public static DbEnvironment CreateDbEnvironment(string envdir)
    {
        DbEnvironmentConfig envconf = new DbEnvironmentConfig();
        envconf.CacheSize = 50 * 1024;
        
        envconf.AllowCreate = true;
        envconf.InitializeCache = true;
        envconf.Transactional = true;
        envconf.InitializeLocking = true;
        envconf.InitializeLogging = true;
        envconf.RunRecovery = true;
        envconf.ErrorWriter = System.Console.Out;
        envconf.ErrorPrefix = "PREFIX"; 
        
        DbEnvironment env = new DbEnvironment(envdir, envconf);
        
        return env;
    }

    public static XmlManager CreateManager(DbEnvironment env) 
    {
        XmlManagerConfig mgrconfig = new XmlManagerConfig();
        mgrconfig.AdoptEnvironment = true;
        
        try 
        {
            return new XmlManager(env, mgrconfig);
        }
        catch(System.Exception e) 
        {
            env.Close();
            throw e;
        }
    }

    private static void Usage() 
    {
        System.Console.WriteLine("This program deletes several indexes from a DBXML container.");
        System.Console.WriteLine("You should run exampleLoadContainer before running this example.");
        System.Console.WriteLine("You are only required to pass this command the path location of the database");
        System.Console.WriteLine("environment that you specified when you loaded the examples data:");
        System.Console.WriteLine();
        System.Console.WriteLine("\t-h <dbenv directory>");
        System.Console.WriteLine();
        System.Console.WriteLine("For best results, run addIndex before running this program.");
        System.Console.WriteLine();
        System.Console.WriteLine("For example:");
        System.Console.WriteLine("\tdeleteIndex.exe -h examplesEnvironment");

        System.Environment.Exit(-1);
    }

    private static string parseArguments(string[] args) 
    {
        string envdir = null;
        for(int i = 0; i < args.Length; ++i) 
        {
            string arg = args[i];
            if((arg.StartsWith("-")
#if WIN32
                || arg.StartsWith("/")
#endif
                ) && arg.Length > 1) 
            {
                switch(arg[1]) 
                {
                    case 'h': 
                    {
                        ++i;
                        if(i >= args.Length) 
                        {
                            System.Console.WriteLine("Invalid option: " + arg);
                            Usage();
                        }
                        envdir = args[i];
                        break;
                    }
                    default: 
                    {
                        System.Console.WriteLine("Unknown option: " + arg);
                        Usage();
                        break;
                    }
                }
            }
            else 
            {
                System.Console.WriteLine("Too many arguments: " + arg);
                Usage();
            }
        }
        if(envdir == null) 
        {
            System.Console.WriteLine("Environment directory not found.");
            Usage();
        }
        return envdir;
    }

}