Arquivos
wMind/mind3rd/API/classes/DQB/Query.php
T
Felipe Nascimento de Moura aa8e451a58 - Refactor of all the MindCommand class
- Rebuilt of all programs to use the pattern of the new format designed for the new MindCommand class
2011-04-15 23:32:55 -03:00

217 linhas
6.0 KiB
PHP
Arquivo Executável

<?php
/**
* This file is part of TheWebMind 3rd generation.
*
* Notice that, these packages are being used only for documentation,
* not to organize the classes.
*
* @author Felipe Nascimento de Moura <felipenmoura@gmail.com>
* @license licenses/mind3rd.license
*/
namespace DQB;
/**
* Description of Query
*
* @author Felipe Nascimento de Moura <felipenmoura@gmail.com>
* @package DQB
*/
class Query {
const TABLE_NAME = '/<tablename(\/)?>/';
const PROPS = '/<properties(\/)?>/';
const PROPS_NAME = '/<propertiesnames(\/)?>/';
const PROP_NAME = '/<propertyname(\/)?>/';
const PROP_TYPE = '/<propertytype(\/)?>/';
const PROP_SIZE = '/<propertysize(\/)?>/';
const PROP_DETAILS = '/<propertydetails(\/)?>/';
const PROP_DEFAULT = '/<defaultvalue(\/)?>/';
const PROP_OPTIONS = '/<options(\/)?>/';
const PRIMARY_KEYS = '/<primarykeys(\/)?>/';
const CONSTRAINT_NAME= '/<constraintname(\/)?>/';
const REF_TAB_NAME = '/<referencetablename(\/)?>/';
const REF_COL_NAME = '/<referencecolumnname(\/)?>/';
const REFERENCES = '/<references(\/)?>/';
const FK_NAME= '/<fkname(\/)?>/';
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, "(<value>".$prop['size']."</value>)", $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;
}
}