on master help sign in
added update and insert
commit554ac048637ebcbe3d37adc7e1da3310e3f701a8 authormelissam <mfm6@st-andrews.ac.uk> dateMon 6 Aug 2012, 16:22 (14 years ago) parenteda4990
6 files changed+83−40
contribs/lib/SQLite3/._sqlexpr.idr contribs/lib/SQLite3/._sqlite3.idr contribs/lib/SQLite3/._sqlite3api.c contribs/lib/SQLite3/sqlexpr.idr+51−22 contribs/lib/SQLite3/sqlite3.idr+31−17 contribs/lib/SQLite3/sqlite3api.c+1−1
contribs/lib/SQLite3/._sqlexpr.idr

Binary file not shown.

contribs/lib/SQLite3/._sqlite3.idr

Binary file not shown.

contribs/lib/SQLite3/._sqlite3api.c

Binary file not shown.

contribs/lib/SQLite3/sqlexpr.idr+51−22
@@ -9,6 +9,7 @@ data Value = VInt Int
99 |VStr String
1010 |VFloat Float
1111 |VCol String
12+ |VNULL
1213
1314
1415data Cond = Equals Value Value
@@ -16,14 +17,15 @@ data Cond = Equals Value Value
1617 |MkGTE Value Value
1718 |MkLT Value Value
1819 |MkLTE Value Value
19−--TODO |MkIN (List Value)
20−--TODO |MkIN SQL
2120
2221
2322data Clause = MkCond Cond
2423 | AND Clause Clause
2524 | OR Clause Clause
2625 | Empty
26+
27+data condClause = SET Clause
28+ | WHERE condClause Clause
2729
2830data SelVar = Cols (List String)
2931 |ALL
@@ -31,6 +33,7 @@ data SelVar = Cols (List String)
3133data SQL = SELECT SelVar SQL Clause
3234 | TBL String
3335 | INSERT SQL (List Value)
36+ | UPDATE SQL condClause
3437
3538-- remember to remove these funcs later
3639foldr1 : (a -> a -> a) -> List a -> a
@@ -54,39 +57,55 @@ mapping : Int -> List a -> List (Int, a)
5457mapping counter [] = []
5558mapping counter (x :: xs) = (counter, x) :: mapping (counter + 1) xs
5659
60+fromJust : Maybe Value -> Value
61+fromJust Nothing = VNULL
62+fromJust (Just x) = x
5763
5864popintoList : Maybe Value -> List (Maybe Value) -> List (Maybe Value)
5965popintoList (Just x) [] = [(Just x)]
6066popintoList (Just (x)) ((Just x) :: xs) = (popintoList (Just x) xs)
6167popintoList Nothing [] = []
6268
69+getlist : (String, List (Maybe(Int, Value))) -> List (Maybe(Int, Value))
70+getlist (x, (xs)) = xs
71+
72+
73+outList : List (Maybe Value) -> Maybe Value
74+outList [] = Nothing
75+outList ((Just x)::xs) = Just x
76+
6377valString : List (Maybe(Int, Value)) -> Value -> (String, List (Maybe(Int, Value)))
6478valString xs (VInt x) = ("?" ++ show (cast(length xs)+1), xs ++ [Just (cast((length xs)+1),(VInt x))])
6579valString xs (VStr x) = ("?" ++ show (cast(length xs)+1), xs ++ [Just (cast((length xs)+1),(VStr x))])
6680valString xs (VFloat x) = ("?" ++ show (cast(length xs)+1), xs ++ [Just (cast((length xs)+1),(VFloat x))])
6781valString xs (VCol n) = (n, xs)
6882
83+listVal : List (Maybe(Int, Value)) -> List Value -> (String, List (Maybe(Int, Value)))
84+listVal xs [] = ("", xs)
85+listVal xs (v::vs) = let (str, newxs) = (valString xs v) in
86+ let (str', newxs') = listVal newxs vs in
87+ ((unwords(intersperse "," (words(str) ++ words (str')))), newxs')
6988
7089evalCond : List (Maybe(Int, Value)) -> Cond -> (String, List (Maybe(Int, Value)))
7190evalCond xs (Equals val1 val2) = let (restring , newxs ) = valString xs val1 in
7291 let (restring2, newxs') = valString newxs val2 in
73− (restring ++ " = " ++ restring2, (newxs ++ newxs'))
92+ (restring ++ " = " ++ restring2, (newxs'))
7493
7594evalCond xs (MkGT val1 val2) = let (restring , newxs ) = valString xs val1 in
7695 let (restring2, newxs') = valString newxs val2 in
77− (restring ++ " > " ++ restring2, (newxs ++ newxs'))
96+ (restring ++ " > " ++ restring2, (newxs'))
7897
7998evalCond xs (MkGTE val1 val2) = let (restring , newxs ) = valString xs val1 in
8099 let (restring2, newxs') = valString newxs val2 in
81− (restring ++ " >= " ++ restring2, (newxs ++ newxs'))
100+ (restring ++ " >= " ++ restring2, ( newxs'))
82101
83102evalCond xs (MkLT val1 val2) = let (restring , newxs ) = valString xs val1 in
84103 let (restring2, newxs') = valString newxs val2 in
85− (restring ++ " < " ++ restring2, (newxs ++ newxs'))
104+ (restring ++ " < " ++ restring2, (newxs'))
86105
87106evalCond xs (MkLTE val1 val2) = let (restring , newxs ) = valString xs val1 in
88107 let (restring2, newxs') = valString newxs val2 in
89− (restring ++ " =< " ++ restring2, (newxs ++ newxs'))
108+ (restring ++ " =< " ++ restring2, ( newxs'))
90109
91110
92111clauseString : List (Maybe(Int, Value)) -> Clause -> (String, List (Maybe(Int, Value)))
@@ -102,6 +121,14 @@ clauseString xs (OR c1 c2) = let (clausestr, newxs) = clauseString xs c1 in
102121 let (clausestr2, newxs') = clauseString newxs c2 in
103122 (clausestr ++ " OR " ++clausestr2 , newxs')
104123
124+condClauseStr : List (Maybe(Int, Value)) -> condClause -> (String, List (Maybe(Int, Value)))
125+condClauseStr xs (SET setcl) = let (condstr, newxs) = clauseString xs setcl in
126+ (" SET " ++ condstr, newxs)
127+
128+condClauseStr xs (WHERE setcl1 setcl2) = let (condstr, newxs) = condClauseStr xs setcl1 in
129+ let (condstr', newxs') = clauseString newxs setcl2 in
130+ ( condstr ++ " WHERE " ++ condstr', newxs')
131+
105132
106133evalSQL : List (Maybe(Int, Value)) -> SQL -> ( String, List (Maybe(Int, Value)))
107134evalSQL xs (TBL tbl) = (tbl, xs)
@@ -109,26 +136,28 @@ evalSQL xs (SELECT vars sql' c) = let (sqlstring, newxs) = evalSQL xs sql' in
109136 let (csstring, newxs') = clauseString newxs c in
110137 case c of
111138 Empty => case vars of
112− (ALL ) => ("SELECT " ++ "*" ++ " FROM (" ++ sqlstring ++ ") " ++ csstring, newxs')
113− (Cols selvar) => ("SELECT " ++ unwords ( intersperse "" ( selvar ++ (words ( " FROM (" ++ sqlstring ++ ")")))) ++ csstring, newxs')
139+ (ALL ) => ("SELECT " ++ "*" ++ " FROM ("
140+ ++ sqlstring ++ ") " ++ csstring++ ";", newxs')
141+ (Cols selvar) => ("SELECT " ++ unwords ( intersperse "" ( selvar ++
142+ (words ( " FROM (" ++ sqlstring ++ ")")))) ++ csstring++ ";", newxs')
114143
115144 _ => case vars of
116− (ALL ) => ("SELECT " ++ "*" ++ " FROM (" ++ sqlstring ++ ") " ++ "WHERE " ++ csstring, newxs')
117− (Cols selvar) => ("SELECT " ++ unwords ( intersperse "" ( selvar ++ (words ( " FROM (" ++ sqlstring ++ ")")))) ++ "WHERE" ++ csstring, newxs')
145+ (ALL ) => ("SELECT " ++ "*" ++ " FROM ("
146+ ++ sqlstring ++ ") " ++ "WHERE " ++ csstring++ ";", newxs')
147+ (Cols selvar) => ("SELECT " ++ unwords ( intersperse "" ( selvar ++
148+ (words ( " FROM (" ++ sqlstring ++ ")")))) ++ "WHERE" ++ csstring ++ ";", newxs')
149+
150+evalSQL xs (INSERT sql vals) = let (tblname, newvals) = evalSQL xs sql in
151+ let (str, newxs ) = listVal newvals vals in
152+ ("INSERT INTO " ++ tblname ++ " VALUES (" ++ str ++ ")" , newxs)
153+
154+evalSQL xs (UPDATE sql cl) = let (tblname, newxs) = evalSQL xs sql in
155+ let (csstring, newxs') = condClauseStr newxs cl in
156+ ("UPDATE " ++ tblname ++ csstring, newxs')
118157
158+
119159
120160display : (String, List (Maybe(Int, Value))) -> String
121161display (x, (xs)) = x
122162
123−getlist : (String, List (Maybe(Int, Value))) -> List (Maybe(Int, Value))
124−getlist (x, (xs)) = xs
125−
126−--evalSQL2 : List (Maybe Value) -> String -> (String, List (Maybe Value))
127−--evalSQL2 [] sql = (sql, [])
128−--evalSQL2 ((Just (VInt x)) :: xs) sql = let ("string" , newxs) = evalSQL2 xs sql in
129−-- ("string" ++ sql , Just (VInt x) :: newxs)
130−
131−--main : IO ()
132−--main = (display(evalSQL [] ((SELECT ALL)(TBL "tbl") (MkCond (Equals (VCol "col")(VInt 1))))))
133−
134163
contribs/lib/SQLite3/sqlite3.idr+31−17
@@ -62,11 +62,6 @@ open_db name = do x <- liftIO(mkForeign (FFun "sqlite3_open_idr" [FString] FPtr)
6262
6363close_db : DBPointer -> DB Int
6464close_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)
7065
7166
7267
@@ -280,13 +275,7 @@ toList name stmt x = do
280275 )
281276 liftIO (free_table ptr)
282277 return res
283−
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
278+
290279
291280bind_int : StmtPtr -> Int -> Int -> DB StmtPtr
292281bind_int (MkStmtPtr pointer) indexval val = do
@@ -369,8 +358,7 @@ bindMulti pointer ((Just (indexs, val))::vs) = case val of
369358 bindMulti(x) vs
370359testexpr : DB()
371360testexpr = 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")))))
361+ let sql = (evalSQL [] ((SELECT ALL)(TBL "tbl1") (OR (AND (MkCond (Equals (VCol "data")(VStr "data0"))) (MkCond (Equals (VCol "num")(VInt 1))) ) (MkCond (Equals (VCol "num")(VInt 2))))))
374362 let x = (display sql)
375363 let list = (getlist sql)
376364 liftIO(print x)
@@ -382,10 +370,36 @@ testexpr = do db <- open_db "somedb.db"
382370 finalize_db stmt
383371 close_db db
384372 return ()
385−
373+
374+testupdate : DB()
375+testupdate = do db <- open_db "somedb.db"
376+ let sql = (evalSQL [] (UPDATE (TBL "tbl1") (WHERE (SET (MkCond (Equals(VCol "data") (VStr "data0"))) ) (MkCond (Equals (VCol "num") (VInt 2))) ) ))
377+ let x = (display sql)
378+ let list = (getlist sql)
379+ liftIO(print x)
380+ stmt <- (prepare_db db x)
381+ bindMulti stmt list
382+ exec_db_v2 stmt
383+ finalize_db stmt
384+ close_db db
385+ return ()
386+
387+testInsert : DB()
388+testInsert = do db <- open_db "somedb.db"
389+ let sql = (evalSQL [] (INSERT (TBL "tbl1") [(VInt 2),(VStr "histring2")]))
390+ let x = (display sql)
391+ let list = (getlist sql)
392+ liftIO(print x)
393+ stmt <- (prepare_db db x)
394+ bindMulti stmt list
395+ exec_db_v2 stmt
396+ finalize_db stmt
397+ close_db db
398+ return ()
386399main : IO ()
387400main = do --x <- runDB (test3)
388− y <- runDB (testexpr)
401+ y <- runDB (testInsert)
389402 return ()
390403
391−
404+
405+
contribs/lib/SQLite3/sqlite3api.c+1−1
@@ -414,7 +414,7 @@ void* sqlite3_bind_int_idr(void* p,int index, int val){
414414 DBinfo* dbi =(DBinfo*) p;
415415 int rc;
416416
417− printf("\nThe statement has %d wildcards\n", sqlite3_bind_parameter_count(dbi->ppStmt));
417+ //printf("\nThe statement has %d wildcards\n", sqlite3_bind_parameter_count(dbi->ppStmt));
418418 rc =sqlite3_bind_int(dbi->ppStmt,index,val);
419419 if(rc != SQLITE_OK){
420420 printf("Error in binding\n");