Source for file OnpubSAMaps.php

Documentation is available at OnpubSAMaps.php

  1. <?php
  2.  
  3. /**
  4.  * Manage section-article 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 OnpubSAMaps table}. An
  8.  * OnpubSAMaps table maps section IDs to article IDs. This allows Onpub to do
  9.  * the following without any duplication of section/article data:
  10.  * - Add a single article to multiple sections.
  11.  * - Add multiple articles to a single section.
  12.  * - Specify the order of articles in a section.
  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 $sectionID Delete the map(s) with sectionID.
  58.    * @param int $articleID Delete the map(s) with articleID.
  59.    * @return int The number of maps deleted, 0 if no maps were deleted.
  60.    */
  61.   public function delete($sectionID$articleID)
  62.   {
  63.     if ($sectionID && $articleID{
  64.       $stmt $this->pdo->prepare("DELETE FROM OnpubSAMaps WHERE sectionID = :sectionID AND articleID = :articleID");
  65.       OnpubDatabase::verifyPrepare($this->pdo$stmtFALSE);
  66.       $stmt->bindParam(':sectionID'$sectionID);
  67.       $stmt->bindParam(':articleID'$articleID);
  68.     }
  69.  
  70.     if ($sectionID && !$articleID{
  71.       $stmt $this->pdo->prepare("DELETE FROM OnpubSAMaps WHERE sectionID = :sectionID");
  72.       OnpubDatabase::verifyPrepare($this->pdo$stmtFALSE);
  73.       $stmt->bindParam(':sectionID'$sectionID);
  74.     }
  75.  
  76.     if (!$sectionID && $articleID{
  77.       $stmt $this->pdo->prepare("DELETE FROM OnpubSAMaps WHERE articleID = :articleID");
  78.       OnpubDatabase::verifyPrepare($this->pdo$stmtFALSE);
  79.       $stmt->bindParam(':articleID'$articleID);
  80.     }
  81.  
  82.     $result $stmt->execute();
  83.     OnpubDatabase::verifyExecute($this->pdo$resultFALSE$stmt->errorInfo());
  84.  
  85.     return $stmt->rowCount();
  86.   }
  87.  
  88.   /**
  89.    * @param OnpubSAMap $samap Map whose ID you want to get.
  90.    * @return int The ID of the map. NULL if the map does not exist in the database.
  91.    */
  92.   public function getID(OnpubSAMap $samap)
  93.   {
  94.     $stmt $this->pdo->prepare("SELECT ID FROM OnpubSAMaps WHERE sectionID = :sectionID AND articleID = :articleID");
  95.     OnpubDatabase::verifyPrepare($this->pdo$stmtFALSE);
  96.  
  97.     $sectionID $samap->sectionID;
  98.     $articleID $samap->articleID;
  99.  
  100.     $stmt->bindParam(':sectionID'$sectionID);
  101.     $stmt->bindParam(':articleID'$articleID);
  102.     $result $stmt->execute();
  103.     OnpubDatabase::verifyExecute($this->pdo$resultFALSE$stmt->errorInfo());
  104.  
  105.     if (($row $stmt->fetch(PDO::FETCH_ASSOC))) {
  106.       return $row["ID"];
  107.     }
  108.  
  109.     return NULL;
  110.   }
  111.  
  112.   /**
  113.    * @param OnpubQueryOptions $queryOptions Database query options.
  114.    * @return array An array of {@link OnpubSAMap} objects.
  115.    */
  116.   public function select(OnpubQueryOptions $queryOptions NULL$sectionID NULL$articleID NULL)
  117.   {
  118.     if ($queryOptions === NULL)
  119.       $queryOptions new OnpubQueryOptions();
  120.  
  121.     $query $this->selectQuery($queryOptions$sectionID$articleID);
  122.     $result $this->pdo->query($query);
  123.     OnpubDatabase::verifyQuery($this->pdo$resultFALSE);
  124.     $rows $result->fetchAll(PDO::FETCH_ASSOC);
  125.  
  126.     $samaps array();
  127.  
  128.     if ($rows{
  129.       foreach ($rows as $row{
  130.         $samap new OnpubSAMap();
  131.  
  132.         $samap->ID $row["ID"];
  133.         $samap->sectionID $row["sectionID"];
  134.         $samap->articleID $row["articleID"];
  135.         $samap->setCreated(new DateTime($row["created"]));
  136.         $samap->setModified(new DateTime($row["modified"]));
  137.  
  138.         $samaps[$samap;
  139.       }
  140.     }
  141.  
  142.     $result->closeCursor();
  143.     return $samaps;
  144.   }
  145.  
  146.   private function selectQuery(OnpubQueryOptions $queryOptions NULL$sectionID NULL$articleID NULL)
  147.   {
  148.     if ($queryOptions === NULL)
  149.       $queryOptions new OnpubQueryOptions();
  150.  
  151.     $where "";
  152.     $orderBy "";
  153.     $limit "";
  154.  
  155.     if ($queryOptions->dateLimit{
  156.       $where "WHERE created <= "
  157.         . $this->pdo->quote($queryOptions->dateLimit->format('Y-m-d H:i:s'));
  158.  
  159.       if ($sectionID{
  160.         $where .= " AND sectionID = $sectionID";
  161.       }
  162.       elseif ($articleID{
  163.         $where .= " AND articleID = $articleID";
  164.       }
  165.     }
  166.     else {
  167.       if ($sectionID{
  168.         $where "WHERE sectionID = $sectionID";
  169.       }
  170.       elseif ($articleID{
  171.         $where "WHERE articleID = $articleID";
  172.       }
  173.     }
  174.  
  175.     if ($queryOptions->orderBy{
  176.       $orderBy "ORDER BY " $queryOptions->orderBy;
  177.  
  178.       if ($queryOptions->order{
  179.         $orderBy .= " " $queryOptions->order;
  180.       }
  181.     }
  182.  
  183.     if ($queryOptions->getPage(&& $queryOptions->rowLimit && $queryOptions->rowLimit 0{
  184.       $limit "LIMIT "
  185.         . (($queryOptions->getPage(1$queryOptions->rowLimit","
  186.         . $queryOptions->rowLimit;
  187.     }
  188.     elseif ($queryOptions->rowLimit && $queryOptions->rowLimit 0{
  189.       $limit "LIMIT 0," $queryOptions->rowLimit;
  190.     }
  191.  
  192.     return "SELECT ID, sectionID, articleID, created, modified FROM OnpubSAMaps $where $orderBy $limit";
  193.   }
  194.  
  195.   /**
  196.    * @param mixed $samaps A single {@link OnpubSAMap} object or an array of {@link OnpubSAMap} objects (to insert multiple maps at a time).
  197.    * @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.
  198.    * @throws PDOException if there's a database error.
  199.    */
  200.   public function insert($samaps)
  201.   {
  202.     $samapIDs array();
  203.     $isArray TRUE;
  204.  
  205.     if (!is_array($samaps)) {
  206.       $samaps array ($samaps);
  207.       $isArray FALSE;
  208.     }
  209.  
  210.     if ($this->enableTransactions{
  211.       $status $this->pdo->beginTransaction();
  212.       OnpubDatabase::verifyTransaction($this->pdo$status);
  213.     }
  214.  
  215.     $stmt $this->pdo->prepare("INSERT INTO OnpubSAMaps (ID, sectionID, articleID, created, modified) VALUES (:ID, :sectionID, :articleID, :created, :modified)");
  216.     OnpubDatabase::verifyPrepare($this->pdo$stmt$this->enableTransactions);
  217.  
  218.     foreach ($samaps as $samap{
  219.       try {
  220.         $samapID $this->getID($samap);
  221.       }
  222.       catch (PDOException $e{
  223.         if ($this->enableTransactions)
  224.           $this->pdo->rollBack();
  225.  
  226.         throw $e;
  227.       }
  228.  
  229.       if ($samapID{
  230.         $samapIDs[$samapID;
  231.         $samap->ID $samapID;
  232.       }
  233.       else {
  234.         $ID $samap->ID;
  235.         $sectionID $samap->sectionID;
  236.         $articleID $samap->articleID;
  237.         $created $samap->getCreated()->format('Y-m-d H:i:s');
  238.         $modified $samap->getModified()->format('Y-m-d H:i:s');
  239.  
  240.         $stmt->bindParam(':ID'$ID);
  241.         $stmt->bindParam(':sectionID'$sectionID);
  242.         $stmt->bindParam(':articleID'$articleID);
  243.         $stmt->bindParam(':created'$created);
  244.         $stmt->bindParam(':modified'$modified);
  245.         $result $stmt->execute();
  246.         OnpubDatabase::verifyExecute($this->pdo$result$this->enableTransactions$stmt->errorInfo());
  247.  
  248.         $samapIDs[$this->pdo->lastInsertId();
  249.         $samap->ID $this->pdo->lastInsertId();
  250.       }
  251.     }
  252.  
  253.     if ($this->enableTransactions{
  254.       $status $this->pdo->commit();
  255.       OnpubDatabase::verifyTransaction($this->pdo$status);
  256.     }
  257.  
  258.     if ($isArray{
  259.       return $samapIDs;
  260.     }
  261.     else {
  262.       return end($samapIDs);
  263.     }
  264.   }
  265.  
  266.   /**
  267.    * @param OnpubSAMap $samap The map to be updated.
  268.    * @return int 1 if the map was updated. 0 if the map does not exist in the database.
  269.    */
  270.   public function update(OnpubSAMap $samap)
  271.   {
  272.     $stmt $this->pdo->prepare("UPDATE OnpubSAMaps SET sectionID = :sectionID, articleID = :articleID, created = :created, modified = :modified WHERE ID = :ID");
  273.     OnpubDatabase::verifyPrepare($this->pdo$stmt$this->enableTransactions);
  274.  
  275.     $ID $samap->ID;
  276.     $sectionID $samap->sectionID;
  277.     $articleID $samap->articleID;
  278.     $created $samap->getCreated()->format('Y-m-d H:i:s');
  279.     $modified $samap->getModified()->format('Y-m-d H:i:s');
  280.  
  281.     $stmt->bindParam(':ID'$ID);
  282.     $stmt->bindParam(':sectionID'$sectionID);
  283.     $stmt->bindParam(':articleID'$articleID);
  284.     $stmt->bindParam(':created'$created);
  285.     $stmt->bindParam(':modified'$modified);
  286.     $result $stmt->execute();
  287.     OnpubDatabase::verifyExecute($this->pdo$result$this->enableTransactions$stmt->errorInfo());
  288.  
  289.     return $stmt->rowCount();
  290.   }
  291. }
  292. ?>

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