Arquivos
wMind/mind3rd/API/classes/DAO/ProjectFactory.php
T
Felipe Nascimento de Moura c0dc18d2aa -added annotations
-added link to projects
-removed unused files
-removed useless message
2011-03-24 18:49:45 -03:00

191 linhas
4.5 KiB
PHP

<?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 DAO;
/**
* ProjectFactory: will work with the DAO\Project class.
* This class will deal with the SQLite database to check for Project's
* changes.
*
* @package VCS
* @subpackage DAO
* @author felipe
*/
class ProjectFactory extends Project{
/**
* Returns if the entity from the SQLite is the same as the entity in the Memory
*
* @param array $entity1
* @param \MindEntity $entity2
* @return boolean
*/
public function areDifferent(Array $entity1, \MindEntity $entity2)
{
$props= $this->getProperties($entity1);
if(sizeof($props) != sizeof($entity2->properties)
||
array_keys($props) != array_keys($entity2->properties))
return true;
foreach($props as $k=>$prop)
{
$refs= "";
if(!isset($entity2->properties[$prop['name']]))
return true;
$p= $entity2->properties[$prop['name']];
if($p->refTo)
$refs= $p->refTo[0]->name.".".$p->refTo[1]->name;
if(
$prop['name'] != $p->name ||
$prop['type'] != $p->type ||
$prop['size'] != $p->size ||
$prop['options'] != JSON_encode($p->options) ||
$prop['unique_value'] != $p->unique ||
$prop['default_value'] != $p->default ||
$prop['required'] != $p->required ||
$prop['comment'] != $p->comment ||
$prop['ref_to_property'] != $refs
)
{
return true;
}
unset($props[$k]);
}
return false;
}
/**
* Saves the current entities
*
* It will persist the current entities into the SQLite database.
* This will also verifies the changes in the previous version and
* make the necessary changes.
*
* @param Array &$currentEntities
*/
public function saveEntities(&$currentEntities)
{
$enKey= null;
$commited= false;
foreach(\Analyst::$entities as &$entity)
{
$vs= 1;
// if it is a new entity
if(!isset($currentEntities[$entity->name]))
{
$commited= true;
unset($currentEntities[$entity->name]);
$this->insertEntity($entity, $vs);
}else{
// if it is a possible update of an entity
if($this->areDifferent($currentEntities[$entity->name], $entity))
{
$commited= true;
$this->markAsChanged($currentEntities[$entity->name]);
$vs= ++$currentEntities[$entity->name]['version'];
$this->insertEntity($entity,
$vs);
}
unset($currentEntities[$entity->name]);
}
}
foreach($currentEntities as $en)
{
$commited= true;
$this->markAsDopped($en);
}
if($commited)
\Mind::write('commitChanged', true, $this->data['version']);
else
{
$this->data['version']--;
\Mind::write('commitUnchanged', true, $this->data['version']);
}
$this->changed= $commited;
}
/**
* Gets the data from the current version.
*
* @param integer $vs
* @return Array The current version id, version and the project's creator
*/
public function getCurrentVersion($vs= false)
{
$qr_newProj= "SELECT pk_version,
v.version as version,
p.creator as creator
from project p,
version v
where p.pk_project = v.fk_project
and p.pk_project = ".$this->data['pk_project'];
if($vs)
$qr_newProj.= " and v.version= ".$vs;
$qr_newProj.= "
ORDER by pk_version desc
LIMIT 1";
$data= $this->db->query($qr_newProj);
$data= $data[0];
$this->versionId= $data['pk_version'];
return $data;
}
/**
* Commits the current data to the SQLite database.
* It will commit the analyzed structure to the databse into a
* new version of the current project, or return a message
* of "unchanged"
*/
public function commit()
{
$this->changed= false;
$currentEntities= $this->getCurrentEntities();
$curEn= Array();
foreach($currentEntities as &$en)
{
$curEn[$en['name']]= $en;
}
$currentEntities= $curEn;
$this->addNewVersion();
$this->saveEntities($currentEntities);
if($this->changed)
$this->db->execute("COMMIT");
}
/**
* The DAO\ProjectFactory constructor
* It calls the DAO\Project's constructor
* @param array $projectData
* @param integer $vs
*/
public function __construct(Array $projectData, $vs=false)
{
parent::__construct();
$this->data= $projectData;
$this->db->execute('BEGIN');
$data= $this->getCurrentVersion($vs);
$this->data= array_merge($this->data, $data);
}
}