diff options
Diffstat (limited to 'buildscripts/phing/classes/phing/tasks/ext/pdo/PDOSQLExecFormatterElement.php')
-rw-r--r-- | buildscripts/phing/classes/phing/tasks/ext/pdo/PDOSQLExecFormatterElement.php | 313 |
1 files changed, 313 insertions, 0 deletions
diff --git a/buildscripts/phing/classes/phing/tasks/ext/pdo/PDOSQLExecFormatterElement.php b/buildscripts/phing/classes/phing/tasks/ext/pdo/PDOSQLExecFormatterElement.php new file mode 100644 index 00000000..bc657604 --- /dev/null +++ b/buildscripts/phing/classes/phing/tasks/ext/pdo/PDOSQLExecFormatterElement.php @@ -0,0 +1,313 @@ +<?php +/** + * $Id: a3ca52c2b277a8cbc0d2802b75f2bea18701b636 $ + * + * 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'; +require_once 'phing/util/LogWriter.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(); + + $this->parentTask->log("Setting output writer to: " . get_class($out), Project::MSG_VERBOSE); + $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; + } +} |