1 (* Java code generation *)
14 let comment = G.comment
15 let empty_line = G.empty_line
19 output
"public %s %s" cls name
;
23 G.close_curly
" // %s %s" cls name
;
28 let (start_class
,end_class
) = start_ "class"
29 let (start_intf
,end_intf
) = start_ "interface"
31 let as_java_type = function
33 | Type.Text
-> "String"
34 | Type.Float
-> "float"
36 | Type.Bool
-> "boolean"
37 | Type.Datetime
-> "Timestamp"
39 let get_column attr index
=
40 sprintf
"res.get%s(%u)"
41 (attr
.RA.domain
>> as_java_type >> String.capitalize
)
44 let param_type_to_string t
= t
>> Option.default
Type.Text
>> as_java_type
46 let set_param index param
=
48 output
"pstmt.set%s(%u, %s);"
49 (t
>> param_type_to_string >> String.capitalize
)
51 (param_name_to_string id index
)
53 let schema_to_values = List.mapi
(fun i attr
-> name_of attr i
, attr
.RA.domain
>> as_java_type)
55 let output_schema_binder index schema
=
56 let name = default_name
"output" index
in
59 output
"public void callback(%s);" (G.Values.to_string
(schema_to_values schema
));
64 let output_schema_binder index schema
=
67 | _
-> Some
(output_schema_binder index schema
)
69 let params_to_values = List.mapi
(fun i
(n
,t
) -> param_name_to_string n i
, t
>> param_type_to_string)
70 let params_to_values = List.unique
& params_to_values
72 let output_value_defs vals
=
73 vals
>> List.iter
(fun (name,t
) -> output
"%s %s;" t
name)
75 let output_schema_data index schema
=
76 let name = default_name
"data" index
in
78 schema
>> schema_to_values >> output_value_defs;
81 let output_params_binder index params
=
83 let name = default_name "params" index in
87 let values = params_to_values params in
88 values >> make_const_values >> output_value_defs;
90 output "%s(%s)" name (values >> make_const_values >> G.Values.to_string);
91 output_value_inits values;
95 output "void set_params(typename Traits::statement stmt)";
98 List.iteri
set_param params
;
111 let generate_code () index schema params kind props
=
112 let schema_binder_name = output_schema_binder index schema
in
113 let values = params_to_values params
in
114 let result = match schema_binder_name with None
-> [] | Some
name -> ["result",name] in
115 let all_params = G.Values.to_string
116 (["db","Connection"] @ result @ values)
118 let name = choose_name props kind index
in
119 let sql = G.quote
(get_sql props kind params
) in
120 output
"public static int %s(%s) throws SQLException" name all_params;
122 output
"PreparedStatement pstmt = db.prepareStatement(%s);" sql;
123 output_params_binder index params
;
124 begin match schema_binder_name with
125 | None
-> output
"return pstmt.executeUpdate();"
127 output
"ResultSet res = pstmt.executeQuery();";
128 let args = List.mapi
(fun index attr
-> get_column attr index
) schema
in
129 let args = String.concat
"," args in
130 output
"int count = 0;";
131 output
"while (res.next())";
133 output
"result.callback(%s);" args;
136 output
"return count;"
141 let start_output () name =
142 output
"import java.sql.*;";
146 let finish_output () name = end_class
name