Source for file OnpubDatabase.php

Documentation is available at OnpubDatabase.php

  1. <?php
  2.  
  3. /**
  4.  * Manage an Onpub database.
  5.  *
  6.  * @author {@link mailto:corey@onpub.com Corey H.M. Taylor}
  7.  * @copyright Onpub (TM). Copyright 2012, Onpub.com.
  8.  *  {@link http://onpub.com/}
  9.  * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License
  10.  *  Version 2
  11.  * @package OnpubAPI
  12.  */
  13. {
  14.   private $pdo;
  15.  
  16.   /**
  17.    * Connect to a database.
  18.    *
  19.    * All the methods in this class which query the database use the database
  20.    * connection provided by the PDO object required by this constructor.
  21.    * Currently, Onpub only supports MySQL as a database for storing content.
  22.    * Therefore, when constructing the PDO object, only the
  23.    * {@link PHP_MANUAL#ref.pdo-mysql PDO_MYSQL} driver is supported
  24.    * as a PDO {@link PHP_MANUAL#ref.pdo-mysql.connection data source}.
  25.    *
  26.    * @param PDO $pdo {@link PHP_MANUAL#function.pdo-construct PHP Data Object}.
  27.    */
  28.   function __construct(PDO $pdo)
  29.   {
  30.     $this->pdo $pdo;
  31.     $this->pdo->setAttribute(PDO::ATTR_EMULATE_PREPARESTRUE);
  32.   }
  33.  
  34.   /**
  35.    * Get the name of the currently connected-to MySQL database.
  36.    *
  37.    * @return mixed NULL if no database is currently selected. Otherwise, the
  38.    *  name of the MySQL that's currently being used.
  39.    */
  40.   public function current()
  41.   {
  42.     $result $this->pdo->query('SELECT DATABASE() AS current');
  43.     OnpubDatabase::verifyQuery($this->pdo$resultFALSE);
  44.  
  45.     if (!($row $result->fetch(PDO::FETCH_ASSOC))) {
  46.       return 0;
  47.     }
  48.  
  49.     $result->closeCursor();
  50.  
  51.     return $row["current"];
  52.   }
  53.  
  54.   /**
  55.    * Delete the Onpub schema.
  56.    *
  57.    * Calling this method will delete all Onpub content and schema in the
  58.    * PDO-connected database! Use with caution.
  59.    *
  60.    * @return mixed TRUE if the schema was successfully deleted. An array
  61.    *  of PDOException objects will be returned if any errors occured.
  62.    */
  63.   public function delete()
  64.   {
  65.     $sqlfile array();
  66.     $line 0;
  67.     $exceptions array();
  68.  
  69.     $sqlfile file('../api/sql/deleteonpubtables.sql');
  70.  
  71.     // advance past all comments
  72.     while (strpos($sqlfile[$line]'--'!== FALSE{
  73.       $line++;
  74.  
  75.       while ($sqlfile[$line== "\n"{
  76.         $line++;
  77.       }
  78.     }
  79.  
  80.     for ($i $line$i sizeof($sqlfile)$i++{
  81.       $query '';
  82.  
  83.       while (strpos($sqlfile[$i]';'=== FALSE{
  84.         $query .= $sqlfile[$i];
  85.         $i++;
  86.       }
  87.  
  88.       $query .= $sqlfile[$i];
  89.  
  90.       if (($i 1sizeof($sqlfile)) {
  91.         while ($sqlfile[$i 1== "\n"{
  92.           $i++;
  93.         }
  94.       }
  95.  
  96.       $result NULL;
  97.       $result $this->pdo->exec($query);
  98.  
  99.       try {
  100.         OnpubDatabase::verifyExec($this->pdo$resultFALSE);
  101.       }
  102.       catch (PDOException $e{
  103.         $exceptions[$e;
  104.       }
  105.     }
  106.  
  107.     if (sizeof($exceptions)) {
  108.       return $exceptions;
  109.     }
  110.  
  111.     return TRUE;
  112.   }
  113.  
  114.   /**
  115.    * Install the {@link http://onpub.com/pdfs/onpub_schema.pdf Onpub schema}.
  116.    *
  117.    * Calling this method will install the Onpub tables in the PDO-connected
  118.    * database.
  119.    *
  120.    * @param int $version Optional argument to specify what version of the Onpub
  121.    *  schema to install. If NULL (the default), the latest version of the schema
  122.    *  will be added to the database.
  123.    * @return mixed TRUE if the schema was successfully installed. An array
  124.    *  of PDOException objects will be returned if any errors occured.
  125.    */
  126.   public function install($version NULL)
  127.   {
  128.     $sqlfile array();
  129.     $line 0;
  130.     $exceptions array();
  131.  
  132.     $sqlfile file('../api/sql/createonpubtables-rev0.sql');
  133.  
  134.     // advance past all comments
  135.     while (strpos($sqlfile[$line]'--'!== FALSE{
  136.       $line++;
  137.  
  138.       while ($sqlfile[$line== "\n"{
  139.         $line++;
  140.       }
  141.     }
  142.  
  143.     for ($i $line$i sizeof($sqlfile)$i++{
  144.       $query '';
  145.  
  146.       while (strpos($sqlfile[$i]';'=== FALSE{
  147.         $query .= $sqlfile[$i];
  148.         $i++;
  149.       }
  150.  
  151.       $query .= $sqlfile[$i];
  152.  
  153.       if (($i 1sizeof($sqlfile)) {
  154.         while ($sqlfile[$i 1== "\n"{
  155.           $i++;
  156.         }
  157.       }
  158.  
  159.       $result NULL;
  160.       $result $this->pdo->exec($query);
  161.  
  162.       try {
  163.         OnpubDatabase::verifyExec($this->pdo$resultFALSE);
  164.       }
  165.       catch (PDOException $e{
  166.         $exceptions[$e;
  167.       }
  168.     }
  169.  
  170.     if (sizeof($exceptions)) {
  171.       return $exceptions;
  172.     }
  173.  
  174.     return TRUE;
  175.   }
  176.  
  177.   /**
  178.    * Gets a list of MySQL databases that the logged-in user has access to.
  179.    * System database names are excluded from the list.
  180.    *
  181.    * @return array Array will be empty if user has no database access.
  182.    *  Otherwise array will contain the names of the MySQL databases she has
  183.    *  access to.
  184.    */
  185.   public function listDBs()
  186.   {
  187.     $result $this->pdo->query('SHOW DATABASES');
  188.     OnpubDatabase::verifyQuery($this->pdo$resultFALSE);
  189.     $rows $result->fetchAll(PDO::FETCH_ASSOC);
  190.  
  191.     $excludes array('mysql''performance_schema''information_schema');
  192.     $dbs array();
  193.  
  194.     if ($rows{
  195.       foreach ($rows as $row{
  196.         if (!in_array($row['Database']$excludes))
  197.         {
  198.           $dbs[$row['Database'];
  199.         }
  200.       }
  201.     }
  202.  
  203.     $result->closeCursor();
  204.     return $dbs;
  205.   }
  206.  
  207.   /**
  208.    * Check the status of the Onpub schema.
  209.    *
  210.    * @return mixed The version of the schema in the database as an int. An array
  211.    *  of PDOException objects will be returned if the schema is incomplete or
  212.    *  not installed.
  213.    */
  214.   public function status()
  215.   {
  216.     $oaamaps new OnpubAAMaps($this->pdo);
  217.     $oarticles new OnpubArticles($this->pdo);
  218.     $oauthors new OnpubAuthors($this->pdo);
  219.     $oimages new OnpubImages($this->pdo);
  220.     $osamaps new OnpubSAMaps($this->pdo);
  221.     $osections new OnpubSections($this->pdo);
  222.     $owebsites new OnpubWebsites($this->pdo);
  223.     $owsmaps new OnpubWSMaps($this->pdo);
  224.     $queryOptions new OnpubQueryOptions($this->pdo);
  225.     $queryOptions->setPage(11);
  226.     $exceptions array();
  227.     $version 0;
  228.  
  229.     try {
  230.       $oaamaps->select($queryOptions);
  231.     }
  232.     catch (PDOException $e{
  233.       $exceptions[$e;
  234.     }
  235.  
  236.     try {
  237.       $oarticles->select($queryOptions);
  238.     }
  239.     catch (PDOException $e{
  240.       $exceptions[$e;
  241.     }
  242.  
  243.     try {
  244.       $oauthors->select($queryOptions);
  245.     }
  246.     catch (PDOException $e{
  247.       $exceptions[$e;
  248.     }
  249.  
  250.     try {
  251.       $oimages->select($queryOptions);
  252.     }
  253.     catch (PDOException $e{
  254.       $exceptions[$e;
  255.     }
  256.  
  257.     try {
  258.       $osamaps->select($queryOptions);
  259.     }
  260.     catch (PDOException $e{
  261.       $exceptions[$e;
  262.     }
  263.  
  264.     try {
  265.       $osections->select($queryOptions);
  266.     }
  267.     catch (PDOException $e{
  268.       $exceptions[$e;
  269.     }
  270.  
  271.     try {
  272.       $owebsites->select($queryOptions);
  273.     }
  274.     catch (PDOException $e{
  275.       $exceptions[$e;
  276.     }
  277.  
  278.     try {
  279.       $owsmaps->select($queryOptions);
  280.     }
  281.     catch (PDOException $e{
  282.       $exceptions[$e;
  283.     }
  284.  
  285.     if (sizeof($exceptions)) {
  286.       return $exceptions;
  287.     }
  288.  
  289.     $version 1;
  290.  
  291.     return $version;
  292.   }
  293.  
  294.   /**
  295.    * Verify the results of a call to {@link PHP_MANUAL#function.pdostatement-execute PDOStatement->execute()}.
  296.    *
  297.    * Used internally to verify whether or not a PDOStatement->execute() call was
  298.    * successful or not. If the call returned FALSE then an exception is
  299.    * thrown with an error message and error code, explaining what went wrong.
  300.    * If the execute() call fails during a running database transaction,
  301.    * {@link PHP_MANUAL#function.pdo-rollback PDOStatement->rollback()} is called to
  302.    * roll back the transaction to put the database back in the state it was
  303.    * before the error occured; then the appropriate exception is thrown.
  304.    *
  305.    * @param PDO $pdo The PDO object which called {@link PHP_MANUAL#function.pdo-prepare prepare()}.
  306.    * @param mixed $result The value execute() returned when it was called.
  307.    * @param bool $isTransaction TRUE if execute() was called during a running
  308.    *                             database transaction, FALSE otherwise.
  309.    * @param array $errorInfo The array returned by {@link PHP_MANUAL#function.pdostatement-errorinfo PDOStatement->errorInfo()}.
  310.    * @return void 
  311.    * @throws PDOException if the execute() call failed.
  312.    */
  313.   public static function verifyExecute(PDO $pdo$result$isTransaction$errorInfo)
  314.   {
  315.     if ($isTransaction{
  316.       if (!$result{
  317.         $status $pdo->rollBack();
  318.  
  319.         if (!$status{
  320.           $errorInfo $pdo->errorInfo();
  321.           $e new PDOException($errorInfo[2]$errorInfo[1]);
  322.           $e->errorInfo $errorInfo;
  323.  
  324.           throw $e;
  325.         }
  326.  
  327.         $e new PDOException($errorInfo[2]$errorInfo[1]);
  328.         $e->errorInfo $errorInfo;
  329.  
  330.         throw $e;
  331.       }
  332.     }
  333.     else {
  334.       if (!$result{
  335.         $e new PDOException($errorInfo[2]$errorInfo[1]);
  336.         $e->errorInfo $errorInfo;
  337.  
  338.         throw $e;
  339.       }
  340.     }
  341.   }
  342.  
  343.   /**
  344.    * Verify the results of a call to {@link PHP_MANUAL#function.pdo-exec PDO->exec()}.
  345.    *
  346.    * Used internally to verify whether or not a PDO->exec() call was
  347.    * successful or not. If the call returned FALSE then an exception is
  348.    * thrown with an error message and error code, explaining what went wrong.
  349.    * If the exec() call fails during a running database transaction,
  350.    * {@link PHP_MANUAL#function.pdo-rollback PDO->rollback()} is called to
  351.    * roll back the transaction to put the database back in the state it was
  352.    * before the error occured; then the appropriate exception is thrown.
  353.    *
  354.    * @param PDO $pdo The PDO object which called exec().
  355.    * @param mixed $result The value exec() returned when it was called.
  356.    * @param bool $isTransaction TRUE if exec() was called during a running
  357.    *                             database transaction, FALSE otherwise.
  358.    * @return void 
  359.    * @throws PDOException if the exec() call failed.
  360.    */
  361.   public static function verifyExec(PDO $pdo$result$isTransaction)
  362.   {
  363.     if ($isTransaction{
  364.       if ($result === FALSE{
  365.         $errorInfo $pdo->errorInfo();
  366.         $status $pdo->rollBack();
  367.  
  368.         if (!$status{
  369.           $errorInfo $pdo->errorInfo();
  370.           $e new PDOException($errorInfo[2]$errorInfo[1]);
  371.           $e->errorInfo $errorInfo;
  372.  
  373.           throw $e;
  374.         }
  375.  
  376.         $e new PDOException($errorInfo[2]$errorInfo[1]);
  377.         $e->errorInfo $errorInfo;
  378.  
  379.         throw $e;
  380.       }
  381.     }
  382.     else {
  383.       if ($result === FALSE{
  384.         $errorInfo $pdo->errorInfo();
  385.         $e new PDOException($errorInfo[2]$errorInfo[1]);
  386.         $e->errorInfo $errorInfo;
  387.  
  388.         throw $e;
  389.       }
  390.     }
  391.   }
  392.  
  393.   /**
  394.    * Verify the results of a call to {@link PHP_MANUAL#function.pdo-query PDO->query()}.
  395.    *
  396.    * Used internally to verify whether or not a PDO->query() call was
  397.    * successful or not. If the call returned FALSE then an exception is
  398.    * thrown with an error message and error code, explaining what went wrong.
  399.    * If the query() call fails during a running database transaction,
  400.    * {@link PHP_MANUAL#function.pdo-rollback PDO->rollback()} is called to
  401.    * roll back the transaction to put the database back in the state it was
  402.    * before the error occured; then the appropriate exception is thrown.
  403.    *
  404.    * @param PDO $pdo The PDO object which called query().
  405.    * @param mixed $result The value query() returned when it was called.
  406.    * @param bool $isTransaction TRUE if query() was called during a running
  407.    *                             database transaction, FALSE otherwise.
  408.    * @return void 
  409.    * @throws PDOException if the query() call failed.
  410.    */
  411.   public static function verifyQuery(PDO $pdo$result$isTransaction)
  412.   {
  413.     if ($isTransaction{
  414.       if (!$result{
  415.         $errorInfo $pdo->errorInfo();
  416.         $status $pdo->rollBack();
  417.  
  418.         if (!$status{
  419.           $errorInfo $pdo->errorInfo();
  420.           $e new PDOException($errorInfo[2]$errorInfo[1]);
  421.           $e->errorInfo $errorInfo;
  422.  
  423.           throw $e;
  424.         }
  425.  
  426.         $e new PDOException($errorInfo[2]$errorInfo[1]);
  427.         $e->errorInfo $errorInfo;
  428.  
  429.         throw $e;
  430.       }
  431.     }
  432.     else {
  433.       if (!$result{
  434.         $errorInfo $pdo->errorInfo();
  435.         $e new PDOException($errorInfo[2]$errorInfo[1]);
  436.         $e->errorInfo $errorInfo;
  437.  
  438.         throw $e;
  439.       }
  440.     }
  441.   }
  442.  
  443.   /**
  444.    * Verify the results of a call to {@link PHP_MANUAL#function.pdo-beginTransaction PDO->beginTransaction()} or {@link PHP_MANUAL#function.pdo-commit PDO->commit()}.
  445.    *
  446.    * Used internally to verify whether or not a PDO->beginTransaction() or a
  447.    * PDO->rollback() call was successful or not. If the call returned FALSE
  448.    * then an exception is thrown with an error message and error code,
  449.    * explaining what went wrong.
  450.    *
  451.    * @param PDO $pdo The PDO object which called beginTransaction() or rollback().
  452.    * @param mixed $result The value beginTransaction() or rollback() returned when it was called.
  453.    * @return void 
  454.    * @throws PDOException if the beginTransaction() or rollback() call failed.
  455.    */
  456.   public static function verifyTransaction(PDO $pdo$result)
  457.   {
  458.     if (!$result{
  459.       $errorInfo $pdo->errorInfo();
  460.       $e new PDOException($errorInfo[2]$errorInfo[1]);
  461.       $e->errorInfo $errorInfo;
  462.  
  463.       throw $e;
  464.     }
  465.   }
  466.  
  467.   /**
  468.    * Verify the results of a call to {@link PHP_MANUAL#function.pdo-prepare PDO->prepare()}.
  469.    *
  470.    * Used internally to verify whether or not a PDO->prepare() call was
  471.    * successful or not. If the call returned FALSE then an exception is
  472.    * thrown with an error message and error code, explaining what went wrong.
  473.    * If the prepare() call fails during a running database transaction,
  474.    * {@link PHP_MANUAL#function.pdo-rollback PDO->rollback()} is called to
  475.    * roll back the transaction to put the database back in the state it was
  476.    * before the error occured; then the appropriate exception is thrown.
  477.    *
  478.    * @param PDO $pdo The PDO object which called prepare().
  479.    * @param mixed $result The value prepare() returned when it was called.
  480.    * @param bool $isTransaction TRUE if prepare() was called during a running
  481.    *                             database transaction, FALSE otherwise.
  482.    * @return void 
  483.    * @throws PDOException if the prepare() call failed.
  484.    */
  485.   public static function verifyPrepare(PDO $pdo$result$isTransaction)
  486.   {
  487.     if ($isTransaction{
  488.       if ($result === FALSE{
  489.         $errorInfo $pdo->errorInfo();
  490.         $status $pdo->rollBack();
  491.  
  492.         if (!$status{
  493.           $errorInfo $pdo->errorInfo();
  494.           $e new PDOException($errorInfo[2]$errorInfo[1]);
  495.           $e->errorInfo $errorInfo;
  496.  
  497.           throw $e;
  498.         }
  499.  
  500.         $e new PDOException($errorInfo[2]$errorInfo[1]);
  501.         $e->errorInfo $errorInfo;
  502.  
  503.         throw $e;
  504.       }
  505.     }
  506.     else {
  507.       if ($result === FALSE{
  508.         $errorInfo $pdo->errorInfo();
  509.         $e new PDOException($errorInfo[2]$errorInfo[1]);
  510.         $e->errorInfo $errorInfo;
  511.  
  512.         throw $e;
  513.       }
  514.     }
  515.   }
  516.  
  517.   /**
  518.    * Decode a UTF8-encoded string to a latin1-encoded string.
  519.    *
  520.    * @param string $in_str UTF8-encoded string.
  521.    * @return string latin1-encoded string.
  522.    */
  523.   public static function utf8Decode($in_str)
  524.   {
  525.     // utf8Decode is courtesy nospam@jra.nu and was found
  526.     // at: http://us4.php.net/utf8-decode in the comments section
  527.     // Replace ? with a unique string
  528.     $new_str str_replace("?""q0u0e0s0t0i0o0n"$in_str);
  529.  
  530.     // Try the utf8_decode
  531.     $new_str utf8_decode($new_str);
  532.  
  533.     // if it contains ? marks
  534.     if (strpos($new_str"?"!== FALSE{
  535.       // Something went wrong, set new_str to the original string.
  536.       $new_str $in_str;
  537.     }
  538.     else {
  539.       // If not then all is well, put the ?-marks back where is belongs
  540.       $new_str str_replace("q0u0e0s0t0i0o0n""?"$new_str);
  541.     }
  542.  
  543.     return $new_str;
  544.   }
  545. }
  546. ?>

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