/** * re initialize all taskjob of a taskjob * * @param $tasks_id integer id of the task * * @return bool TRUE if all taskjob are ready (so finished from old runnning job) * **/ function reinitializeTaskjobs($tasks_id, $disableTimeVerification = 0) { global $DB; $pfTask = new PluginFusioninventoryTask(); $pfTaskjob = new PluginFusioninventoryTaskjob(); $pfTaskjobstate = new PluginFusioninventoryTaskjobstate(); $pfTaskjoblog = new PluginFusioninventoryTaskjoblog(); $query = "SELECT *, UNIX_TIMESTAMP(datetime_start) as date_scheduled_timestamp\n FROM `" . $pfTask->getTable() . "`\n WHERE `id`='" . $tasks_id . "'\n LIMIT 1"; $result = $DB->query($query); $data = $DB->fetch_assoc($result); $period = $pfTaskjob->periodicityToTimestamp($data['periodicity_type'], $data['periodicity_count']); // Calculate next execution from last $queryJob = "SELECT * FROM `" . $pfTaskjob->getTable() . "`\n WHERE `plugin_fusioninventory_tasks_id`='" . $tasks_id . "'\n ORDER BY `id` DESC"; $resultJob = $DB->query($queryJob); $nb_taskjobs = $DB->numrows($resultJob); // get only with execution_id (same +1) as task $queryJob = "SELECT * FROM `" . $pfTaskjob->getTable() . "`\n WHERE `plugin_fusioninventory_tasks_id`='" . $tasks_id . "'\n AND `execution_id`='" . ($data['execution_id'] + 1) . "'\n ORDER BY `id` DESC"; $finished = 2; $resultJob = $DB->query($queryJob); $nb_finished = 0; while ($dataJob = $DB->fetch_array($resultJob)) { $a_taskjobstateuniqs = $pfTaskjobstate->find("`plugin_fusioninventory_taskjobs_id`='" . $dataJob['id'] . "'", 'id DESC', 1); $a_taskjobstateuniq = current($a_taskjobstateuniqs); $a_taskjobstate = $pfTaskjobstate->find("`plugin_fusioninventory_taskjobs_id`='" . $dataJob['id'] . "'\n AND `uniqid`='" . $a_taskjobstateuniq['uniqid'] . "'"); $taskjobstatefinished = 0; foreach ($a_taskjobstate as $statedata) { $a_joblog = $pfTaskjoblog->find("`plugin_fusioninventory_taskjobstates_id`='" . $statedata['id'] . "'\n AND (`state`='2' OR `state`='4' OR `state`='5')"); if (count($a_joblog) > 0) { $taskjobstatefinished++; } } if (count($a_taskjobstate) == $taskjobstatefinished and count($a_taskjobstate) > 0) { if ($finished == '2') { $finished = 1; } $nb_finished++; } else { $finished = 0; } } if ($nb_finished != $nb_taskjobs) { if ($disableTimeVerification == '1') { // Forcerun $queryJob2 = "SELECT * FROM `" . $pfTaskjob->getTable() . "`\n WHERE `plugin_fusioninventory_tasks_id`='" . $tasks_id . "'\n AND `execution_id`='" . $data['execution_id'] . "'\n ORDER BY `id` DESC"; $resultJob2 = $DB->query($queryJob2); if ($DB->numrows($resultJob2) == $nb_taskjobs) { $finished = 1; return TRUE; } else { $finished = 0; } } else { $finished = 0; } } // if all jobs are finished, we calculate if we reinitialize all jobs if ($finished == "1") { $exe = $data['execution_id']; unset($data['execution_id']); $queryUpdate = "UPDATE `" . $pfTaskjob->getTable() . "`\n SET `status`='0'\n WHERE `plugin_fusioninventory_tasks_id`='" . $data['id'] . "'"; $DB->query($queryUpdate); if ($period != '0') { if (is_null($data['date_scheduled_timestamp'])) { $data['date_scheduled_timestamp'] = date('U'); } if ($data['date_scheduled_timestamp'] + $period <= date('U') and $period = !'0') { $periodtotal = $period; for ($i = 2; $data['date_scheduled_timestamp'] + $periodtotal <= date('U'); $i++) { $periodtotal = $period * $i; } $data['datetime_start'] = date("Y-m-d H:i:s", $data['date_scheduled_timestamp'] + $periodtotal); } else { if ($data['date_scheduled_timestamp'] > date('U')) { // Don't update date next execution } else { $data['datetime_start'] = date("Y-m-d H:i:s", $data['date_scheduled_timestamp'] + $period); } } } $data['execution_id'] = $exe + 1; unset($data['comment']); $pfTask->update($data); return TRUE; } else { return FALSE; } }