16 include_once (
"FDL/Class.DocFam.php");
17 include_once (
"FDL/Class.DocTimer.php");
18 include_once (
"FDL/Class.SearchDoc.php");
21 $usage->setDefinitionText(
"Execute Dynacase Processes when needed");
22 $doctimerId =
$usage->addOptionalParameter(
'doctimer-id',
'Doctimer identifier', null, null);
23 $execId =
$usage->addOptionalParameter(
'exec-id',
'Exec identifier', null, null);
24 self::$debug = (
$usage->addEmptyParameter(
'debug',
'Enable debugging verbose output') !==
false);
27 if ($doctimerId !== null && $execId !== null) {
31 if ($doctimerId !== null) {
32 self::execute_doctimer($action, $doctimerId);
33 } elseif ($execId !== null) {
34 self::execute_exec($action, $execId);
37 self::execute_all($action);
47 self::debug(sprintf(
"Locking exclusive execution..."));
48 $i1 = unpack(
"i",
"PROC") [1];
49 $i2 = unpack(
"i",
"EXEC") [1];
50 simpleQuery($action->dbaccess, sprintf(
"SELECT pg_try_advisory_lock(%d, %d)", $i1, $i2) , $res,
true,
true,
true);
52 $msg = sprintf(
"A 'processExecute' API script is already running.");
56 self::debug(sprintf(
"Exclusive execution locked."));
76 self::verifyExecDocuments(
$action);
77 self::verifyTimerDocuments(
$action);
79 catch(\Exception $e) {
89 $time_start = microtime(
true);
91 $time_end = microtime(
true);
92 $time = $time_end - $time_start;
94 $action->log->
error(sprintf(
"Error while executing timer %s (%d): %s in %.03f seconds",
$dt->title,
$dt->id,
$err, $time));
95 print sprintf(
"Error while executing timer %s (%d): %s in %.03f seconds",
$dt->title,
$dt->id,
$err, $time);
97 $action->log->
info(sprintf(
"Timer %s (%d) executed in %.03f seconds",
$dt->title,
$dt->id, $time));
98 print sprintf(
"Timer %s (%d) executed in %.03f seconds",
$dt->title,
$dt->id, $time);
107 if (is_scalar($exec)) {
111 $exec =
new_Doc($action->dbaccess, $exec,
true);
113 if (!is_object($exec) || !is_a($exec,
'\Dcp\Family\Exec') || !$exec->isAlive()) {
119 static function verifyExecDocuments(
Action & $action)
125 $s->setObjectReturn();
126 $s->addFilter(sprintf(
"exec_nextdate < %s", pg_escape_literal($now)));
127 $s->addFilter(
"exec_status is null or exec_status = 'none'");
131 while ($de =
$s->getNextDoc()) {
132 $de->setValue(
"exec_status",
"waiting");
133 $de->modify(
true, array(
139 $s->setObjectReturn();
140 $s->addFilter(sprintf(
"exec_nextdate < %s", pg_escape_literal($now)));
141 $s->addFilter(
"exec_status != 'progressing'");
145 self::debug(__METHOD__ .
" " . sprintf(
"Found %d documents to execute.",
$s->count()));
146 if (
$s->count() <= 0) {
150 while ($de =
$s->getNextDoc()) {
154 self::debug(__METHOD__ .
" " . sprintf(
"Executing document '%s' (%d).", $de->getTitle() , $de->id));
155 self::execute_exec($action, $de);
165 $ate =
$dt->getActionsToExecute();
167 self::debug(__METHOD__ .
" " . sprintf(
"Found %d doctimers.", count($ate)));
168 foreach ($ate as $k => $v) {
172 throw new \Exception(
"Error: could not create temporary file.");
174 $cmd = sprintf(
"%s/wsh.php --api=processExecute --doctimer-id=%s > %s 2>&1",
DEFAULT_PUBDIR, escapeshellarg($v[
'id']) , escapeshellarg(
$tmpfile));
175 self::debug(__METHOD__ .
" " . sprintf(
"Running '%s'",
$cmd));
180 throw new \Exception(sprintf(
"Process '%s' returned with error (%d): %s",
$cmd,
$ret,
$out));
183 catch(\Exception $e) {
189 'm' => preg_replace(
'/^([^\n]*).*/s',
'\1', $e->getMessage())
static execute_doctimer(Action &$action, $doctimerId)
_wsh_send_error($errMsg, $expand=array())
static verifyTimerDocuments(Action &$action)
static run(Action &$action)
foreach($argv as $arg) $cmd
static execute_all($action)
static lock(Action &$action)
formatErrorLogException($e)
new_Doc($dbaccess, $id= '', $latest=false)
static unlock(Action &$action, $lock)
static getTimeDate($hourdelta=0, $second=false)
simpleQuery($dbaccess, $query, &$result=array(), $singlecolumn=false, $singleresult=false, $useStrict=null)
if($file) if($subject==""&&$file) if($subject=="") $err
Verify arguments for wsh programs.