@@ -56,13 +56,18 @@ runDB (MkDB f) = do f' <- f
5656 Left str => ioError str
5757
5858
59−
60−open_db : String -> IO DBPointer
61−open_db name = do x <- mkForeign (FFun "sqlite3_open_idr" [FString] FPtr)name
59+open_db : String -> DB DBPointer
60+open_db name = do x <- liftIO(mkForeign (FFun "sqlite3_open_idr" [FString] FPtr) name)
6261 return (MkDBPointer x)
6362
64−close_db : DBPointer -> IO Int
65−close_db (MkDBPointer pointer) =mkForeign (FFun "sqlite3_close_idr" [FPtr] FInt)pointer
63+close_db : DBPointer -> DB Int
64+close_db (MkDBPointer pointer) = liftIO (mkForeign (FFun "sqlite3_close_idr" [FPtr] FInt)pointer)
65+--close_db pointer = liftIO ((runDB pointer) >>= mkForeign (FFun "sqlite3_close_idr" [FPtr] FInt) )
66+--close_db pointer = liftIO (do
67+-- (MkDBPointer ptr) <- (runDB pointer)
68+-- i <- mkForeign (FFun "sqlite3_close_idr" [FPtr] FInt) ptr
69+-- return i)
70+
6671
6772
6873exec_db : DBPointer -> String -> DB Int
@@ -80,8 +85,7 @@ get_error (MkDBPointer pointer) =mkForeign (FFun "sqlite3_get_error" [FPtr] FStr
8085
8186prepare_db : DBPointer -> String -> DB StmtPtr
8287prepare_db (MkDBPointer pointer) cmd = do
83−
84− result <- liftIO (mkForeign (FFun "sqlite3_prepare_idr" [FPtr, FString] FPtr)pointer cmd)
88+ result <- liftIO(mkForeign (FFun "sqlite3_prepare_idr" [FPtr, FString] FPtr)pointer cmd)
8589 flag <- liftIO(nullPtr result)
8690 if flag
8791 then fail "Error occured while preparing"
@@ -89,13 +93,13 @@ prepare_db (MkDBPointer pointer) cmd = do
8993
9094exec_db_v2 : StmtPtr -> DB Int
9195exec_db_v2 (MkStmtPtr pointer) = do
92− x <- liftIO(mkForeign (FFun "exec_db" [FPtr] FInt)pointer)
96+ x <- liftIO (mkForeign (FFun "exec_db" [FPtr] FInt) pointer)
9397 if (x == 21)
9498 then fail "No data returned."
9599 else return x
96100
97101step_db : StmtPtr -> DB Int
98−step_db (MkStmtPtr pointer) = do
102+step_db (MkStmtPtr pointer)= do
99103 x <- liftIO (mkForeign (FFun "sqlite3_step_idr" [FPtr] FInt)pointer)
100104 if ( x == 101)
101105 then fail "SQLITE_DONE"
@@ -277,35 +281,47 @@ toList name stmt x = do
277281 liftIO (free_table ptr)
278282 return res
279283
280−bind_int : StmtPtr -> Int -> Int -> DB Int
281−bind_int (MkStmtPtr pointer) indexval val = do
282− x <- liftIO(mkForeign (FFun "sqlite3_bind_int_idr" [FPtr, FInt, FInt] FInt)pointer indexval val)
283− if (x /= 0 )
284+--bind_int : StmtPtr -> Int -> Int -> DB Int
285+--bind_int (MkStmtPtr pointer) indexval val = do
286+-- x <- liftIO(mkForeign (FFun "sqlite3_bind_int_idr" [FPtr, FInt, FInt] FInt)pointer indexval val)
287+-- if (x /= 0 )
288+-- then fail "Could not bind int."
289+-- else return x
290+
291+bind_int : StmtPtr -> Int -> Int -> DB StmtPtr
292+bind_int (MkStmtPtr pointer) indexval val = do
293+ x <- liftIO(mkForeign (FFun "sqlite3_bind_int_idr" [FPtr, FInt, FInt] FPtr)pointer indexval val)
294+ flag <- liftIO(nullPtr x)
295+ if flag
284296 then fail "Could not bind int."
285− else return x
286−
297+ else return (MkStmtPtr x)
298+
287299
288−bind_float : StmtPtr -> Int -> Int -> DB Int
300+bind_float : StmtPtr -> Int -> Float -> DB StmtPtr
289301bind_float (MkStmtPtr pointer) indexval val = do
290− x <- liftIO(mkForeign (FFun "sqlite3_bind_float_idr" [FPtr, FInt, FInt] FInt)pointer indexval val)
291− if (x /= 0)
302+ x <- liftIO(mkForeign (FFun "sqlite3_bind_float_idr" [FPtr, FInt, FFloat] FPtr)pointer indexval val)
303+ flag <- liftIO(nullPtr x)
304+ if flag
292305 then fail "Could not bind float."
293− else return x
306+ else return (MkStmtPtr x)
294307
295−bind_text : StmtPtr -> String -> Int -> Int -> DB Int
308+bind_text : StmtPtr -> String -> Int -> Int -> DB StmtPtr
296309bind_text (MkStmtPtr pointer) text indexval lengthval = do
297− x <- liftIO(mkForeign (FFun "sqlite3_bind_text_idr" [FPtr, FString, FInt, FInt] FInt)pointer text indexval lengthval)
298− if (x /= 0)
310+ x <- liftIO(mkForeign (FFun "sqlite3_bind_text_idr" [FPtr, FString, FInt, FInt] FPtr)pointer text indexval lengthval)
311+ flag <- liftIO(nullPtr x)
312+ if flag
299313 then fail "Could not bind text."
300− else return x
301−
302−bind_null : StmtPtr -> Int -> DB Int
303−bind_null (MkStmtPtr pointer) indexval =do
304− x <- liftIO(mkForeign (FFun "sqlite3_bind_null_idr" [FPtr, FInt] FInt)pointer indexval)
305− if (x /= 0)
306− then fail "Could not bind null."
307− else return x
314+ else return (MkStmtPtr x)
315+
316+--bind_null : StmtPtr -> Int -> DB StmtPtr
317+--bind_null (MkStmtPtr pointer) indexval =do
318+-- x <- liftIO(mkForeign (FFun "sqlite3_bind_null_idr" [FPtr, FInt] FInt)pointer indexval)
319+-- if (x /= 0)
320+-- then fail "Could not bind null."
321+-- else return x
308322
323+strlen : String -> DB Int
324+strlen str = liftIO(mkForeign (FFun "strLength" [FString] FInt) str)
309325
310326instance Show DBVal where
311327 show (DBInt i) = "Int val: " ++ show i ++ "\n"
@@ -316,47 +332,55 @@ instance Show DBVal where
316332print_data_v2 : DBVal -> String
317333print_data_v2 = show
318334
319−test : DB()
320−test = do db <- liftIO (open_db "somedb.db")
335+test : DB ()
336+test = do db <- open_db "somedb.db"
321337 stmt <- (prepare_db db "insert into tbl1 values (?,?);")
322338 bind_int stmt 1 456
323339 bind_text stmt "testing" 2 4
324340 step_db stmt
325341 reset_db stmt
326342 finalize_db stmt
327− c <- liftIO (close_db db)
343+ c <- close_db db
328344 return ()
329345
330346test3 : DB()
331−test3 = do db <- liftIO (open_db "students.db")
347+test3 = do db <- open_db "students.db"
332348 stmt <- (prepare_db db "SELECT Student.Name FROM Student, Module, Enrollment WHERE Module.Credits = 30 AND Student.School_student = Enrollment.School_Student AND Student.School = Enrollment.School AND Enrollment.Code = Module.Code")
333349 exec_db_v2 stmt
334350 res <- toList_v2 db
335351 liftIO(print res)
336352 finalize_db stmt
337− c <- liftIO (close_db db)
353+ c <- close_db db
338354 return ()
339355
340−--bindMulti : StmtPtr -> List (Int, (Maybe Value)) -> StmtPtr
341−--bindMulti (MkStmtPtr pointer) [] = (MkStmtPtr pointer)
342−--bindMulti (MkStmtPtr pointer) xs = let newxs = mapping 0 xs in
343−-- case newxs of
344−-- ((_, Nothing):: vs) => bindMulti (MkStmtPtr pointer) vs
345−-- ((index, Just v)::vs) => bindMulti(bind pointer index v) vs
346−
356+bindMulti : StmtPtr-> List (Maybe (Int, Value)) -> DB StmtPtr
357+bindMulti pointer [] = return pointer
358+bindMulti pointer (Nothing :: vs) = bindMulti pointer vs
359+bindMulti pointer ((Just (indexs, val))::vs) = case val of
360+ (VInt intval) => do x <- bind_int pointer indexs intval
361+ bindMulti(x) vs
362+
363+ (VStr strval) => do len <- strlen strval
364+ x <- bind_text pointer strval indexs len
365+ bindMulti(x) vs
366+
367+
368+ (VFloat floatval) => do x <- bind_float pointer indexs floatval
369+ bindMulti(x) vs
347370testexpr : DB()
348−testexpr = do db <- liftIO (open_db "somedb.db")
349− let sql = (evalSQL [] ((SELECT ALL)(TBL "tbl1")(MkCond (Equals (VCol "data")(VInt 1)))))
371+testexpr = do db <- open_db "somedb.db"
372+ --let db = open_db "somedb.db"
373+ let sql = (evalSQL [] ((SELECT ALL)(TBL "tbl1")(MkCond (Equals (VCol "data")(VStr "data1")))))
350374 let x = (display sql)
375+ let list = (getlist sql)
351376 liftIO(print x)
352− stmt <- (prepare_db db "select * from tbl1 where num =?")
353− --let Int(theval) = getval(getlist(sql))
354− bind_int stmt 0 2
377+ stmt <- (prepare_db db x)
378+ bindMulti stmt list
355379 exec_db_v2 stmt
356380 res <- toList_v2 db
357381 liftIO(print res)
358382 finalize_db stmt
359− c <- liftIO (close_db db)
383+ close_db db
360384 return ()
361385
362386main : IO ()