 |
/*
* 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;
using JanaBiz.Db;
using JanaBiz.DbXml;
using JanaBiz.DbXml.Exceptions;
public class DeleteDocument
{
private static string theContainer = "namespaceExampleData.dbxml";
// Method that deletes all documents from a DB XML container that match a given
// XQuery.
private static void doDeleteDocument(XmlManager mgr, XmlContainer container,
string query, XmlQueryContext context, XmlTransaction txn)
{
Console.WriteLine("Deleting documents for expression: '" + query + "'.");
Console.WriteLine("Return to continue: ");
Console.ReadLine();
// Perform our query. We'll delete any document contained in this result set.
XmlResults results = mgr.Query(txn, query, context, new XmlDocumentConfig());
Console.WriteLine("Found " + results.Size +
" matching the expression '" + query + "'.");
// Get an update context.
using (XmlUpdateContext updateContext = mgr.CreateUpdateContext()) {
while (results.MoveNext()) {
XmlDocument document = results.Current.ToDocument();
string name = document.Name;
Console.WriteLine("Deleting document: " + name + ".");
// Peform the delete
container.DeleteDocument(txn, document, updateContext);
Console.WriteLine("Deleted document: " + name + ".");
}
}
}
// Utility method that we use to make sure the documents that we thought
// were deleted from the container are in fact deleted.
private static void confirmDelete(XmlManager mgr, string query, XmlQueryContext context)
{
Console.WriteLine("Confirming the delete.");
Console.WriteLine("The query: '" + query +
"' should return result set size 0.");
XmlResults results = mgr.Query(null, query, context, new XmlDocumentConfig());
if (results.Size == 0) {
Console.WriteLine("Result set size is 0. Deletion confirmed.");
} else {
Console.WriteLine("Result set size is " + results.Size +
". Deletion failed.");
}
}
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()) {
// Create a context and declare the namespaces
using (XmlQueryContext context = mgr.CreateQueryContext()) {
context.SetNamespace("fruits", "http://groceryItem.dbxml/fruits");
context.SetNamespace("vegetables", "http://groceryItem.dbxml/vegetables");
context.SetNamespace("desserts", "http://groceryItem.dbxml/desserts");
// Delete the document that describes Mabolo (a fruit)
string query = "collection(\"" + theContainer + "\")/fruits:item[product = 'Mabolo']";
// If doDeleteDocument throws an exception then the using block
// will call Dispose() on the Transaction, which will cause it
// to abort itself.
doDeleteDocument(mgr, container, query, context, txn);
txn.Commit();
confirmDelete(mgr, query, context);
}
}
}
}
} catch (DbXmlException e) {
Console.WriteLine("Error performing document delete against " + theContainer);
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 = Console.Out;
envconf.ErrorPrefix = "LOG";
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 (Exception e) {
env.Close();
throw e;
}
}
private static void Usage()
{
Console.WriteLine("This program deletes an XML document from a DBXML container.");
Console.WriteLine("You should run exampleLoadContainer before running this example.");
Console.WriteLine("You are only required to pass this command the path location of the");
Console.WriteLine("database environment that you specified when you loaded the examples data:");
Console.WriteLine();
Console.WriteLine("\t-h <dbenv directory>");
Console.WriteLine("For example:");
Console.WriteLine("\tdeleteDocument.exe -h examplesEnvironment");
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) {
Console.WriteLine("Invalid option: " + arg);
Usage();
}
envdir = args[i];
break;
}
default:
{
Console.WriteLine("Unknown option: " + arg);
Usage();
break;
}
}
} else {
Console.WriteLine("Too many arguments: " + arg);
Usage();
}
}
if (envdir == null) {
Console.WriteLine("Environment directory not found.");
Usage();
}
return envdir;
}
}
 |
|
 |
|