pass environment for table name resolution, quick hack to fix #22
[sqlgg.git] / lib / tables.ml
blob68a77ff12c7099de69310b391dd0ea1681cdf826
1 (** Global list of tables *)
3 open Printf
4 open ExtLib
6 type table = Sql.table
8 let all : table list ref = ref []
10 (** FIXME table names case sensitivity? *)
11 let by_name name = fun (n,_) -> n = name
13 (** @raise Error when no such table *)
14 let get_from tables name =
15 try
16 List.find (by_name name) tables
17 with Not_found -> failwith (sprintf "no such table %s" name)
19 let get name = get_from !all name
20 let get_schema name = snd (get name)
21 let check name = ignore (get name)
23 let add v =
24 let (name,_) = v in
25 match List.find_all (by_name name) !all with
26 | [] -> all := v :: !all
27 | _ -> failwith (sprintf "table %s already exists" name)
29 let drop name = check name; all := List.remove_if (by_name name) !all
31 let alter name f =
32 check name;
33 let alter_scheme ((n,s) as table) =
34 if n = name then
35 name, f s
36 else
37 table
39 all := List.map alter_scheme !all
41 let alter_add name col pos = alter name (fun s -> Sql.Schema.add s col pos)
42 let alter_drop name col = alter name (fun s -> Sql.Schema.drop s col)
43 let alter_change name oldcol col pos = alter name (fun s -> Sql.Schema.change s oldcol col pos)
45 let print ch tables = let out = IO.output_channel ch in List.iter (Sql.print_table out) tables; IO.flush out
46 let print_all () = print stdout !all
47 let print1 name = print stdout [get name]
49 let reset () = all := []