BerkeleyDBXML 0.7.1 → 0.7.2
raw patch · 6 files changed
+212/−35 lines, 6 filesdep ~BerkeleyDB
Dependency ranges changed: BerkeleyDB
Files
- BerkeleyDBXML.cabal +21/−7
- Database/Berkeley/DbXml.hs +121/−18
- Database/Berkeley/dbxml_helper.cpp +53/−0
- Database/Berkeley/dbxml_helper.h +12/−0
- README +4/−9
- examples/adventure.hs +1/−1
BerkeleyDBXML.cabal view
@@ -1,5 +1,5 @@ name: BerkeleyDBXML-version: 0.7.1+version: 0.7.2 license: BSD3 license-file: LICENSE cabal-version: >= 1.6@@ -9,10 +9,24 @@ stability: beta synopsis: Berkeley DB XML binding description:- Berkeley DB XML is a powerful, fully transactional, XML-based database that uses- XQuery as its query language. Berkeley DB XML is built on top of Berkeley DB.- It is NOT an SQL database.+ This package is a Haskell binding for Berkeley DB XML, which is a powerful,+ fully transactional, XML-based database written in C++ that uses XQuery as its+ query language. It is NOT an SQL database. It is not free for commercial use. .+ The binding is only about 70% complete, but it should allow you to write a fairly+ serious application. If you would like a particular part of the API added,+ please contact me.+ .+ If Berkeley DB or DB XML is not installed in the default location of /usr or+ /usr/local, you will need to specify the paths in this way:+ .+ > cabal install BerkeleyDBXML \+ > --extra-include-dirs=/usr/local/dbxml-2.5.16/include/ \+ > --extra-include-dirs=/usr/local/dbxml-2.5.16/include/dbxml/ \+ > --extra-lib-dirs=/usr/local/dbxml-2.5.16/lib/+ .+ See the examples/ directory for examples.+ . Berkeley DB XML home page: <http://www.oracle.com/database/berkeley-db/xml/index.html> .@@ -20,7 +34,7 @@ <http://www.haskell.org/haskellwiki/BerkeleyDBXML> . DARCS repository:- <http://blacksapphire.com/BerkeleyDBXML/>+ <http://code.haskell.org/BerkeleyDBXML/> . Changes: 0.7: Compatible (only) with dbxml 2.5. @@ -37,7 +51,7 @@ exposed-modules: Database.Berkeley.DbXml c-sources: Database/Berkeley/dbxml_helper.cpp - build-depends: base == 4.*, bytestring >= 0.9, BerkeleyDB >= 0.8.1+ build-depends: base == 4.*, bytestring >= 0.9, BerkeleyDB >= 0.8.4 include-dirs: Database/Berkeley/- extra-libraries: db, dbxml, xqilla, xerces-c, xml2, stdc+++ extra-libraries: db, dbxml, xqilla, xerces-c, stdc++
Database/Berkeley/DbXml.hs view
@@ -1,4 +1,5 @@-{-# LANGUAGE ForeignFunctionInterface, EmptyDataDecls, TypeSynonymInstances, DeriveDataTypeable #-}+{-# LANGUAGE ForeignFunctionInterface, EmptyDataDecls, TypeSynonymInstances,+ DeriveDataTypeable, FlexibleInstances #-} {-# CFILES Database/Berkeley/dbxml_helper.cpp #-} -- | Berkeley DB binding. All IO monad functions can throw DbXmlException or DbException.@@ -47,6 +48,8 @@ XmlQueryContext, xmlQueryContext_setDefaultCollection, xmlQueryContext_setVariableValue,+ -- * XmlUpdateContext+ XmlUpdateContext, -- * XmlQueryExpression XmlQueryExpression, xmlQueryExpression_execute,@@ -65,6 +68,18 @@ xmlString, xmlXmlDocument, xmlValue_asString,+ -- * C++ integration+ XmlManager_native,+ xmlManager_toNative,+ XmlContainer_native,+ xmlContainer_toNative,+ xmlContainer_fromNative,+ XmlTransaction_native,+ xmlTransaction_fromNative,+ XmlQueryContext_native,+ xmlQueryContext_fromNative,+ XmlUpdateContext_native,+ xmlUpdateContext_fromNative ) where import Foreign.C@@ -73,7 +88,7 @@ import Foreign.Ptr import Foreign.ForeignPtr import Foreign.Marshal.Utils-import Data.Bits +import Data.Bits import Database.Berkeley.Db import Data.Maybe import System.IO.Error@@ -95,7 +110,7 @@ charToUtf8 :: Char -> String charToUtf8 ch = let- c = ord(ch)::Int+ c = ord(ch):: Int f0 = c .&. 0x3f f1 = (c `shiftR` 6) .&. 0x3f f2 = (c `shiftR` 12) .&. 0x3f@@ -111,7 +126,7 @@ charFromUtf8 :: String -> (Char, String) charFromUtf8 (ch:chs) = let- c = ord(ch)::Int+ c = ord(ch):: Int in case c of _ | (c .&. 0x80) == 0 -> (c, cs)@@ -143,7 +158,7 @@ OPERATION_INTERRUPTED | -- ^ An operation was explicitly interrupted UNKNOWN_ERROR -- ^ An unexpected error code was received from Berkeley DbXML deriving (Show,Eq)- + dbxmlErrFromNum :: Int -> ExceptionCode dbxmlErrFromNum 0 = INTERNAL_ERROR dbxmlErrFromNum 1 = CONTAINER_OPEN@@ -217,6 +232,7 @@ DBXML_GEN_NAME | -- ^ generate name in putDoc DB_FLAG DbFlag -- ^ For wrapping a Berkeley DB flag +dbxmlToNum :: DbXmlFlag -> Word32 dbxmlToNum DBXML_ADOPT_DBENV = 0x00000001 dbxmlToNum DBXML_ALLOW_EXTERNAL_ACCESS = 0x00000002 dbxmlToNum DBXML_ALLOW_AUTO_OPEN = 0x00000004@@ -238,13 +254,14 @@ dbxmlToNum DBXML_GEN_NAME = 0x02000000 dbxmlToNum (DB_FLAG f) = dbToNum f -dbxmlOrFlags flags = foldr (.|.) 0 $ map dbxmlToNum flags+dbxmlOrFlags :: [DbXmlFlag] -> Word32+dbxmlOrFlags = foldr (.|.) 0 . map dbxmlToNum data XmlManager_struct type XmlManager = Ptr XmlManager_struct foreign import ccall safe "dbxml_helper.h _xmlManager" _xmlManager- :: Ptr DbEnv_struct -> CUInt -> Ptr XmlManager -> IO CInt+ :: Ptr DbEnv_struct -> Word32 -> Ptr XmlManager -> IO CInt xmlManager_create :: DbEnv -> [DbXmlFlag] -> IO XmlManager xmlManager_create dbenv flags =@@ -255,17 +272,38 @@ then throwDBXML "xmlManager_create" ret "" else peek ptr +data XmlManager_native+foreign import ccall "dbxml_helper.h _xmlManager_toNative" _xmlManager_toNative+ :: XmlManager -> Ptr (Ptr XmlManager_native) -> IO CInt++-- | Extract a C++ pointer of type XmlManager* from the Haskell handle, which can be+-- passed to C++.+xmlManager_toNative :: XmlManager -> (Ptr XmlManager_native -> IO a) -> IO a+xmlManager_toNative mgr code =+ alloca $ \pManager -> do+ ret <- _xmlManager_toNative mgr pManager+ if ret /= 0+ then throwDBXML "xmlManager_toNative" ret ""+ else code =<< peek pManager+ data XmlContainer_struct type XmlContainer = ForeignPtr XmlContainer_struct foreign import ccall "dbxml_helper.h &_xmlContainer_delete" _xmlContainer_delete :: FunPtr (Ptr XmlContainer_struct -> IO ())+foreign import ccall "dbxml_helper.h &_xmlContainer_nullDelete" _xmlContainer_nullDelete+ :: FunPtr (Ptr XmlContainer_struct -> IO ()) data ContainerType = NodeContainer | WholedocContainer foreign import ccall safe "dbxml_helper.h _xmlManager_openContainer" _xmlManager_openContainer- :: XmlManager -> CString -> CUInt -> CInt -> CInt -> Ptr (Ptr XmlContainer_struct) -> IO CInt+ :: XmlManager -> CString -> Word32 -> CInt -> CInt -> Ptr (Ptr XmlContainer_struct) -> IO CInt -xmlManager_openContainer :: XmlManager -> String -> [DbXmlFlag] -> ContainerType -> Int -> IO XmlContainer+xmlManager_openContainer :: XmlManager+ -> String -- ^ Container filename+ -> [DbXmlFlag]+ -> ContainerType -- ^ Default in C++ interface is NodeContainer+ -> Int -- ^ Unix file mode+ -> IO XmlContainer xmlManager_openContainer mgr filename flags cType mode = alloca $ \ptr -> withCAString filename $ \c_filename -> do@@ -294,7 +332,7 @@ :: FunPtr (Ptr XmlTransaction_struct -> IO ()) foreign import ccall safe "dbxml_helper.h _xmlManager_createTransaction" _xmlManager_createTransaction- :: XmlManager -> CUInt -> Ptr (Ptr XmlTransaction_struct) -> IO CInt+ :: XmlManager -> Word32 -> Ptr (Ptr XmlTransaction_struct) -> IO CInt xmlManager_createTransaction :: XmlManager -> [DbFlag] -> IO XmlTransaction xmlManager_createTransaction mgr flags =@@ -320,6 +358,19 @@ p <- peek ptr newForeignPtr _xmlTransaction_delete p +data XmlTransaction_native+foreign import ccall "dbxml_helper.h &_xmlTransaction_nullDestructor" _xmlTransaction_nullDestructor+ :: FunPtr (Ptr XmlTransaction_struct -> IO ())+foreign import ccall unsafe "dbxml_helper.h _xmlTransaction_fromNative" _xmlTransaction_fromNative+ :: Ptr XmlTransaction_native -> IO (Ptr XmlTransaction_struct)++-- | Create a Haskell handle for a C++ transaction of type XmlTransaction*. The+-- C++ code has the responsibility of cleaning it up.+xmlTransaction_fromNative :: Ptr XmlTransaction_native -> IO XmlTransaction+xmlTransaction_fromNative nat = do+ s <- _xmlTransaction_fromNative nat+ newForeignPtr _xmlTransaction_nullDestructor s -- Do not clean it up when we release it+ foreign import ccall safe "dbxml_helper.h _xmlTransaction_commit" _xmlTransaction_commit :: Ptr XmlTransaction_struct -> IO CInt @@ -345,8 +396,38 @@ foreign import ccall safe "dbxml_helper.h &_xmlDocument_delete" _xmlDocument_delete :: FunPtr (Ptr XmlDocument_struct -> IO ()) +data XmlContainer_native+foreign import ccall "dbxml_helper.h _xmlContainer_toNative" _xmlContainer_toNative+ :: Ptr XmlContainer_struct -> Ptr (Ptr XmlContainer_native) -> IO CInt++-- | Extract a C++ pointer of type XmlContainer* from the Haskell handle, which can be+-- passed to C++.+xmlContainer_toNative :: XmlContainer -> (Ptr XmlContainer_native -> IO a) -> IO a+xmlContainer_toNative cont code =+ alloca $ \pCont ->+ withForeignPtr cont $ \c_cont -> do+ ret <- _xmlContainer_toNative c_cont pCont+ if ret /= 0+ then throwDBXML "xmlContainer_toNative" ret ""+ else code =<< peek pCont++foreign import ccall safe "dbxml_helper.h _xmlContainer_fromNative" _xmlContainer_fromNative+ :: Ptr XmlContainer_native -> Ptr (Ptr XmlContainer_struct) -> IO CInt++-- | Make a Haskell handle from a native XmlContainer*, where the XmlContainer* is+-- managed by someone else.+xmlContainer_fromNative :: Ptr XmlContainer_native -> IO XmlContainer+xmlContainer_fromNative c_cont =+ alloca $ \ptr -> do+ ret <- _xmlContainer_fromNative c_cont ptr+ if ret /= 0+ then throwDBXML "xmlManager_openContainer" ret ""+ else do+ p <- peek ptr+ newForeignPtr _xmlContainer_nullDelete p+ foreign import ccall safe "dbxml_helper.h _xmlContainer_getDocument" _xmlContainer_getDocument- :: Ptr XmlContainer_struct -> Ptr XmlTransaction_struct -> CString -> CUInt -> Ptr (Ptr XmlDocument_struct) -> IO CInt+ :: Ptr XmlContainer_struct -> Ptr XmlTransaction_struct -> CString -> Word32 -> Ptr (Ptr XmlDocument_struct) -> IO CInt xmlContainer_getDocument :: XmlContainer -> Maybe XmlTransaction -> String -> [DbFlag] -> IO XmlDocument xmlContainer_getDocument cont mTrans key flags =@@ -488,7 +569,7 @@ -- Safe so it doesn't block other Haskell threads, since this one can take a while to execute foreign import ccall safe "dbxml_helper.h _xmlManager_query" _xmlManager_query :: Ptr XmlManager_struct -> Ptr XmlTransaction_struct -> CString ->- Ptr XmlQueryContext_struct -> CUInt -> Ptr (Ptr XmlResults_struct) -> IO CInt+ Ptr XmlQueryContext_struct -> Word32 -> Ptr (Ptr XmlResults_struct) -> IO CInt xmlManager_query :: XmlManager -> Maybe XmlTransaction@@ -626,10 +707,21 @@ then throwDBXML "xmlQueryContext_setVariableValue" ret (" name="++name++" value="++(show value)) else return () +data XmlQueryContext_native+foreign import ccall "dbxml_helper.h &_xmlQueryContext_nullDestructor" _xmlQueryContext_nullDestructor+ :: FunPtr (Ptr XmlQueryContext_struct -> IO ())+foreign import ccall unsafe "dbxml_helper.h _xmlQueryContext_fromNative" _xmlQueryContext_fromNative+ :: Ptr XmlQueryContext_native -> IO (Ptr XmlQueryContext_struct)++xmlQueryContext_fromNative :: Ptr XmlQueryContext_native -> IO XmlQueryContext+xmlQueryContext_fromNative uc_c = do+ uc <- _xmlQueryContext_fromNative uc_c+ newForeignPtr _xmlQueryContext_nullDestructor uc+ -- Safe so it doesn't block other Haskell threads, since this one can take a while to execute foreign import ccall safe "dbxml_helper.h _xmlQueryExpression_execute" _xmlQueryExpression_execute :: Ptr XmlQueryExpression_struct -> Ptr XmlTransaction_struct -> Ptr XmlValue_struct- -> Ptr XmlQueryContext_struct -> CUInt -> Ptr (Ptr XmlResults_struct) -> IO CInt+ -> Ptr XmlQueryContext_struct -> Word32 -> Ptr (Ptr XmlResults_struct) -> IO CInt xmlQueryExpression_execute :: XmlQueryExpression -> Maybe XmlTransaction@@ -730,6 +822,17 @@ p <- peek ptr newForeignPtr _xmlUpdateContext_delete p +data XmlUpdateContext_native+foreign import ccall "dbxml_helper.h &_xmlUpdateContext_nullDestructor" _xmlUpdateContext_nullDestructor+ :: FunPtr (Ptr XmlUpdateContext_struct -> IO ())+foreign import ccall unsafe "dbxml_helper.h _xmlUpdateContext_fromNative" _xmlUpdateContext_fromNative+ :: Ptr XmlUpdateContext_native -> IO (Ptr XmlUpdateContext_struct)++xmlUpdateContext_fromNative :: Ptr XmlUpdateContext_native -> IO XmlUpdateContext+xmlUpdateContext_fromNative uc_c = do+ uc <- _xmlUpdateContext_fromNative uc_c+ newForeignPtr _xmlUpdateContext_nullDestructor uc+ foreign import ccall safe "dbxml_helper.h _xmlDocument_setContent" _xmlDocument_setContent :: Ptr XmlDocument_struct -> Ptr Word8 -> CUInt -> IO CInt @@ -747,7 +850,7 @@ let (fp, fp_offset, length) = BSI.toForeignPtr bs withForeignPtr fp $ \c_fp -> code (c_fp `plusPtr` fp_offset) length- + foreign import ccall safe "dbxml_helper.h _xmlContainer_updateDocument" _xmlContainer_updateDocument :: Ptr XmlContainer_struct -> Ptr XmlTransaction_struct -> Ptr XmlDocument_struct -> Ptr XmlUpdateContext_struct -> IO CInt@@ -770,7 +873,7 @@ foreign import ccall safe "dbxml_helper.h _xmlContainer_putDocument" _xmlContainer_putDocument :: Ptr XmlContainer_struct -> Ptr XmlTransaction_struct- -> Ptr XmlDocument_struct -> Ptr XmlUpdateContext_struct -> CUInt -> IO CInt+ -> Ptr XmlDocument_struct -> Ptr XmlUpdateContext_struct -> Word32 -> IO CInt xmlContainer_putDocument :: XmlContainer -> Maybe XmlTransaction -> XmlDocument -> XmlUpdateContext -> [DbXmlFlag] -> IO ()@@ -812,12 +915,12 @@ foreign import ccall safe "dbxml_helper.h _xmlContainer_close" _xmlContainer_close :: Ptr XmlContainer_struct -> IO () --- | Closes a container. Equivalent to destructing the XmlContainer object in C++. +-- | Closes a container. Equivalent to destructing the XmlContainer object in C++. xmlContainer_close :: XmlContainer -> IO () xmlContainer_close cont = withForeignPtr cont $ \cont_ -> _xmlContainer_close cont_- + foreign import ccall safe "dbxml_helper.h _xmlContainer_addIndex" _xmlContainer_addIndex :: Ptr XmlContainer_struct -> Ptr XmlTransaction_struct -> CString -> CString -> CString -> Ptr XmlUpdateContext_struct -> IO CInt@@ -886,7 +989,7 @@ foreign import ccall safe "dbxml_helper.h _xmlManager_close" _xmlManager_close :: Ptr XmlManager_struct -> IO () --- | Closes an XmlManager. Equivalent to destructing the XmlManager object in C++. +-- | Closes an XmlManager. Equivalent to destructing the XmlManager object in C++. xmlManager_close :: XmlManager -> IO () xmlManager_close mgr = _xmlManager_close mgr
Database/Berkeley/dbxml_helper.cpp view
@@ -93,6 +93,12 @@ } } +int _xmlManager_toNative(XmlManagerInfo* mgr, DbXml::XmlManager** pMgr)+{+ *pMgr = &mgr->mgr;+ return 0;+}+ void _xmlManager_close(XmlManagerInfo* mgr) { delete mgr;@@ -126,6 +132,13 @@ delete cont; } +// Delete the container reference but not the container itself, because someone+// else is managing it.+void _xmlContainer_nullDelete(DbXml::XmlContainer** cont)+{+ delete cont;+}+ void _xmlContainer_close(DbXml::XmlContainer** cont) { delete *cont;@@ -166,6 +179,15 @@ delete trans; } +void _xmlTransaction_nullDestructor(DbXml::XmlTransaction* trans)+{+}++DbXml::XmlTransaction* _xmlTransaction_fromNative(DbXml::XmlTransaction* trans)+{+ return trans;+}+ int _xmlTransaction_commit(DbXml::XmlTransaction* trans) { try {@@ -188,6 +210,19 @@ } } +int _xmlContainer_toNative(DbXml::XmlContainer** cont, DbXml::XmlContainer** pCont)+{+ *pCont = *cont;+ return 0;+}++int _xmlContainer_fromNative(DbXml::XmlContainer* cont, DbXml::XmlContainer*** container)+{+ *container = new DbXml::XmlContainer*;+ **container = cont;+ return 0;+}+ int _xmlContainer_getDocument(DbXml::XmlContainer** cont, DbXml::XmlTransaction* trans, const char* key, u_int32_t flags, DbXml::XmlDocument** doc) {@@ -260,6 +295,15 @@ delete ctx; } +void _xmlQueryContext_nullDestructor(DbXml::XmlQueryContext*)+{+}++DbXml::XmlQueryContext* _xmlQueryContext_fromNative(DbXml::XmlQueryContext* qc)+{+ return qc;+}+ void _xmlResults_delete(DbXml::XmlResults* res) { delete res;@@ -485,6 +529,15 @@ void _xmlUpdateContext_delete(DbXml::XmlUpdateContext* ctx) { delete ctx;+}++void _xmlUpdateContext_nullDestructor(DbXml::XmlUpdateContext*)+{+}++DbXml::XmlUpdateContext* _xmlUpdateContext_fromNative(DbXml::XmlUpdateContext* uc)+{+ return uc; } int _xmlManager_createUpdateContext(XmlManagerInfo* mgr, DbXml::XmlUpdateContext** ctx)
Database/Berkeley/dbxml_helper.h view
@@ -28,17 +28,25 @@ }; int _xmlManager(DB_ENV** dbenv, u_int32_t flags, XmlManagerInfo** mgr);+ int _xmlManager_toNative(XmlManagerInfo* mgr, DbXml::XmlManager** pMgr); void _xmlManager_close(XmlManagerInfo* mgr); int _xmlManager_openContainer(XmlManagerInfo* mgr, const char* name, u_int32_t flags, int cType, int mode, DbXml::XmlContainer*** container); int _xmlManager_existsContainer(XmlManagerInfo* mgr, const char* name); void _xmlContainer_delete(DbXml::XmlContainer** cont);+ // Delete the container reference but not the container itself, because someone+ // else is managing it.+ void _xmlContainer_nullDelete(DbXml::XmlContainer** cont); void _xmlContainer_close(DbXml::XmlContainer** cont); int _xmlManager_createTransaction(XmlManagerInfo* mgr, u_int32_t flags, DbXml::XmlTransaction** trans); int _xmlManager_createTransaction_DbTxn(XmlManagerInfo* mgr, DB_TXN ** dbtxnp, DbXml::XmlTransaction** trans); void _xmlTransaction_delete(DbXml::XmlTransaction* trans);+ void _xmlTransaction_nullDestructor(DbXml::XmlTransaction* trans); int _xmlTransaction_commit(DbXml::XmlTransaction* trans); int _xmlTransaction_abort(DbXml::XmlTransaction* trans);+ DbXml::XmlTransaction* _xmlTransaction_fromNative(DbXml::XmlTransaction* trans);+ int _xmlContainer_toNative(DbXml::XmlContainer** cont, DbXml::XmlContainer** pCont);+ int _xmlContainer_fromNative(DbXml::XmlContainer* cont, DbXml::XmlContainer*** container); int _xmlContainer_getDocument(DbXml::XmlContainer** cont, DbXml::XmlTransaction* trans, const char* key, u_int32_t flags, DbXml::XmlDocument** doc); char* _xmlContainer_getName(DbXml::XmlContainer** cont);@@ -47,6 +55,8 @@ int _xmlDocument_getContent(DbXml::XmlDocument* doc, char** str, int* length); int _xmlManager_createQueryContext(XmlManagerInfo* mgr, int rt, int ev, DbXml::XmlQueryContext** ctx); void _xmlQueryContext_delete(DbXml::XmlQueryContext* ctx);+ void _xmlQueryContext_nullDestructor(DbXml::XmlQueryContext*);+ DbXml::XmlQueryContext* _xmlQueryContext_fromNative(DbXml::XmlQueryContext* qc); void _xmlResults_delete(DbXml::XmlResults* res); int _xmlResults_hasNext(DbXml::XmlResults* res, int* answer); int _xmlResults_nextDocument(DbXml::XmlResults* res, DbXml::XmlDocument** doc);@@ -71,6 +81,8 @@ int _xmlDocument_getName(DbXml::XmlDocument* doc, char** name); int _xmlDocument_setName(DbXml::XmlDocument* doc, const char* name); void _xmlUpdateContext_delete(DbXml::XmlUpdateContext* ctx);+ void _xmlUpdateContext_nullDestructor(DbXml::XmlUpdateContext*);+ DbXml::XmlUpdateContext* _xmlUpdateContext_fromNative(DbXml::XmlUpdateContext* uc); int _xmlManager_createUpdateContext(XmlManagerInfo* mgr, DbXml::XmlUpdateContext** ctx); int _xmlDocument_setContent(DbXml::XmlDocument* doc, const char* text, unsigned int length); int _xmlContainer_updateDocument(DbXml::XmlContainer** cont, DbXml::XmlTransaction* trans,
README view
@@ -1,5 +1,5 @@ Berkeley DB / Berkeley DB XML binding for Haskell-28 Jan 2010+6 May 2011 by Stephen Blackheath email me: http://blacksapphire.com/antispam/@@ -8,7 +8,8 @@ Berkeley DB XML is a powerful, fully transactional, XML-based database that uses-XQuery as its query language. It is NOT an SQL database. You can download it here:+XQuery as its query language. It is NOT an SQL database. It is not free for+commercial use. You can download it here: http://www.oracle.com/database/berkeley-db/xml/index.html @@ -25,16 +26,10 @@ To install, use the standard Cabal install procedure: -cabal install--or--runhaskell Setup.hs install- If Berkeley DB or DB XML is not installed in the default location of /usr or /usr/local, you will need to specify the paths in this way: -cabal install \+cabal install BerkeleyDBXML \ --extra-include-dirs=/usr/local/dbxml-2.5.16/include/ \ --extra-include-dirs=/usr/local/dbxml-2.5.16/include/dbxml/ \ --extra-lib-dirs=/usr/local/dbxml-2.5.16/lib/
examples/adventure.hs view
@@ -193,7 +193,7 @@ docs <- collectM (xmlResults_next res) records <- forM docs $ \doc -> do text <- xmlDocument_getContent doc- value <- case unpickleXML' defaultParserOptions (xpRoot pickler) text of+ value <- case unpickleXML' defaultParseOptions (xpRoot pickler) text of Left err -> fail $ "unpickle failed: "++err Right value -> return value return (doc, value)