Code Coverage  | 
     ||||||||||
Classes and Traits  | 
      Functions and Methods  | 
      Lines  | 
     ||||||||
| Total |         | 
      100.00%  | 
      1 / 1  | 
              | 
      100.00%  | 
      12 / 12  | 
      CRAP |         | 
      100.00%  | 
      95 / 95  | 
     
| ModifiedTouched |         | 
      100.00%  | 
      1 / 1  | 
              | 
      100.00%  | 
      12 / 12  | 
      25 |         | 
      100.00%  | 
      95 / 95  | 
     
| __construct(\Scrivo\Context $context=null) |         | 
      100.00%  | 
      1 / 1  | 
      2 |         | 
      100.00%  | 
      5 / 5  | 
     |||
| __get($name) |         | 
      100.00%  | 
      1 / 1  | 
      5 |         | 
      100.00%  | 
      5 / 5  | 
     |||
| __set($name, $value) |         | 
      100.00%  | 
      1 / 1  | 
      3 |         | 
      100.00%  | 
      3 / 3  | 
     |||
| setFields(\Scrivo\Context $context, array $rd) |         | 
      100.00%  | 
      1 / 1  | 
      1 |         | 
      100.00%  | 
      6 / 6  | 
     |||
| setIdModified($idModified) |         | 
      100.00%  | 
      1 / 1  | 
      1 |         | 
      100.00%  | 
      5 / 5  | 
     |||
| setIdTouched($idTouched) |         | 
      100.00%  | 
      1 / 1  | 
      1 |         | 
      100.00%  | 
      5 / 5  | 
     |||
| validateInsert() |         | 
      100.00%  | 
      1 / 1  | 
      1 |         | 
      100.00%  | 
      2 / 2  | 
     |||
| insert() |         | 
      100.00%  | 
      1 / 1  | 
      2 |         | 
      100.00%  | 
      14 / 14  | 
     |||
| validateDelete( \Scrivo\Context $context, $idModified, $idTouched) |         | 
      100.00%  | 
      1 / 1  | 
      1 |         | 
      100.00%  | 
      2 / 2  | 
     |||
| delete( \Scrivo\Context $context, $idModified, $idTouched) |         | 
      100.00%  | 
      1 / 1  | 
      2 |         | 
      100.00%  | 
      15 / 15  | 
     |||
| fetch( \Scrivo\Context $context, $idModified, $idTouched) |         | 
      100.00%  | 
      1 / 1  | 
      3 |         | 
      100.00%  | 
      19 / 19  | 
     |||
| select(\Scrivo\Context $context) |         | 
      100.00%  | 
      1 / 1  | 
      3 |         | 
      100.00%  | 
      14 / 14  | 
     |||
| <?php | |
| /* Copyright (c) 2013, Geert Bergman (geert@scrivo.nl) | |
| * All rights reserved. | |
| * | |
| * Redistribution and use in source and binary forms, with or without | |
| * modification, are permitted provided that the following conditions are met: | |
| * | |
| * 1. Redistributions of source code must retain the above copyright notice, | |
| * this list of conditions and the following disclaimer. | |
| * 2. Redistributions in binary form must reproduce the above copyright notice, | |
| * this list of conditions and the following disclaimer in the documentation | |
| * and/or other materials provided with the distribution. | |
| * 3. Neither the name of "Scrivo" nor the names of its contributors may be | |
| * used to endorse or promote products derived from this software without | |
| * specific prior written permission. | |
| * | |
| * 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 HOLDER 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. | |
| * | |
| * $Id: ModifiedTouched.php 866 2013-08-25 16:22:35Z geert $ | |
| */ | |
| /** | |
| * Implementation of the \Scrivo\ModifiedTouched class. | |
| */ | |
| namespace Scrivo; | |
| /** | |
| * The ModifiedTouched class models the relation of pages that need to be | |
| * touched (their modification date updated) when some other pages is updated. | |
| * | |
| * It is very well possible to create pages that change due to the modification | |
| * of another page. Suppose you have a selection of the last three news items | |
| * of a new page. Adding news obviously changes the modification date of the | |
| * new page which is important for indexing and caching, but the change on the | |
| * home page will go unnoticed for the indexing or caching functionality. | |
| * | |
| * @property-read int $typeModified The type of the subject that is being | |
| * modified. | |
| * @property-read int $typeTouched The type of the subject that needs to be | |
| * touched when the other subject. | |
| * @property int $idModified The id of the subject that is being modified. | |
| * @property int $idTouched The id of the subject that needs to be touched | |
| * when the other subject is modified | |
| */ | |
| class ModifiedTouched { | |
| /** | |
| * Constant to the denote that the subject id is a document id. | |
| */ | |
| const TYPE_DOCUMENT_ID = 1; | |
| /** | |
| * Constant to the denote that the subject id is a template id. | |
| */ | |
| const TYPE_TEMPLATE_ID = 2; | |
| /** | |
| * The id of the subject that is being modified. | |
| * @var int | |
| */ | |
| private $idModified = 0; | |
| /** | |
| * The type of the subject that is being modified. | |
| * @var int | |
| */ | |
| private $typeModified = self::TYPE_DOCUMENT_ID; | |
| /** | |
| * The id of the subject that needs to be touched when the other subject | |
| * is modified. | |
| * @var int | |
| */ | |
| private $idTouched = 0; | |
| /** | |
| * The type of the subject that needs to be touched when the other subject | |
| * is modified. | |
| * @var int | |
| */ | |
| private $typeTouched = self::TYPE_TEMPLATE_ID; | |
| /** | |
| * A Scrivo context. | |
| * @var \Scrivo\Context | |
| */ | |
| private $context = null; | |
| /** | |
| * Create an empty modified-touched relation entry or select a | |
| * modified-touched relation entry from the database. | |
| * | |
| * @param \Scrivo\Context $context A Scrivo context. | |
| */ | |
| public function __construct(\Scrivo\Context $context=null) { | |
| \Scrivo\ArgumentCheck::assertArgs(func_get_args(), array(null), 0); | |
| if ($context) { | |
| $this->context = $context; | |
| } | |
| } | |
| /** | |
| * Implementation of the readable properties using the PHP magic | |
| * method __get(). | |
| * | |
| * @param string $name The name of the property to get. | |
| * | |
| * @return mixed The value of the requested property. | |
| */ | |
| public function __get($name) { | |
| switch($name) { | |
| case "idModified": return $this->idModified; | |
| case "typeModified": return $this->typeModified; | |
| case "idTouched": return $this->idTouched; | |
| case "typeTouched": return $this->typeTouched; | |
| } | |
| throw new \Scrivo\SystemException("No such get-property '$name'."); | |
| } | |
| /** | |
| * Implementation of the writable properties using the PHP magic | |
| * method __set(). | |
| * | |
| * @param string $name The name of the property to set. | |
| * @param mixed $value The value of the property to set. | |
| */ | |
| public function __set($name, $value) { | |
| switch($name) { | |
| case "idModified": $this->setIdModified($value); return; | |
| case "idTouched": $this->setIdTouched($value); return; | |
| } | |
| throw new \Scrivo\SystemException("No such set-property '$name'."); | |
| } | |
| /** | |
| * Convenience method to set the fields of a modified touched object from | |
| * an array (result set row). | |
| * | |
| * @param \Scrivo\Context $context A Scrivo context. | |
| * @param array $rd An array containing the field data using the database | |
| * field names as keys. | |
| */ | |
| private function setFields(\Scrivo\Context $context, array $rd) { | |
| $this->idModified = intval($rd["modified_id"]); | |
| $this->typeModified = intval($rd["date_modified_touched"]); | |
| $this->idTouched = intval($rd["touched_id"]); | |
| $this->typeTouched = intval($rd["touched_type"]); | |
| $this->context = $context; | |
| } | |
| /** | |
| * Set The id of the subject that is being modified. | |
| * | |
| * @param int $idModified The id of the subject that is being modified. | |
| */ | |
| private function setIdModified($idModified) { | |
| \Scrivo\ArgumentCheck::assertArgs(func_get_args(), array( | |
| array(\Scrivo\ArgumentCheck::TYPE_INTEGER) | |
| )); | |
| $this->idModified = $idModified; | |
| } | |
| /** | |
| * Set The id of the subject that needs to be touched when the other | |
| * subject is modified. | |
| * | |
| * @param int $idTouched The id of the subject that needs to be touched | |
| * when the other subject is modified. | |
| */ | |
| private function setIdTouched($idTouched) { | |
| \Scrivo\ArgumentCheck::assertArgs(func_get_args(), array( | |
| array(\Scrivo\ArgumentCheck::TYPE_INTEGER) | |
| )); | |
| $this->idTouched = $idTouched; | |
| } | |
| /** | |
| * Check if this modified touched object can be inserted into the database. | |
| * | |
| * @throws \Scrivo\ApplicationException If the data is not accessible or | |
| * one or more of the fields contain invalid data. | |
| */ | |
| private function validateInsert() { | |
| $this->context->checkPermission(\Scrivo\AccessController::WRITE_ACCESS); | |
| } | |
| /** | |
| * Insert new modified touched object data into the database. | |
| * | |
| * First it is checked if the data of this modified touched object can be | |
| * inserted into the database, then the data is inserted into the database. | |
| * If no id was set a new object id is generated. | |
| * | |
| * @throws \Scrivo\ApplicationException If the data is not accessible or | |
| * one or more of the fields contain invalid data. | |
| */ | |
| public function insert() { | |
| try { | |
| $this->validateInsert(); | |
| $sth = $this->context->connection->prepare( | |
| "INSERT INTO modified_touched ( | |
| instance_id, modified_id, date_modified_touched, | |
| touched_id, touched_type | |
| ) VALUES ( | |
| :instId, :idModified, :typeModified, | |
| :idTouched, :typeTouched | |
| )"); | |
| $this->context->connection->bindInstance($sth); | |
| $sth->bindValue(":idModified", $this->idModified, \PDO::PARAM_INT); | |
| $sth->bindValue( | |
| ":typeModified", $this->typeModified, \PDO::PARAM_INT); | |
| $sth->bindValue(":idTouched", $this->idTouched, \PDO::PARAM_INT); | |
| $sth->bindValue( | |
| ":typeTouched", $this->typeTouched, \PDO::PARAM_INT); | |
| $sth->execute(); | |
| } catch(\PDOException $e) { | |
| throw new \Scrivo\ResourceException($e); | |
| } | |
| } | |
| /** | |
| * Check if deletion of modified touched object data does not violate any | |
| * business rules. | |
| * | |
| * @param \Scrivo\Context $context A Scrivo context. | |
| * @param int $idModified The object id the a subject that is modified. | |
| * @param int $idTouched The object id of a subject that needs to be | |
| * touched when the other subject is updated. | |
| * | |
| * @throws \Scrivo\ApplicationException If the data is not accessible or | |
| * if it is not possible to delete the language data. | |
| */ | |
| private static function validateDelete( | |
| \Scrivo\Context $context, $idModified, $idTouched) { | |
| $context->checkPermission(\Scrivo\AccessController::WRITE_ACCESS); | |
| } | |
| /** | |
| * Delete existing modified touched data from the database. | |
| * | |
| * First it is is checked if it's possible to delete modified touched data, | |
| * then the modified touched data including its dependencies is deleted | |
| * from the database. | |
| * | |
| * @param \Scrivo\Context $context A Scrivo context. | |
| * @param int $idModified The object id the a subject that is modified. | |
| * @param int $idTouched The object id of a subject that needs to be | |
| * touched when the other subject is updated. | |
| * | |
| * @throws \Scrivo\ApplicationException If the data is not accessible or | |
| * if it is not possible to delete the modified touched data. | |
| */ | |
| public static function delete( | |
| \Scrivo\Context $context, $idModified, $idTouched) { | |
| \Scrivo\ArgumentCheck::assertArgs(func_get_args(), array( | |
| null, | |
| array(\Scrivo\ArgumentCheck::TYPE_INTEGER), | |
| array(\Scrivo\ArgumentCheck::TYPE_INTEGER) | |
| )); | |
| try { | |
| self::validateDelete($context, $idModified, $idTouched); | |
| $sth = $context->connection->prepare( | |
| "DELETE FROM modified_touched | |
| WHERE instance_id = :instId AND modified_id = :idModified | |
| AND touched_id = :idTouched"); | |
| $context->connection->bindInstance($sth); | |
| $sth->bindValue(":idModified", $idModified, \PDO::PARAM_INT); | |
| $sth->bindValue(":idTouched", $idTouched, \PDO::PARAM_INT); | |
| $sth->execute(); | |
| } catch(\PDOException $e) { | |
| throw new \Scrivo\ResourceException($e); | |
| } | |
| } | |
| /** | |
| * Fetch a modified touched object from the database using its object id. | |
| * | |
| * @param \Scrivo\Context $context A Scrivo context. | |
| * @param int $idModified The object id the a subject that is modified. | |
| * @param int $idTouched The object id of a subject that needs to be | |
| * touched when the other subject is updated. | |
| * | |
| * @return \Scrivo\ModifiedTouched The requested modified touched object. | |
| */ | |
| public static function fetch( | |
| \Scrivo\Context $context, $idModified, $idTouched) { | |
| \Scrivo\ArgumentCheck::assertArgs(func_get_args(), array( | |
| null, | |
| array(\Scrivo\ArgumentCheck::TYPE_INTEGER), | |
| array(\Scrivo\ArgumentCheck::TYPE_INTEGER) | |
| )); | |
| try { | |
| $sth = $context->connection->prepare( | |
| "SELECT modified_id, date_modified_touched, touched_id, touched_type | |
| FROM modified_touched | |
| WHERE instance_id = :instId AND modified_id = :idModified | |
| AND touched_id = :idTouched"); | |
| $context->connection->bindInstance($sth); | |
| $sth->bindValue(":idModified", $idModified, \PDO::PARAM_INT); | |
| $sth->bindValue(":idTouched", $idTouched, \PDO::PARAM_INT); | |
| $sth->execute(); | |
| if ($sth->rowCount() != 1) { | |
| throw new \Scrivo\SystemException( | |
| "Failed to load modified-touched relation entry"); | |
| } | |
| $modifiedTouched = new \Scrivo\ModifiedTouched(); | |
| $modifiedTouched->setFields($context, $sth->fetch(\PDO::FETCH_ASSOC)); | |
| return $modifiedTouched; | |
| } catch(\PDOException $e) { | |
| throw new \Scrivo\ResourceException($e); | |
| } | |
| } | |
| /** | |
| * Select modified-touched relation entries from the database. | |
| * | |
| * @param \Scrivo\Context $context A Scrivo context. | |
| * | |
| * @return ModifiedTouched[] An array containing the selected | |
| * modified-touched relation entrys. | |
| */ | |
| public static function select(\Scrivo\Context $context) { | |
| \Scrivo\ArgumentCheck::assertArgs(func_get_args(), array(null)); | |
| try { | |
| $sth = $context->connection->prepare( | |
| "SELECT modified_id, date_modified_touched, touched_id, touched_type | |
| FROM modified_touched | |
| WHERE instance_id = :instId"); | |
| $context->connection->bindInstance($sth); | |
| $sth->execute(); | |
| $res = array(); | |
| while ($rd = $sth->fetch(\PDO::FETCH_ASSOC)) { | |
| $li = new ModifiedTouched(); | |
| $li->setFields($context, $rd); | |
| $res[] = $li; | |
| } | |
| return $res; | |
| } catch(\PDOException $e) { | |
| throw new \Scrivo\ResourceException($e); | |
| } | |
| } | |
| } | |