* @license licenses/mind3rd.license */ namespace DQB; /** * Description of Query * * @author Felipe Nascimento de Moura * @package DQB */ class Query { const TABLE_NAME = '//'; const PROPS = '//'; const PROPS_NAME = '//'; const PROP_NAME = '//'; const PROP_TYPE = '//'; const PROP_SIZE = '//'; const PROP_DETAILS = '//'; const PROP_DEFAULT = '//'; const PROP_OPTIONS = '//'; const PRIMARY_KEYS = '//'; const CONSTRAINT_NAME= '//'; const REF_TAB_NAME = '//'; const REF_COL_NAME = '//'; const REFERENCES = '//'; const FK_NAME= '//'; public $query= ""; public $closingQuery= Array(); private $pks= Array(); // temporary variable private $fks= Array(); // temporary variable public function setUp() { $this->pks= false; $this->pks= Array(); $this->fks= false; $this->fks= Array(); $this->closingQuery= false; $this->closingQuery= Array(); } private function parseDetails(Array $prop, $table) { $details= Array(); // parsing te default value if(!empty($prop['default_value'])) { if(\AUTOINCREMENT_DEFVAL == $prop['default_value']) { $details[]= QueryFactory::getQueryString('createAutoIncrement'); $prop['default_value']= false; }else{ $default= QueryFactory::getQueryString('createDefault'); $def= \addslashes($prop['default_value']); $def= preg_replace(\BETWEEN_QUOTES, "'", trim($def)); $details[]= preg_replace(self::PROP_DEFAULT, $def, $default); } } // checking the not null attribute if($prop['required']) $details[]= QueryFactory::getQueryString('notNullDefinition'); if($prop['ref_to_property'] && QueryFactory::$mustSort) { $tb= explode('.', $prop['ref_to_property']); $col= $tb[1]; $tb= $tb[0]; $reference= QueryFactory::getQueryString('createReferences'); $reference= preg_replace(self::REF_TAB_NAME, $tb, $reference); $reference= preg_replace(self::REF_COL_NAME, $col, $reference); $details[]= $reference; } // if($prop['options']) $prop['options']= JSON_decode($prop['options']); if(sizeof($prop['options'])>0) { $optionsTplt= QueryFactory::getQueryString('createOptionsCheck'); $options= Array(); foreach($prop['options'] as $opt) { $opt= \is_string($opt[0])? "'".$opt[0]."'": $opt[0]; $options[]= $opt; } $details[]= preg_replace(self::PROP_OPTIONS, $prop['name']."=". implode(" OR ".$prop['name'] ."=", $options), $optionsTplt); } if($prop['unique_value']) { $details[]= QueryFactory::getQueryString('createUnique'); } if($prop['ref_to_property']) { $this->fks[]= $prop; } return implode(' ', $details); } private function createProperties(&$query, $table) { $template= QueryFactory::getQueryString('property'); $tmpQuery= ""; foreach($table['properties'] as $prop) { if($prop['is_pk']) $this->pks[]= $prop['name']; $propQuery= ""; $propQuery= preg_replace(self::PROP_NAME, $prop['name'], $template); if($prop['default_value'] == \AUTOINCREMENT_DEFVAL) { $prop['type']= QueryFactory::getQueryString('autoIncrementType'); } if($prop['size']) $propQuery= preg_replace(self::PROP_SIZE, "(".$prop['size'].")", $propQuery); else $propQuery= preg_replace(self::PROP_SIZE, "", $propQuery); $propQuery= preg_replace(self::PROP_NAME, $prop['name'], $propQuery); $propQuery= preg_replace(self::PROP_DETAILS, $this->parseDetails($prop, $table), $propQuery); $propQuery= preg_replace(self::PROP_TYPE, $prop['type'], $propQuery); $propQuery= preg_replace(self::REFERENCES, '', $propQuery); $tmpQuery.= trim($propQuery).",\n "; } $query= preg_replace(self::PROPS, trim($tmpQuery), $query); } public function createPrimaryKeys(&$query, $table) { $tmplt= QueryFactory::getQueryString('createPrimaryKeys'); //print_r($this->pks); $tmpQuery= preg_replace(self::PROPS_NAME, implode(', ', $this->pks), $tmplt); $tmpQuery= preg_replace(self::FK_NAME, $table['name']."_".implode('_', $this->pks), $tmpQuery); $query= preg_replace(self::PRIMARY_KEYS, trim($tmpQuery), $query); } private function createForeignKeys(&$query, $table) { $tmplt= QueryFactory::getQueryString('createFk'); foreach($this->fks as $fk) { $constraintName= str_replace('.', '_', $fk['ref_to_property']); $constraintName= "fk_".$table['name'].'_'.$constraintName; $tb= explode('.', $fk['ref_to_property']); $col= $tb[1]; $tb= $tb[0]; $tmpQuery= preg_replace(self::TABLE_NAME, $table['name'], $tmplt); $tmpQuery= preg_replace(self::CONSTRAINT_NAME, $constraintName, $tmpQuery); $tmpQuery= preg_replace(self::PROP_NAME, $fk['name'], $tmpQuery); $tmpQuery= preg_replace(self::REF_TAB_NAME, $tb, $tmpQuery); $tmpQuery= preg_replace(self::REF_COL_NAME, $col, $tmpQuery); $this->closingQuery[]= $tmpQuery; } } public function __construct($command, Array $table, $template) { $query= ''; $this->setUp(); switch($command) { case 'createTable': $query= preg_replace(self::TABLE_NAME, $table['name'], $template); //if(preg_match(self::PROPS, $template)) self::createProperties($query, $table); self::createPrimaryKeys($query, $table); self::createForeignKeys($query, $table); break; } $this->query= $query; $this->table= $table; return $query; } public function __toString() { return $this->query; } }