diff options
Diffstat (limited to 'nixpkgs/pkgs/development/libraries/dbxml')
3 files changed, 137 insertions, 0 deletions
diff --git a/nixpkgs/pkgs/development/libraries/dbxml/cxx11.patch b/nixpkgs/pkgs/development/libraries/dbxml/cxx11.patch new file mode 100644 index 000000000000..f264515c7d67 --- /dev/null +++ b/nixpkgs/pkgs/development/libraries/dbxml/cxx11.patch @@ -0,0 +1,59 @@ +diff -urN dbxml-6.1.4.orig/dbxml/src/dbxml/nodeStore/NsUpdate.cpp dbxml-6.1.4/dbxml/src/dbxml/nodeStore/NsUpdate.cpp +--- dbxml-6.1.4.orig/dbxml/src/dbxml/nodeStore/NsUpdate.cpp 2017-05-01 16:05:29.000000000 +0100 ++++ dbxml-6.1.4/dbxml/src/dbxml/nodeStore/NsUpdate.cpp 2017-09-04 11:50:20.000000000 +0100 +@@ -1359,21 +1359,13 @@ + void NsUpdate::attributeRemoved(const DbXmlNodeImpl &node) + { + string key = makeKey(node); +-#if defined(_MSC_VER) && (_MSC_VER>1600) + attrMap_.insert(make_pair(key,node.getIndex())); +-#else +- attrMap_.insert(make_pair<const std::string, int>(key,node.getIndex())); +-#endif + } + + void NsUpdate::textRemoved(const DbXmlNodeImpl &node) + { + string key = makeKey(node); +-#if defined(_MSC_VER) && (_MSC_VER>1600) + textDeleteMap_.insert(make_pair(key,node.getIndex())); +-#else +- textDeleteMap_.insert(make_pair<const std::string, int>(key,node.getIndex())); +-#endif + } + + void NsUpdate::textRemoved(int index, const NsNid &nid, +@@ -1381,21 +1373,13 @@ + const std::string &cname) + { + string key = makeKey(nid, did, cname); +-#if defined(_MSC_VER) && (_MSC_VER>1600) + textDeleteMap_.insert(make_pair(key,index)); +-#else +- textDeleteMap_.insert(make_pair<const std::string, int>(key,index)); +-#endif + } + + void NsUpdate::textInserted(int index, const DbXmlNodeImpl &node) + { + string key = makeKey(node); +-#if defined(_MSC_VER) && (_MSC_VER>1600) + textInsertMap_.insert(make_pair(key,index)); +-#else +- textInsertMap_.insert(make_pair<const std::string, int>(key,index)); +-#endif + } + + void NsUpdate::textInserted(int index, const NsNid &nid, +@@ -1403,11 +1387,7 @@ + const std::string &cname) + { + string key = makeKey(nid, did, cname); +-#if defined(_MSC_VER) && (_MSC_VER>1600) + textInsertMap_.insert(make_pair(key,index)); +-#else +- textInsertMap_.insert(make_pair<const std::string, int>(key,index)); +-#endif + } + + // diff --git a/nixpkgs/pkgs/development/libraries/dbxml/default.nix b/nixpkgs/pkgs/development/libraries/dbxml/default.nix new file mode 100644 index 000000000000..a0005f1bf720 --- /dev/null +++ b/nixpkgs/pkgs/development/libraries/dbxml/default.nix @@ -0,0 +1,44 @@ +{ stdenv, fetchurl, db62, xercesc, xqilla }: + +stdenv.mkDerivation rec { + pname = "dbxml"; + version = "6.1.4"; + + src = fetchurl { + url = "http://download.oracle.com/berkeley-db/${pname}-${version}.tar.gz"; + sha256 = "a8fc8f5e0c3b6e42741fa4dfc3b878c982ff8f5e5f14843f6a7e20d22e64251a"; + }; + + outputs = [ "bin" "dev" "out" ]; + + patches = [ + ./cxx11.patch + ./incorrect-optimization.patch + ]; + + buildInputs = [ + xercesc xqilla + ]; + + propagatedBuildInputs = [ + db62 + ]; + + configureFlags = [ + "--with-berkeleydb=${db62.out}" + "--with-xerces=${xercesc}" + "--with-xqilla=${xqilla}" + ]; + + preConfigure = '' + cd dbxml + ''; + + meta = with stdenv.lib; { + homepage = "https://www.oracle.com/database/berkeley-db/xml.html"; + description = "Embeddable XML database based on Berkeley DB"; + license = licenses.agpl3; + maintainers = with maintainers; [ danieldk ]; + platforms = platforms.unix; + }; +} diff --git a/nixpkgs/pkgs/development/libraries/dbxml/incorrect-optimization.patch b/nixpkgs/pkgs/development/libraries/dbxml/incorrect-optimization.patch new file mode 100644 index 000000000000..630dc972e188 --- /dev/null +++ b/nixpkgs/pkgs/development/libraries/dbxml/incorrect-optimization.patch @@ -0,0 +1,34 @@ +Patch provided by Lauren Foutz. See: +https://community.oracle.com/thread/4093422 + +--- dbxml-6.1.4-orig/dbxml/src/dbxml/query/ParentOfChildJoinQP.cpp ++++ dbxml-6.1.4/dbxml/src/dbxml/query/ParentOfChildJoinQP.cpp +@@ -139,28 +139,16 @@ bool ParentOfChildIterator::doJoin(Dynam + + // Invarient 4: When ancestorStack_ is empty we can output the + // buffered results_, since any more results will come after them in + // document order. + + while(true) { + context->testInterrupt(); + +- /* +- * If current parent's node level already be larger than +- * childen's, abandon current parent and move to next one. +- */ +- if (parents_ != NULL && +- parents_->getNodeLevel() > children_->getNodeLevel()) { +- if(!parents_->next(context)) { +- delete parents_; +- parents_ = 0; +- } +- } +- + int cmp = parents_ == 0 ? -1 : isDescendantOf(children_, parents_, /*orSelf*/false); + if(cmp < 0) { + if(!ancestorStack_.empty()) { + // We've found the closest ancestor - is it a parent? + if(ancestorStack_.back()->getNodeLevel() == (children_->getNodeLevel() - 1)) { + // Maintain invarient 3 + if(results_.empty() || NodeInfo::compare(results_.back(), ancestorStack_.back()) < 0) + results_.push_back(ancestorStack_.back()); |