bindings-0.0.1: traduttoreTraditore/sqlite3/5minutes.hs
-- This is a translation of the C code example found in sqlite web site
-- page "SQLite in 5 Minutes Or Less". Due to the conversion of String
-- and CString and vice versa, problems related to international input
-- are to be expected.
module Main (main) where
import Foreign
import Foreign.C
import System.IO
import System.Environment
import Control.Monad
import qualified Bindings.Sqlite3 as Sqlite3
import qualified Bindings.Utilities as U
callback :: U.CB0001 ()
callback _ argc argv azColName =
do mapM write [0..(fromIntegral $ argc - 1)]
putStrLn ""
return 0
where write n = do aCN' <- peekElemOff azColName n
aCN <- peekCString aCN'
v' <- peekElemOff argv n
v <- maybePeek peekCString v'
putStrLn $ aCN ++ " " ++ (maybe "NULL" id v)
main :: IO CInt
main = do
argv' <- getArgs
argv <- mapM newCString argv'
dbPtr <- new nullPtr
zErrMsgPtr <- new nullPtr
case argv of
database:sql:[] ->
do rc <- Sqlite3.open database dbPtr
db <- peek dbPtr
if (rc == Sqlite3._OK)
then U.withCallback callback $ \cb ->
do rc <- Sqlite3.exec db sql cb nullPtr zErrMsgPtr
when (rc /= Sqlite3._OK) $
do zErrMsg' <- peek zErrMsgPtr
zErrMsg <- peekCString zErrMsg'
putStrLn $ "SQL error: " ++ zErrMsg
Sqlite3.free zErrMsg'
else putStrLn $ "Can't open database: " ++ (show database)
Sqlite3.close db
return ()
_ ->
do programName <- getProgName
putStrLn $ "Usage: " ++ programName ++ " DATABASE SQL-STATEMENT"
return 1