on master help sign in
Merge branch 'master' of github.com:edwinb/Idris-dev

Conflicts: rts/libidris_rts.a

commit617dc9851be73f52cc5028b6e2984946a5ca9325 authorEdwin Brady <eb@cs.st-andrews.ac.uk> dateThu 2 Aug 2012, 12:49 (14 years ago) parent0406f6254daba1
13 files changed+395−133
contribs/lib/._simpleparser.idr contribs/lib/SQLite3/._sqlite3.c → contribs/lib/SQLite3/._Makefile contribs/lib/SQLite3/._sqlexpr.idr contribs/lib/SQLite3/._sqlite3.idr contribs/lib/SQLite3/._sqlite3api.c contribs/lib/SQLite3/._sqlite3api.h contribs/lib/SQLite3/Makefile+12 contribs/lib/SQLite3/sqlexpr.idr+132 contribs/lib/SQLite3/sqlite3.c−97 contribs/lib/SQLite3/sqlite3.idr+103−20 contribs/lib/SQLite3/sqlite3api.c+112−16 contribs/lib/SQLite3/sqlite3api.h+19 lib/prelude/strings.idr+17
contribs/lib/._simpleparser.idr

Binary file not shown.

contribs/lib/SQLite3/._sqlite3.c → contribs/lib/SQLite3/._Makefilerenamed

Binary file not shown.

contribs/lib/SQLite3/._sqlexpr.idrnew file

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/Makefilenew file+12
@@ -0,0 +1,12 @@
1+# This makefile compiles the project
2+#
3+
4+.PHONY: all
5+
6+sqltest : sqlite3.idr sqlite3api.o
7+ idris sqlite3.idr -o sqltest
8+
9+sqlite3api.o : sqlite3api.c
10+ gcc -c sqlite3api.c
11+
12+all : sqltest sqlite3api.o
contribs/lib/SQLite3/sqlexpr.idrnew file+132
@@ -0,0 +1,132 @@
1+module main
2+import prelude.list
3+
4+-----------------------------------------------------------
5+-- * SQL data type
6+-----------------------------------------------------------
7+
8+data Value = VInt Int
9+ |VStr String
10+ |VCol String
11+
12+data Cond = Equals Value Value
13+ |MkGT Value Value
14+ |MkGTE Value Value
15+ |MkLT Value Value
16+ |MkLTE Value Value
17+--TODO |MkIN (List Value)
18+--TODO |MkIN SQL
19+
20+
21+data Clause = MkCond Cond
22+ | AND Clause Clause
23+ | OR Clause Clause
24+ | Empty
25+
26+data SelVar = Cols (List String)
27+ |ALL
28+
29+data SQL = SELECT SelVar SQL Clause
30+ | TBL String
31+ | INSERT SQL (List Value)
32+
33+
34+foldr1 : (a -> a -> a) -> List a -> a
35+foldr1 f [x] = x
36+foldr1 f (x::xs) = f x (foldr1 f xs)
37+
38+
39+unwords' : List (List Char) -> List Char
40+unwords' [] = []
41+unwords' ws = (foldr1 addSpace ws)
42+ where
43+ addSpace : List Char -> List Char -> List Char
44+ addSpace w s = w ++ (' ' :: s)
45+
46+
47+unwords : List String -> String
48+unwords = pack . unwords' . map unpack
49+
50+
51+mapping : Int -> List a -> List (Int, a)
52+mapping counter [] = []
53+mapping counter (x :: xs) = (counter, x) :: mapping (counter + 1) xs
54+
55+
56+popintoList : Maybe Value -> List (Maybe Value) -> List (Maybe Value)
57+popintoList (Just x) [] = [(Just x)]
58+popintoList (Just (x)) ((Just x) :: xs) = (popintoList (Just x) xs)
59+popintoList Nothing [] = []
60+
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)
65+
66+
67+evalCond : List (Maybe Value) -> Cond -> (String, List (Maybe Value))
68+evalCond xs (Equals val1 val2) = let (restring , newxs ) = valString xs val1 in
69+ let (restring2, newxs') = valString newxs val2 in
70+ (restring ++ " = " ++ restring2, (newxs ++ newxs'))
71+
72+evalCond xs (MkGT val1 val2) = let (restring , newxs ) = valString xs val1 in
73+ let (restring2, newxs') = valString newxs val2 in
74+ (restring ++ " > " ++ restring2, (newxs ++ newxs'))
75+
76+evalCond xs (MkGTE val1 val2) = let (restring , newxs ) = valString xs val1 in
77+ let (restring2, newxs') = valString newxs val2 in
78+ (restring ++ " >= " ++ restring2, (newxs ++ newxs'))
79+
80+evalCond xs (MkLT val1 val2) = let (restring , newxs ) = valString xs val1 in
81+ let (restring2, newxs') = valString newxs val2 in
82+ (restring ++ " < " ++ restring2, (newxs ++ newxs'))
83+
84+evalCond xs (MkLTE val1 val2) = let (restring , newxs ) = valString xs val1 in
85+ let (restring2, newxs') = valString newxs val2 in
86+ (restring ++ " =< " ++ restring2, (newxs ++ newxs'))
87+
88+
89+clauseString : List (Maybe Value) -> Clause -> (String, List (Maybe Value))
90+clauseString xs (Empty) = ("" , []) -- No condition
91+clauseString xs (MkCond cond') = let (condstr, newxs) = evalCond xs cond' in
92+ (condstr , newxs)
93+
94+clauseString xs (AND c1 c2) = let (clausestr, newxs) = clauseString xs c1 in
95+ let (clausestr2, newxs') = clauseString newxs c2 in
96+ (clausestr ++ " AND " ++clausestr2 , newxs')
97+
98+clauseString xs (OR c1 c2) = let (clausestr, newxs) = clauseString xs c1 in
99+ let (clausestr2, newxs') = clauseString newxs c2 in
100+ (clausestr ++ " OR " ++clausestr2 , newxs')
101+
102+
103+varString : List String -> String
104+varString xs = (unwords xs)
105+
106+
107+evalSQL : List (Maybe Value) -> SQL -> ( String, List (Maybe Value))
108+evalSQL xs (TBL tbl) = (tbl, xs)
109+evalSQL xs (SELECT vars sql' c) = let (sqlstring, newxs) = evalSQL xs sql' in
110+ let (csstring, newxs') = clauseString newxs c in
111+ case c of
112+ 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'))
115+
116+ _ => 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'))
119+
120+
121+display : (String, List (Maybe Value)) -> String
122+display (x, (xs)) = show x
123+
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)
128+
129+main : IO ()
130+main = print (display(evalSQL [] ((SELECT ALL)(TBL "tbl") (MkCond (Equals (VCol "col")(VInt 1))))))
131+
132+
contribs/lib/SQLite3/sqlite3.cdeleted−97
@@ -1,97 +0,0 @@
1−#include <stdio.h>
2−#include <string.h>
3−#include <sqlite3.h>
4−
5−sqlite3* db; // pointer to the database
6−
7−int first_row;
8−
9−int select_callback(void *p_data, int num_fields, char **p_fields, char **p_col_names) {
10−
11− int i; // counter
12− int *p_rn =(int*)p_data; // pointer counter
13−
14− if(first_row) {
15− first_row=0;
16− // Go through the columns
17− for(int i=0; i<num_fields; i++){
18− printf("%20s", p_col_names[i]);
19− }
20− printf("\n");
21− for(i=0; i<num_fields; i++){
22− printf("=");
23− }
24− printf("\n");
25− }
26− (*p_rn)++; // increment the pointer counter for column
27−
28−
29− for(i=0; i< num_fields; i++){
30− printf("%20s", p_fields[i]);
31− }
32− printf("\n");
33− return 0;
34−}
35−void select_stmt(const char* stmt){
36− char *errmsg; // erro
37− int ret; // return code
38− int nrecs =0; // return code 0 for successful
39−
40− first_row =1;
41−
42− // open database, SQL to be evaluated, call back function, 1st argument to call back ,err
43− ret = sqlite3_exec(db, stmt, select_callback, &nrecs, &errmsg);
44− if(ret !=SQLITE_OK){
45− printf("Error in select statement %s [%s].\n", stmt, errmsg);
46− }
47− else{
48− printf("\n %d records returned.\n", nrecs);
49− }
50−}
51−
52−void sql_stmt(const char* stmt){
53−
54− char *errmsg;
55− int ret;
56− ret = sqlite3_exec(db, stmt, 0, 0, &errmsg);
57−
58− if(ret !=SQLITE_OK){
59− printf("Error in select statement %s [%s].\n", stmt, errmsg);
60− }
61−}
62−
63−
64−void insert(){
65− sql_stmt("begin");
66− sql_stmt("insert into Student values ('Alice','Peterson',1234551,'Medicine',12)");
67− //sql_stmt("insert into mytable values ('mytable2' , 251826, 22660136)");
68− //sql_stmt("insert into mytable values ('mytable3' , 271826, 22684136)");
69− sql_stmt("commit");
70−}
71−
72−int main(){
73− sqlite3_open("./students.db", &db);
74−
75− if(db ==0 ){
76− printf("Could not open the database");
77− return 1;
78− }
79−
80− //sql_stmt("Create table Student (Name, Surname, Passport ,School, School Student)");
81− //insert();
82−// select_stmt("Select *from Student;");
83−// select_stmt("Select *from Module;");
84−// select_stmt("Select *from Enrollment;");
85− select_stmt("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");
86−
87−
88− sqlite3_close(db);
89− return 0;
90−}
91−
92−
93−
94−
95−
96−
97−
contribs/lib/SQLite3/sqlite3.idr+103−20
@@ -1,8 +1,13 @@
11module main
2+import sqlexpr
3+
4+
25%lib "sqlite3"
36%link "sqlite3api.o"
47%include "sqlite3api.h"
58
9+
10+
611data DBVal = DBInt Int
712 | DBText String
813 | DBFloat Float
@@ -63,10 +68,12 @@ close_db (MkDBPointer pointer) =mkForeign (FFun "sqlite3_close_idr" [FPtr] FInt)
6368exec_db : DBPointer -> String -> DB Int
6469exec_db (MkDBPointer pointer) stmt = do
6570 x <- liftIO(mkForeign (FFun "sqlite3_exec_idr" [FPtr, FString] FInt)pointer stmt)
66− if (x /= 0)
71+ if (x == 1)
6772 then fail "Could not execute."
6873 else return x
69−
74+
75+
76+
7077get_error : DBPointer -> IO String
7178get_error (MkDBPointer pointer) =mkForeign (FFun "sqlite3_get_error" [FPtr] FString)pointer
7279
@@ -77,9 +84,15 @@ prepare_db (MkDBPointer pointer) cmd = do
7784 result <- liftIO (mkForeign (FFun "sqlite3_prepare_idr" [FPtr, FString] FPtr)pointer cmd)
7885 flag <- liftIO(nullPtr result)
7986 if flag
80− then fail "Error occured"
87+ then fail "Error occured while preparing"
8188 else return (MkStmtPtr result)
8289
90+exec_db_v2 : StmtPtr -> DB Int
91+exec_db_v2 (MkStmtPtr pointer) = do
92+ x <- liftIO(mkForeign (FFun "exec_db" [FPtr] FInt)pointer)
93+ if (x == 21)
94+ then fail "No data returned."
95+ else return x
8396
8497step_db : StmtPtr -> DB Int
8598step_db (MkStmtPtr pointer) = do
@@ -194,6 +207,53 @@ get_data (MkDBPointer pointer) tbl_name row col = do
194207 helper 3 = do i <- get_data_val_text pointer tbl_name row col; return (DBText i)
195208 helper _ = return (DBNull)
196209
210+num_row_v2 : DBPointer -> IO Int
211+num_row_v2 (MkDBPointer pointer) = do x <- mkForeign (FFun "sqlite3_get_num_row_v2" [FPtr] FInt)pointer
212+ return (x)
213+
214+num_col_v2 : DBPointer -> IO Int
215+num_col_v2 (MkDBPointer pointer) = do x <- mkForeign (FFun "sqlite3_get_num_col_v2" [FPtr] FInt)pointer
216+ return (x)
217+
218+
219+get_data_v2 : DBPointer -> Int -> Int -> IO DBVal
220+get_data_v2 (MkDBPointer pointer) row col = do
221+ ty <- get_data_type_v2 pointer row col
222+ helper ty
223+ where
224+ get_data_type_v2 : Ptr ->Int -> Int -> IO Int
225+ get_data_type_v2 pointer row col =mkForeign (FFun "sqlite3_get_data_type_v2" [FPtr, FInt, FInt] FInt)pointer row col
226+
227+ get_data_val_int : Ptr -> Int -> IO Int
228+ get_data_val_int pointer col =mkForeign (FFun "sqlite3_get_val_int_v2" [FPtr,FInt] FInt)pointer col
229+
230+ get_data_val_text : Ptr -> Int -> IO String
231+ get_data_val_text pointer col =mkForeign (FFun "sqlite3_get_val_text_v2" [FPtr, FInt] FString)pointer col
232+
233+
234+
235+ get_data_val_float : Ptr -> Int -> IO Float
236+ get_data_val_float pointer col =mkForeign (FFun "sqlite3_get_float_v2" [FPtr, FInt] FFloat)pointer col
237+
238+ helper : Int -> IO DBVal
239+ helper 1 = do i <- get_data_val_int pointer col ; return (DBInt i)
240+ helper 2 = do i <- get_data_val_float pointer col ; return (DBFloat i)
241+ helper 3 = do i <- get_data_val_text pointer col; return (DBText i)
242+ helper _ =return (DBNull)
243+
244+
245+toList_v2 : DBPointer -> DB Table
246+toList_v2 db = do
247+ nbR <- liftIO (num_row_v2 db)
248+ nmC <- liftIO (num_col_v2 db)
249+ res <- forM [0..(nbR-1)] (\ i =>
250+ forM [0..(nmC-1)] (\ j =>
251+ liftIO(get_data_v2 db i j)
252+
253+ )
254+ )
255+ return res
256+
197257
198258strcat : String -> String-> String
199259strcat str1 str2 = (str1 ++ str2)
@@ -211,11 +271,11 @@ toList name stmt x = do
211271 res <- forM [0..(nbR-1)] (\ i =>
212272 forM [0..(nmC-1)] (\ j =>
213273 liftIO(get_data x name i j)
274+
214275 )
215276 )
216277 liftIO (free_table ptr)
217− return res
218−
278+ return res
219279
220280bind_int : StmtPtr -> Int -> Int -> DB Int
221281bind_int (MkStmtPtr pointer) indexval val = do
@@ -248,9 +308,9 @@ bind_null (MkStmtPtr pointer) indexval =do
248308
249309
250310instance Show DBVal where
251− show (DBInt i) = "Int val: " ++ show i
252− show (DBText i) = "Text val: " ++ show i
253− show (DBFloat i) = "Float val: " ++ show i
311+ show (DBInt i) = "Int val: " ++ show i ++ "\n"
312+ show (DBText i) = "Text val: " ++ show i ++ "\n"
313+ show (DBFloat i) = "Float val: " ++ show i ++ "\n"
254314 show (DBNull ) = "NULL"
255315
256316print_data_v2 : DBVal -> String
@@ -265,20 +325,43 @@ test = do db <- liftIO (open_db "somedb.db")
265325 reset_db stmt
266326 finalize_db stmt
267327 c <- liftIO (close_db db)
268− return ()
269−
270−test2 : DB ()
271−test2 = do db <- liftIO (open_db "students.db")
272− -- tbl <- (get_table 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")
273− --res <- (toList "Student" "select *from Student;" db)
274− mydata <- liftIO ( get_data db "Student" 1 1)
275− liftIO(print mydata)
328+ return ()
329+
330+test3 : DB()
331+test3 = do db <- liftIO (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")
333+ exec_db_v2 stmt
334+ res <- toList_v2 db
335+ liftIO(print res)
336+ finalize_db stmt
276337 c <- liftIO (close_db db)
277− return ()
278−
338+ return ()
339+
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+
347+testexpr : DB()
348+testexpr = do db <- liftIO (open_db "somedb.db")
349+ let sql = (evalSQL [] ((SELECT ALL)(TBL "tbl1")(MkCond (Equals (VCol "data")(VInt 1)))))
350+ let x = (display sql)
351+ 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
355+ exec_db_v2 stmt
356+ res <- toList_v2 db
357+ liftIO(print res)
358+ finalize_db stmt
359+ c <- liftIO (close_db db)
360+ return ()
361+
279362main : IO ()
280−main = do x <- runDB (test2)
281− --y <- runDB (test)
363+main = do --x <- runDB (test3)
364+ y <- runDB (testexpr)
282365 return ()
283366
284367
contribs/lib/SQLite3/sqlite3api.c+112−16
@@ -110,23 +110,59 @@ void* sqlite3_get_table_idr(void* db,
110110 }
111111
112112 tbl -> data_size = array_size;
113+ return tbl;
113114
114− int i, j, row, col;
115−
116− row = tbl->num_row;
117− col = tbl->num_col;
115+}
116+
117+int exec_db(void*p){
118118
119− for( i=0; i< row; i++){
120− for(j=0;j<col; j++){
121− printf("%s\n", tbl->table_data[(i+1)*col +j]);
122−
123− }
124−
119+ DBinfo* dbi =(DBinfo*) p;
120+ int rc, col, row_counter;
121+
122+ const char* col_name;
123+
124+ rc = sqlite3_step(dbi->ppStmt);
125+
126+ if( rc == SQLITE_DONE){
127+ return rc;
128+ }
129+ if(rc == SQLITE_ERROR && rc == SQLITE_MISUSE){
130+ return 1;
131+ }
132+
133+ row_counter =0;
134+
135+ while (rc == SQLITE_ROW) {
136+
137+ rc = sqlite3_step(dbi->ppStmt);
138+ row_counter++;
125139 }
126− return tbl;
140+
141+ col = sqlite3_column_count(dbi->ppStmt);
142+ dbi->row_count = row_counter;
143+ dbi->col_count = col;
144+ return rc;
127145
128146}
129147
148+int sqlite3_get_num_row_v2(void* p){
149+
150+ DBinfo* dbi =(DBinfo*) p;
151+ int row_number =dbi->row_count;
152+ return row_number;
153+
154+
155+}
156+
157+int sqlite3_get_num_col_v2(void* p){
158+
159+ DBinfo* dbi =(DBinfo*) p;
160+ int col_number =dbi-> col_count;
161+ return col_number;
162+
163+}
164+
165+
130166int sqlite3_get_num_row(void* p){
131167
132168 Table* tbl =(Table*) p;
@@ -142,6 +178,38 @@ int sqlite3_get_num_col(void* p){
142178 int col_number =tbl-> num_col;
143179 return col_number;
144180
181+}
182+int sqlite3_get_data_type_v2(void* p, int nRow, int nCol){
183+
184+ DBinfo* dbi =(DBinfo*) p;
185+ int rc, type, row_counter;
186+ const char* char_int;
187+
188+ rc = sqlite3_reset(dbi->ppStmt);
189+ rc = sqlite3_step(dbi->ppStmt);
190+ row_counter =0;
191+
192+ while (rc == SQLITE_ROW && row_counter < nRow) {
193+
194+ rc = sqlite3_step(dbi->ppStmt);
195+ row_counter++;
196+ }
197+ type =sqlite3_column_type(dbi->ppStmt, nCol);
198+ return type;
199+
200+}
201+
202+
203+int sqlite3_get_val_int_v2(void* p, int nCol){
204+
205+
206+ DBinfo* dbi =(DBinfo*) p;
207+ int val, col;
208+
209+ val =sqlite3_column_int(dbi->ppStmt, nCol);
210+ return val;
211+
212+
145213}
146214
147215int sqlite3_get_data_type(void* p,const char* tbl_name, int nRow, int nCol){
@@ -171,7 +239,6 @@ int sqlite3_get_data_type(void* p,const char* tbl_name, int nRow, int nCol){
171239 }
172240
173241 val =sqlite3_column_type(stmt, nCol);
174− printf("Type : %d\n", val );
175242
176243 rc =sqlite3_finalize(stmt);
177244 if( rc != SQLITE_OK){
@@ -210,7 +277,6 @@ int sqlite3_get_val_int(void* p,const char* tbl_name, int nRow, int nCol){
210277 }
211278
212279 val =sqlite3_column_int(stmt, nCol);
213− printf("int_val : %d\n", val );
214280 rc =sqlite3_finalize(stmt);
215281 if( rc != SQLITE_OK){
216282 printf("Couldnt finalize:\n");
@@ -220,6 +286,24 @@ int sqlite3_get_val_int(void* p,const char* tbl_name, int nRow, int nCol){
220286
221287}
222288
289+const unsigned char* sqlite3_get_val_text_v2(void* p,int nCol){
290+
291+
292+ DBinfo* dbi =(DBinfo*) p;
293+ int rc,i, val, counter;
294+ const unsigned char* text_val;
295+
296+ array =(unsigned char *) GC_malloc(1000*sizeof(char));
297+
298+ text_val =sqlite3_column_text(dbi->ppStmt, nCol);
299+ memcpy(array, text_val, strlen(text_val));
300+ int size = strlen(text_val);
301+
302+ return array;
303+
304+}
305+
306+
223307
224308const unsigned char* sqlite3_get_val_text(void* p,const char* tbl_name,int nRow, int nCol){
225309
@@ -248,10 +332,11 @@ const unsigned char* sqlite3_get_val_text(void* p,const char* tbl_name,int nRow,
248332
249333 }
250334
251− array =(unsigned char *) malloc(1000*sizeof(char));
335+
336+ array =(unsigned char *) GC_malloc(1000*sizeof(char));
337+
252338 text_val =sqlite3_column_text(stmt, nCol);
253339 memcpy(array, text_val, sizeof(text_val));
254− printf("text_val : %s\n", text_val );
255340 rc =sqlite3_finalize(stmt);
256341 if( rc != SQLITE_OK){
257342 printf("Couldn't finalize.\n");
@@ -261,6 +346,7 @@ const unsigned char* sqlite3_get_val_text(void* p,const char* tbl_name,int nRow,
261346
262347}
263348
349+
264350float sqlite3_get_float(void* p,const char* tbl_name, int nRow, int nCol){
265351
266352 DBinfo* dbi =(DBinfo*) p;
@@ -290,7 +376,6 @@ float sqlite3_get_float(void* p,const char* tbl_name, int nRow, int nCol){
290376 }
291377 double_val =sqlite3_column_double(stmt, nCol);
292378 float float_val =(float)double_val;
293− printf("float_val %f\n", float_val);
294379 rc =sqlite3_finalize(stmt);
295380 if( rc != SQLITE_OK){
296381 printf("Couldn't finalize.\n");
@@ -299,6 +384,17 @@ float sqlite3_get_float(void* p,const char* tbl_name, int nRow, int nCol){
299384
300385}
301386
387+float sqlite3_get_float_v2(void* p, int nCol){
388+
389+ DBinfo* dbi =(DBinfo*) p;
390+ double double_val;
391+
392+ double_val =sqlite3_column_double(dbi->ppStmt, nCol);
393+ float float_val =(float)double_val;
394+ return float_val;
395+
396+}
397+
302398
303399void sqlite3_free_table_idr(void* db){
304400 Table* tbl =(Table*) db;
contribs/lib/SQLite3/sqlite3api.h+19
@@ -11,6 +11,7 @@
1111#include <string.h>
1212#include <sqlite3.h>
1313#include <ctype.h>
14+#include <gc.h>
1415
1516typedef struct {
1617 sqlite3 *db_ptr;
@@ -19,6 +20,8 @@ typedef struct {
1920 const char *Ptr_tail;
2021 sqlite3_blob *blob_ptr;
2122 sqlite3_value *value;
23+ int row_count;
24+ int col_count;
2225
2326} DBinfo;
2427
@@ -36,8 +39,12 @@ typedef struct {
3639 DBinfo* database;
3740}Table;
3841
42+int* int_list ();
43+
3944void* sqlite3_open_idr(const char *filename);
4045
46+int exec_db(void*p);
47+
4148int sqlite3_close_idr(void* db);
4249
4350int sqlite3_exec_idr(void*, const char *sql);
@@ -46,6 +53,10 @@ char* sqlite3_get_error(void* db);
4653
4754
4855const unsigned char* sqlite3_get_val_text(void* p,const char* tbl_name,int nRow, int nCol);
56+
57+const unsigned char* sqlite3_get_val_text_v2(void* p,int nCol);
58+
59+float sqlite3_get_float_v2(void* p, int nCol);
4960
5061void* sqlite3_get_table_idr(void* db, const char *sql);
5162
@@ -53,10 +64,18 @@ int sqlite3_get_num_col(void* p);
5364
5465int sqlite3_get_num_row(void* p);
5566
67+int sqlite3_get_num_row_v2(void* p);
68+
69+int sqlite3_get_num_col_v2(void* p);
70+
5671void* sqlite3_get_data(void* p, int nRow, int nCol);
5772
5873int sqlite3_get_data_type(void* p,const char* tbl_name,int nRow, int nCol);
5974
75+int sqlite3_get_data_type_v2(void* p, int nRow, int nCol);
76+
77+int sqlite3_get_val_int_v2(void* p,int nCo);
78+
6079int sqlite3_get_val_int(void* p,const char* tbl_name, int nRow, int nCol);
6180
6281float sqlite3_get_float(void* p,const char* tbl_name, int nRow, int nCol);
lib/prelude/strings.idr+17
@@ -70,3 +70,20 @@ words' s = case dropWhile isSpace s of
7070
7171words : String -> List String
7272words s = map pack $ words' $ unpack s
73+
74+foldr1 : (a -> a -> a) -> List a -> a
75+foldr1 f [x] = x
76+foldr1 f (x::xs) = f x (foldr1 f xs)
77+
78+
79+unwords' : List (List Char) -> List Char
80+unwords' [] = []
81+unwords' ws = (foldr1 addSpace ws)
82+ where
83+ addSpace : List Char -> List Char -> List Char
84+ addSpace w s = w ++ (' ' :: s)
85+
86+
87+unwords : List String -> String
88+unwords = pack . unwords' . map unpack
89+