packages feed

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