pack
[sqlgg.git] / src / cli.ml
blob35fcd369bd87f2e197bcf35493b4924b02183cc5
1 (** command-line *)
3 open Printf
4 open Prelude
5 open ExtLib
7 module Cxx = Gen.Make(Gen_cxx)
8 module Caml = Gen.Make(Gen_caml)
9 module Xml_gen = Gen.Make(Gen_xml)
10 module Java = Gen.Make(Gen_java)
11 module CSharp = Gen.Make(Gen_csharp)
13 (*
14 common usecase:
15 sqlgg [-gen none] ddl.sql -gen cxx dml.sql
17 let generate = ref None
18 let name = ref "sqlgg"
20 let set_out s =
21 generate :=
22 match (String.lowercase s) with
23 | "cxx" | "c++" | "cpp" -> Some Cxx.process
24 | "caml" | "ocaml" | "ml" -> Some Caml.process
25 | "xml" -> Some Xml_gen.process
26 | "java" -> Some Java.process
27 | "csharp" | "c#" | "cs" -> Some CSharp.process
28 | "none" -> None
29 | _ -> failwith (sprintf "Unknown output language: %s" s)
31 let set_params_mode s =
32 Gen.params_mode :=
33 match String.lowercase s with
34 | "named" -> Some Gen.Named
35 | "unnamed" -> Some Gen.Unnamed
36 | "oracle" -> Some Gen.Oracle
37 | "postgresql" -> Some Gen.PostgreSQL
38 | "none" -> None
39 | _ -> failwith (sprintf "Unknown params mode: %s" s)
41 let each_input =
42 let run input =
43 let l = match input with Some ch -> Main.get_statements ch | None -> [] in
44 match !generate with
45 | None -> []
46 | Some _ -> l
48 function
49 | "-" -> run (Some stdin)
50 | filename -> Main.with_channel filename run
52 let generate l =
53 match !generate with
54 | None -> ()
55 | Some f -> f !name (List.enum l)
57 let usage_msg =
58 let s1 = sprintf "SQL Guided (code) Generator ver. %s\n" Sqlgg_config.version in
59 let s2 = sprintf "Usage: %s <options> <file.sql> [<file2.sql> ...]\n" (Filename.basename Sys.executable_name) in
60 let s3 = "Options are:" in
61 s1 ^ s2 ^ s3
63 let show_version () = print_endline Sqlgg_config.version
65 let main () =
66 let l = ref [] in
67 let work s = l := each_input s :: !l in
68 let args = Arg.align
70 "-version", Arg.Unit show_version, " Show version";
71 "-gen", Arg.String set_out, "cxx|caml|java|xml|csharp|none Set output language (default: none)";
72 "-name", Arg.String (fun x -> name := x), "<identifier> Set output module name (default: sqlgg)";
73 "-params", Arg.String set_params_mode, "named|unnamed|oracle|postgresql|none Output query parameters substitution (default: none)";
74 "-debug", Arg.Int (fun x -> Sqlgg_config.debug_level := x), "<N> set debug level";
75 "-no-header", Arg.Unit (fun () -> Sqlgg_config.gen_header := false), "do not put version header in generated output";
76 "-show-tables", Arg.Unit Tables.print, " Show all current tables";
77 "-show-table", Arg.String Tables.print1, "<name> Show specified table";
78 "-", Arg.Unit (fun () -> work "-"), " Read sql from stdin";
79 "-test", Arg.Unit Test.run, " Run unit tests";
82 Arg.parse args work usage_msg;
83 match !l with
84 | [] -> if Array.length Sys.argv = 1 then Arg.usage args usage_msg; 0
85 | l ->
86 if !Error.errors then
87 begin Error.log "Errors encountered, no code generated"; 1 end
88 else
89 begin generate & List.concat & List.rev & l; 0 end
91 let main () =
92 try
93 main ()
94 with
95 exn -> Error.logs (Printexc.to_string exn); 2
97 let () = exit (main ())