on master help sign in
Merge branch 'master' of github.com:edwinb/Idris-dev
617dc98Edwin Brady
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 @@
1module main
1module main
2+import sqlexpr
3+
4+
2%lib "sqlite3"
5%lib "sqlite3"
3%link "sqlite3api.o"
6%link "sqlite3api.o"
4%include "sqlite3api.h"
7%include "sqlite3api.h"
5
8
9+
10+
6data DBVal = DBInt Int
11data DBVal = DBInt Int
7 | DBText String
12 | DBText String
8 | DBFloat Float
13 | DBFloat Float
@@ -63,10 +68,12 @@ close_db (MkDBPointer pointer) =mkForeign (FFun "sqlite3_close_idr" [FPtr] FInt)
63exec_db : DBPointer -> String -> DB Int
68exec_db : DBPointer -> String -> DB Int
64exec_db (MkDBPointer pointer) stmt = do
69exec_db (MkDBPointer pointer) stmt = do
65 x <- liftIO(mkForeign (FFun "sqlite3_exec_idr" [FPtr, FString] FInt)pointer stmt)
70 x <- liftIO(mkForeign (FFun "sqlite3_exec_idr" [FPtr, FString] FInt)pointer stmt)
66− if (x /= 0)
71+ if (x == 1)
67 then fail "Could not execute."
72 then fail "Could not execute."
68 else return x
73 else return x
69−
74+
75+
76+
70get_error : DBPointer -> IO String
77get_error : DBPointer -> IO String
71get_error (MkDBPointer pointer) =mkForeign (FFun "sqlite3_get_error" [FPtr] FString)pointer
78get_error (MkDBPointer pointer) =mkForeign (FFun "sqlite3_get_error" [FPtr] FString)pointer
72
79
@@ -77,9 +84,15 @@ prepare_db (MkDBPointer pointer) cmd = do
77 result <- liftIO (mkForeign (FFun "sqlite3_prepare_idr" [FPtr, FString] FPtr)pointer cmd)
84 result <- liftIO (mkForeign (FFun "sqlite3_prepare_idr" [FPtr, FString] FPtr)pointer cmd)
78 flag <- liftIO(nullPtr result)
85 flag <- liftIO(nullPtr result)
79 if flag
86 if flag
80− then fail "Error occured"
87+ then fail "Error occured while preparing"
81 else return (MkStmtPtr result)
88 else return (MkStmtPtr result)
82
89
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
83
96
84step_db : StmtPtr -> DB Int
97step_db : StmtPtr -> DB Int
85step_db (MkStmtPtr pointer) = do
98step_db (MkStmtPtr pointer) = do
@@ -194,6 +207,53 @@ get_data (MkDBPointer pointer) tbl_name row col = do
194 helper 3 = do i <- get_data_val_text pointer tbl_name row col; return (DBText i)
207 helper 3 = do i <- get_data_val_text pointer tbl_name row col; return (DBText i)
195 helper _ = return (DBNull)
208 helper _ = return (DBNull)
196
209
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+
197
257
198strcat : String -> String-> String
258strcat : String -> String-> String
199strcat str1 str2 = (str1 ++ str2)
259strcat str1 str2 = (str1 ++ str2)
@@ -211,11 +271,11 @@ toList name stmt x = do
211 res <- forM [0..(nbR-1)] (\ i =>
271 res <- forM [0..(nbR-1)] (\ i =>
212 forM [0..(nmC-1)] (\ j =>
272 forM [0..(nmC-1)] (\ j =>
213 liftIO(get_data x name i j)
273 liftIO(get_data x name i j)
274+
214 )
275 )
215 )
276 )
216 liftIO (free_table ptr)
277 liftIO (free_table ptr)
217− return res
278+ return res
218−
219
279
220bind_int : StmtPtr -> Int -> Int -> DB Int
280bind_int : StmtPtr -> Int -> Int -> DB Int
221bind_int (MkStmtPtr pointer) indexval val = do
281bind_int (MkStmtPtr pointer) indexval val = do
@@ -248,9 +308,9 @@ bind_null (MkStmtPtr pointer) indexval =do
248
308
249
309
250instance Show DBVal where
310instance Show DBVal where
251− show (DBInt i) = "Int val: " ++ show i
311+ show (DBInt i) = "Int val: " ++ show i ++ "\n"
252− show (DBText i) = "Text val: " ++ show i
312+ show (DBText i) = "Text val: " ++ show i ++ "\n"
253− show (DBFloat i) = "Float val: " ++ show i
313+ show (DBFloat i) = "Float val: " ++ show i ++ "\n"
254 show (DBNull ) = "NULL"
314 show (DBNull ) = "NULL"
255
315
256print_data_v2 : DBVal -> String
316print_data_v2 : DBVal -> String
@@ -265,20 +325,43 @@ test = do db <- liftIO (open_db "somedb.db")
265 reset_db stmt
325 reset_db stmt
266 finalize_db stmt
326 finalize_db stmt
267 c <- liftIO (close_db db)
327 c <- liftIO (close_db db)
268− return ()
328+ return ()
269−
329+
270−test2 : DB ()
330+test3 : DB()
271−test2 = do db <- liftIO (open_db "students.db")
331+test3 = 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")
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")
273− --res <- (toList "Student" "select *from Student;" db)
333+ exec_db_v2 stmt
274− mydata <- liftIO ( get_data db "Student" 1 1)
334+ res <- toList_v2 db
275− liftIO(print mydata)
335+ liftIO(print res)
336+ finalize_db stmt
276 c <- liftIO (close_db db)
337 c <- liftIO (close_db db)
277− return ()
338+ return ()
278−
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+
279main : IO ()
362main : IO ()
280−main = do x <- runDB (test2)
363+main = do --x <- runDB (test3)
281− --y <- runDB (test)
364+ y <- runDB (testexpr)
282 return ()
365 return ()
283
366
284
367
contribs/lib/SQLite3/sqlite3api.c+112−16
@@ -110,23 +110,59 @@ void* sqlite3_get_table_idr(void* db,
110 }
110 }
111
111
112 tbl -> data_size = array_size;
112 tbl -> data_size = array_size;
113+ return tbl;
113
114
114− int i, j, row, col;
115+}
115−
116+
116− row = tbl->num_row;
117+int exec_db(void*p){
117− col = tbl->num_col;
118
118
119− for( i=0; i< row; i++){
119+ DBinfo* dbi =(DBinfo*) p;
120− for(j=0;j<col; j++){
120+ int rc, col, row_counter;
121− printf("%s\n", tbl->table_data[(i+1)*col +j]);
121+
122−
122+ const char* col_name;
123− }
123+
124−
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++;
125 }
139 }
140+
141+ col = sqlite3_column_count(dbi->ppStmt);
142+ dbi->row_count = row_counter;
143+ dbi->col_count = col;
126− return tbl;
144+ return rc;
127
145
128}
146}
129
147
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+
130int sqlite3_get_num_row(void* p){
166int sqlite3_get_num_row(void* p){
131
167
132 Table* tbl =(Table*) p;
168 Table* tbl =(Table*) p;
@@ -142,6 +178,38 @@ int sqlite3_get_num_col(void* p){
142 int col_number =tbl-> num_col;
178 int col_number =tbl-> num_col;
143 return col_number;
179 return col_number;
144
180
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+
145}
213}
146
214
147int sqlite3_get_data_type(void* p,const char* tbl_name, int nRow, int nCol){
215int 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){
171 }
239 }
172
240
173 val =sqlite3_column_type(stmt, nCol);
241 val =sqlite3_column_type(stmt, nCol);
174− printf("Type : %d\n", val );
175
242
176 rc =sqlite3_finalize(stmt);
243 rc =sqlite3_finalize(stmt);
177 if( rc != SQLITE_OK){
244 if( rc != SQLITE_OK){
@@ -210,7 +277,6 @@ int sqlite3_get_val_int(void* p,const char* tbl_name, int nRow, int nCol){
210 }
277 }
211
278
212 val =sqlite3_column_int(stmt, nCol);
279 val =sqlite3_column_int(stmt, nCol);
213− printf("int_val : %d\n", val );
214 rc =sqlite3_finalize(stmt);
280 rc =sqlite3_finalize(stmt);
215 if( rc != SQLITE_OK){
281 if( rc != SQLITE_OK){
216 printf("Couldnt finalize:\n");
282 printf("Couldnt finalize:\n");
@@ -220,6 +286,24 @@ int sqlite3_get_val_int(void* p,const char* tbl_name, int nRow, int nCol){
220
286
221}
287}
222
288
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+
223
307
224const unsigned char* sqlite3_get_val_text(void* p,const char* tbl_name,int nRow, int nCol){
308const unsigned char* sqlite3_get_val_text(void* p,const char* tbl_name,int nRow, int nCol){
225
309
@@ -248,10 +332,11 @@ const unsigned char* sqlite3_get_val_text(void* p,const char* tbl_name,int nRow,
248
332
249 }
333 }
250
334
335+
251− array =(unsigned char *) malloc(1000*sizeof(char));
336+ array =(unsigned char *) GC_malloc(1000*sizeof(char));
337+
252 text_val =sqlite3_column_text(stmt, nCol);
338 text_val =sqlite3_column_text(stmt, nCol);
253 memcpy(array, text_val, sizeof(text_val));
339 memcpy(array, text_val, sizeof(text_val));
254− printf("text_val : %s\n", text_val );
255 rc =sqlite3_finalize(stmt);
340 rc =sqlite3_finalize(stmt);
256 if( rc != SQLITE_OK){
341 if( rc != SQLITE_OK){
257 printf("Couldn't finalize.\n");
342 printf("Couldn't finalize.\n");
@@ -261,6 +346,7 @@ const unsigned char* sqlite3_get_val_text(void* p,const char* tbl_name,int nRow,
261
346
262}
347}
263
348
349+
264float sqlite3_get_float(void* p,const char* tbl_name, int nRow, int nCol){
350float sqlite3_get_float(void* p,const char* tbl_name, int nRow, int nCol){
265
351
266 DBinfo* dbi =(DBinfo*) p;
352 DBinfo* dbi =(DBinfo*) p;
@@ -290,7 +376,6 @@ float sqlite3_get_float(void* p,const char* tbl_name, int nRow, int nCol){
290 }
376 }
291 double_val =sqlite3_column_double(stmt, nCol);
377 double_val =sqlite3_column_double(stmt, nCol);
292 float float_val =(float)double_val;
378 float float_val =(float)double_val;
293− printf("float_val %f\n", float_val);
294 rc =sqlite3_finalize(stmt);
379 rc =sqlite3_finalize(stmt);
295 if( rc != SQLITE_OK){
380 if( rc != SQLITE_OK){
296 printf("Couldn't finalize.\n");
381 printf("Couldn't finalize.\n");
@@ -299,6 +384,17 @@ float sqlite3_get_float(void* p,const char* tbl_name, int nRow, int nCol){
299
384
300}
385}
301
386
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+
302
398
303void sqlite3_free_table_idr(void* db){
399void sqlite3_free_table_idr(void* db){
304 Table* tbl =(Table*) db;
400 Table* tbl =(Table*) db;
contribs/lib/SQLite3/sqlite3api.h+19
@@ -11,6 +11,7 @@
11#include <string.h>
11#include <string.h>
12#include <sqlite3.h>
12#include <sqlite3.h>
13#include <ctype.h>
13#include <ctype.h>
14+#include <gc.h>
14
15
15typedef struct {
16typedef struct {
16 sqlite3 *db_ptr;
17 sqlite3 *db_ptr;
@@ -19,6 +20,8 @@ typedef struct {
19 const char *Ptr_tail;
20 const char *Ptr_tail;
20 sqlite3_blob *blob_ptr;
21 sqlite3_blob *blob_ptr;
21 sqlite3_value *value;
22 sqlite3_value *value;
23+ int row_count;
24+ int col_count;
22
25
23} DBinfo;
26} DBinfo;
24
27
@@ -36,8 +39,12 @@ typedef struct {
36 DBinfo* database;
39 DBinfo* database;
37}Table;
40}Table;
38
41
42+int* int_list ();
43+
39void* sqlite3_open_idr(const char *filename);
44void* sqlite3_open_idr(const char *filename);
40
45
46+int exec_db(void*p);
47+
41int sqlite3_close_idr(void* db);
48int sqlite3_close_idr(void* db);
42
49
43int sqlite3_exec_idr(void*, const char *sql);
50int sqlite3_exec_idr(void*, const char *sql);
@@ -46,6 +53,10 @@ char* sqlite3_get_error(void* db);
46
53
47
54
48const unsigned char* sqlite3_get_val_text(void* p,const char* tbl_name,int nRow, int nCol);
55const 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);
49
60
50void* sqlite3_get_table_idr(void* db, const char *sql);
61void* sqlite3_get_table_idr(void* db, const char *sql);
51
62
@@ -53,10 +64,18 @@ int sqlite3_get_num_col(void* p);
53
64
54int sqlite3_get_num_row(void* p);
65int sqlite3_get_num_row(void* p);
55
66
67+int sqlite3_get_num_row_v2(void* p);
68+
69+int sqlite3_get_num_col_v2(void* p);
70+
56void* sqlite3_get_data(void* p, int nRow, int nCol);
71void* sqlite3_get_data(void* p, int nRow, int nCol);
57
72
58int sqlite3_get_data_type(void* p,const char* tbl_name,int nRow, int nCol);
73int sqlite3_get_data_type(void* p,const char* tbl_name,int nRow, int nCol);
59
74
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+
60int sqlite3_get_val_int(void* p,const char* tbl_name, int nRow, int nCol);
79int sqlite3_get_val_int(void* p,const char* tbl_name, int nRow, int nCol);
61
80
62float sqlite3_get_float(void* p,const char* tbl_name, int nRow, int nCol);
81float 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
70
70
71words : String -> List String
71words : String -> List String
72words s = map pack $ words' $ unpack s
72words 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+