Source for file jDaoParser.class.php
Documentation is available at jDaoParser.class.php
- <?php
- /**
- * @package jelix
- * @subpackage dao
- * @author GĂ©rald Croes, Laurent Jouanneau
- * @contributor Laurent Jouanneau
- * @copyright 2001-2005 CopixTeam, 2005-2012 Laurent Jouanneau
- * This class was get originally from the Copix project (CopixDAODefinitionV1, Copix 2.3dev20050901, http://www.copix.org)
- * Few lines of code are still copyrighted 2001-2005 CopixTeam (LGPL licence).
- * Initial authors of this Copix class are Gerald Croes and Laurent Jouanneau,
- *
- * @link http://www.jelix.org
- * @licence http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public Licence, see LICENCE file
- */
-
- require(JELIX_LIB_PATH.'dao/jDaoXmlException.class.php');
- require(JELIX_LIB_PATH.'dao/jDaoProperty.class.php');
- require(JELIX_LIB_PATH.'dao/jDaoMethod.class.php');
- require(JELIX_LIB_PATH.'dao/jDaoGenerator.class.php');
-
- /**
- * extract data from a dao xml content
- * @package jelix
- * @subpackage dao
- * @see jDaoCompiler
- */
- class jDaoParser {
- /**
- * the properties list.
- * keys = field code name
- * values = jDaoProperty
- */
- private $_properties = array ();
-
- /**
- * all tables with their properties, and their own fields
- * keys = table code name
- * values = array()
- * 'name'=> table code name, 'realname'=>'real table name',
- * 'pk'=> primary keys list
- * 'fk'=> foreign keys list
- * 'fields'=>array(list of field code name)
- */
- private $_tables = array();
-
- /**
- * primary table code name
- */
- private $_primaryTable = '';
-
- /**
- * code name of foreign table with a outer join
- * @var array list of array(table code name, 0)
- */
- private $_ojoins = array ();
-
- /**
- * code name of foreign table with a inner join
- * @var array list of table code name
- */
- private $_ijoins = array ();
-
- /**
- * @var array list of jDaoMethod objects
- */
- private $_methods = array();
-
- /**
- * list of main events to sent
- */
- private $_eventList = array();
-
- public $hasOnlyPrimaryKeys = false;
-
- /**
- * selector of the user record class
- * @var jSelectorDaoRecord
- */
- private $_userRecord = null;
-
- /**
- * selector of the imported dao
- * @var jSelectorDao[]
- */
- private $_importedDao = null;
-
- public $selector;
- /**
- * Constructor
- */
- function __construct($selector) {
- $this->selector = $selector;
- }
-
- /**
- * parse a dao xml content
- * @param SimpleXmlElement $xml
- * @param jDbTools $tools
- * @param int $debug for debug only 0:parse all, 1:parse only datasource+record, 2;parse only datasource
- */
- public function parse ($xml, $tools) {
- $this->import($xml, $tools);
- $this->parseDatasource($xml);
- $this->parseRecord($xml, $tools);
- $this->parseFactory($xml);
- }
-
- protected function import ($xml, $tools) {
- if (isset($xml['import'])) {
- $import = (string)$xml['import'];
-
- jApp::pushCurrentModule($this->selector->module);
- // Keep the same driver as current used
- $importSel = new jSelectorDao($import, $this->selector->driver);
- jApp::popCurrentModule();
-
- $doc = new DOMDocument();
- if (!$doc->load($importSel->getPath())) {
- throw new jException('jelix~daoxml.file.unknown', $importSel->getPath());
- }
- $parser = new jDaoParser ($importSel);
- $parser->parse(simplexml_import_dom($doc), $tools);
-
- $this->_properties = $parser->getProperties();
- $this->_tables = $parser->getTables();
- $this->_primaryTable = $parser->getPrimaryTable();
- $this->_methods = $parser->getMethods();
- $this->_ojoins = $parser->getOuterJoins();
- $this->_ijoins = $parser->getInnerJoins();
- $this->_eventList = $parser->getEvents();
- $this->_userRecord = $parser->getUserRecord();
- $this->_importedDao = $parser->getImportedDao();
- $this->hasOnlyPrimaryKeys = $parser->hasOnlyPrimaryKeys;
-
- if ($this->_importedDao)
- $this->_importedDao[] = $importSel;
- else
- $this->_importedDao = array($importSel);
- }
- }
-
- protected function parseDatasource($xml) {
- // -- tables
- if(isset ($xml->datasources) && isset ($xml->datasources[0]->primarytable)) {
- $previousTables = $this->_tables;
- // erase table definitions (in the case where the dao imports an other one)
- $this->_tables = array();
- $this->_ijoins = array();
- $this->_ojoins = array();
-
- $t = $this->_parseTable (0, $xml->datasources[0]->primarytable[0]);
- $this->_primaryTable = $t['name'];
- if (isset($previousTables[$t['name']])) {
- $this->_tables[$t['name']]['fields'] = $previousTables[$t['name']]['fields'];
- }
- if(isset($xml->datasources[0]->primarytable[1])){
- throw new jDaoXmlException ($this->selector, 'table.two.many');
- }
- foreach($xml->datasources[0]->foreigntable as $table){
- $t = $this->_parseTable (1, $table);
- if (isset($previousTables[$t['name']])) {
- $this->_tables[$t['name']]['fields'] = $previousTables[$t['name']]['fields'];
- }
- }
- foreach($xml->datasources[0]->optionalforeigntable as $table){
- $t = $this->_parseTable (2, $table);
- if (isset($previousTables[$t['name']])) {
- $this->_tables[$t['name']]['fields'] = $previousTables[$t['name']]['fields'];
- }
- }
- }else if ($this->_primaryTable === '') { // no imported dao
- throw new jDaoXmlException ($this->selector, 'datasource.missing');
- }
- }
-
- protected function parseRecord($xml, $tools) {
-
- //add the record properties
- if(isset($xml->record)){
- if (isset($xml->record[0]['extends'])) {
- jApp::pushCurrentModule($this->selector->module);
- $this->_userRecord = new jSelectorDaoRecord((string)$xml->record[0]['extends']);
- jApp::popCurrentModule();
- }
- if (isset($xml->record[0]->property)) {
- // don't append directly new properties into _properties,
- // so we can see the differences between imported properties
- // and readed properties
- $properties = array();
- foreach ($xml->record[0]->property as $prop){
- $p = new jDaoProperty ($prop->attributes(), $this, $tools);
- if (isset($properties[$p->name])) {
- throw new jDaoXmlException ($this->selector, 'property.already.defined', $p->name);
- }
- if (!in_array($p->name, $this->_tables[$p->table]['fields'])) { // if this property does not redefined an imported property
- $this->_tables[$p->table]['fields'][] = $p->name;
- }
- $properties[$p->name] = $p;
- }
- $this->_properties = array_merge($this->_properties, $properties);
- }
- }
- // in the case when there is no defined property and no imported dao
- if (count($this->_properties) == 0)
- throw new jDaoXmlException ($this->selector, 'properties.missing');
-
- // check that properties are attached to a known table. It can be
- // wrong if the datasource has been redefined with other table names
- $countprop = 0;
- foreach ($this->_properties as $p) {
- if (!isset($this->_tables[$p->table]))
- throw new jDaoXmlException ($this->selector, 'property.imported.unknown.table', $p->name);
- if($p->ofPrimaryTable && !$p->isPK)
- $countprop ++;
- }
- $this->hasOnlyPrimaryKeys = ($countprop == 0);
- }
-
- protected function parseFactory($xml) {
- // get additionnal methods definition
- if (isset ($xml->factory)) {
- if (isset($xml->factory[0]['events'])) {
- $events = (string)$xml->factory[0]['events'];
- $this->_eventList = preg_split("/[\s,]+/", $events);
- }
-
- if (isset($xml->factory[0]->method)){
- $methods = array();
- foreach($xml->factory[0]->method as $method){
- $m = new jDaoMethod ($method, $this);
- if (isset ($methods[$m->name])){
- throw new jDaoXmlException ($this->selector, 'method.duplicate',$m->name);
- }
- $methods[$m->name] = $m;
- }
- $this->_methods = array_merge($this->_methods, $methods);
- }
- }
- }
-
- /**
- * parse a join definition
- */
- private function _parseTable ($typetable, $tabletag){
- $infos = $this->getAttr($tabletag, array('name','realname','primarykey','onforeignkey'));
-
- if ($infos['name'] === null )
- throw new jDaoXmlException ($this->selector, 'table.name');
-
- if($infos['realname'] === null)
- $infos['realname'] = $infos['name'];
-
- if($infos['primarykey'] === null)
- throw new jDaoXmlException ($this->selector, 'primarykey.missing');
-
- $infos['pk']= preg_split("/[\s,]+/", $infos['primarykey']);
- unset($infos['primarykey']);
-
- if(count($infos['pk']) == 0 || $infos['pk'][0] == '')
- throw new jDaoXmlException ($this->selector, 'primarykey.missing');
-
- if($typetable){ // for the foreigntable and optionalforeigntable
- if($infos['onforeignkey'] === null)
- throw new jDaoXmlException ($this->selector, 'foreignkey.missing');
- $infos['fk']=preg_split("/[\s,]+/",$infos['onforeignkey']);
- unset($infos['onforeignkey']);
- if(count($infos['fk']) == 0 || $infos['fk'][0] == '')
- throw new jDaoXmlException ($this->selector, 'foreignkey.missing');
- if(count($infos['fk']) != count($infos['pk']))
- throw new jDaoXmlException ($this->selector, 'foreignkey.missing');
- if($typetable == 1){
- $this->_ijoins[]=$infos['name'];
- }else{
- $this->_ojoins[]=array($infos['name'],0);
- }
- }else{
- unset($infos['onforeignkey']);
- }
-
- $infos['fields'] = array ();
- $this->_tables[$infos['name']] = $infos;
-
- return $infos;
- }
-
- /**
- * Try to read all given attributes
- * @param SimpleXmlElement $tag
- * @param array $requiredattr attributes list
- * @return array attributes and their values
- */
- public function getAttr($tag, $requiredattr){
- $res=array();
- foreach($requiredattr as $attr){
- if(isset($tag[$attr]) && trim((string)$tag[$attr]) != '')
- $res[$attr]=(string)$tag[$attr];
- else
- $res[$attr]=null;
- }
- return $res;
- }
-
- /**
- * just a quick way to retrieve boolean values from a string.
- * will accept yes, true, 1 as "true" values
- * all other values will be considered as false.
- * @return boolean true / false
- */
- public function getBool ($value) {
- return in_array (trim ($value), array ('true', '1', 'yes'));
- }
-
- /**
- * the properties list.
- * keys = field code name
- * values = jDaoProperty
- * @return array
- */
- public function getProperties () { return $this->_properties; }
-
- /**
- * all tables with their properties, and their own fields
- * keys = table code name
- * values = array()
- * 'name'=> table code name, 'realname'=>'real table name',
- * 'pk'=> primary keys list
- * 'fk'=> foreign keys list
- * 'fields'=>array(list of field code name)
- * @return array
- */
- public function getTables(){ return $this->_tables;}
-
- /**
- * @return string the primary table code name
- */
- public function getPrimaryTable(){ return $this->_primaryTable;}
-
- /**
- * @return jDaoMethod[] list of jDaoMethod objects
- */
- public function getMethods(){ return $this->_methods;}
-
- /**
- * list of code name of foreign table with a outer join
- * @var array list of array(table code name, 0)
- */
- public function getOuterJoins(){ return $this->_ojoins;}
-
- /**
- * list of code name of foreign tables with a inner join
- * @return array the list
- */
- public function getInnerJoins(){ return $this->_ijoins;}
-
- public function getEvents(){ return $this->_eventList;}
- public function hasEvent($event){ return in_array($event,$this->_eventList);}
-
- /**
- * selector of the user record class
- * @return jSelectorDaoRecord
- */
- public function getUserRecord() { return $this->_userRecord;}
-
- /**
- * selector of the imported dao. If can return several selector, if
- * an imported dao import itself an other dao etc.
- * @return jSelectorDao[]
- */
- public function getImportedDao(){ return $this->_importedDao;}
- }
Documentation generated on Wed, 04 Jan 2017 22:53:23 +0100 by phpDocumentor 1.4.3