2016-05-18 10 views
2

Ich muss eine Implementierung der regex() SQLite-Funktion in einer Haskell-Datenbankverbindung erstellen, damit ich den Operator "REGEX" verwenden kann Abfragen.Einfügen einer regexp() SQLite-Funktion in Haskell (Database.SQLite3, "direct-sqlite")

Nun, ich habe eine Implementierung einer Funktion Regex Matching, die PCRE verwendet:

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 

, die gut funktioniert (bitte sehr expliziten Anrufe entschuldigen)

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

Nun, wie erstelle ich die SQLite-Funktion ??

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

Die docs für createFunction createFunction API docs hilft mir, so weit wie mich verständlich zu machen, dass ich die Funktion einen Kontext vornehmen müssen und einige Argumente nehmen, aber die Schiedsrichter für diese Daten nicht mir nicht helfen! FuncContext and FuncArgs API docs

Wie sollte meine Funktion nehmen eine FuncContext und FuncArgs?

Antwort

1

Es gibt ein Beispiel in der 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 

Sie die Funktionen funcArg... verwenden, um die Argumente und Funktionen wie funcResult... bekommen sie zurückzukehren.

Links zu der Dokumentation:

+0

Excellent! Sehr hilfreich! Vielen Dank! –