在Haskell中插入regexp()SQLite函数(Database.SQLite3," direct-sqlite")

时间:2016-05-18 20:21:37

标签: regex function haskell sqlite

我需要在Haskell数据库连接中创建regex() SQLite函数的实现,以便我可以使用" REGEX"查询中的运算符。

现在,我有一个使用PCRE的正则表达式匹配函数的实现:

import Text.Regex.Base.RegexLike
import qualified Text.Regex.PCRE.ByteString as PCRE
import qualified Data.ByteString as BS

sqlRegex :: BS.ByteString -> BS.ByteString -> IO Bool
sqlRegex reg b = do
    reC <- pcreCompile reg
    re <- case reC of
        (Right r) -> return r
    reE <- PCRE.execute re b
    case reE of
        (Right (Just _)) -> return True
        (Right (Nothing)) -> return False
    where pcreCompile = PCRE.compile defaultCompOpt defaultExecOpt

效果很好(请原谅非常明确的来电)

> sqlRegex (Data.ByteString.Char8.pack ".*") (Data.ByteString.Char8.pack "hello")
True
> sqlRegex (Data.ByteString.Char8.pack "H.*") (Data.ByteString.Char8.pack "hello")
False

现在,我如何创建SQLite函数??

conn <- open $ pack dbFile
createFunction conn "regexp" (Just 2) True [..... and what should go here?]

createFunction的{​​{3}} docs 帮助我,只要让我明白我需要使函数采取上下文和一些参数,但这些数据的参考对我没有帮助! createFunction API docs

如何使我的函数采用FuncContextFuncArgs ??

1 个答案:

答案 0 :(得分:1)

github repo中有一个例子:

https://github.com/IreneKnapp/direct-sqlite/blob/master/test/Main.hs#L743-757

-- implements repeat(n,str)
repeatString ctx args = do
    n <- funcArgInt64 args 0
    s <- funcArgText args 1
    funcResultText ctx $ T.concat $ replicate (fromIntegral n) s

使用函数funcArg...获取funcResult...之类的参数和函数以返回它们。

指向文档的链接: