<?php /** * $Id: PDOSQLExecFormatterElement.php 905 2010-10-05 16:28:03Z mrook $ * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * This software consists of voluntary contributions made by many individuals * and is licensed under the LGPL. For more information please see * <http://phing.info>. */ require_once 'phing/system/io/PhingFile.php'; require_once 'phing/tasks/ext/pdo/PlainPDOResultFormatter.php'; require_once 'phing/tasks/ext/pdo/XMLPDOResultFormatter.php'; /** * A class to represent the nested <formatter> element for PDO SQL results. * * This class is inspired by the similarly-named class in the PHPUnit tasks. * * @author Hans Lellelid <hans@xmpl.org> * @package phing.tasks.ext.pdo * @since 2.3.0 */ class PDOSQLExecFormatterElement { /** * @var PDOResultFormatter */ private $formatter; /** * The type of the formatter (used for built-in formatter classes). * @var string */ private $type = ""; /** * Whether to use file (or write output to phing log). * @var boolean */ private $useFile = true; /** * Output file for formatter. * @var PhingFile */ private $outfile; /** * Print header columns. * @var boolean */ private $showheaders = true; /** * Whether to format XML output. * @var boolean */ private $formatoutput = true; /** * Encoding for XML output. * @var string */ private $encoding; /** * Column delimiter. * Defaults to ',' * @var string */ private $coldelimiter = ","; /** * Row delimiter. * Defaults to PHP_EOL. * @var string */ private $rowdelimiter = PHP_EOL; /** * Append to an existing file or overwrite it? * @var boolean */ private $append = false; /** * Parameters for a custom formatter. * @var array Parameter[] */ private $formatterParams = array(); /** * @var PDOSQLExecTask */ private $parentTask; /** * Construct a new PDOSQLExecFormatterElement with parent task. * @param PDOSQLExecTask $parentTask */ public function __construct(PDOSQLExecTask $parentTask) { $this->parentTask = $parentTask; } /** * Supports nested <param> element (for custom formatter classes). * @return Parameter */ public function createParam() { $num = array_push($this->parameters, new Parameter()); return $this->parameters[$num-1]; } /** * Gets a configured output writer. * @return Writer */ private function getOutputWriter() { if ($this->useFile) { $of = $this->getOutfile(); if (!$of) { $of = new PhingFile($this->formatter->getPreferredOutfile()); } return new FileWriter($of, $this->append); } else { return $this->getDefaultOutput(); } } /** * Configures wrapped formatter class with any attributes on this element. */ public function prepare() { if (!$this->formatter) { throw new BuildException("No formatter specified (use type or classname attribute)", $this->getLocation()); } $out = $this->getOutputWriter(); print "Setting output writer to: " . get_class($out) . "\n"; $this->formatter->setOutput($out); if ($this->formatter instanceof PlainPDOResultFormatter) { // set any options that apply to the plain formatter $this->formatter->setShowheaders($this->showheaders); $this->formatter->setRowdelim($this->rowdelimiter); $this->formatter->setColdelim($this->coldelimiter); } elseif ($this->formatter instanceof XMLPDOResultFormatter) { // set any options that apply to the xml formatter $this->formatter->setEncoding($this->encoding); $this->formatter->setFormatOutput($this->formatoutput); } foreach($this->formatterParams as $param) { $param = new Parameter(); $method = 'set' . $param->getName(); if (!method_exists($this->formatter, $param->getName())) { throw new BuildException("Formatter " . get_class($this->formatter) . " does not have a $method method.", $this->getLocation()); } call_user_func(array($this->formatter, $method), $param->getValue()); } } /** * Sets the formatter type. * @param string $type */ function setType($type) { $this->type = $type; if ($this->type == "xml") { $this->formatter = new XMLPDOResultFormatter(); } elseif ($this->type == "plain") { $this->formatter = new PlainPDOResultFormatter(); } else { throw new BuildException("Formatter '" . $this->type . "' not implemented"); } } /** * Set classname for a custom formatter (must extend PDOResultFormatter). * @param string $className */ function setClassName($className) { $classNameNoDot = Phing::import($className); $this->formatter = new $classNameNoDot(); } /** * Set whether to write formatter results to file. * @param boolean $useFile */ function setUseFile($useFile) { $this->useFile = (boolean) $useFile; } /** * Return whether to write formatter results to file. * @return boolean */ function getUseFile() { return $this->useFile; } /** * Sets the output file for the formatter results. * @param PhingFile $outFile */ function setOutfile(PhingFile $outfile) { $this->outfile = $outfile; } /** * Get the output file. * @return PhingFile */ function getOutfile() { return $this->outfile; /* } else { return new PhingFile($this->formatter->getPreferredOutfile()); }*/ } /** * whether output should be appended to or overwrite * an existing file. Defaults to false. * @param boolean $append */ public function setAppend($append) { $this->append = (boolean) $append; } /** * Whether output should be appended to file. * @return boolean */ public function getAppend() { return $this->append; } /** * Print headers for result sets from the * statements; optional, default true. * @param boolean $showheaders */ public function setShowheaders($showheaders) { $this->showheaders = (boolean) $showheaders; } /** * Sets the column delimiter. * @param string $v */ public function setColdelim($v) { $this->coldelimiter = $v; } /** * Sets the row delimiter. * @param string $v */ public function setRowdelim($v) { $this->rowdelimiter = $v; } /** * Set the DOM document encoding. * @param string $v */ public function setEncoding($v) { $this->encoding = $v; } /** * @param boolean $v */ public function setFormatOutput($v) { $this->formatOutput = (boolean) $v; } /** * Gets a default output writer for this task. * @return Writer */ private function getDefaultOutput() { return new LogWriter($this->parentTask); } /** * Gets the formatter that has been configured based on this element. * @return PDOResultFormatter */ function getFormatter() { return $this->formatter; } }