Source for file jDaoParser.class.php

Documentation is available at jDaoParser.class.php

  1. <?php
  2. /**
  3. @package     jelix
  4. @subpackage  dao
  5. @author      Croes GĂ©rald, Laurent Jouanneau
  6. @contributor Laurent Jouanneau
  7. @copyright   2001-2005 CopixTeam, 2005-2006 Laurent Jouanneau
  8. *  This class was get originally from the Copix project (CopixDAODefinitionV1, Copix 2.3dev20050901, http://www.copix.org)
  9. *  Few lines of code are still copyrighted 2001-2005 CopixTeam (LGPL licence).
  10. *  Initial authors of this Copix class are Gerald Croes and Laurent Jouanneau,
  11. *  and this class was adapted/improved for Jelix by Laurent Jouanneau
  12. *
  13. @link        http://www.jelix.org
  14. @licence  http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public Licence, see LICENCE file
  15. */
  16.  
  17. /**
  18.  * extract data from a dao xml content
  19.  * @package  jelix
  20.  * @subpackage dao
  21.  * @see jDaoCompiler
  22.  */
  23. class jDaoParser {
  24.     /**
  25.     * the properties list.
  26.     * keys = field code name
  27.     * values = jDaoProperty
  28.     */
  29.     private $_properties array ();
  30.  
  31.     /**
  32.     * all tables with their properties, and their own fields
  33.     * keys = table code name
  34.     * values = array()
  35.     *          'name'=> table code name, 'realname'=>'real table name',
  36.     *          'primarykey'=> attribute , 'pk'=> primary keys list
  37.     *          'onforeignkey'=> attribute, 'fk'=> foreign keys list
  38.     *          'fields'=>array(list of field code name)
  39.     */
  40.     private $_tables array();
  41.  
  42.     /**
  43.     * primary table code name
  44.     */
  45.     private $_primaryTable '';
  46.  
  47.     /**
  48.     * code name of foreign table with a outer join
  49.     * @var array  of table code name
  50.     */
  51.     private $_ojoins array ();
  52.  
  53.     /**
  54.     * code name of foreign table with a inner join
  55.     * @var array  of array(table code name, 0)
  56.     */
  57.     private $_ijoins array ();
  58.  
  59.     /**
  60.      * @var array list of jDaoMethod objects
  61.      */
  62.     private $_methods array();
  63.  
  64.     /**
  65.      * list of main events to sent
  66.      */
  67.     private $_eventList array();
  68.  
  69.  
  70.     public $hasOnlyPrimaryKeys = false;
  71.     /**
  72.     * Constructor
  73.     */
  74.     function __construct(){
  75.     }
  76.  
  77.     /**
  78.     * parse a dao xml content
  79.     * @param SimpleXmlElement $xml 
  80.     * @param int $debug  for debug only 0:parse all, 1:parse only datasource+record, 2;parse only datasource
  81.     */
  82.     public function parse$xml$debug=0){
  83.         // -- tables
  84.         if(isset ($xml->datasources&& isset ($xml->datasources[0]->primarytable)){
  85.             $t $this->_parseTable (0$xml->datasources[0]->primarytable[0]);
  86.             $this->_primaryTable $t['name'];
  87.             if(isset($xml->datasources[0]->primarytable[1])){
  88.                 throw new jDaoXmlException ('table.two.many');
  89.             }
  90.             foreach($xml->datasources[0]->foreigntable as $table){
  91.                 $this->_parseTable (1$table);
  92.             }
  93.             foreach($xml->datasources[0]->optionalforeigntable as $table){
  94.                 $this->_parseTable (2$table);
  95.             }
  96.         }else{
  97.             throw new jDaoXmlException ('datasource.missing');
  98.         }
  99.  
  100.         if($debug == 2return;
  101.         $countprop 0;
  102.         //add the record properties
  103.         if(isset($xml->record&& isset($xml->record[0]->property)){
  104.             foreach ($xml->record[0]->property as $prop){
  105.                 $p new jDaoProperty ($prop->attributes()$this);
  106.                 $this->_properties[$p->name$p;
  107.                 $this->_tables[$p->table]['fields'][$p->name;
  108.                 if(($p->table == $this->_primaryTable&& !$p->isPK)
  109.                     $countprop ++;
  110.             }
  111.             $this->hasOnlyPrimaryKeys = ($countprop == 0);
  112.         }else
  113.             throw new jDaoXmlException ('properties.missing');
  114.  
  115.         if($debug == 1return;
  116.  
  117.         // get additionnal methods definition
  118.         if (isset ($xml->factory)) {
  119.             if (isset($xml->factory[0]['events'])) {
  120.                 $events = (string)$xml->factory[0]['events'];
  121.                 $this->_eventList preg_split("/[\s,]+/"$events);
  122.             }
  123.  
  124.             if (isset($xml->factory[0]->method)){
  125.                 foreach($xml->factory[0]->method as $method){
  126.                     $m new jDaoMethod ($method$this);
  127.                     if(isset ($this->_methods[$m->name])){
  128.                         throw new jDaoXmlException ('method.duplicate',$m->name);
  129.                     }
  130.                     $this->_methods[$m->name$m;
  131.                 }
  132.             }
  133.         }
  134.     }
  135.  
  136.     /**
  137.     * parse a join definition
  138.     */
  139.     private function _parseTable ($typetable$tabletag){
  140.         $infos $this->getAttr($tabletagarray('name','realname','primarykey','onforeignkey'));
  141.  
  142.         if ($infos['name'=== null )
  143.             throw new jDaoXmlException ('table.name');
  144.  
  145.         if($infos['realname'=== null)
  146.             $infos['realname'$infos['name'];
  147.  
  148.         if($infos['primarykey'=== null)
  149.             throw new jDaoXmlException ('primarykey.missing');
  150.  
  151.         $infos['pk']preg_split("/[\s,]+/"$infos['primarykey']);
  152.         unset($infos['primarykey']);
  153.  
  154.         if(count($infos['pk']== || $infos['pk'][0== '')
  155.             throw new jDaoXmlException ('primarykey.missing');
  156.  
  157.         if($typetable)// pour les foreigntable et optionalforeigntable
  158.             if($infos['onforeignkey'=== null)
  159.                 throw new jDaoXmlException ('foreignkey.missing');
  160.             $infos['fk']=preg_split("/[\s,]+/",$infos['onforeignkey']);
  161.             unset($infos['onforeignkey']);
  162.             if(count($infos['fk']== || $infos['fk'][0== '')
  163.                 throw new jDaoXmlException ('foreignkey.missing');
  164.             if(count($infos['fk']!= count($infos['pk']))
  165.                 throw new jDaoXmlException ('foreignkey.missing');
  166.             if($typetable == 1){
  167.                 $this->_ijoins[]=$infos['name'];
  168.             }else{
  169.                 $this->_ojoins[]=array($infos['name'],0);
  170.             }
  171.         }else{
  172.             unset($infos['onforeignkey']);
  173.         }
  174.  
  175.         $infos['fields'array ();
  176.         $this->_tables[$infos['name']] $infos;
  177.  
  178.         return $infos;
  179.     }
  180.  
  181.     /**
  182.     * try to read all given attributes
  183.     * @param SimpleXmlElement $tag 
  184.     * @param array $requiredattr attributes list
  185.     * @return array attributes and their values
  186.     */
  187.     public function getAttr($tag$requiredattr){
  188.         $res=array();
  189.         foreach($requiredattr as $attr){
  190.             if(isset($tag[$attr]&& trim((string)$tag[$attr]!= '')
  191.                 $res[$attr]=(string)$tag[$attr];
  192.             else
  193.                 $res[$attr]=null;
  194.         }
  195.         return $res;
  196.     }
  197.  
  198.     /**
  199.     * just a quick way to retrieve boolean values from a string.
  200.     *  will accept yes, true, 1 as "true" values
  201.     *  all other values will be considered as false.
  202.     * @return boolean true / false
  203.     */
  204.     public function getBool ($value{
  205.         return in_array (trim ($value)array ('true''1''yes'));
  206.     }
  207.  
  208.     public function getProperties (return $this->_properties}
  209.     public function getTables(){  return $this->_tables;}
  210.     public function getPrimaryTable(){  return $this->_primaryTable;}
  211.     public function getMethods(){  return $this->_methods;}
  212.     public function getOuterJoins(){  return $this->_ojoins;}
  213.     public function getInnerJoins(){  return $this->_ijoins;}
  214.     public function hasEvent($event)return in_array($event,$this->_eventList);}
  215. }

Documentation generated on Thu, 22 Mar 2012 22:14:57 +0100 by phpDocumentor 1.4.3