-- 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