fields(array( 'name' => $name, 'progress' => 0, 'message' => $message, 'start' => $current, 'current' => $current, )) ->execute(); return progress_set_progress($name, $message, 0); } /** * Set progress * * @param string $name * Name of progress * @param string $message * Message for progress * @param double $progress * Current progress (0 - 1) * @return mixed * Result from db execute() */ function progress_set_progress($name, $message, $progress) { $current = microtime(TRUE); return db_update('progress') ->fields(array( 'progress' => $progress, 'message' => $message, 'current' => $current, )) ->condition('name', $name) ->execute(); } /** * Set intervalled progress * Use when you don't need to spam the progress table every time. * * @param string $name * Name of progress * @param string $message * Message for progress * @param double $progress * Current progress (0 - 1) * @param double $interval * Interval in seconds * @return mixed * Result from db execute() */ function progress_set_intervalled_progress($name, $message, $progress, $interval = NULL) { static $set = array(); if (isset($interval, $set[$name])) { if ($set[$name] + $interval > microtime(TRUE)) { return TRUE; } } $result = progress_set_progress($name, $message, $progress); $set[$name] = microtime(TRUE); return $result; } /** * Get progress * * @param string $name * Name of progress * @return object * Object containing all the progress data */ function progress_get_progress($name) { return db_query("SELECT name, progress, message, start, end, current FROM {progress} WHERE name = :name", array(':name' => $name))->fetchObject(); } /** * End a progress. Sets to 100% (=1) * * @param string $name * Name of progress * @param string $message * Message for progress * @return boolean * TRUE on success, FALSE on fail */ function progress_end_progress($name, $message) { $current = microtime(TRUE); return db_update('progress') ->fields(array( 'progress' => 1, 'message' => $message, 'end' => $current, )) ->condition('name', $name) ->execute(); } /** * Remove a progress * * @param string $name * Name of progress * @return boolean * TRUE on success, FALSE on fail */ function progress_remove_progress($name) { return db_delete('progress') ->condition('name', $name) ->execute(); } /** * Get all progresses * * @return array * Array of objects containing all progress data */ function progress_get_progresses() { $result = db_select('progress', 'p') ->fields('p', array('name', 'progress', 'message', 'start', 'end', 'current')) ->execute(); $progresses = array(); foreach ($result as $progress) { $progresses[$progress->name] = $progress; } return $progresses; } /** * Estimate completion time of a progress * * @param object $progress * Progress object * @return double * Estimated unix timestamp of completion in microseconds */ function progress_estimate_completion($progress) { if ($progress->progress) { $progress->estimate = $progress->start + 1 / $progress->progress * ($progress->current - $progress->start); } else { $progress->estimate = NULL; } return $progress->estimate; } /** * Implementation of hook_cron(). * * Clean up finished progresses */ function progress_cron() { return db_delete('progress') ->condition('end', 0, '>') ->condition('end', time() - variable_get('progress_age', PROGRESS_AGE), '<') ->execute(); } /** * Implementation of hook_cronapi(). */ function progress_cronapi($op, $job = NULL) { switch ($op) { case 'list': return array('progress_cron' => t('Cleanup old progresses')); } }