Patches for Berkeley DB XML version 2.4.16

  1. Consolidated patch for 2.4 support issues (SRs): 16491, 16556, 16565, 16593, 16595, 16608, 16617, 16626, 16628, 16677, 16678, 16722. This patch must be applied to an unpatched version of Berkeley DB XML 2.4.16.

    [#16491]
    Fixed a problem where documents could lose their name (from the name index database) after calls to XmlContainer.updateDocument().
    [#16556]
    Fixed an assertion triggered when using a predicate against a variable containing constructed nodes.
    [#16565]
    Fixed a static initialization problem that appears on some Windows platforms related to NsNid and results in an exception during XmlManager construction.
    [#16593]
    Fixed a bug where constructed documents could not be created from an XmlInputStream.
    [#16595]
    The Java garbage collector will no longer destory XmlResolver objects while the object is still needed.
    [#16608]
    XmlValues created from an empty document will no longer crash on calls to certain functions.
    [#16617]
    XmlInputStream will no longer cause a crash or print garbage if the XmlDocument it came from is deleted. Also, XmlDocument.getContentAsXmlInputStream() will now always consume the content of constructed documents.
    [#16626]
    Fixed a bug in the Python bindings for XmlEventWriter::writeText()
    [#16628]
    Fixed exception class constructors for XmlDatabaseError and XmlException. Arguments were out of order.
    [316677] TAR
    The flags DBXML_ENCRYPT and DBXML_CHKSUM will no longer result in an exception even when used correctly.
    [#16678]
    Modified interfaces that can legitimately return a NULL value (in C++ or Java) to return None in Python.
    [#16722]
    Updating a node selected using the query . will no longer result in an exception or crash when using the Java API.

  2. Apply the following patch to the dbxml-2.4.16 release.  
    diff -ru dbxml-2.4.16-original/dbxml/dist/swig/dbxml_python.i dbxml-2.4.16/dbxml/dist/swig/dbxml_python.i
    --- dbxml-2.4.16-original/dbxml/dist/swig/dbxml_python.i	2008-10-21 14:27:14.000000000 -0700
    +++ dbxml-2.4.16/dbxml/dist/swig/dbxml_python.i	2008-12-30 11:57:20.000000000 -0800
    @@ -316,7 +316,15 @@
       if ($1)
         $result = PyString_FromString((const char*)$1);
       else
    -    $result = NULL;
    +    $result = Py_None;
    +}
    +
    +%typemap(typecheck,precedence=SWIG_TYPECHECK_STRING) const unsigned char * {
    +  $1 = PyString_Check($input) ? 1 : 0;
    +}
    +
    +%typemap(typecheck,precedence=SWIG_TYPECHECK_STRING) const unsigned char * {
    +  $1 = PyString_Check($input) ? 1 : 0;
     }
     
     %typemap(in) Dbt *, Dbt & (Dbt dbt) {
    @@ -329,7 +337,7 @@
       if ($1)
         $result = PyString_FromStringAndSize((char *)$1->get_data(), $1->get_size());
       else
    -    $result = NULL;
    +    $result = Py_None;
     }
     
     %typemap(in) XmlData *, XmlData & (XmlData xml_data) {
    @@ -345,7 +353,7 @@
     						   $1->get_size());
     		delete $1; // done with new XmlData
     	} else
    -		$result = NULL;
    +		$result = Py_None;
     }
     
     %{
    @@ -468,14 +476,14 @@
     
     %pythoncode %{
     class XmlException(Exception):
    -    """Base class for BDB XML exceptions.
    +    """Base class for BDB XML exceptions.  It should never be called directly, and
    +    if it is, it's an unknown error
         Attributes:
    -        exceptionCode -- integer value
             what -- the exception message
         """
    -    def __init__(self, ec, msg):
    -        self.exceptionCode = ec
    -        self.what = msg
    +    def __init__(self, msg):
    +        self.exceptionCode = INTERNAL_ERROR
    +        self.what = "Unknown exception thrown: ",msg
         def __str__(self):
             return "XmlException %d, %s"%(self.exceptionCode,self.what)
         def getexceptionCode(self):
    @@ -488,7 +496,7 @@
         Attributes:
             dbError -- the Berkeley DB errno
         """
    -    def __init__(self, dberr, msg):
    +    def __init__(self, msg, dberr):
             self.exceptionCode = DATABASE_ERROR
             self.what = msg
             self.dbError = dberr
    diff -ru dbxml-2.4.16-original/dbxml/src/dbxml/ConfigurationDatabase.cpp dbxml-2.4.16/dbxml/src/dbxml/ConfigurationDatabase.cpp
    --- dbxml-2.4.16-original/dbxml/src/dbxml/ConfigurationDatabase.cpp	2008-10-21 14:27:22.000000000 -0700
    +++ dbxml-2.4.16/dbxml/src/dbxml/ConfigurationDatabase.cpp	2008-12-30 11:57:20.000000000 -0800
    @@ -52,7 +52,7 @@
     		dbtxn = txn->getDbTxn();
     
     	// always set DB_CREATE and DB_THREAD
    -	flags &= ~(DB_TXN_NOSYNC);
    +	flags &= ~(DB_TXN_NOSYNC|DBXML_ENCRYPT|DBXML_CHKSUM);
     	flags |= DB_CREATE|DB_THREAD;
     	DbSequence *seq =  new DbSequence(&db, 0);
     	if (seq) {
    diff -ru dbxml-2.4.16-original/dbxml/src/dbxml/Document.cpp dbxml-2.4.16/dbxml/src/dbxml/Document.cpp
    --- dbxml-2.4.16-original/dbxml/src/dbxml/Document.cpp	2008-10-21 14:27:22.000000000 -0700
    +++ dbxml-2.4.16/dbxml/src/dbxml/Document.cpp	2008-12-30 11:57:20.000000000 -0800
    @@ -571,6 +571,10 @@
     		consumed(getName(), consumed_);
     		ret = new MemBufInputStream(0, 0, getName().c_str(),false);
     	}
    +	if(definitiveContent_ == DBT) {
    +		dbtContent_ = 0;
    +		definitiveContent_ = NONE;
    +	}
     	return ret;
     }
     
    @@ -680,6 +684,7 @@
     {
     	changeContentToNsDom(isns);
     
    +	if (!nsDocument_) return 0; //empty document
     	if (nid.isDocRootNid())
     		return nsDocument_->getDocumentNode();
     	NsNode *nsNode = nsDocument_->getNode(nid, /*getNext*/false);
    diff -ru dbxml-2.4.16-original/dbxml/src/dbxml/DocumentDatabase.cpp dbxml-2.4.16/dbxml/src/dbxml/DocumentDatabase.cpp
    --- dbxml-2.4.16-original/dbxml/src/dbxml/DocumentDatabase.cpp	2008-10-21 14:27:22.000000000 -0700
    +++ dbxml-2.4.16/dbxml/src/dbxml/DocumentDatabase.cpp	2008-12-30 11:57:20.000000000 -0800
    @@ -184,9 +184,6 @@
     			id = ((Document&)old_document).getID();
     			new_document.getIDToSet() = id;
     			resetId = true;
    -			// clear modified flag if set on name
    -			const_cast(&new_document)->
    -				clearModified(Name(metaDataName_uri_name));
     		}
     	} else {
     		err = indexer.getContainer()->getDocument(
    diff -ru dbxml-2.4.16-original/dbxml/src/dbxml/nodeStore/NsDocumentDatabase.cpp dbxml-2.4.16/dbxml/src/dbxml/nodeStore/NsDocumentDatabase.cpp
    --- dbxml-2.4.16-original/dbxml/src/dbxml/nodeStore/NsDocumentDatabase.cpp	2008-10-21 14:27:22.000000000 -0700
    +++ dbxml-2.4.16/dbxml/src/dbxml/nodeStore/NsDocumentDatabase.cpp	2008-12-30 11:57:20.000000000 -0800
    @@ -173,9 +173,6 @@
     			id = ((Document&)old_document).getID();
     			new_document.getIDToSet() = id;
     			resetId = true;
    -			// clear modified flag if set on name
    -			const_cast(&new_document)->
    -				clearModified(Name(metaDataName_uri_name));
     		}
     
     	} else {
    diff -ru dbxml-2.4.16-original/dbxml/src/dbxml/nodeStore/NsNid.cpp dbxml-2.4.16/dbxml/src/dbxml/nodeStore/NsNid.cpp
    --- dbxml-2.4.16-original/dbxml/src/dbxml/nodeStore/NsNid.cpp	2008-10-21 14:27:17.000000000 -0700
    +++ dbxml-2.4.16/dbxml/src/dbxml/nodeStore/NsNid.cpp	2008-12-30 11:57:20.000000000 -0800
    @@ -62,9 +62,9 @@
      * 3.  Between "1a0" and "1ab" ==> 1aam (cannot use "1aa")
      */
     
    -const NsFullNid NsFullNid::docRootFullNid = NsFullNid();
    -const NsNid NsNid::docRootNid;
    -const NsNid NsNid::docMetaDataNid;
    +NsFullNid NsFullNid::docRootFullNid;
    +NsNid NsNid::docRootNid;
    +NsNid NsNid::docMetaDataNid;
     
     #define NID_BETW_INITIAL_SIZE 4 // must be two or more
     #define NID_INITIAL_DIGIT 0
    diff -ru dbxml-2.4.16-original/dbxml/src/dbxml/nodeStore/NsNid.hpp dbxml-2.4.16/dbxml/src/dbxml/nodeStore/NsNid.hpp
    --- dbxml-2.4.16-original/dbxml/src/dbxml/nodeStore/NsNid.hpp	2008-10-21 14:27:17.000000000 -0700
    +++ dbxml-2.4.16/dbxml/src/dbxml/nodeStore/NsNid.hpp	2008-12-30 11:57:20.000000000 -0800
    @@ -108,23 +108,23 @@
     
     	// static methods
     	static void initDocRoot() {
    -		const_cast(docRootNid) = rootNid;
    -		const_cast(docMetaDataNid) = metadataNid;
    +		docRootNid = rootNid;
    +		docMetaDataNid = metadataNid;
     	}
     	static void displayNid(std::ostream &out, const char *buf, uint32_t len);
     	static const NsNid *getRootNid() {
    -		return &docRootNid;
    +		return const_cast(&docRootNid);
     	}
     	static const NsNid *getMetaDataNid() {
    -		return &docMetaDataNid;
    +		return const_cast(&docMetaDataNid);
     	}
     	static int compare(const unsigned char *n1,
     			   const unsigned char *n2);
     	
     protected:
     	const unsigned char *nid_;
    -	static const NsNid docRootNid;
    -	static const NsNid docMetaDataNid;
    +	static NsNid docRootNid;
    +	static NsNid docMetaDataNid;
     };
     	
     class NsFullNid {
    @@ -215,15 +215,15 @@
     		return 4;
     	}
     	static const NsFullNid *getRootNid() {
    -		return &docRootFullNid;
    +		return const_cast(&docRootFullNid);
     	}
     	static void initDocRootNid() {
    -		const_cast(docRootFullNid).setDocRootNid();
    +		docRootFullNid.setDocRootNid();
     		NsNid::initDocRoot();
     	}
     	static void initNid(xmlbyte_t *buf, xmlbyte_t id);
     private:
    -	static const NsFullNid docRootFullNid;
    +	static NsFullNid docRootFullNid;
     };
     
     class DBXML_EXPORT NsNidGen {
    diff -ru dbxml-2.4.16-original/dbxml/src/dbxml/query/DecisionPointQP.cpp dbxml-2.4.16/dbxml/src/dbxml/query/DecisionPointQP.cpp
    --- dbxml-2.4.16-original/dbxml/src/dbxml/query/DecisionPointQP.cpp	2008-10-21 14:27:22.000000000 -0700
    +++ dbxml-2.4.16/dbxml/src/dbxml/query/DecisionPointQP.cpp	2008-12-30 11:57:20.000000000 -0800
    @@ -3,7 +3,6 @@
     //
     // Copyright (c) 2002,2008 Oracle.  All rights reserved.
     //
    -// $Id$
     //
     
     #include "../DbXmlInternal.hpp"
    @@ -274,7 +273,7 @@
     	// **** IMPORTANT - This algorithm is very carefully arranged to avoid
     	// **** deadlocks and race-conditions. Don't rearrange things unless you
     	// **** know what you are doing!
    -
    +	
     	// Get the runtime configuration
     	DbXmlConfiguration *conf = GET_CONFIGURATION(context);
     
    @@ -354,7 +353,8 @@
     	}
     	{
     		OptimizationContext opt(OptimizationContext::ALTERNATIVES, context, 0, container);
    -		qp = qp->chooseAlternative(opt, "decision point", container->getContainerID() == 0);
    +		opt.setCheckForSS(container->getContainerID() == 0);
    +		qp = qp->chooseAlternative(opt, "decision point");
     		qp->logQP(opt.getLog(), "OQP", qp, opt.getPhase());
     	}
     	{
    @@ -395,16 +395,27 @@
     {
     	if(arg_ != 0)
     		_src.add(arg_->getStaticAnalysis());
    +	
    +	bool checkForSS = opt.checkForSS();
    +	
    +	try {
    +		ListItem **li = &qpList_;
    +		for(ListItem *oli = o->qpList_; oli != 0; oli = oli->next) {
    +			opt.setCheckForSS(oli->container->getContainerID() == 0);
    +		
    +			*li = new (mm) ListItem(oli->container, 0);
    +			(*li)->qp = oli->qp->chooseAlternative(opt, "decision point");
     
    -	ListItem **li = &qpList_;
    -	for(ListItem *oli = o->qpList_; oli != 0; oli = oli->next) {
    -		*li = new (mm) ListItem(oli->container, 0);
    -		(*li)->qp = oli->qp->chooseAlternative(opt, "decision point", oli->container->getContainerID() == 0);
    +			_src.add((*li)->qp->getStaticAnalysis());
     
    -		_src.add((*li)->qp->getStaticAnalysis());
    -
    -		li = &(*li)->next;
    +			li = &(*li)->next;
    +		}
    +	}
    +	catch(...) {
    +		opt.setCheckForSS(checkForSS);
    +		throw;
     	}
    +	opt.setCheckForSS(checkForSS);
     }
     
     DecisionPointQP::DecisionPointQP(const DecisionPointQP *o, XPath2MemoryManager *mm)
    diff -ru dbxml-2.4.16-original/dbxml/src/dbxml/query/QueryPlan.cpp dbxml-2.4.16/dbxml/src/dbxml/query/QueryPlan.cpp
    --- dbxml-2.4.16-original/dbxml/src/dbxml/query/QueryPlan.cpp	2008-10-21 14:27:22.000000000 -0700
    +++ dbxml-2.4.16/dbxml/src/dbxml/query/QueryPlan.cpp	2008-12-30 11:57:20.000000000 -0800
    @@ -3,7 +3,6 @@
     //
     // Copyright (c) 2002,2008 Oracle.  All rights reserved.
     //
    -// $Id$
     //
     
     #include "../DbXmlInternal.hpp"
    @@ -133,13 +132,44 @@
     	}
     }
     
    -CostSortItem::CostSortItem(QueryPlan *qp, OperationContext &oc, QueryExecutionContext &qec)
    -	: qp_(qp), cost_(qp->cost(oc, qec))
    +class ContainsSequentialScan : public NodeVisitingOptimizer
    +{
    +public:
    +	bool run(QueryPlan *qp)
    +	{
    +		found = false;
    +		optimizeQP(qp);
    +		return found;
    +	}
    +
    +private:
    +	virtual void resetInternal() {}
    +
    +	virtual ASTNode *optimize(ASTNode *item)
    +	{
    +		// Don't look inside ASTNode objects
    +		return item;
    +	}
    +	virtual QueryPlan *optimizeSequentialScan(SequentialScanQP *item)
    +	{
    +		found = true;
    +		return item;
    +	}
    +
    +	bool found;
    +};
    +
    +CostSortItem::CostSortItem(QueryPlan *qp, OperationContext &oc, QueryExecutionContext &qec, bool checkForSS)
    +	: qp_(qp), cost_(qp->cost(oc, qec)),
    +	  hasSS_(false)
     {
    +	if(checkForSS) hasSS_ = ContainsSequentialScan().run(qp);
     }
     
     bool CostSortItem::operator<(const CostSortItem &o) const
     {
    +        if(hasSS_ != o.hasSS_) return !hasSS_;
    +	
     	if(cost_.totalPages() < o.cost_.totalPages()) return true;
     	if(cost_.totalPages() > o.cost_.totalPages()) return false;
     
    @@ -194,12 +224,12 @@
     			}
     
     			++alternativesCount;
    -			costSortSet.insert(CostSortItem(*it, oc, qec));
    +			costSortSet.insert(CostSortItem(*it, oc, qec, opt.checkForSS()));
     
     			if(costSortSet.size() > ALTERNATIVES_THRESHOLD) {
     				// Trim all QueryPlans outside of a factor of the cost of the lowest cost QueryPlan
     				// TBD Make the specific factor configurable - jpcs
    -				set::iterator cutPoint = costSortSet.lower_bound(costSortSet.begin()->cost_.totalPages() * cutOffFactor);
    +				set::iterator cutPoint = costSortSet.lower_bound(CostSortItem(costSortSet.begin()->cost_.totalPages() * cutOffFactor, false));
     				if(cutPoint != costSortSet.begin() && cutPoint != costSortSet.end()) {
     					for(i = cutPoint; i != costSortSet.end(); ++i) {
     						if(Log::isLogEnabled(Log::C_OPTIMIZER, Log::L_DEBUG)) {
    @@ -252,36 +282,9 @@
     	}
     }
     
    -class ContainsSequentialScan : public NodeVisitingOptimizer
    -{
    -public:
    -	bool run(QueryPlan *qp)
    -	{
    -		found = false;
    -		optimizeQP(qp);
    -		return found;
    -	}
    -
    -private:
    -	virtual void resetInternal() {}
    -
    -	virtual ASTNode *optimize(ASTNode *item)
    -	{
    -		// Don't look inside ASTNode objects
    -		return item;
    -	}
    -	virtual QueryPlan *optimizeSequentialScan(SequentialScanQP *item)
    -	{
    -		found = true;
    -		return item;
    -	}
    -
    -	bool found;
    -};
    -
    -static bool betterAlternativeCost(const Cost &costA, bool ssA, const Cost &costB, bool ssB, bool noSequentialScan)
    +static bool betterAlternativeCost(const Cost &costA, bool ssA, const Cost &costB, bool ssB, bool checkForSS)
     {
    -	if(ssA != ssB && noSequentialScan) return ssB;
    +	if(ssA != ssB && checkForSS) return ssB;
     
     	if(costA.totalPages() < costB.totalPages()) return true;
     	if(costA.totalPages() > costB.totalPages()) return false;
    @@ -289,7 +292,7 @@
     	return costA.pagesOverhead < costB.pagesOverhead;
     }
     
    -QueryPlan *QueryPlan::chooseAlternative(OptimizationContext &opt, const char *name, bool noSequentialScan) const
    +QueryPlan *QueryPlan::chooseAlternative(OptimizationContext &opt, const char *name) const
     {
     	QueryPlans combinations;
     	createCombinations(MAX_ALTERNATIVES, opt, combinations);
    @@ -318,7 +321,7 @@
     			Cost itCost = qp->cost(opt.getOperationContext(), qec);
     			bool itSS = ContainsSequentialScan().run(qp);
     
    -			if(bestQP == 0 || betterAlternativeCost(itCost, itSS, bestCost, bestSS, noSequentialScan)) {
    +			if(bestQP == 0 || betterAlternativeCost(itCost, itSS, bestCost, bestSS, opt.checkForSS())) {
     				if(bestQP != 0) {
     					log(qec, "Rejected Alternative (not best)");
     					bestQP->logCost(qec, bestCost, 0);
    diff -ru dbxml-2.4.16-original/dbxml/src/dbxml/query/QueryPlan.hpp dbxml-2.4.16/dbxml/src/dbxml/query/QueryPlan.hpp
    --- dbxml-2.4.16-original/dbxml/src/dbxml/query/QueryPlan.hpp	2008-10-21 14:27:22.000000000 -0700
    +++ dbxml-2.4.16/dbxml/src/dbxml/query/QueryPlan.hpp	2008-12-30 11:57:20.000000000 -0800
    @@ -3,7 +3,6 @@
     //
     // Copyright (c) 2002,2008 Oracle.  All rights reserved.
     //
    -// $Id$
     //
     
     #ifndef __QUERYPLAN_HPP
    @@ -65,7 +64,7 @@
     	};
     
     	OptimizationContext(Phase ph, DynamicContext *cn, QueryPlanOptimizer *qpo, ContainerBase *c = 0)
    -		: phase_(ph), context_(cn), qpo_(qpo), container_(c), isFetched_(false) {}
    +		: phase_(ph), context_(cn), qpo_(qpo), container_(c), isFetched_(false), checkForSS_(false) {}
     
     	Phase getPhase() const { return phase_; }
     
    @@ -82,6 +81,9 @@
     	const IndexSpecification &getIndexSpecification() const;
     	const Log &getLog() const;
     
    +	bool checkForSS() const { return checkForSS_; }
    +	void setCheckForSS(bool val) { checkForSS_ = val; }
    +
     private:
     	Phase phase_;
     	DynamicContext *context_;
    @@ -89,6 +91,7 @@
     	ContainerBase *container_;
     	mutable IndexSpecification is_;
     	mutable bool isFetched_;
    +	bool checkForSS_;
     };
     
     class QueryPlan : public LocationInfo
    @@ -181,7 +184,7 @@
     
     	void createAlternatives(unsigned int maxAlternatives, OptimizationContext &opt, QueryPlans &alternatives) const;
     	void createReducedAlternatives(double cutOffFactor, unsigned int maxAlternatives, OptimizationContext &opt, QueryPlans &alternatives) const;
    -	QueryPlan *chooseAlternative(OptimizationContext &opt, const char *name, bool noSequentialScan = false) const;
    +	QueryPlan *chooseAlternative(OptimizationContext &opt, const char *name) const;
     
     	virtual NodeIterator *createNodeIterator(DynamicContext *context) const = 0;
     	virtual Cost cost(OperationContext &context, QueryExecutionContext &qec) const = 0;
    @@ -541,13 +544,14 @@
     };
     
     struct CostSortItem {
    -	CostSortItem(double cost) : qp_(0), cost_(0, cost) {}
    -	CostSortItem(QueryPlan *qp, OperationContext &oc, QueryExecutionContext &qec);
    +	CostSortItem(double cost, bool hasSS) : qp_(0), cost_(0, cost), hasSS_(hasSS) {}
    +	CostSortItem(QueryPlan *qp, OperationContext &oc, QueryExecutionContext &qec, bool checkForSS);
     
     	bool operator<(const CostSortItem &o) const;
     
     	QueryPlan *qp_;
     	Cost cost_;
    +	bool hasSS_;
     };
     
     }
    diff -ru dbxml-2.4.16-original/dbxml/src/dbxml/query/SequentialScanQP.cpp dbxml-2.4.16/dbxml/src/dbxml/query/SequentialScanQP.cpp
    --- dbxml-2.4.16-original/dbxml/src/dbxml/query/SequentialScanQP.cpp	2008-10-21 14:27:22.000000000 -0700
    +++ dbxml-2.4.16/dbxml/src/dbxml/query/SequentialScanQP.cpp	2008-12-30 11:57:20.000000000 -0800
    @@ -3,7 +3,6 @@
     //
     // Copyright (c) 2002,2008 Oracle.  All rights reserved.
     //
    -// $Id$
     //
     
     #include "../DbXmlInternal.hpp"
    @@ -139,6 +138,7 @@
     
     NodeIterator *SequentialScanQP::createNodeIterator(DynamicContext *context) const
     {
    +	DBXML_ASSERT(container_->getContainerID() != 0);
     	if(nodeType_ == ImpliedSchemaNode::METADATA) {
     		return container_->createDocumentIterator(context, this);
     	} else {
    diff -ru dbxml-2.4.16-original/dbxml/src/dbxml/query/StructuralJoinQP.cpp dbxml-2.4.16/dbxml/src/dbxml/query/StructuralJoinQP.cpp
    --- dbxml-2.4.16-original/dbxml/src/dbxml/query/StructuralJoinQP.cpp	2008-10-21 14:27:22.000000000 -0700
    +++ dbxml-2.4.16/dbxml/src/dbxml/query/StructuralJoinQP.cpp	2008-12-30 11:57:20.000000000 -0800
    @@ -1070,15 +1070,6 @@
     	if(!SuitableForPredicate().check(sj->getLeftArg()))
     		return 0;
     
    -	switch(sj->getRightArg()->getType()) {
    -// 	case QueryPlan::PRESENCE:
    -// 	case QueryPlan::VALUE:
    -// 	case QueryPlan::RANGE:
    -// 	case QueryPlan::SEQUENTIAL_SCAN:
    -	case QueryPlan::VARIABLE: return 0;
    -	default: break;
    -	}
    -
     	if((sj->getFlags() & QueryPlan::SKIP_LEFT_TO_PREDICATE) != 0) return 0;
     
     	const XMLCh *varName = GET_CONFIGURATION(opt.getContext())->allocateTempVarName(mm);
    @@ -1119,15 +1110,6 @@
     	if(!SuitableForPredicate().check(l))
     		return 0;
     
    -	switch(r->getType()) {
    -	case QueryPlan::PRESENCE:
    -	case QueryPlan::VALUE:
    -	case QueryPlan::RANGE:
    -	case QueryPlan::SEQUENTIAL_SCAN:
    -	case QueryPlan::VARIABLE: return 0;
    -	default: break;
    -	}
    -
     	if((flags & QueryPlan::SKIP_LEFT_TO_PREDICATE) != 0) return 0;
     
     	const XMLCh *varName = GET_CONFIGURATION(opt.getContext())->allocateTempVarName(mm);
    diff -ru dbxml-2.4.16-original/dbxml/src/dbxml/RawNodeValue.cpp dbxml-2.4.16/dbxml/src/dbxml/RawNodeValue.cpp
    --- dbxml-2.4.16-original/dbxml/src/dbxml/RawNodeValue.cpp	2008-10-21 14:27:22.000000000 -0700
    +++ dbxml-2.4.16/dbxml/src/dbxml/RawNodeValue.cpp	2008-12-30 11:57:20.000000000 -0800
    @@ -84,6 +84,12 @@
     // it comes from the Container.
     DbWrapper *RawNodeValue::getDocDB() const
     {
    +	//Make sure the doc db of this node and the document are the same
    +	if (!xdoc_.isNull()) {
    +		DbWrapper *docDb = (*xdoc_).getDocDb();
    +		if (docDb) return docDb;
    +	}
    +
     	Results &res = GET_RESULTS();
     	XmlManager &mgr = res.getManager();
     	CacheDatabaseMinder &minder = res.getDbMinder();
    diff -ru dbxml-2.4.16-original/dbxml/src/dbxml/Results.cpp dbxml-2.4.16/dbxml/src/dbxml/Results.cpp
    --- dbxml-2.4.16-original/dbxml/src/dbxml/Results.cpp	2008-10-21 14:27:22.000000000 -0700
    +++ dbxml-2.4.16/dbxml/src/dbxml/Results.cpp	2008-12-30 11:57:20.000000000 -0800
    @@ -241,12 +241,13 @@
     	if (contextItem && (contextItem->getType() == XmlValue::NODE)) {
     		XmlDocument &xdoc = (XmlDocument&)contextItem->asDocument();
     		CacheDatabaseMinder &minder = ((Document *)xdoc)->getDbMinder();
    -		if (minder.isNull()) {
    +		if (minder.isNull() && !((Document*)xdoc)->getContainerID()) {
     			dbMinder_.findOrAllocate((Manager&)(context->getManager()),
     						 ((Document *)xdoc)->getContainerID());
     			minder = dbMinder_;
     		}else
     			dbMinder_ = minder;
    +		if ((*xdoc).isUninitialized()) (*xdoc).changeContentToNsDom(0);
     	}
     	oc_.set(txn);
     	conf_.setMinder(&evaluationMinder_);
    diff -ru dbxml-2.4.16-original/dbxml/src/java/com/sleepycat/dbxml/dbxml_javaJNI.java dbxml-2.4.16/dbxml/src/java/com/sleepycat/dbxml/dbxml_javaJNI.java
    --- dbxml-2.4.16-original/dbxml/src/java/com/sleepycat/dbxml/dbxml_javaJNI.java	2008-10-21 14:28:16.000000000 -0700
    +++ dbxml-2.4.16/dbxml/src/java/com/sleepycat/dbxml/dbxml_javaJNI.java	2008-12-30 11:57:20.000000000 -0800
    @@ -100,7 +100,6 @@
       public final static native void XmlManager_setDefaultContainerType(long jarg1, XmlManager jarg1_, int jarg2);
       public final static native int XmlManager_getDefaultContainerType(long jarg1, XmlManager jarg1_);
       public final static native String XmlManager_getHome(long jarg1, XmlManager jarg1_);
    -  public final static native void XmlManager_registerResolver(long jarg1, XmlManager jarg1_, long jarg2, XmlResolver jarg2_);
       public final static native int XmlManager_getImplicitTimezone(long jarg1, XmlManager jarg1_);
       public final static native void XmlManager_setImplicitTimezone(long jarg1, XmlManager jarg1_, int jarg2);
       public final static native int XmlManager_existsContainer(long jarg1, XmlManager jarg1_, String jarg2);
    @@ -159,6 +158,7 @@
       public final static native int XmlManager_get_version_patch();
       public final static native String XmlManager_get_version_string();
       public final static native XmlDocument XmlManager_createDocumentInternal(long jarg1, XmlManager jarg1_);
    +  public final static native void XmlManager_registerResolverInternal(long jarg1, XmlManager jarg1_, long jarg2, XmlResolver jarg2_);
       public final static native void delete_XmlIndexLookup(long jarg1);
       public final static native boolean XmlIndexLookup_isNull(long jarg1, XmlIndexLookup jarg1_);
       public final static native String XmlIndexLookup_getIndex(long jarg1, XmlIndexLookup jarg1_);
    diff -ru dbxml-2.4.16-original/dbxml/src/java/com/sleepycat/dbxml/XmlDocument.java dbxml-2.4.16/dbxml/src/java/com/sleepycat/dbxml/XmlDocument.java
    --- dbxml-2.4.16-original/dbxml/src/java/com/sleepycat/dbxml/XmlDocument.java	2008-10-21 14:27:22.000000000 -0700
    +++ dbxml-2.4.16/dbxml/src/java/com/sleepycat/dbxml/XmlDocument.java	2008-12-30 11:57:20.000000000 -0800
    @@ -115,9 +115,7 @@
     	    content.stream = null;
     	    content.type = NONE;
     	    return ins;
    -	}else if (!content.hasContent() && docID == 0)
    -	    return null;
    -	else
    +	} else
     	    return HelperFunctions.getContentAsXmlInputStream(this);
         }
     
    @@ -127,9 +125,7 @@
     	    content.reader = null;
     	    content.type = NONE;
     	    return xer;
    -	}else if (!content.hasContent() && docID == 0)
    -	    return null;
    -	else
    +	} else
     	    return HelperFunctions.getContentAsEventReader(this);
         }
     
    @@ -214,6 +210,13 @@
         }
     
         //The rest of this class is for internal use.
    +    protected boolean isConstructed()
    +    {
    +    	if(results == null && docID == 0)
    +    		return true;
    +    	return false;
    +    }
    +    
         /* If both modified and removed are set to false then the meta data is 
          * only being added if it does not already exist.
          */
    @@ -259,11 +262,6 @@
     	content = new Content();
         }
     
    -    protected void finalize() throws XmlException {
    -	metaData.clear();
    -	content.clear();
    -    }
    -
         protected void copy(XmlDocument o) throws XmlException {
     	docID = o.docID;
     	cid = o.cid;
    @@ -360,6 +358,10 @@
         protected void setEventWriter(long writer){
     	eventWriter = writer;
         }
    +    
    +    protected Content getEmptyContent() {
    +    	return new Content();
    +    }
     
         class Content {
     	public XmlEventReader reader;
    diff -ru dbxml-2.4.16-original/dbxml/src/java/com/sleepycat/dbxml/XmlInputStream.java dbxml-2.4.16/dbxml/src/java/com/sleepycat/dbxml/XmlInputStream.java
    --- dbxml-2.4.16-original/dbxml/src/java/com/sleepycat/dbxml/XmlInputStream.java	2008-10-21 14:28:16.000000000 -0700
    +++ dbxml-2.4.16/dbxml/src/java/com/sleepycat/dbxml/XmlInputStream.java	2008-12-30 11:57:20.000000000 -0800
    @@ -21,10 +21,6 @@
         return (obj == null) ? 0 : obj.swigCPtr;
       }
     
    -  protected void finalize() {
    -    delete();
    -  }
    -
       public void delete() /* no exception */ {
         if(swigCPtr != 0 && swigCMemOwn) {
     	swigCMemOwn = false;
    diff -ru dbxml-2.4.16-original/dbxml/src/java/com/sleepycat/dbxml/XmlManager.java dbxml-2.4.16/dbxml/src/java/com/sleepycat/dbxml/XmlManager.java
    --- dbxml-2.4.16-original/dbxml/src/java/com/sleepycat/dbxml/XmlManager.java	2008-10-21 14:28:16.000000000 -0700
    +++ dbxml-2.4.16/dbxml/src/java/com/sleepycat/dbxml/XmlManager.java	2008-12-30 11:57:20.000000000 -0800
    @@ -16,6 +16,7 @@
         import com.sleepycat.db.internal.DbEnv;
         import com.sleepycat.db.internal.DbConstants;
         import com.sleepycat.db.XmlHelper;
    +    import java.util.LinkedList;
         
     public class XmlManager {
       private long swigCPtr;
    @@ -49,6 +50,7 @@
         private boolean threaded = true; // default on if no Environment
         private boolean adopted = false;
         private XmlManagerConfig config = null;
    +    private LinkedList resolverStore;
     
         public XmlManager(final Environment dbenv,
     		      XmlManagerConfig config)
    @@ -385,6 +387,18 @@
         public void close() throws XmlException {
     	delete();
         }
    +    
    +    private synchronized void setResolver(XmlResolver resolver)
    +	{
    +		if (resolverStore == null) resolverStore = new LinkedList();
    +    	resolverStore.add(resolver);  //prevents premature garbage collection
    +	}
    +	
    +	public void registerResolver(XmlResolver resolver) throws XmlException
    +    {
    +    	setResolver(resolver);
    +    	registerResolverInternal(resolver);
    +    }
     
         public final static int LEVEL_NONE = dbxml_java.LEVEL_NONE;
         public final static int LEVEL_DEBUG = dbxml_java.LEVEL_DEBUG;
    @@ -438,10 +452,6 @@
         return dbxml_javaJNI.XmlManager_getHome(swigCPtr, this);
       }
     
    -  public void registerResolver(XmlResolver resolver) throws XmlException {
    -    dbxml_javaJNI.XmlManager_registerResolver(swigCPtr, this, XmlResolver.getCPtr(resolver), resolver);
    -  }
    -
       public int getImplicitTimezone() throws XmlException {
         return dbxml_javaJNI.XmlManager_getImplicitTimezone(swigCPtr, this);
       }
    @@ -703,4 +713,8 @@
     
       public XmlDocument createDocumentInternal() throws XmlException { return dbxml_javaJNI.XmlManager_createDocumentInternal(swigCPtr, this); }
     
    +  public void registerResolverInternal(XmlResolver resolver) throws XmlException {
    +    dbxml_javaJNI.XmlManager_registerResolverInternal(swigCPtr, this, XmlResolver.getCPtr(resolver), resolver);
    +  }
    +
     }
    diff -ru dbxml-2.4.16-original/dbxml/src/java/com/sleepycat/dbxml/XmlValue.java dbxml-2.4.16/dbxml/src/java/com/sleepycat/dbxml/XmlValue.java
    --- dbxml-2.4.16-original/dbxml/src/java/com/sleepycat/dbxml/XmlValue.java	2008-10-21 14:27:22.000000000 -0700
    +++ dbxml-2.4.16/dbxml/src/java/com/sleepycat/dbxml/XmlValue.java	2008-12-30 11:57:20.000000000 -0800
    @@ -10,6 +10,8 @@
     
     import java.util.*;
     
    +import com.sleepycat.dbxml.XmlDocument.Content;
    +
     public class XmlValue {
         protected Value value;
         protected int valueType;
    @@ -69,7 +71,10 @@
     
         public XmlValue(XmlDocument document) throws XmlException
         {
    -	XmlValue xmlvalue = HelperFunctions.createDocumentValue(document);
    +    Content con = document.content;
    +    document.content = document.getEmptyContent(); //Prevents the content from being consumed
    +    XmlValue xmlvalue = HelperFunctions.createDocumentValue(document);
    +    document.content = con;
     	valueType = xmlvalue.getType();
     	value = new NodeValue((NodeValue)xmlvalue.value);
     	((NodeValue)value).setDocument(document);
    diff -ru dbxml-2.4.16-original/dbxml/src/java/dbxml_java_wrap.cpp dbxml-2.4.16/dbxml/src/java/dbxml_java_wrap.cpp
    --- dbxml-2.4.16-original/dbxml/src/java/dbxml_java_wrap.cpp	2008-10-21 14:28:16.000000000 -0700
    +++ dbxml-2.4.16/dbxml/src/java/dbxml_java_wrap.cpp	2008-12-30 11:57:20.000000000 -0800
    @@ -1516,10 +1516,8 @@
     	    XmlValue value((XmlValue::Type)type, v);
     	}
     SWIGINTERN XmlInputStream *HelperFunctions_getContentAsXmlInputStream(XmlDocument &doc){
    -	    XmlEventReader &reader = doc.getContentAsEventReader();
    -	    doc.setContentAsEventReader(reader);
    -	    return doc.getContentAsXmlInputStream();
    -	}
    +		return doc.getContentAsXmlInputStream();
    + 	}
     SWIGINTERN XmlEventReader &HelperFunctions_getContentAsEventReader(XmlDocument &doc){
     	    return doc.getContentAsEventReader();
     	}
    @@ -1790,6 +1788,9 @@
     SWIGINTERN XmlDocument XmlManager_createDocumentInternal(XmlManager *self){
     	return self->createDocument();
         }
    +SWIGINTERN void XmlManager_registerResolverInternal(XmlManager *self,XmlResolver *resolver){ 
    +		self->registerResolver(*resolver);
    + 	}
     SWIGINTERN XmlResults *XmlIndexLookup_execute__SWIG_0(XmlIndexLookup const *self,XmlQueryContext &context,u_int32_t flags=0){
     		return new XmlResults(self->execute(context, flags));
     	}
    @@ -4365,55 +4366,6 @@
     }
     
     
    -SWIGEXPORT void JNICALL Java_com_sleepycat_dbxml_dbxml_1javaJNI_XmlManager_1registerResolver(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jlong jarg2, jobject jarg2_) {
    -  XmlManager *arg1 = (XmlManager *) 0 ;
    -  XmlResolver *arg2 = 0 ;
    -  
    -  (void)jenv;
    -  (void)jcls;
    -  (void)jarg1_;
    -  (void)jarg2_;
    -  arg1 = *(XmlManager **)&jarg1; 
    -  arg2 = *(XmlResolver **)&jarg2;
    -  if(!arg2) {
    -    SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "XmlResolver const & reference is null");
    -    return ;
    -  } 
    -  
    -  if (!jarg1) {
    -    jenv->Throw((jthrowable)jenv->NewObject(xmlex_class, xmlex_construct,
    -        XmlException::INTERNAL_ERROR,
    -        jenv->NewStringUTF("null object - call after object destroyed?"),
    -        0, 0, 0, 0));					
    -    return ;
    -  }
    -  
    -  {
    -    jthrowable t = NULL;
    -    try {
    -      (arg1)->registerResolver((XmlResolver const &)*arg2);
    -    }
    -    catch (std::exception &se) {
    -      t = createException(jenv, &se);
    -    }
    -    catch(JavaException & /* je */) {
    -      // This means there's already an exception waiting in the JVM
    -      return ;
    -    }
    -    catch (...) {
    -      t = (jthrowable)jenv->NewObject(xmlex_class, xmlex_construct,
    -        XmlException::INTERNAL_ERROR,
    -        jenv->NewStringUTF("Uncaught exception from C++ API"), 0, 0, 0, 0);
    -    }
    -    
    -    if (t) {
    -      jenv->Throw(t);
    -      return ;
    -    }
    -  }
    -}
    -
    -
     SWIGEXPORT jint JNICALL Java_com_sleepycat_dbxml_dbxml_1javaJNI_XmlManager_1getImplicitTimezone(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_) {
       jint jresult = 0 ;
       XmlManager *arg1 = (XmlManager *) 0 ;
    @@ -8088,6 +8040,51 @@
     }
     
     
    +SWIGEXPORT void JNICALL Java_com_sleepycat_dbxml_dbxml_1javaJNI_XmlManager_1registerResolverInternal(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jlong jarg2, jobject jarg2_) {
    +  XmlManager *arg1 = (XmlManager *) 0 ;
    +  XmlResolver *arg2 = (XmlResolver *) 0 ;
    +  
    +  (void)jenv;
    +  (void)jcls;
    +  (void)jarg1_;
    +  (void)jarg2_;
    +  arg1 = *(XmlManager **)&jarg1; 
    +  arg2 = *(XmlResolver **)&jarg2; 
    +  
    +  if (!jarg1) {
    +    jenv->Throw((jthrowable)jenv->NewObject(xmlex_class, xmlex_construct,
    +        XmlException::INTERNAL_ERROR,
    +        jenv->NewStringUTF("null object - call after object destroyed?"),
    +        0, 0, 0, 0));					
    +    return ;
    +  }
    +  
    +  {
    +    jthrowable t = NULL;
    +    try {
    +      XmlManager_registerResolverInternal(arg1,arg2);
    +    }
    +    catch (std::exception &se) {
    +      t = createException(jenv, &se);
    +    }
    +    catch(JavaException & /* je */) {
    +      // This means there's already an exception waiting in the JVM
    +      return ;
    +    }
    +    catch (...) {
    +      t = (jthrowable)jenv->NewObject(xmlex_class, xmlex_construct,
    +        XmlException::INTERNAL_ERROR,
    +        jenv->NewStringUTF("Uncaught exception from C++ API"), 0, 0, 0, 0);
    +    }
    +    
    +    if (t) {
    +      jenv->Throw(t);
    +      return ;
    +    }
    +  }
    +}
    +
    +
     SWIGEXPORT void JNICALL Java_com_sleepycat_dbxml_dbxml_1javaJNI_delete_1XmlIndexLookup(JNIEnv *jenv, jclass jcls, jlong jarg1) {
       XmlIndexLookup *arg1 = (XmlIndexLookup *) 0 ;
       
    diff -ru dbxml-2.4.16-original/dbxml/src/python/dbxml.py dbxml-2.4.16/dbxml/src/python/dbxml.py
    --- dbxml-2.4.16-original/dbxml/src/python/dbxml.py	2008-10-21 14:28:13.000000000 -0700
    +++ dbxml-2.4.16/dbxml/src/python/dbxml.py	2008-12-30 11:57:20.000000000 -0800
    @@ -56,14 +56,14 @@
     
     
     class XmlException(Exception):
    -    """Base class for BDB XML exceptions.
    +    """Base class for BDB XML exceptions.  It should never be called directly, and
    +    if it is, it's an unknown error
         Attributes:
    -        exceptionCode -- integer value
             what -- the exception message
         """
    -    def __init__(self, ec, msg):
    -        self.exceptionCode = ec
    -        self.what = msg
    +    def __init__(self, msg):
    +        self.exceptionCode = INTERNAL_ERROR
    +        self.what = "Unknown exception thrown: ",msg
         def __str__(self):
             return "XmlException %d, %s"%(self.exceptionCode,self.what)
         def getexceptionCode(self):
    @@ -76,7 +76,7 @@
         Attributes:
             dbError -- the Berkeley DB errno
         """
    -    def __init__(self, dberr, msg):
    +    def __init__(self, msg, dberr):
             self.exceptionCode = DATABASE_ERROR
             self.what = msg
             self.dbError = dberr
    diff -ru dbxml-2.4.16-original/dbxml/src/python/dbxml_python_wrap.cpp dbxml-2.4.16/dbxml/src/python/dbxml_python_wrap.cpp
    --- dbxml-2.4.16-original/dbxml/src/python/dbxml_python_wrap.cpp	2008-10-21 14:28:16.000000000 -0700
    +++ dbxml-2.4.16/dbxml/src/python/dbxml_python_wrap.cpp	2008-12-30 11:57:20.000000000 -0800
    @@ -2994,9 +2994,8 @@
     #define SWIGTYPE_p_XmlValue swig_types[22]
     #define SWIGTYPE_p_char swig_types[23]
     #define SWIGTYPE_p_int swig_types[24]
    -#define SWIGTYPE_p_unsigned_char swig_types[25]
    -static swig_type_info *swig_types[27];
    -static swig_module_info swig_module = {swig_types, 26, 0, 0, 0, 0};
    +static swig_type_info *swig_types[26];
    +static swig_module_info swig_module = {swig_types, 25, 0, 0, 0, 0};
     #define SWIG_TypeQuery(name) SWIG_TypeQueryModule(&swig_module, &swig_module, name)
     #define SWIG_MangledTypeQuery(name) SWIG_MangledTypeQueryModule(&swig_module, &swig_module, name)
     
    @@ -23335,7 +23334,7 @@
             result->get_size());
           delete result; // done with new XmlData
         } else
    -    resultobj = NULL;
    +    resultobj = Py_None;
       }
       SWIG_PYTHON_THREAD_END_BLOCK;
       return resultobj;
    @@ -23408,7 +23407,7 @@
             result->get_size());
           delete result; // done with new XmlData
         } else
    -    resultobj = NULL;
    +    resultobj = Py_None;
       }
       if (SWIG_IsNewObj(res2)) delete arg2;
       if (SWIG_IsNewObj(res3)) delete arg3;
    @@ -34216,7 +34215,7 @@
         if (result)
         resultobj = PyString_FromString((const char*)result);
         else
    -    resultobj = NULL;
    +    resultobj = Py_None;
       }
       SWIG_PYTHON_THREAD_END_BLOCK;
       return resultobj;
    @@ -34258,7 +34257,7 @@
         if (result)
         resultobj = PyString_FromString((const char*)result);
         else
    -    resultobj = NULL;
    +    resultobj = Py_None;
       }
       SWIG_PYTHON_THREAD_END_BLOCK;
       return resultobj;
    @@ -34300,7 +34299,7 @@
         if (result)
         resultobj = PyString_FromString((const char*)result);
         else
    -    resultobj = NULL;
    +    resultobj = Py_None;
       }
       SWIG_PYTHON_THREAD_END_BLOCK;
       return resultobj;
    @@ -34342,7 +34341,7 @@
         if (result)
         resultobj = PyString_FromString((const char*)result);
         else
    -    resultobj = NULL;
    +    resultobj = Py_None;
       }
       SWIG_PYTHON_THREAD_END_BLOCK;
       return resultobj;
    @@ -34513,7 +34512,7 @@
         if (result)
         resultobj = PyString_FromString((const char*)result);
         else
    -    resultobj = NULL;
    +    resultobj = Py_None;
       }
       SWIG_PYTHON_THREAD_END_BLOCK;
       return resultobj;
    @@ -34564,7 +34563,7 @@
         if (result)
         resultobj = PyString_FromString((const char*)result);
         else
    -    resultobj = NULL;
    +    resultobj = Py_None;
       }
       SWIG_PYTHON_THREAD_END_BLOCK;
       return resultobj;
    @@ -34615,7 +34614,7 @@
         if (result)
         resultobj = PyString_FromString((const char*)result);
         else
    -    resultobj = NULL;
    +    resultobj = Py_None;
       }
       SWIG_PYTHON_THREAD_END_BLOCK;
       return resultobj;
    @@ -34666,7 +34665,7 @@
         if (result)
         resultobj = PyString_FromString((const char*)result);
         else
    -    resultobj = NULL;
    +    resultobj = Py_None;
       }
       SWIG_PYTHON_THREAD_END_BLOCK;
       return resultobj;
    @@ -34708,7 +34707,7 @@
         if (result)
         resultobj = PyString_FromString((const char*)result);
         else
    -    resultobj = NULL;
    +    resultobj = Py_None;
       }
       SWIG_PYTHON_THREAD_END_BLOCK;
       return resultobj;
    @@ -34750,7 +34749,7 @@
         if (result)
         resultobj = PyString_FromString((const char*)result);
         else
    -    resultobj = NULL;
    +    resultobj = Py_None;
       }
       SWIG_PYTHON_THREAD_END_BLOCK;
       return resultobj;
    @@ -34792,7 +34791,7 @@
         if (result)
         resultobj = PyString_FromString((const char*)result);
         else
    -    resultobj = NULL;
    +    resultobj = Py_None;
       }
       SWIG_PYTHON_THREAD_END_BLOCK;
       return resultobj;
    @@ -35564,9 +35563,9 @@
             _v = SWIG_CheckState(res);
           }
           if (_v) {
    -        void *vptr = 0;
    -        int res = SWIG_ConvertPtr(argv[2], &vptr, SWIGTYPE_p_unsigned_char, 0);
    -        _v = SWIG_CheckState(res);
    +        {
    +          _v = PyString_Check(argv[2]) ? 1 : 0;
    +        }
             if (_v) {
               SWIG_PYTHON_THREAD_END_BLOCK;
               return _wrap_XmlEventWriter_writeText__SWIG_1(self, args);
    @@ -35585,9 +35584,9 @@
             _v = SWIG_CheckState(res);
           }
           if (_v) {
    -        void *vptr = 0;
    -        int res = SWIG_ConvertPtr(argv[2], &vptr, SWIGTYPE_p_unsigned_char, 0);
    -        _v = SWIG_CheckState(res);
    +        {
    +          _v = PyString_Check(argv[2]) ? 1 : 0;
    +        }
             if (_v) {
               {
                 int res = SWIG_AsVal_size_t(argv[3], NULL);
    @@ -35674,9 +35673,9 @@
         int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_XmlEventWriter, 0);
         _v = SWIG_CheckState(res);
         if (_v) {
    -      void *vptr = 0;
    -      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_unsigned_char, 0);
    -      _v = SWIG_CheckState(res);
    +      {
    +        _v = PyString_Check(argv[1]) ? 1 : 0;
    +      }
           if (_v) {
             SWIG_PYTHON_THREAD_END_BLOCK;
             return _wrap_XmlEventWriter_writeDTD__SWIG_1(self, args);
    @@ -35689,9 +35688,9 @@
         int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_XmlEventWriter, 0);
         _v = SWIG_CheckState(res);
         if (_v) {
    -      void *vptr = 0;
    -      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_unsigned_char, 0);
    -      _v = SWIG_CheckState(res);
    +      {
    +        _v = PyString_Check(argv[1]) ? 1 : 0;
    +      }
           if (_v) {
             {
               int res = SWIG_AsVal_size_t(argv[2], NULL);
    @@ -36782,7 +36781,6 @@
     static swig_type_info _swigt__p_XmlValue = {"_p_XmlValue", "XmlValue *", 0, 0, (void*)0, 0};
     static swig_type_info _swigt__p_char = {"_p_char", "char *", 0, 0, (void*)0, 0};
     static swig_type_info _swigt__p_int = {"_p_int", "int *|int32_t *", 0, 0, (void*)0, 0};
    -static swig_type_info _swigt__p_unsigned_char = {"_p_unsigned_char", "unsigned char *", 0, 0, (void*)0, 0};
     
     static swig_type_info *swig_type_initial[] = {
       &_swigt__p_DbTxn,
    @@ -36810,7 +36808,6 @@
       &_swigt__p_XmlValue,
       &_swigt__p_char,
       &_swigt__p_int,
    -  &_swigt__p_unsigned_char,
     };
     
     static swig_cast_info _swigc__p_DbTxn[] = {  {&_swigt__p_DbTxn, 0, 0, 0},{0, 0, 0, 0}};
    @@ -36838,7 +36835,6 @@
     static swig_cast_info _swigc__p_XmlValue[] = {  {&_swigt__p_XmlValue, 0, 0, 0},{0, 0, 0, 0}};
     static swig_cast_info _swigc__p_char[] = {  {&_swigt__p_char, 0, 0, 0},{0, 0, 0, 0}};
     static swig_cast_info _swigc__p_int[] = {  {&_swigt__p_int, 0, 0, 0},{0, 0, 0, 0}};
    -static swig_cast_info _swigc__p_unsigned_char[] = {  {&_swigt__p_unsigned_char, 0, 0, 0},{0, 0, 0, 0}};
     
     static swig_cast_info *swig_cast_initial[] = {
       _swigc__p_DbTxn,
    @@ -36866,7 +36862,6 @@
       _swigc__p_XmlValue,
       _swigc__p_char,
       _swigc__p_int,
    -  _swigc__p_unsigned_char,
     };