on master help sign in
added multiBind
commiteda4990ca192580af73b47e516782b6f7a3f665f authormelissam <mfm6@st-andrews.ac.uk> dateFri 3 Aug 2012, 16:21 (14 years ago) parentbb342d8
8 files changed+124−98
contribs/lib/SQLite3/._sqlexpr.idr contribs/lib/SQLite3/._sqlite3.idr contribs/lib/SQLite3/._sqlite3api.c contribs/lib/SQLite3/._sqlite3api.h contribs/lib/SQLite3/sqlexpr.idr+27−25 contribs/lib/SQLite3/sqlite3.idr+72−48 contribs/lib/SQLite3/sqlite3api.c+18−11 contribs/lib/SQLite3/sqlite3api.h+7−14
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/._sqlite3api.h

Binary file not shown.

contribs/lib/SQLite3/sqlexpr.idr+27−25
@@ -7,7 +7,9 @@ import prelude.list
77
88data Value = VInt Int
99 |VStr String
10+ |VFloat Float
1011 |VCol String
12+
1113
1214data Cond = Equals Value Value
1315 |MkGT Value Value
@@ -30,7 +32,7 @@ data SQL = SELECT SelVar SQL Clause
3032 | TBL String
3133 | INSERT SQL (List Value)
3234
33−
35+-- remember to remove these funcs later
3436foldr1 : (a -> a -> a) -> List a -> a
3537foldr1 f [x] = x
3638foldr1 f (x::xs) = f x (foldr1 f xs)
@@ -58,13 +60,14 @@ popintoList (Just x) [] = [(Just x)]
5860popintoList (Just (x)) ((Just x) :: xs) = (popintoList (Just x) xs)
5961popintoList Nothing [] = []
6062
61−valString : List (Maybe Value) -> Value -> (String, List (Maybe Value))
62−valString xs (VInt x) = ("?", xs ++ [Just (VInt x)])
63−valString xs (VStr x) = ("?", xs ++ [Just (VStr x)])
64−valString xs (VCol n) = (n, xs)
63+valString : List (Maybe(Int, Value)) -> Value -> (String, List (Maybe(Int, Value)))
64+valString xs (VInt x) = ("?" ++ show (cast(length xs)+1), xs ++ [Just (cast((length xs)+1),(VInt x))])
65+valString xs (VStr x) = ("?" ++ show (cast(length xs)+1), xs ++ [Just (cast((length xs)+1),(VStr x))])
66+valString xs (VFloat x) = ("?" ++ show (cast(length xs)+1), xs ++ [Just (cast((length xs)+1),(VFloat x))])
67+valString xs (VCol n) = (n, xs)
6568
6669
67−evalCond : List (Maybe Value) -> Cond -> (String, List (Maybe Value))
70+evalCond : List (Maybe(Int, Value)) -> Cond -> (String, List (Maybe(Int, Value)))
6871evalCond xs (Equals val1 val2) = let (restring , newxs ) = valString xs val1 in
6972 let (restring2, newxs') = valString newxs val2 in
7073 (restring ++ " = " ++ restring2, (newxs ++ newxs'))
@@ -86,7 +89,7 @@ evalCond xs (MkLTE val1 val2) = let (restring , newxs ) = valString xs val1 in
8689 (restring ++ " =< " ++ restring2, (newxs ++ newxs'))
8790
8891
89−clauseString : List (Maybe Value) -> Clause -> (String, List (Maybe Value))
92+clauseString : List (Maybe(Int, Value)) -> Clause -> (String, List (Maybe(Int, Value)))
9093clauseString xs (Empty) = ("" , []) -- No condition
9194clauseString xs (MkCond cond') = let (condstr, newxs) = evalCond xs cond' in
9295 (condstr , newxs)
@@ -98,35 +101,34 @@ clauseString xs (AND c1 c2) = let (clausestr, newxs) = clauseString xs c1 in
98101clauseString xs (OR c1 c2) = let (clausestr, newxs) = clauseString xs c1 in
99102 let (clausestr2, newxs') = clauseString newxs c2 in
100103 (clausestr ++ " OR " ++clausestr2 , newxs')
101−
102−
103−varString : List String -> String
104−varString xs = (unwords xs)
105−
104+
106105
107−evalSQL : List (Maybe Value) -> SQL -> ( String, List (Maybe Value))
106+evalSQL : List (Maybe(Int, Value)) -> SQL -> ( String, List (Maybe(Int, Value)))
108107evalSQL xs (TBL tbl) = (tbl, xs)
109108evalSQL xs (SELECT vars sql' c) = let (sqlstring, newxs) = evalSQL xs sql' in
110109 let (csstring, newxs') = clauseString newxs c in
111110 case c of
112111 Empty => case vars of
113− (ALL ) => ("SELECT " ++ "*" ++ " FROM (" ++ sqlstring ++ ") " ++ csstring, map snd ( mapping 0 newxs'))
114− (Cols selvar) => ("SELECT " ++ unwords ( intersperse "" ( selvar ++ (words ( " FROM (" ++ sqlstring ++ ")")))) ++ csstring, map snd ( mapping 0 newxs'))
112+ (ALL ) => ("SELECT " ++ "*" ++ " FROM (" ++ sqlstring ++ ") " ++ csstring, newxs')
113+ (Cols selvar) => ("SELECT " ++ unwords ( intersperse "" ( selvar ++ (words ( " FROM (" ++ sqlstring ++ ")")))) ++ csstring, newxs')
115114
116115 _ => case vars of
117− (ALL ) => ("SELECT " ++ "*" ++ " FROM (" ++ sqlstring ++ ") " ++ "WHERE" ++ csstring, map snd ( mapping 0 newxs'))
118− (Cols selvar) => ("SELECT " ++ unwords ( intersperse "" ( selvar ++ (words ( " FROM (" ++ sqlstring ++ ")")))) ++ "WHERE" ++ csstring, map snd ( mapping 0 newxs'))
116+ (ALL ) => ("SELECT " ++ "*" ++ " FROM (" ++ sqlstring ++ ") " ++ "WHERE " ++ csstring, newxs')
117+ (Cols selvar) => ("SELECT " ++ unwords ( intersperse "" ( selvar ++ (words ( " FROM (" ++ sqlstring ++ ")")))) ++ "WHERE" ++ csstring, newxs')
118+
119119
120+display : (String, List (Maybe(Int, Value))) -> String
121+display (x, (xs)) = x
120122
121−display : (String, List (Maybe Value)) -> String
122−display (x, (xs)) = show x
123+getlist : (String, List (Maybe(Int, Value))) -> List (Maybe(Int, Value))
124+getlist (x, (xs)) = xs
123125
124−evalSQL2 : List (Maybe Value) -> String -> (String, List (Maybe Value))
125−evalSQL2 [] sql = (sql, [])
126−evalSQL2 ((Just (VInt x)) :: xs) sql = let ("string" , newxs) = evalSQL2 xs sql in
127− ("string" ++ sql , Just (VInt x) :: newxs)
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)
128130
129−main : IO ()
130−main = print (display(evalSQL [] ((SELECT ALL)(TBL "tbl") (MkCond (Equals (VCol "col")(VInt 1))))))
131+--main : IO ()
132+--main = (display(evalSQL [] ((SELECT ALL)(TBL "tbl") (MkCond (Equals (VCol "col")(VInt 1))))))
131133
132134
contribs/lib/SQLite3/sqlite3.idr+72−48
@@ -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 ()
contribs/lib/SQLite3/sqlite3api.c+18−11
@@ -297,7 +297,6 @@ const unsigned char* sqlite3_get_val_text_v2(void* p,int nCol){
297297
298298 text_val =sqlite3_column_text(dbi->ppStmt, nCol);
299299 memcpy(array, text_val, strlen(text_val));
300− int size = strlen(text_val);
301300
302301 return array;
303302
@@ -410,7 +409,7 @@ int sqlite3_step_idr(void* db){
410409 return rc;
411410}
412411
413−int sqlite3_bind_int_idr(void* p,int index, int val){
412+void* sqlite3_bind_int_idr(void* p,int index, int val){
414413
415414 DBinfo* dbi =(DBinfo*) p;
416415 int rc;
@@ -418,13 +417,14 @@ int sqlite3_bind_int_idr(void* p,int index, int val){
418417 printf("\nThe statement has %d wildcards\n", sqlite3_bind_parameter_count(dbi->ppStmt));
419418 rc =sqlite3_bind_int(dbi->ppStmt,index,val);
420419 if(rc != SQLITE_OK){
421− return 1;
420+ printf("Error in binding\n");
421+ return NULL;
422422 }
423423
424− return rc;
424+ return dbi;
425425}
426426
427−int sqlite3_bind_float_idr(void* p,int index, float val){
427+void* sqlite3_bind_float_idr(void* p,int index, float val){
428428
429429 DBinfo* dbi =(DBinfo*) p;
430430 int rc;
@@ -433,10 +433,10 @@ int sqlite3_bind_float_idr(void* p,int index, float val){
433433 rc =sqlite3_bind_double(dbi->ppStmt,index,res);
434434
435435 if(rc != SQLITE_OK){
436− return 1;
436+ return NULL;
437437 }
438438
439− return rc;
439+ return dbi;
440440}
441441
442442int sqlite3_bind_null_idr(void* p,int index){
@@ -451,16 +451,17 @@ int sqlite3_bind_null_idr(void* p,int index){
451451 return rc;
452452}
453453
454−int sqlite3_bind_text_idr(void* p,const char* text, int index,int length){
454+void* sqlite3_bind_text_idr(void* p,const char* text, int index,int length){
455455
456456 DBinfo* dbi =(DBinfo*) p;
457457 int rc;
458458 rc =sqlite3_bind_text(dbi->ppStmt,index,text,length,SQLITE_STATIC);
459459 if(rc != SQLITE_OK){
460− return 1;
460+ printf("Error in binding\n");
461+ return NULL;
461462 }
462463
463− return rc;
464+ return dbi;
464465
465466}
466467int sqlite3_column_count_idr(void* db, const char* tbl_name){
@@ -644,6 +645,12 @@ int sqlite3_value_bytes16_idr(void* value){
644645
645646}
646647
647−
648+int strLength(const char * str){
649+
650+ int length = strlen(str);
651+ return length;
652+
653+
654+}
648655
649656
contribs/lib/SQLite3/sqlite3api.h+7−14
@@ -39,7 +39,6 @@ typedef struct {
3939 DBinfo* database;
4040}Table;
4141
42−int* int_list ();
4342
4443void* sqlite3_open_idr(const char *filename);
4544
@@ -51,15 +50,14 @@ int sqlite3_exec_idr(void*, const char *sql);
5150
5251char* sqlite3_get_error(void* db);
5352
54−
5553const unsigned char* sqlite3_get_val_text(void* p,const char* tbl_name,int nRow, int nCol);
5654
5755const unsigned char* sqlite3_get_val_text_v2(void* p,int nCol);
5856
59−float sqlite3_get_float_v2(void* p, int nCol);
60−
6157void* sqlite3_get_table_idr(void* db, const char *sql);
6258
59+void sqlite3_free_table_idr(void* db);
60+
6361int sqlite3_get_num_col(void* p);
6462
6563int sqlite3_get_num_row(void* p);
@@ -68,8 +66,6 @@ int sqlite3_get_num_row_v2(void* p);
6866
6967int sqlite3_get_num_col_v2(void* p);
7068
71−void* sqlite3_get_data(void* p, int nRow, int nCol);
72−
7369int sqlite3_get_data_type(void* p,const char* tbl_name,int nRow, int nCol);
7470
7571int sqlite3_get_data_type_v2(void* p, int nRow, int nCol);
@@ -80,7 +76,7 @@ int sqlite3_get_val_int(void* p,const char* tbl_name, int nRow, int nCol);
8076
8177float sqlite3_get_float(void* p,const char* tbl_name, int nRow, int nCol);
8278
83−void sqlite3_free_table_idr(void* db);
79+float sqlite3_get_float_v2(void* p, int nCol);
8480
8581void* sqlite3_prepare_idr(
8682 void *db, /* Database handle */
@@ -89,15 +85,13 @@ void* sqlite3_prepare_idr(
8985
9086int sqlite3_step_idr(void* stmt);
9187
92−int sqlite3_bind_float_idr(void* p,int index, float val);
88+void* sqlite3_bind_float_idr(void* p,int index, float val);
9389
94−int sqlite3_bind_int_idr(void* p,int index , int val);
95−
96−int sqlite3_bind_int_idr_v2(void* p,int index , int val);
90+void* sqlite3_bind_int_idr(void* p,int index , int val);
9791
9892int sqlite3_bind_null_idr(void* p,int index);
9993
100−int sqlite3_bind_text_idr(void* p,const char* text, int index,int length);
94+void* sqlite3_bind_text_idr(void* p,const char* text, int index,int length);
10195
10296int sqlite3_column_count_idr(void* stmt, const char* tbl_name);
10397
@@ -142,5 +136,4 @@ int sqlite3_value_bytes_idr(void* value);
142136
143137int sqlite3_value_bytes16_idr(void* value);
144138
145−int sqlite3_errcode(sqlite3 *db);
146−
139+int strLength(const char * str);