import Database.HaskellDB
import Database.HaskellDB.Database
import Database.HaskellDB.DBSpec.DBSpecToDatabase

import TestConnect

import Control.Exception
import System.IO

--
-- Database description
--

import Database.HaskellDB.DBLayout


dbinfo :: DBInfo
dbinfo = DBInfo {dbname = "Dp037",
                 opts = DBOptions {useBString = False},
                 tbls = [TInfo {tname = "test_non_ascii",
                               cols = [CInfo {cname = "str_id",
                                              descr = (IntT, False)},
                                       CInfo {cname = "str",
                                              descr = (StringT, False)}]}]
		}

---------------------------------------------------------------------------
-- Table
---------------------------------------------------------------------------
test_non_ascii :: Table
    ((RecCons Str_id (Expr Int)
      (RecCons Str (Expr String) RecNil)))

test_non_ascii = baseTable "test_non_ascii" $
                 hdbMakeEntry Str_id #
                 hdbMakeEntry Str

---------------------------------------------------------------------------
-- Fields
---------------------------------------------------------------------------
---------------------------------------------------------------------------
-- Str_id Field
---------------------------------------------------------------------------

data Str_id = Str_id

instance FieldTag Str_id where fieldName _ = "str_id"

str_id :: Attr Str_id Int
str_id = mkAttr Str_id

---------------------------------------------------------------------------
-- Str Field
---------------------------------------------------------------------------

data Str = Str

instance FieldTag Str where fieldName _ = "str"

str :: Attr Str String
str = mkAttr Str



--
-- Database creation
--

printIOErrors :: IO () -> IO ()
printIOErrors = handleJust ioErrors (hPutStrLn stderr . show)

recreateDB :: Database -> DBInfo -> IO ()
recreateDB db info = do
		     dropTables db info
		     dbSpecToDatabase db info

dropTables :: Database -> DBInfo -> IO ()
dropTables db info = mapM_ (printIOErrors . dropTable db . tname) (tbls info)

--
-- Testing
--

addGet db i s = do
		insert db test_non_ascii (str_id << constant i 
					  # str << constant s)
		(r:_) <- query db $ do
				    t <- table test_non_ascii
				    restrict (t!str_id .==. constant i)
				    return t
		return (r!str)

showStr s = s ++ " (" ++ show s ++ ")"

testStr db i s = do
		 s' <- addGet db i s
		 putStrLn $ showStr s ++ " => " ++ showStr s'

test :: Database -> IO ()
test db = do
	  testStr db 0 "åäöñ"
	  testStr db 1 "'\"\\"

--
-- Main function
--

main = argConnect $ \db -> do
			   recreateDB db dbinfo
			   test db
			   dropTables db dbinfo
