From d7c6f1d025cb7b03a7d44625827a7e852df23e0e Mon Sep 17 00:00:00 2001 From: defanor Date: Fri, 23 Feb 2018 18:32:30 +0300 Subject: Fix Literal value datatype URI handling It should be an URI, not a string. --- Redland/LowLevel.hs | 2 +- Redland/MidLevel.hs | 10 +++++++--- Redland/Util.hs | 8 ++++---- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/Redland/LowLevel.hs b/Redland/LowLevel.hs index 7be277a..75730a6 100644 --- a/Redland/LowLevel.hs +++ b/Redland/LowLevel.hs @@ -195,7 +195,7 @@ foreign import ccall "librdf_node_get_literal_value_language" foreign import ccall "librdf_node_get_literal_value_datatype_uri" librdf_node_get_literal_value_datatype_uri :: Ptr RedlandNode - -> IO CString + -> IO (Ptr RedlandURI) -- ^ Literal datatype URI, must be copied foreign import ccall "librdf_node_get_literal_value_is_wf_xml" librdf_node_get_literal_value_is_wf_xml diff --git a/Redland/MidLevel.hs b/Redland/MidLevel.hs index c8e9aa6..e9f1993 100644 --- a/Redland/MidLevel.hs +++ b/Redland/MidLevel.hs @@ -289,10 +289,14 @@ nodeGetLiteralValueLanguage node = withForeignPtr node $ librdf_node_get_literal_value_language >=> maybeSharedCString -nodeGetLiteralValueDatatypeURI :: ForeignPtr RedlandNode -> IO (Maybe String) +nodeGetLiteralValueDatatypeURI :: ForeignPtr RedlandNode + -> IO (Maybe (ForeignPtr RedlandURI)) nodeGetLiteralValueDatatypeURI node = - withForeignPtr node $ - librdf_node_get_literal_value_datatype_uri >=> maybeSharedCString + withForeignPtr node $ \node' -> do + oldURI <- librdf_node_get_literal_value_datatype_uri node' + if oldURI == nullPtr + then pure Nothing + else Just <$> initialize (librdf_new_uri_from_uri oldURI) p_librdf_free_uri nodeGetLiteralValueIsWellFormedXML :: ForeignPtr RedlandNode -> IO Bool nodeGetLiteralValueIsWellFormedXML node = diff --git a/Redland/Util.hs b/Redland/Util.hs index 600cc83..e7ac295 100644 --- a/Redland/Util.hs +++ b/Redland/Util.hs @@ -79,10 +79,10 @@ redlandNodeToNode rn = do litVal <- nodeGetLiteralValue rn litLang <- nodeGetLiteralValueLanguage rn litType <- nodeGetLiteralValueDatatypeURI rn - let nType = case (litLang, litType) of - (Just l, _) -> Just $ LanguageTag l - (_, Just t) -> Just $ XMLSchema t - _ -> Nothing + nType <- case (litLang, litType) of + (Just l, _) -> pure $ Just $ LanguageTag l + (_, Just t) -> Just . XMLSchema <$> uriAsString t + _ -> pure Nothing pure $ LiteralNode litVal nType _ -> ResourceNode <$> (nodeGetURI rn >>= uriAsString) -- cgit v1.2.3