multitask / branches / master / models / multitask_queued_task.php

history
<?php

class MultitaskQueuedTask extends AppModel {
	
	var $name = 'MultitaskQueuedTask';
	
	const STATUS_QUEUED = 0;
	const STATUS_COMPLETE = 1;
	const STATUS_INPROGRESS = 2;
	const STATUS_ERROR = -1;
	
	var $validate = array(
		'task' => array(
			'rule' => 'notEmpty'
		)
	);
		
	function beforeSave() {
		$data =& $this->data[$this->alias];
		if (empty($this->id) && array_key_exists('data', $data)) {
			if (!$this->is_serialized($data['data'])) {
				$data['data'] = serialize($data['data']);
			}
		}
		return parent::beforeSave();
	}
	
	function getNextTask() {
		$task = $this->find('first', array('conditions' => array('status' => self::STATUS_QUEUED))); 
		if ($task) {
			$task = $task[$this->alias];
			if ($this->is_serialized($task['data'])) {
				$task['data'] = unserialize($task['data']);
			}
		}
		return $task;
	}
	
	function taskExecuting($id) {
		$this->id = $id;
		$this->saveField('status', self::STATUS_INPROGRESS);
	}
	
	function taskComplete($id) {
		$this->id = $id;
		$this->saveField('status', self::STATUS_COMPLETE);
	}
	
	function taskError($id) {
		$this->id = $id;
		$this->saveField('status', self::STATUS_ERROR);
	}
	
	function is_serialized($data) {
		// if it isn't a string, it isn't serialized
		if ( !is_string($data) )
			return false;
		$data = trim($data);
		if ( 'N;' == $data )
			return true;
		if ( !preg_match('/^([adObis]):/', $data, $badions) )
			return false;
		switch ( $badions[1] ) :
		case 'a' :
		case 'O' :
		case 's' :
			if ( preg_match("/^{$badions[1]}:[0-9]+:.*[;}]\$/s", $data) )
				return true;
			break;
		case 'b' :
		case 'i' :
		case 'd' :
			if ( preg_match("/^{$badions[1]}:[0-9.E-]+;\$/", $data) )
				return true;
			break;
		endswitch;
		return false;
	}
	
}

?>