Source for file OnpubAAMaps.php

Documentation is available at OnpubAAMaps.php

  1. <?php
  2.  
  3. /**
  4.  * Manage article-author maps in an Onpub database.
  5.  *
  6.  * This class contains the methods to manage the data contained in an
  7.  * {@link http://onpub.com/pdfs/onpub_schema.pdf OnpubAAMaps table}. An
  8.  * OnpubAAMaps table maps article IDs to author IDs. This allows Onpub to do
  9.  * the following without any duplication of article/author data:
  10.  * - Use the same author for multiple articles.
  11.  * - A single article can have multiple authors.
  12.  * - Specify the order of an article's authors.
  13.  *
  14.  * @author {@link mailto:corey@onpub.com Corey H.M. Taylor}
  15.  * @copyright Onpub (TM). Copyright 2012, Onpub.com.
  16.  *  {@link http://onpub.com/}
  17.  * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License
  18.  *  Version 2
  19.  * @package OnpubAPI
  20.  */
  21. {
  22.   private $pdo;
  23.   /**
  24.    * @var bool 
  25.    */
  26.   public $enableTransactions;
  27.  
  28.   /**
  29.    * Connect to an Onpub database.
  30.    *
  31.    * All the methods in this class which query the database use the database
  32.    * connection provided by the PDO object required by this constructor.
  33.    * Currently, Onpub only supports MySQL as a database for storing content.
  34.    * Therefore, when constructing the PDO object, only the
  35.    * {@link PHP_MANUAL#ref.pdo-mysql PDO_MYSQL} driver is supported
  36.    * as a PDO {@link PHP_MANUAL#ref.pdo-mysql.connection data source}.
  37.    *
  38.    * All the methods in this class require the
  39.    * {@link http://onpub.com/pdfs/onpub_schema.pdf Onpub schema}
  40.    * to be installed in the PDO-connected database. The {@link OnpubDatabase}
  41.    * class contains methods to manage the Onpub schema. The Onpub
  42.    * schema can also be installed by clicking the "Install the schema" link
  43.    * once logged in to the Onpub web interface. The schema generally only has
  44.    * to be installed once per database.
  45.    *
  46.    * @param PDO $pdo {@link PHP_MANUAL#function.pdo-construct PHP Data Object}.
  47.    * @param bool $enableTransactions 
  48.    */
  49.   function __construct(PDO $pdo$enableTransactions TRUE)
  50.   {
  51.     $this->pdo $pdo;
  52.     $this->enableTransactions = $enableTransactions;
  53.     $this->pdo->setAttribute(PDO::ATTR_EMULATE_PREPARESTRUE);
  54.   }
  55.  
  56.   /**
  57.    * @param int $articleID Delete the map(s) with articleID.
  58.    * @param int $authorID Delete the map(s) with authorID.
  59.    * @return int The number of maps deleted, 0 if no maps were deleted.
  60.    */
  61.   public function delete($articleID$authorID)
  62.   {
  63.     if ($articleID && $authorID{
  64.       $stmt $this->pdo->prepare("DELETE FROM OnpubAAMaps WHERE articleID = :articleID AND authorID = :authorID");
  65.       OnpubDatabase::verifyPrepare($this->pdo$stmtFALSE);
  66.       $stmt->bindParam(':articleID'$articleID);
  67.       $stmt->bindParam(':authorID'$authorID);
  68.     }
  69.  
  70.     if ($articleID && !$authorID{
  71.       $stmt $this->pdo->prepare("DELETE FROM OnpubAAMaps WHERE articleID = :articleID");
  72.       OnpubDatabase::verifyPrepare($this->pdo$stmtFALSE);
  73.       $stmt->bindParam(':articleID'$articleID);
  74.     }
  75.  
  76.     if (!$articleID && $authorID{
  77.       $stmt $this->pdo->prepare("DELETE FROM OnpubAAMaps WHERE authorID = :authorID");
  78.       OnpubDatabase::verifyPrepare($this->pdo$stmtFALSE);
  79.       $stmt->bindParam(':authorID'$authorID);
  80.     }
  81.  
  82.     $result $stmt->execute();
  83.     OnpubDatabase::verifyExecute($this->pdo$resultFALSE$stmt->errorInfo());
  84.  
  85.     return $stmt->rowCount();
  86.   }
  87.  
  88.   /**
  89.    * @param OnpubQueryOptions $queryOptions Database query options.
  90.    * @return array An array of {@link OnpubAAMap} objects.
  91.    */
  92.   public function select(OnpubQueryOptions $queryOptions NULL)
  93.   {
  94.     if ($queryOptions === NULL)
  95.       $queryOptions new OnpubQueryOptions();
  96.  
  97.     $query $this->selectQuery($queryOptions);
  98.     $result $this->pdo->query($query);
  99.     OnpubDatabase::verifyQuery($this->pdo$resultFALSE);
  100.     $rows $result->fetchAll(PDO::FETCH_ASSOC);
  101.  
  102.     $aamaps array();
  103.  
  104.     if ($rows{
  105.       foreach ($rows as $row{
  106.         $aamap new OnpubAAMap();
  107.  
  108.         $aamap->ID $row["ID"];
  109.         $aamap->articleID $row["articleID"];
  110.         $aamap->authorID $row["authorID"];
  111.         $aamap->setCreated(new DateTime($row["created"]));
  112.         $aamap->setModified(new DateTime($row["modified"]));
  113.  
  114.         $aamaps[$aamap;
  115.       }
  116.     }
  117.  
  118.     $result->closeCursor();
  119.     return $aamaps;
  120.   }
  121.  
  122.   private function selectQuery(OnpubQueryOptions $queryOptions NULL)
  123.   {
  124.     if ($queryOptions === NULL)
  125.       $queryOptions new OnpubQueryOptions();
  126.  
  127.     $where "";
  128.     $orderBy "";
  129.     $limit "";
  130.  
  131.     if ($queryOptions->dateLimit{
  132.       $where "WHERE created <= "
  133.         . $this->pdo->quote($queryOptions->dateLimit->format('Y-m-d H:i:s'));
  134.     }
  135.  
  136.     if ($queryOptions->orderBy{
  137.       $orderBy "ORDER BY " $queryOptions->orderBy;
  138.  
  139.       if ($queryOptions->order{
  140.         $orderBy .= " " $queryOptions->order;
  141.       }
  142.     }
  143.  
  144.     if ($queryOptions->getPage(&& $queryOptions->rowLimit && $queryOptions->rowLimit 0{
  145.       $limit "LIMIT "
  146.         . (($queryOptions->getPage(1$queryOptions->rowLimit","
  147.         . $queryOptions->rowLimit;
  148.     }
  149.     elseif ($queryOptions->rowLimit && $queryOptions->rowLimit 0{
  150.       $limit "LIMIT 0," $queryOptions->rowLimit;
  151.     }
  152.  
  153.     return "SELECT ID, articleID, authorID, created, modified FROM OnpubAAMaps $where $orderBy $limit";
  154.   }
  155.  
  156.   /**
  157.    * @param OnpubAAMap $aamap Map whose ID you want to get.
  158.    * @return int The ID of the map. NULL if the map does not exist in the database.
  159.    */
  160.   public function getID(OnpubAAMap $aamap)
  161.   {
  162.     $stmt $this->pdo->prepare("SELECT ID FROM OnpubAAMaps WHERE articleID = :articleID AND authorID = :authorID");
  163.     OnpubDatabase::verifyPrepare($this->pdo$stmtFALSE);
  164.  
  165.     $articleID $aamap->articleID;
  166.     $authorID $aamap->authorID;
  167.  
  168.     $stmt->bindParam(':articleID'$articleID);
  169.     $stmt->bindParam(':authorID'$authorID);
  170.     $result $stmt->execute();
  171.     OnpubDatabase::verifyExecute($this->pdo$resultFALSE$stmt->errorInfo());
  172.  
  173.     if (($row $stmt->fetch(PDO::FETCH_ASSOC))) {
  174.       return $row["ID"];
  175.     }
  176.  
  177.     return NULL;
  178.   }
  179.  
  180.   /**
  181.    * @param mixed $aamaps A single {@link OnpubAAMap} object or an array of {@link OnpubAAMap} objects (to insert multiple maps at a time).
  182.    * @return mixed The ID(s) of the new map(s). An int will be returned if a single map was inserted. An array of ints will be returned if multiple maps were inserted.
  183.    * @throws PDOException if there's a database error.
  184.    */
  185.   public function insert($aamaps)
  186.   {
  187.     $aamapIDs array();
  188.     $isArray TRUE;
  189.  
  190.     if (!is_array($aamaps)) {
  191.       $aamaps array ($aamaps);
  192.       $isArray FALSE;
  193.     }
  194.  
  195.     if ($this->enableTransactions{
  196.       $status $this->pdo->beginTransaction();
  197.       OnpubDatabase::verifyTransaction($this->pdo$status);
  198.     }
  199.  
  200.     $stmt $this->pdo->prepare("INSERT INTO OnpubAAMaps (ID, articleID, authorID, created, modified) VALUES (:ID, :articleID, :authorID, :created, :modified)");
  201.     OnpubDatabase::verifyPrepare($this->pdo$stmt$this->enableTransactions);
  202.  
  203.     foreach ($aamaps as $aamap{
  204.       try {
  205.         $aamapID $this->getID($aamap);
  206.       }
  207.       catch (PDOException $e{
  208.         if ($this->enableTransactions)
  209.           $this->pdo->rollBack();
  210.  
  211.         throw $e;
  212.       }
  213.  
  214.       if ($aamapID{
  215.         $aamapIDs[$aamapID;
  216.         $aamap->ID $aamapID;
  217.       }
  218.       else {
  219.         $ID $aamap->ID;
  220.         $articleID $aamap->articleID;
  221.         $authorID $aamap->authorID;
  222.         $created $aamap->getCreated()->format('Y-m-d H:i:s');
  223.         $modified $aamap->getModified()->format('Y-m-d H:i:s');
  224.  
  225.         $stmt->bindParam(':ID'$ID);
  226.         $stmt->bindParam(':articleID'$articleID);
  227.         $stmt->bindParam(':authorID'$authorID);
  228.         $stmt->bindParam(':created'$created);
  229.         $stmt->bindParam(':modified'$modified);
  230.         $result $stmt->execute();
  231.         OnpubDatabase::verifyExecute($this->pdo$result$this->enableTransactions$stmt->errorInfo());
  232.  
  233.         $aamapIDs[$this->pdo->lastInsertId();
  234.         $aamap->ID $this->pdo->lastInsertId();
  235.       }
  236.     }
  237.  
  238.     if ($this->enableTransactions{
  239.       $status $this->pdo->commit();
  240.       OnpubDatabase::verifyTransaction($this->pdo$status);
  241.     }
  242.  
  243.     if ($isArray{
  244.       return $aamapIDs;
  245.     }
  246.     else {
  247.       return end($aamapIDs);
  248.     }
  249.   }
  250. }
  251. ?>

Documentation generated on Fri, 08 Feb 2013 04:02:15 -0500 by phpDocumentor 1.4.4