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

using System.Collections;
using System.IO;
using JanaBiz.Db;
using JanaBiz.DbXml;
using JanaBiz.DbXml.Exceptions;

public class AddIndex 
{

    public static void Main(string[] args) 
    {
        IDictionary options = parseArguments(args, "h:p:");

        string envdir = (string)options['h'];
        string filePath = (string)options['p'];
        if(envdir == null || filePath == null) Usage();

        DirectoryInfo fileDir = new DirectoryInfo(filePath);
        if(!fileDir.Exists) 
        {
            System.Console.WriteLine("File path directory does not exist.");
            Usage();
        }

        DirectoryInfo nsDataDir = GetSubDirectory(fileDir, "nsData");
        DirectoryInfo simpleDataDir = GetSubDirectory(fileDir, "simpleData");

        
        DbEnvironment dbEnv = null;
        XmlManager mgr = null;

        try 
        {
            // Open an environment
            dbEnv = CreateDbEnvironment(envdir);

            // Open an environment and manager
            using(mgr = CreateManager(dbEnv)) 
            {

                LoadFiles(mgr, "namespaceExampleData.dbxml",
                    nsDataDir.GetFiles("*.xml"));
                LoadFiles(mgr, "simpleExampleData.dbxml",
                    simpleDataDir.GetFiles("*.xml"));
            }
        }
        catch(DbXmlException e) 
        {
            System.Console.WriteLine("Error in exampleLoadContainer");
            System.Console.WriteLine(e.ToString());
        }
        finally
        {
            if(mgr != null)
            {
                mgr.Close();
            }
            if(dbEnv != null)
            {
                dbEnv.Close();
            }
        }
    }

    public static void LoadFiles(XmlManager mgr, string containerName, FileInfo[] files) 
    {
        // Open a transactional container
        XmlContainerConfig containerconfig = new XmlContainerConfig();
        containerconfig.AllowCreate = true;
        containerconfig.Transactional = true;

        XmlContainer container  = null;
        try
        {
            container = mgr.OpenContainer(null, containerName,containerconfig);
            
            // Create an update context
            using(XmlUpdateContext uc = mgr.CreateUpdateContext()) 
            {

                // Start a transaction
                using(XmlTransaction txn = mgr.CreateTransaction()) 
                {

                    XmlDocumentConfig docconfig = new XmlDocumentConfig();

                    foreach(FileInfo file in files) 
                    {
                        using(FileStream stream = file.OpenRead()) 
                        {
        
                            // Create a document
                            using(XmlDocument doc = mgr.CreateDocument()) 
                            {

                                doc.Name = file.Name;
                                doc.StreamContent = mgr.CreateInputStream(stream);
                            
                                XmlMetaData metaData = new XmlMetaData("http://dbxmlExamples/timestamp",
                                    "timeStamp",
                                    new XmlValue(System.DateTime.Now.ToString()));
                                doc.SetMetaData(metaData);
                            
                                container.PutDocument(txn, doc, uc, docconfig);
                                System.Console.WriteLine("Added " + file.Name + " to container " +
                                    containerName);
                            }
                        }
                    }

                    // Commit the index adds
                    txn.Commit();
                }
            }            
        }
        catch(DbXmlException e) 
        {
            System.Console.WriteLine(e.ToString());
        }
        finally{
            if(container != null)
            {
                container.Close();
            }
        }
    }

    public static DirectoryInfo GetSubDirectory(DirectoryInfo fileDir, string subdir) 
    {
        DirectoryInfo[] dirs = fileDir.GetDirectories(subdir);
        if(dirs.Length < 1) 
        {
            System.Console.WriteLine(subdir + " subdirectory does not exist.");
            Usage();      
        }
        return dirs[0];
    }

    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 loads the examples XML data into the examples container.");
        System.Console.WriteLine("Provide the directory where you want to place your database environment, ");
        System.Console.WriteLine("and the path to the xmlData directory (this exists in your DB XML examples");
        System.Console.WriteLine("directory).");
        System.Console.WriteLine();
        System.Console.WriteLine("\t-h <dbenv directory> -p <filepath>");    
        System.Console.WriteLine("For example:");
        System.Console.WriteLine("\texampleLoadContainer.exe -h examplesEnvironment -p /home/user1/dbxml-1.1.0/examples/xmlData");

        System.Environment.Exit(-1);
    }

    private static IDictionary parseArguments(string[] args, string options) 
    {
        IDictionary result = new Hashtable();
        for(int i = 0; i < args.Length; ++i) 
        {
            string arg = args[i];
            if((arg.StartsWith("-")
#if WIN32
                || arg.StartsWith("/")
#endif
                ) && arg.Length > 1) 
            {

                int index = options.IndexOf(arg[1]);
                if(index == -1) 
                {
                    System.Console.WriteLine("Unknown option: " + arg);
                    Usage();
                    break;
                }
                else 
                {
                    ++index;
                    if(index < options.Length && options[index] == ':') 
                    {
                        if(arg.Length > 2 && (arg[2] == '='
#if WIN32
                            || arg[2] == ':'
#endif
                            )) 
                        {
                            result[arg[1]] = arg.Substring(3);
                        }
                        else if(arg.Length > 2) 
                        {
                            System.Console.WriteLine("Unknown option: " + arg);
                            Usage();
                        }
                        else 
                        {
                            ++i;
                            if(i >= args.Length) 
                            {
                                System.Console.WriteLine("Invalid option: " + arg);
                                Usage();
                            }
                            result[arg[1]] = args[i];
                        }
                    }
                    else 
                    {
                        result[arg[1]] = "true";
                    }
                }
            }
            else 
            {
                System.Console.WriteLine("Too many arguments: " + arg);
                Usage();
            }
        }
        return result;
    }

}