<?php
	/**
	 * Class to manage reports.  Note how this class is designed to use
	 * the functions provided by the database driver exclusively, and hence
	 * will work with any database without modification.
	 *
	 * $Id: Reports.php,v 1.18 2007/04/16 11:02:35 mr-russ Exp $
	 */

	class Reports {

		// A database driver
		var $driver;
		var $reports_db = 'phppgadmin';
		var $reports_schema = 'public';
		var $reports_table = 'ppa_reports';

		/* Constructor */
		function Reports(&$status) {
			global $conf, $misc, $data;
			
			// Get data from config if it's been defined
			if (isset($conf['reports_db'])) {
				$this->reports_db = $conf['reports_db'];
			}
			if (isset($conf['reports_schema'])) {
				$this->reports_schema = $conf['reports_schema'];
			}
			if (isset($conf['reports_table'])) {
				$this->reports_table = $conf['reports_table'];
			}

			// Check to see if the reports database exists
			$rs = $data->getDatabase($this->reports_db);
			if ($rs->recordCount() != 1) $status = -1;
			else {
				// Create a new database access object.
				$this->driver = $misc->getDatabaseAccessor($this->reports_db);
				// Reports database should have been created in public schema
				if ($this->driver->hasSchemas()) $this->driver->setSchema($this->reports_schema);
				$status = 0;
			}
		}

		/**
		 * Finds all reports
		 * @return A recordset
		 */
		function getReports() {
			global $conf, $misc;
			// Filter for owned reports if necessary
			if ($conf['owned_reports_only']) {
				$server_info = $misc->getServerInfo();
				$filter['created_by'] = $server_info['username'];
				$ops = array('created_by' => '=');
			}
			else $filter = $ops = array();

			$sql = $this->driver->getSelectSQL($this->reports_table,
				array('report_id', 'report_name', 'db_name', 'date_created', 'created_by', 'descr', 'report_sql', 'paginate'),
				$filter, $ops, array('db_name' => 'asc', 'report_name' => 'asc'));

			return $this->driver->selectSet($sql);
		}

		/**
		 * Finds a particular report
		 * @param $report_id The ID of the report to find
		 * @return A recordset
		 */
		function getReport($report_id) {			
			$sql = $this->driver->getSelectSQL($this->reports_table,
				array('report_id', 'report_name', 'db_name', 'date_created', 'created_by', 'descr', 'report_sql', 'paginate'),
				array('report_id' => $report_id), array('report_id' => '='), array());

			return $this->driver->selectSet($sql);
		}
		
		/**
		 * Creates a report
		 * @param $report_name The name of the report
		 * @param $db_name The name of the database
		 * @param $descr The comment on the report
		 * @param $report_sql The SQL for the report
		 * @param $paginate The report should be paginated
		 * @return 0 success
		 */
		function createReport($report_name, $db_name, $descr, $report_sql, $paginate) {
			global $misc;
			$server_info = $misc->getServerInfo();
			$temp = array(
				'report_name' => $report_name,
				'db_name' => $db_name,
				'created_by' => $server_info['username'],
				'report_sql' => $report_sql,
				'paginate' => $paginate ? 'true' : 'false',
			);
			if ($descr != '') $temp['descr'] = $descr;

			return $this->driver->insert($this->reports_table, $temp);
		}

		/**
		 * Alters a report
		 * @param $report_id The ID of the report
		 * @param $report_name The name of the report
		 * @param $db_name The name of the database
		 * @param $descr The comment on the report
		 * @param $report_sql The SQL for the report
		 * @param $paginate The report should be paginated
		 * @return 0 success
		 */
		function alterReport($report_id, $report_name, $db_name, $descr, $report_sql, $paginate) {
			global $misc;
			$server_info = $misc->getServerInfo();
			$temp = array(
				'report_name' => $report_name,
				'db_name' => $db_name,
				'created_by' => $server_info['username'],
				'report_sql' => $report_sql,
				'paginate' => $paginate ? 'true' : 'false',
				'descr' => $descr
			);

			return $this->driver->update($this->reports_table, $temp,
							array('report_id' => $report_id));
		}

		/**
		 * Drops a report
		 * @param $report_id The ID of the report to drop
		 * @return 0 success
		 */
		function dropReport($report_id) {
			return $this->driver->delete($this->reports_table, array('report_id' => $report_id));
		}

	}
?>
