force as needed
[sqlgg.git] / src / sqlgg.ml
blob5426fec53258f385424112073a639452eeff2497
1 (** command-line *)
3 open Printf
4 open Operators
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 special workaround for usecase:
15 -gen none ddl.sql -gen cxx dml.sql
17 let generate = ref (Some Cxx.process)
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 | _ -> None
39 let each_input =
40 let run = function Some ch -> Main.get_statements ch | None -> Enum.empty () in
41 let run x =
42 let e = run x in
43 Enum.force e;
44 match !generate with
45 | None -> Enum.empty ()
46 | Some _ -> e
47 in
48 function
49 | "-" -> run (Some stdin)
50 | filename -> Main.with_channel filename run
52 let process l =
53 let e = Enum.concat (List.enum l) in
54 match !generate with
55 | None -> Enum.force e
56 | Some f -> f !name e
58 let usage_msg =
59 let s1 = sprintf "SQL Guided (code) Generator ver. %s\n" Config.version in
60 let s2 = sprintf "Usage: %s <options> <file.sql> [<file2.sql> ...]\n" (Filename.basename Sys.executable_name) in
61 let s3 = "Options are:" in
62 s1 ^ s2 ^ s3
64 let show_version () = print_endline Config.version
66 let main () =
67 let l = ref [] in
68 let work s = l := each_input s :: !l in
69 let args =
71 "-version", Arg.Unit show_version, " Show version";
72 "-gen", Arg.String set_out, "cxx|caml|java|xml|csharp|none Set output language (default: cxx)";
73 "-name", Arg.String (fun x -> name := x), "<identifier> Set output module name (default: sqlgg)";
74 "-params", Arg.String set_params_mode, "named|unnamed|oracle|none Output query parameters substitution (default: none)";
75 "-debug", Arg.Int (fun x -> Config.debug_level := x), "<N> set debug level";
76 "-", Arg.Unit (fun () -> work "-"), " Read sql from stdin";
77 "-test", Arg.Unit Test.run, " Run unit tests";
80 Arg.parse (Arg.align args) work usage_msg;
81 if !l <> [] then process !l
83 let _ = Printexc.print main ()