 |
/*
* 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;
}
}
 |
|
 |
|