<?php
/**
 * ownCloud
 *
 * @author Frank Karlitschek
 * @author Jakob Sack
 * @copyright 2010 Frank Karlitschek karlitschek@kde.org
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
 * License as published by the Free Software Foundation; either
 * version 3 of the License, or any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
 *
 * You should have received a copy of the GNU Affero General Public
 * License along with this library.  If not, see <http://www.gnu.org/licenses/>.
 *
 */
/*
 *
 * The following SQL statement is just a help for developers and will not be
 * executed!
 *
 * CREATE TABLE `log` (
 * `id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
 * `moment` DATETIME NOT NULL ,
 * `appid` VARCHAR( 255 ) NOT NULL ,
 * `user` VARCHAR( 255 ) NOT NULL ,
 * `action` VARCHAR( 255 ) NOT NULL ,
 * `info` TEXT NOT NULL
 * ) ENGINE = MYISAM ;
 *
 */

/**
 * This class is for logging
 */
class OC_LOG {
	/**
	 * @brief adds an entry to the log
	 * @param $appid id of the app
	 * @param $subject username
	 * @param $predicate action
	 * @param $object = null; additional information
	 * @returns true/false
	 *
	 * This function adds another entry to the log database
	 */
	public static function add( $appid, $subject, $predicate, $object = ' ' ){
		$query=OC_DB::prepare("INSERT INTO *PREFIX*log(moment,appid,user,action,info) VALUES(NOW(),?,?,?,?)");
		$result=$query->execute(array($appid,$subject,$predicate,$object));
		// Die if we have an error
		if( PEAR::isError($result)) {
			$entry = 'DB Error: "'.$result->getMessage().'"<br />';
			$entry .= 'Offending command was: '.$query.'<br />';
			error_log( $entry );
			die( $entry );
		}
		return true;
	}

	/**
	 * @brief Fetches log entries
	 * @param $filter = array(); array with filter options
	 * @returns array with entries
	 *
	 * This function fetches the log entries according to the filter options
	 * passed.
	 *
	 * $filter is an associative array.
	 * The following keys are optional:
	 *   - from: all entries after this date
	 *   - until: all entries until this date
	 *   - user: username (default: current user)
	 *   - app: only entries for this app
	 */
	public static function get( $filter = array()){
		$queryString='SELECT * FROM *PREFIX*log WHERE 1=1 ORDER BY moment DESC';
		$params=array();
		if(isset($filter['from'])){
			$queryString.='AND moment>? ';
			array_push($params,$filter('from'));
		}
		if(isset($filter['until'])){
			$queryString.='AND moment<? ';
			array_push($params,$filter('until'));
		}
		if(isset($filter['user'])){
			$queryString.='AND user=? ';
			array_push($params,$filter('user'));
		}
		if(isset($filter['app'])){
			$queryString.='AND appid=? ';
			array_push($params,$filter('app'));
		}
		$query=OC_DB::prepare($queryString);
		$result=$query->execute($params)->fetchAll();
		if(count($result)>0 and is_numeric($result[0]['moment'])){
			foreach($result as &$row){
				$row['moment']=OC_UTIL::formatDate($row['moment']);
			}
		}
		return $result;
		
	}

	/**
	 * @brief removes log entries
	 * @param $date delete entries older than this date
	 * @returns true/false
	 *
	 * This function deletes all entries that are older than $date.
	 */
	public static function deleteBefore( $date ){
		$query=OC_DB::prepare("DELETE FROM *PREFIX*log WHERE moment<?");
		$query->execute(array($date));
		return true;
	}

	/**
	 * @brief removes all log entries
	 * @returns true/false
	 *
	 * This function deletes all log entries.
	 */
	public static function deleteAll(){
		$query=OC_DB::prepare("DELETE FROM *PREFIX*log");
		$query->execute();
		return true;
	}
	
	/**
	 * @brief filter an array of log entries on action
	 * @param array $logs the log entries to filter
	 * @param array $actions an array of actions to filter for
	 * @returns array
	 */
	public static function filterAction($logs,$actions){
		$filteredLogs=array();
		foreach($logs as $log){
			if(array_search($log['action'],$actions)!==false){
				$filteredLogs[]=$log;
			}
		}
		return $filteredLogs;
	}
}



?>