Version 0.6.
[whenjobs.git] / lib / whenexpr.ml
index 8ccde2c..c2ffa33 100644 (file)
@@ -106,6 +106,31 @@ let rpc_of_variable = function
 
 type variables = variable StringMap.t
 
+type preinfo = {
+  pi_job_name : string;
+  pi_serial : Big_int.big_int;
+  pi_variables : (string * variable) list;
+  pi_running : preinfo_running_job list;
+}
+and preinfo_running_job = {
+  pirun_job_name : string;
+  pirun_serial : Big_int.big_int;
+  pirun_start_time : float;
+  pirun_pid : int;
+}
+
+type result = {
+  res_job_name : string;
+  res_serial : Big_int.big_int;
+  res_code : int;
+  res_tmpdir : string;
+  res_output : string;
+  res_start_time : float;
+}
+
+type pre = preinfo -> bool
+type post = result -> unit
+
 type job_cond =
   | When_job of whenexpr
   | Every_job of periodexpr
@@ -113,6 +138,8 @@ type job_cond =
 type job = {
   job_loc : Loc.t;
   job_name : string;
+  job_pre : pre option;
+  job_post : post option;
   job_cond : job_cond;
   job_script : shell_script;
 }
@@ -616,3 +643,22 @@ let next_periodexpr =
     let t0 = Date.make 1970 1 1 in
     let t' = Date.add t0 (Date.Period.month months) in
     Date.to_unixfloat t'
+
+let check_valid_variable_name name =
+  (* Don't permit certain names. *)
+  if name = "JOBSERIAL" then
+    failwith "JOBSERIAL variable cannot be set";
+
+  let len = String.length name in
+  if len = 0 then
+    failwith "variable name is an empty string";
+  if name.[0] <> '_' && not (isalpha name.[0]) then
+    failwith "variable name must start with alphabetic character or underscore";
+
+  let rec loop i =
+    if i >= len then ()
+    else if name.[i] <> '_' && not (isalnum name.[i]) then
+      failwith "variable name contains non-alphanumeric non-underscore character"
+    else loop (i+1)
+  in
+  loop 1