on master help sign in
better version of executing queries, may need to get rid of the old ones later
faaad7emelissam
contribs/lib/SQLite3/sqlite3.idr+71−8
@@ -63,10 +63,12 @@ close_db (MkDBPointer pointer) =mkForeign (FFun "sqlite3_close_idr" [FPtr] FInt)
63exec_db : DBPointer -> String -> DB Int
63exec_db : DBPointer -> String -> DB Int
64exec_db (MkDBPointer pointer) stmt = do
64exec_db (MkDBPointer pointer) stmt = do
65 x <- liftIO(mkForeign (FFun "sqlite3_exec_idr" [FPtr, FString] FInt)pointer stmt)
65 x <- liftIO(mkForeign (FFun "sqlite3_exec_idr" [FPtr, FString] FInt)pointer stmt)
66− if (x /= 0)
66+ if (x == 1)
67 then fail "Could not execute."
67 then fail "Could not execute."
68 else return x
68 else return x
69−
69+
70+
71+
70get_error : DBPointer -> IO String
72get_error : DBPointer -> IO String
71get_error (MkDBPointer pointer) =mkForeign (FFun "sqlite3_get_error" [FPtr] FString)pointer
73get_error (MkDBPointer pointer) =mkForeign (FFun "sqlite3_get_error" [FPtr] FString)pointer
72
74
@@ -80,6 +82,12 @@ prepare_db (MkDBPointer pointer) cmd = do
80 then fail "Error occured"
82 then fail "Error occured"
81 else return (MkStmtPtr result)
83 else return (MkStmtPtr result)
82
84
85+exec_db_v2 : StmtPtr -> DB Int
86+exec_db_v2 (MkStmtPtr pointer) = do
87+ x <- liftIO(mkForeign (FFun "exec_db" [FPtr] FInt)pointer)
88+ if (x == 21)
89+ then fail "No data returned."
90+ else return x
83
91
84step_db : StmtPtr -> DB Int
92step_db : StmtPtr -> DB Int
85step_db (MkStmtPtr pointer) = do
93step_db (MkStmtPtr pointer) = do
@@ -194,6 +202,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)
202 helper 3 = do i <- get_data_val_text pointer tbl_name row col; return (DBText i)
195 helper _ = return (DBNull)
203 helper _ = return (DBNull)
196
204
205+num_row_v2 : DBPointer -> IO Int
206+num_row_v2 (MkDBPointer pointer) = do x <- mkForeign (FFun "sqlite3_get_num_row_v2" [FPtr] FInt)pointer
207+ return (x)
208+
209+num_col_v2 : DBPointer -> IO Int
210+num_col_v2 (MkDBPointer pointer) = do x <- mkForeign (FFun "sqlite3_get_num_col_v2" [FPtr] FInt)pointer
211+ return (x)
212+
213+
214+get_data_v2 : DBPointer -> Int -> Int -> IO DBVal
215+get_data_v2 (MkDBPointer pointer) row col = do
216+ ty <- get_data_type_v2 pointer row col
217+ helper ty
218+ where
219+ get_data_type_v2 : Ptr ->Int -> Int -> IO Int
220+ get_data_type_v2 pointer row col =mkForeign (FFun "sqlite3_get_data_type_v2" [FPtr, FInt, FInt] FInt)pointer row col
221+
222+ get_data_val_int : Ptr -> Int -> IO Int
223+ get_data_val_int pointer col =mkForeign (FFun "sqlite3_get_val_int_v2" [FPtr,FInt] FInt)pointer col
224+
225+ get_data_val_text : Ptr -> Int -> IO String
226+ get_data_val_text pointer col =mkForeign (FFun "sqlite3_get_val_text_v2" [FPtr, FInt] FString)pointer col
227+
228+
229+
230+ get_data_val_float : Ptr -> Int -> IO Float
231+ get_data_val_float pointer col =mkForeign (FFun "sqlite3_get_float_v2" [FPtr, FInt] FFloat)pointer col
232+
233+ helper : Int -> IO DBVal
234+ helper 1 = do i <- get_data_val_int pointer col ; return (DBInt i)
235+ helper 2 = do i <- get_data_val_float pointer col ; return (DBFloat i)
236+ helper 3 = do i <- get_data_val_text pointer col; return (DBText i)
237+ helper _ =return (DBNull)
238+
239+
240+toList_v2 : DBPointer -> DB Table
241+toList_v2 db = do
242+ nbR <- liftIO (num_row_v2 db)
243+ nmC <- liftIO (num_col_v2 db)
244+ res <- forM [1..(nbR)] (\ i =>
245+ forM [0..(nmC-1)] (\ j =>
246+ liftIO(get_data_v2 db i j)
247+
248+ )
249+ )
250+ return res
251+
197
252
198strcat : String -> String-> String
253strcat : String -> String-> String
199strcat str1 str2 = (str1 ++ str2)
254strcat str1 str2 = (str1 ++ str2)
@@ -215,8 +270,7 @@ toList name stmt x = do
215 )
270 )
216 )
271 )
217 liftIO (free_table ptr)
272 liftIO (free_table ptr)
218− return res
273+ return res
219−
220
274
221bind_int : StmtPtr -> Int -> Int -> DB Int
275bind_int : StmtPtr -> Int -> Int -> DB Int
222bind_int (MkStmtPtr pointer) indexval val = do
276bind_int (MkStmtPtr pointer) indexval val = do
@@ -272,14 +326,23 @@ test2 : DB ()
272test2 = do db <- liftIO (open_db "students.db")
326test2 = do db <- liftIO (open_db "students.db")
273 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")
327 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")
274 res <- (toList "Student" "select *from Student;" db)
328 res <- (toList "Student" "select *from Student;" db)
275− --mydata <- liftIO ( get_data db "Student" 1 1)
276 liftIO(print res)
329 liftIO(print res)
277 c <- liftIO (close_db db)
330 c <- liftIO (close_db db)
278 return ()
331 return ()
279−
332+
333+test3 : DB()
334+test3 = do db <- liftIO (open_db "somedb.db")
335+ stmt <- (prepare_db db "select *from tbl1 where num >10;")
336+ exec_db_v2 stmt
337+ res <- toList_v2 db
338+ liftIO(print res)
339+ finalize_db stmt
340+ c <- liftIO (close_db db)
341+ return ()
342+
343+
280main : IO ()
344main : IO ()
281−main = do x <- runDB (test2)
345+main = do x <- runDB (test3)
282− --y <- runDB (test)
283 return ()
346 return ()
284
347
285
348
contribs/lib/SQLite3/sqlite3api.c+107−14
@@ -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;
114+
115+}
116+
117+int exec_db(void*p){
118+
119+ DBinfo* dbi =(DBinfo*) p;
120+ int rc, col, type, row_counter,i;
121+
122+ const char* col_name;
113
123
114− int i, j, row, col;
124+ rc = sqlite3_step(dbi->ppStmt);
125+
126+ if(rc != SQLITE_ROW && rc != SQLITE_DONE){
127+ return 21;
128+ }
129+ col = sqlite3_column_count(dbi->ppStmt);
130+
131+ row_counter =0;
132+
133+ while (rc == SQLITE_ROW) {
115
134
116− row = tbl->num_row;
135+ rc = sqlite3_step(dbi->ppStmt);
117− col = tbl->num_col;
136+ row_counter++;
118−
137+ }
119−// for( i=0; i< row; i++){
138+
120−// for(j=0;j<col; j++){
139+ dbi->row_count = row_counter;
121−// printf("%s\n", tbl->table_data[(i+1)*col +j]);
140+
122−//
141+ dbi->col_count = col;
123−// }
142+
124−//
143+
125−// }
126− return tbl;
144+ return type;
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){
@@ -219,6 +286,22 @@ int sqlite3_get_val_int(void* p,const char* tbl_name, int nRow, int nCol){
219
286
220}
287}
221
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, sizeof(text_val));
300+ return array;
301+
302+}
303+
304+
222
305
223const unsigned char* sqlite3_get_val_text(void* p,const char* tbl_name,int nRow, int nCol){
306const unsigned char* sqlite3_get_val_text(void* p,const char* tbl_name,int nRow, int nCol){
224
307
@@ -291,7 +374,6 @@ float sqlite3_get_float(void* p,const char* tbl_name, int nRow, int nCol){
291 }
374 }
292 double_val =sqlite3_column_double(stmt, nCol);
375 double_val =sqlite3_column_double(stmt, nCol);
293 float float_val =(float)double_val;
376 float float_val =(float)double_val;
294− //printf("float_val %f\n", float_val);
295 rc =sqlite3_finalize(stmt);
377 rc =sqlite3_finalize(stmt);
296 if( rc != SQLITE_OK){
378 if( rc != SQLITE_OK){
297 printf("Couldn't finalize.\n");
379 printf("Couldn't finalize.\n");
@@ -300,6 +382,17 @@ float sqlite3_get_float(void* p,const char* tbl_name, int nRow, int nCol){
300
382
301}
383}
302
384
385+float sqlite3_get_float_v2(void* p, int nCol){
386+
387+ DBinfo* dbi =(DBinfo*) p;
388+ double double_val;
389+
390+ double_val =sqlite3_column_double(dbi->ppStmt, nCol);
391+ float float_val =(float)double_val;
392+ return float_val;
393+
394+}
395+
303
396
304void sqlite3_free_table_idr(void* db){
397void sqlite3_free_table_idr(void* db){
305 Table* tbl =(Table*) db;
398 Table* tbl =(Table*) db;
contribs/lib/SQLite3/sqlite3api.h+18
@@ -20,6 +20,8 @@ typedef struct {
20 const char *Ptr_tail;
20 const char *Ptr_tail;
21 sqlite3_blob *blob_ptr;
21 sqlite3_blob *blob_ptr;
22 sqlite3_value *value;
22 sqlite3_value *value;
23+ int row_count;
24+ int col_count;
23
25
24} DBinfo;
26} DBinfo;
25
27
@@ -37,8 +39,12 @@ typedef struct {
37 DBinfo* database;
39 DBinfo* database;
38}Table;
40}Table;
39
41
42+int* int_list ();
43+
40void* sqlite3_open_idr(const char *filename);
44void* sqlite3_open_idr(const char *filename);
41
45
46+int exec_db(void*p);
47+
42int sqlite3_close_idr(void* db);
48int sqlite3_close_idr(void* db);
43
49
44int sqlite3_exec_idr(void*, const char *sql);
50int sqlite3_exec_idr(void*, const char *sql);
@@ -47,6 +53,10 @@ char* sqlite3_get_error(void* db);
47
53
48
54
49const 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);
50
60
51void* sqlite3_get_table_idr(void* db, const char *sql);
61void* sqlite3_get_table_idr(void* db, const char *sql);
52
62
@@ -54,10 +64,18 @@ int sqlite3_get_num_col(void* p);
54
64
55int sqlite3_get_num_row(void* p);
65int sqlite3_get_num_row(void* p);
56
66
67+int sqlite3_get_num_row_v2(void* p);
68+
69+int sqlite3_get_num_col_v2(void* p);
70+
57void* sqlite3_get_data(void* p, int nRow, int nCol);
71void* sqlite3_get_data(void* p, int nRow, int nCol);
58
72
59int 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);
60
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+
61int 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);
62
80
63float 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);