@@ -56,13 +56,18 @@ runDB (MkDB f) = do f' <- f
56 Left str => ioError str
56 Left str => ioError str
60−open_db : String -> IO DBPointer
59+open_db : String -> DB DBPointer
61−open_db name = do x <- mkForeign (FFun "sqlite3_open_idr" [FString] FPtr)name
60+open_db name = do x <- liftIO(mkForeign (FFun "sqlite3_open_idr" [FString] FPtr) name)
62 return (MkDBPointer x)
61 return (MkDBPointer x)
64−close_db : DBPointer -> IO Int
63+close_db : DBPointer -> DB Int
65−close_db (MkDBPointer pointer) =mkForeign (FFun "sqlite3_close_idr" [FPtr] FInt)pointer
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
68exec_db : DBPointer -> String -> DB Int
73exec_db : DBPointer -> String -> DB Int
@@ -80,8 +85,7 @@ get_error (MkDBPointer pointer) =mkForeign (FFun "sqlite3_get_error" [FPtr] FStr
81prepare_db : DBPointer -> String -> DB StmtPtr
86prepare_db : DBPointer -> String -> DB StmtPtr
82prepare_db (MkDBPointer pointer) cmd = do
87prepare_db (MkDBPointer pointer) cmd = do
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)
85 flag <- liftIO(nullPtr result)
89 flag <- liftIO(nullPtr result)
87 then fail "Error occured while preparing"
91 then fail "Error occured while preparing"
@@ -89,13 +93,13 @@ prepare_db (MkDBPointer pointer) cmd = do
90exec_db_v2 : StmtPtr -> DB Int
94exec_db_v2 : StmtPtr -> DB Int
91exec_db_v2 (MkStmtPtr pointer) = do
95exec_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)
93 if (x == 21)
97 if (x == 21)
94 then fail "No data returned."
98 then fail "No data returned."
95 else return x
99 else return x
97step_db : StmtPtr -> DB Int
101step_db : StmtPtr -> DB Int
98−step_db (MkStmtPtr pointer) = do
102+step_db (MkStmtPtr pointer)= do
99 x <- liftIO (mkForeign (FFun "sqlite3_step_idr" [FPtr] FInt)pointer)
103 x <- liftIO (mkForeign (FFun "sqlite3_step_idr" [FPtr] FInt)pointer)
100 if ( x == 101)
104 if ( x == 101)
101 then fail "SQLITE_DONE"
105 then fail "SQLITE_DONE"
@@ -277,35 +281,47 @@ toList name stmt x = do
277 liftIO (free_table ptr)
281 liftIO (free_table ptr)
278 return res
282 return res
280−bind_int : StmtPtr -> Int -> Int -> DB Int
284+--bind_int : StmtPtr -> Int -> Int -> DB Int
281−bind_int (MkStmtPtr pointer) indexval val = do
285+--bind_int (MkStmtPtr pointer) indexval val = do
282− x <- liftIO(mkForeign (FFun "sqlite3_bind_int_idr" [FPtr, FInt, FInt] FInt)pointer indexval val)
286+-- x <- liftIO(mkForeign (FFun "sqlite3_bind_int_idr" [FPtr, FInt, FInt] FInt)pointer indexval val)
283− if (x /= 0 )
287+-- if (x /= 0 )
288+-- then fail "Could not bind int."
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)
284 then fail "Could not bind int."
296 then fail "Could not bind int."
285− else return x
297+ else return (MkStmtPtr x)
288−bind_float : StmtPtr -> Int -> Int -> DB Int
300+bind_float : StmtPtr -> Int -> Float -> DB StmtPtr
289bind_float (MkStmtPtr pointer) indexval val = do
301bind_float (MkStmtPtr pointer) indexval val = do
290− x <- liftIO(mkForeign (FFun "sqlite3_bind_float_idr" [FPtr, FInt, FInt] FInt)pointer indexval val)
302+ x <- liftIO(mkForeign (FFun "sqlite3_bind_float_idr" [FPtr, FInt, FFloat] FPtr)pointer indexval val)
303+ flag <- liftIO(nullPtr x)
291− if (x /= 0)
304+ if flag
292 then fail "Could not bind float."
305 then fail "Could not bind float."
293− else return x
306+ else return (MkStmtPtr x)
295−bind_text : StmtPtr -> String -> Int -> Int -> DB Int
308+bind_text : StmtPtr -> String -> Int -> Int -> DB StmtPtr
296bind_text (MkStmtPtr pointer) text indexval lengthval = do
309bind_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)
310+ x <- liftIO(mkForeign (FFun "sqlite3_bind_text_idr" [FPtr, FString, FInt, FInt] FPtr)pointer text indexval lengthval)
311+ flag <- liftIO(nullPtr x)
298− if (x /= 0)
312+ if flag
299 then fail "Could not bind text."
313 then fail "Could not bind text."
300− else return x
314+ else return (MkStmtPtr x)
302−bind_null : StmtPtr -> Int -> DB Int
316+--bind_null : StmtPtr -> Int -> DB StmtPtr
303−bind_null (MkStmtPtr pointer) indexval =do
317+--bind_null (MkStmtPtr pointer) indexval =do
304− x <- liftIO(mkForeign (FFun "sqlite3_bind_null_idr" [FPtr, FInt] FInt)pointer indexval)
318+-- x <- liftIO(mkForeign (FFun "sqlite3_bind_null_idr" [FPtr, FInt] FInt)pointer indexval)
305− if (x /= 0)
319+-- if (x /= 0)
306− then fail "Could not bind null."
320+-- then fail "Could not bind null."
307− else return x
321+-- else return x
323+strlen : String -> DB Int
324+strlen str = liftIO(mkForeign (FFun "strLength" [FString] FInt) str)
310instance Show DBVal where
326instance Show DBVal where
311 show (DBInt i) = "Int val: " ++ show i ++ "\n"
327 show (DBInt i) = "Int val: " ++ show i ++ "\n"
@@ -316,47 +332,55 @@ instance Show DBVal where
316print_data_v2 : DBVal -> String
332print_data_v2 : DBVal -> String
317print_data_v2 = show
333print_data_v2 = show
319−test : DB()
335+test : DB ()
320−test = do db <- liftIO (open_db "somedb.db")
336+test = do db <- open_db "somedb.db"
321 stmt <- (prepare_db db "insert into tbl1 values (?,?);")
337 stmt <- (prepare_db db "insert into tbl1 values (?,?);")
322 bind_int stmt 1 456
338 bind_int stmt 1 456
323 bind_text stmt "testing" 2 4
339 bind_text stmt "testing" 2 4
324 step_db stmt
340 step_db stmt
325 reset_db stmt
341 reset_db stmt
326 finalize_db stmt
342 finalize_db stmt
327− c <- liftIO (close_db db)
343+ c <- close_db db
328 return ()
344 return ()
330test3 : DB()
346test3 : DB()
331−test3 = do db <- liftIO (open_db "students.db")
347+test3 = do db <- open_db "students.db"
332 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")
348 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")
333 exec_db_v2 stmt
349 exec_db_v2 stmt
334 res <- toList_v2 db
350 res <- toList_v2 db
335 liftIO(print res)
351 liftIO(print res)
336 finalize_db stmt
352 finalize_db stmt
337− c <- liftIO (close_db db)
353+ c <- close_db db
338 return ()
354 return ()
340−--bindMulti : StmtPtr -> List (Int, (Maybe Value)) -> StmtPtr
356+bindMulti : StmtPtr-> List (Maybe (Int, Value)) -> DB StmtPtr
341−--bindMulti (MkStmtPtr pointer) [] = (MkStmtPtr pointer)
357+bindMulti pointer [] = return pointer
342−--bindMulti (MkStmtPtr pointer) xs = let newxs = mapping 0 xs in
358+bindMulti pointer (Nothing :: vs) = bindMulti pointer vs
343−-- case newxs of
359+bindMulti pointer ((Just (indexs, val))::vs) = case val of
344−-- ((_, Nothing):: vs) => bindMulti (MkStmtPtr pointer) vs
360+ (VInt intval) => do x <- bind_int pointer indexs intval
345−-- ((index, Just v)::vs) => bindMulti(bind pointer index v) vs
361+ bindMulti(x) vs
363+ (VStr strval) => do len <- strlen strval
364+ x <- bind_text pointer strval indexs len
368+ (VFloat floatval) => do x <- bind_float pointer indexs floatval
347testexpr : DB()
370testexpr : DB()
371+testexpr = do db <- open_db "somedb.db"
348−testexpr = do db <- liftIO (open_db "somedb.db")
372+ --let db = open_db "somedb.db"
349− let sql = (evalSQL [] ((SELECT ALL)(TBL "tbl1")(MkCond (Equals (VCol "data")(VInt 1)))))
373+ let sql = (evalSQL [] ((SELECT ALL)(TBL "tbl1")(MkCond (Equals (VCol "data")(VStr "data1")))))
350 let x = (display sql)
374 let x = (display sql)
375+ let list = (getlist sql)
351 liftIO(print x)
376 liftIO(print x)
352− stmt <- (prepare_db db "select * from tbl1 where num =?")
377+ stmt <- (prepare_db db x)
353− --let Int(theval) = getval(getlist(sql))
378+ bindMulti stmt list
355 exec_db_v2 stmt
379 exec_db_v2 stmt
356 res <- toList_v2 db
380 res <- toList_v2 db
357 liftIO(print res)
381 liftIO(print res)
358 finalize_db stmt
382 finalize_db stmt
359− c <- liftIO (close_db db)
383+ close_db db
360 return ()
384 return ()
362main : IO ()
386main : IO ()