Code Coverage  | 
     ||||||||||
Classes and Traits  | 
      Functions and Methods  | 
      Lines  | 
     ||||||||
| Total |         | 
      100.00%  | 
      1 / 1  | 
              | 
      100.00%  | 
      6 / 6  | 
      CRAP |         | 
      100.00%  | 
      26 / 26  | 
     
| PdoConnection |         | 
      100.00%  | 
      1 / 1  | 
              | 
      100.00%  | 
      6 / 6  | 
      7 |         | 
      100.00%  | 
      26 / 26  | 
     
| __construct(Config $config) |         | 
      100.00%  | 
      1 / 1  | 
      1 |         | 
      100.00%  | 
      9 / 9  | 
     |||
| getInstanceId() |         | 
      100.00%  | 
      1 / 1  | 
      1 |         | 
      100.00%  | 
      1 / 1  | 
     |||
| generateId() |         | 
      100.00%  | 
      1 / 1  | 
      1 |         | 
      100.00%  | 
      10 / 10  | 
     |||
| bindInstance(\PDOStatement $sth, $label=":instId") |         | 
      100.00%  | 
      1 / 1  | 
      1 |         | 
      100.00%  | 
      2 / 2  | 
     |||
| __get($field) |         | 
      100.00%  | 
      1 / 1  | 
      2 |         | 
      100.00%  | 
      3 / 3  | 
     |||
| prepare($statement, $options=array() |         | 
      100.00%  | 
      1 / 1  | 
      1 |         | 
      100.00%  | 
      1 / 1  | 
     |||
| <?php | |
| /* Copyright (c) 2012, 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: PdoConnection.php 866 2013-08-25 16:22:35Z geert $ | |
| */ | |
| /** | |
| * Implementation of the \Scrivo\PdoConnection class. | |
| */ | |
| namespace Scrivo; | |
| /** | |
| * Class to manage the connection to the Scrivo database. | |
| * | |
| * This is simply a direct descendent of the \PDO class with a modified | |
| * constructor that uses a Scrivo configuration object to open the connection. | |
| * It also assures that the connection is configured correctly (uses exceptions | |
| * and UTF-8). | |
| * | |
| * It is possible to store data of several instances (sites) in a single | |
| * database. The instance data is identified by an instance id which is also | |
| * defined in the configuration file and present a property of this class. | |
| * | |
| * Furthermore, Scrivo uses object ids instead of auto-numbering. Ids within | |
| * a specific instance need to be unique. To achieve this this class also | |
| * deals with the generation of unique ids. | |
| * | |
| * | |
| */ | |
| class PdoConnection extends \PDO { | |
| /** | |
| * The database instance id. | |
| * @var int | |
| */ | |
| private $instId; | |
| /** | |
| * Construct a scrivo database connection using the setting in a Scrivo | |
| * config file. The following settings are used: | |
| * | |
| * * DB_HOST | |
| * * DB_NAME | |
| * * DB_USER | |
| * * DB_PASSWORD | |
| * * INSTANCE_ID | |
| * | |
| * @param Config $config A Scrivo config object that contains the database | |
| * settings. | |
| */ | |
| public function __construct(Config $config) { | |
| parent::__construct( | |
| "mysql:host={$config->DB_HOST};dbname={$config->DB_NAME}", | |
| $config->DB_USER, $config->DB_PASSWORD, | |
| array(\PDO::ATTR_PERSISTENT => false)); | |
| $this->setAttribute( | |
| \PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION); | |
| $this->exec("SET NAMES utf8"); | |
| $this->instId = $config->INSTANCE_ID; | |
| } | |
| /** | |
| * Get the database instance id. | |
| * | |
| * @return int The database instance id. | |
| */ | |
| public function getInstanceId() { | |
| return $this->instId; | |
| } | |
| /** | |
| * Generate a new object id. | |
| * | |
| * For the generation of an object id in MySQL we use a table with one | |
| * autoincrement column. | |
| * | |
| * TODO: setup a test to see how this holds in concurrency situations | |
| * and document it (the behavoir not the test). | |
| * | |
| * @return int A new object id. | |
| */ | |
| public function generateId() { | |
| $this->exec("LOCK TABLES seq WRITE"); | |
| $this->exec("INSERT INTO seq VALUES ()"); | |
| $sth = $this->prepare("SELECT LAST_INSERT_ID()"); | |
| $sth->execute(); | |
| $this->exec("UNLOCK TABLES"); | |
| $newId = $sth->fetchColumn(); | |
| $sth = $this->prepare("DELETE FROM seq WHERE seq < :newID"); | |
| $sth->bindValue(":newID", $newId, \PDO::PARAM_INT); | |
| $sth->execute(); | |
| return intval($newId); | |
| } | |
| /** | |
| * Convenience method for setting the instance variable in an prepared | |
| * statment. This variable is usually named ":instId", but you can use an | |
| * alternative name. | |
| * | |
| * @param \PDOStatement $sth The statement for which to set the instance id. | |
| * @param string $label An optional alternative label for the instance id | |
| * variable. | |
| */ | |
| public function bindInstance(\PDOStatement $sth, $label=":instId") { | |
| $sth->bindValue($label, $this->instId, \PDO::PARAM_INT); | |
| } | |
| /** | |
| * Implementation of the readable properties using the PHP magic | |
| * method __get(). | |
| * | |
| * @param string $field The name of the property to get. | |
| * | |
| * @return mixed The value of the requested property. | |
| */ | |
| public function __get($field) { | |
| if ($field == "instanceId") { | |
| return $this->getInstanceId(); | |
| } else { | |
| throw new \Scrivo\SystemException("Property $field not found"); | |
| } | |
| } | |
| /** | |
| * Overloaded version of PDO::prepare, just to be able to do some query | |
| * logging. | |
| * | |
| * @param string $statement An SQL statement. | |
| * @param array $options Driver options. | |
| * | |
| * @return \PDOStatement A PDO statement. | |
| */ | |
| public function prepare($statement, $options=array()) { | |
| //error_log("Prepare: $statement"); | |
| return parent::prepare($statement, $options); | |
| } | |
| } | |
| ?> |