From 3d06fa4cfc8d9d03c2165e513b325bd160d53edc Mon Sep 17 00:00:00 2001 From: ygrek Date: Sun, 14 Jun 2009 15:44:29 +0300 Subject: [PATCH] java: reuse prepared statements --- demo/demo_java.java | 29 ++++++++++++------------- demo/run | 5 +++++ gen_java.ml | 62 +++++++++++++++++++++++++++-------------------------- 3 files changed, 51 insertions(+), 45 deletions(-) diff --git a/demo/demo_java.java b/demo/demo_java.java index d71163a..e0f0cef 100644 --- a/demo/demo_java.java +++ b/demo/demo_java.java @@ -13,34 +13,33 @@ public class demo_java { Class.forName(driver).newInstance(); Connection db = DriverManager.getConnection(url+dbName,userName,password); -// System.out.println("Connected to the database"); Statement st = db.createStatement(); st.executeUpdate("DROP TABLE IF EXISTS person"); st.executeUpdate("DROP TABLE IF EXISTS money"); - demo_java_gen gen = new demo_java_gen(); - gen.create_person(db); - gen.create_money(db); + demo_java_gen gen = new demo_java_gen(db); + gen.create_person(); + gen.create_money(); - gen.add_person(db,"John","Black"); + gen.add_person("John","Black"); ResultSet rs = st.executeQuery("SELECT LAST_INSERT_ID()"); rs.next(); int john = rs.getInt(1); - gen.add_person(db,"Ivan","Petrov"); + gen.add_person("Ivan","Petrov"); rs = st.executeQuery("SELECT LAST_INSERT_ID()"); rs.next(); int ivan = rs.getInt(1); - gen.add_person(db,"Sancho","Alvares"); + gen.add_person("Sancho","Alvares"); rs = st.executeQuery("SELECT LAST_INSERT_ID()"); rs.next(); int sancho = rs.getInt(1); // add money relations - gen.add_money(db,john,ivan,200); - gen.add_money(db,john,sancho,100); - gen.add_money(db,john,sancho,250); - gen.add_money(db,sancho,ivan,300); + gen.add_money(john,ivan,200); + gen.add_money(john,sancho,100); + gen.add_money(john,sancho,250); + gen.add_money(sancho,ivan,300); - class a1 implements demo_java_gen.output_4 + class a1 implements demo_java_gen.calc_total_callback { public void callback(String fullname, int total) { @@ -50,9 +49,9 @@ public class demo_java // summarize by person System.out.println("Total transfers:"); - gen.calc_total(db,new a1()); + gen.calc_total(new a1()); - class a2 implements demo_java_gen.output_5 + class a2 implements demo_java_gen.list_donors_callback { public void callback(String surname) { @@ -62,7 +61,7 @@ public class demo_java // list donors System.out.println("Donors:"); - gen.list_donors(db,new a2(),"petrov",100); + gen.list_donors("petrov",100,new a2()); db.close(); } diff --git a/demo/run b/demo/run index 7155f9c..49291f3 100755 --- a/demo/run +++ b/demo/run @@ -1,5 +1,10 @@ +echo ---------- C++ sqlite3 ./demo_cxx +echo ---------- C++ mysql ./demo_cxx_mysql +echo ---------- Caml sqlite3 ./demo_caml +echo ---------- Java mysql java -cp /usr/share/java/mysql.jar:. demo_java +echo ---------- C# mysql mono demo_csharp.exe diff --git a/gen_java.ml b/gen_java.ml index b5a3051..52e7651 100644 --- a/gen_java.ml +++ b/gen_java.ml @@ -43,26 +43,19 @@ let get_column attr index = let param_type_to_string t = t >> Option.default Type.Text >> as_java_type -let set_param index param = - let (id,t) = param in - output "pstmt.set%s(%u, %s);" - (t >> param_type_to_string >> String.capitalize) - (index+1) - (param_name_to_string id index) - let schema_to_values = List.mapi (fun i attr -> name_of attr i, attr.RA.domain >> as_java_type) -let output_schema_binder index schema = - let name = "output" in +let output_schema_binder name index schema = + let name = sprintf "%s_callback" name in start_intf name; output "public void callback(%s);" (G.Values.to_string (schema_to_values schema)); end_intf name; name -let output_schema_binder index schema = +let output_schema_binder name index schema = match schema with | [] -> None - | _ -> Some (output_schema_binder index schema) + | _ -> Some (output_schema_binder name index schema) let params_to_values = List.mapi (fun i (n,t) -> param_name_to_string n i, t >> param_type_to_string) let params_to_values = List.unique & params_to_values @@ -76,7 +69,15 @@ let output_schema_data index schema = schema >> schema_to_values >> output_value_defs; end_class name -let output_params_binder index params = List.iteri set_param params +let set_param name index param = + let (id,t) = param in + output "pstmt_%s.set%s(%u, %s);" + name + (t >> param_type_to_string >> String.capitalize) + (index+1) + (param_name_to_string id index) + +let output_params_binder name index params = List.iteri (set_param name) params type t = unit @@ -86,22 +87,18 @@ let generate_code () index schema params kind props = let values = params_to_values params in let name = choose_name props kind index in let sql = G.quote (get_sql props kind params) in - start_class name; - output "PreparedStatement pstmt;"; - empty_line (); - G.func "public" name ["db","Connection"] (fun () -> - output "pstmt = db.prepareStatement(%s);" sql; - ); - empty_line (); - let schema_binder_name = output_schema_binder index schema in - let result = match schema_binder_name with None -> [] | Some name -> ["result",name] in - let all_params = values @ result in - G.func "public int" "execute" all_params ~tail:"throws SQLException" (fun () -> - output_params_binder index params; + output "PreparedStatement pstmt_%s;" name; + empty_line (); + let schema_binder_name = output_schema_binder name index schema in + let result = match schema_binder_name with None -> [] | Some name -> ["result",name] in + let all_params = values @ result in + G.func "public int" name all_params ~tail:"throws SQLException" (fun () -> + output "if (null == pstmt_%s) pstmt_%s = db.prepareStatement(%s);" name name sql; + output_params_binder name index params; begin match schema_binder_name with - | None -> output "return pstmt.executeUpdate();" - | Some name -> - output "ResultSet res = pstmt.executeQuery();"; + | None -> output "return pstmt_%s.executeUpdate();" name + | Some _ -> + output "ResultSet res = pstmt_%s.executeQuery();" name; let args = List.mapi (fun index attr -> get_column attr index) schema in let args = String.concat "," args in output "int count = 0;"; @@ -111,13 +108,18 @@ let generate_code () index schema params kind props = output "count++;"; G.close_curly ""; output "return count;" - end); - end_class name + end) let start_output () name = output "import java.sql.*;"; empty_line (); - start_class name + start_class name; + output "Connection db;"; + empty_line (); + G.func "public" name ["aDb","Connection"] (fun () -> + output "db = aDb;"; + ); + empty_line () let finish_output () name = end_class name -- 2.11.4.GIT