on master help sign in
fixed binds
commit7ff4d46a901fe0835826e139c3ebd08bdd48e569 authormelissam <mfm6@st-andrews.ac.uk> dateTue 17 Jul 2012, 14:22 (14 years ago) parent4a3ce63
6 files changed+161−37
contribs/lib/SQLite3/._sqlite3.c contribs/lib/SQLite3/._sqlite3.idr contribs/lib/SQLite3/._sqlite3api.h contribs/lib/SQLite3/somedb.db contribs/lib/SQLite3/sqlite3.c+97 contribs/lib/SQLite3/sqlite3.idr+64−37
contribs/lib/SQLite3/._sqlite3.cnew file

Binary file not shown.

contribs/lib/SQLite3/._sqlite3.idr

Binary file not shown.

contribs/lib/SQLite3/._sqlite3api.h

Binary file not shown.

contribs/lib/SQLite3/somedb.db

Binary file not shown.

contribs/lib/SQLite3/sqlite3.cnew file+97
@@ -0,0 +1,97 @@
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+64−37
@@ -70,20 +70,31 @@ exec_db (MkDBPointer pointer) stmt = do
7070get_error : DBPointer -> IO String
7171get_error (MkDBPointer pointer) =mkForeign (FFun "sqlite3_get_error" [FPtr] FString)pointer
7272
73−prepare_db : DBPointer -> String -> IO (Either String StmtPtr)
73+
74+--prepare_db : DBPointer -> String -> IO (Either String StmtPtr)
75+--prepare_db (MkDBPointer pointer) cmd = do
76+--
77+-- result <- mkForeign (FFun "sqlite3_prepare_idr" [FPtr, FString] FPtr)pointer cmd
78+-- flag <- nullPtr result
79+-- if flag
80+-- then return (Left "Error occured")
81+-- else return (Right (MkStmtPtr result))
82+
83+
84+prepare_db : DBPointer -> String -> DB StmtPtr
7485prepare_db (MkDBPointer pointer) cmd = do
7586
76− result <- mkForeign (FFun "sqlite3_prepare_idr" [FPtr, FString] FPtr)pointer cmd
77− flag <- nullPtr result
87+ result <- liftIO (mkForeign (FFun "sqlite3_prepare_idr" [FPtr, FString] FPtr)pointer cmd)
88+ flag <- liftIO(nullPtr result)
7889 if flag
79− then return (Left "Error occured")
80− else return (Right (MkStmtPtr result))
90+ then fail "Error occured"
91+ else return (MkStmtPtr result)
8192
82−step_db : StmtPtr -> DB Int
93+step_db : StmtPtr -> DB Int
8394step_db (MkStmtPtr pointer) = do
8495 x <- liftIO (mkForeign (FFun "sqlite3_step_idr" [FPtr] FInt)pointer)
85− if ( x /= 0)
86− then fail "Step failed"
96+ if ( x == 101)
97+ then fail "SQLITE_DONE"
8798 else return x
8899
89100
@@ -214,31 +225,37 @@ toList name stmt x = do
214225 liftIO (free_table ptr)
215226 return res
216227
217−bind_int : Either String StmtPtr -> Int -> Int -> IO (Either String Int)
218−bind_int (Right (MkStmtPtr pointer)) indexval val = do x <- mkForeign (FFun "sqlite3_bind_int_idr" [FPtr, FInt, FInt] FInt)pointer indexval val
219− return (Right x)
220−
221−bind_int (Left erro) indexval val = return (Left "Could not bind int.")
222−
223−bind_float : Either String StmtPtr -> Int -> Int -> IO (Either String Int)
224−bind_float (Right (MkStmtPtr pointer)) indexval val = do x <- mkForeign (FFun "sqlite3_bind_float_idr" [FPtr, FInt, FInt] FInt)pointer indexval val
225− return (Right x)
226−
227−bind_float (Left erro) indexval val = return (Left "Could not bind float.")
228−
229−bind_text : Either String StmtPtr -> String -> Int -> Int -> IO (Either String Int)
230−bind_text (Right (MkStmtPtr pointer)) text indexval lengthval = do x <- mkForeign (FFun "sqlite3_bind_text_idr" [FPtr, FString, FInt, FInt] FInt)pointer text indexval lengthval
231− return (Right x)
232−
233−bind_text (Left erro) text indexval lengthval = return (Left "Could not bind text.")
234−
235−bind_null : Either String StmtPtr -> Int -> IO (Either String Int)
236−bind_null (Right (MkStmtPtr pointer)) indexval =do x <- mkForeign (FFun "sqlite3_bind_null_idr" [FPtr, FInt] FInt)pointer indexval
237− return (Right x)
238−
239−bind_null (Left erro) indexval = return (Left "Could not bind null.")
240−
241228
229+bind_int : StmtPtr -> Int -> Int -> DB Int
230+bind_int (MkStmtPtr pointer) indexval val = do
231+ x <- liftIO(mkForeign (FFun "sqlite3_bind_int_idr" [FPtr, FInt, FInt] FInt)pointer indexval val)
232+ if (x /= 0 )
233+ then fail "Could not bind int."
234+ else return x
235+
236+
237+bind_float : StmtPtr -> Int -> Int -> DB Int
238+bind_float (MkStmtPtr pointer) indexval val = do
239+ x <- liftIO(mkForeign (FFun "sqlite3_bind_float_idr" [FPtr, FInt, FInt] FInt)pointer indexval val)
240+ if (x /= 0)
241+ then fail "Could not bind float."
242+ else return x
243+
244+bind_text : StmtPtr -> String -> Int -> Int -> DB Int
245+bind_text (MkStmtPtr pointer) text indexval lengthval = do
246+ x <- liftIO(mkForeign (FFun "sqlite3_bind_text_idr" [FPtr, FString, FInt, FInt] FInt)pointer text indexval lengthval)
247+ if (x /= 0)
248+ then fail "Could not bind text."
249+ else return x
250+
251+bind_null : StmtPtr -> Int -> DB Int
252+bind_null (MkStmtPtr pointer) indexval =do
253+ x <- liftIO(mkForeign (FFun "sqlite3_bind_null_idr" [FPtr, FInt] FInt)pointer indexval)
254+ if (x /= 0)
255+ then fail "Could not bind null."
256+ else return x
257+
258+
242259instance Show DBVal where
243260 show (DBInt i) = "Int val: " ++ show i
244261 show (DBText i) = "Text val: " ++ i
@@ -248,18 +265,28 @@ instance Show DBVal where
248265print_data_v2 : DBVal -> String
249266print_data_v2 val = (show val)
250267
251−
252−test4 : DB ()
253−test4 = do db <- liftIO (open_db "somedb.db")
268+test : DB()
269+test = do db <- liftIO (open_db "somedb.db")
270+ stmt <- (prepare_db db "insert into tbl1 values (?,?);;")
271+ bind_int stmt 1 456
272+ bind_text stmt "testing" 2 4
273+ step_db stmt
274+ reset_db stmt
275+ finalize_db stmt
276+ c <- liftIO (close_db db)
277+ return ()
278+
279+test2 : DB ()
280+test2 = do db <- liftIO (open_db "students.db")
254281 tbl <- liftIO (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")
255282 res <- (toList "Student" "select *from Student;" db)
256283 mydata <- liftIO ( get_data db "Student" 1 1)
257−
258284 c <- liftIO (close_db db)
259285 return ()
260286
261287main : IO ()
262−main = do x <- runDB (test4)
288+main = do x <- runDB (test2)
289+ --y <- runDB (test)
263290 return ()
264291
265292