diff --git a/lib/Doctrine/Resource/Client.php b/lib/Doctrine/Resource/Client.php index e76fde4cd..c2bd95a55 100644 --- a/lib/Doctrine/Resource/Client.php +++ b/lib/Doctrine/Resource/Client.php @@ -68,24 +68,23 @@ class Doctrine_Resource_Client extends Doctrine_Resource $schema = file_get_contents($path); } else { $request = new Doctrine_Resource_Request(); - $request->set('type', 'load'); - $request->set('format', $this->getConfig()->get('format')); + $request->set('action', 'load'); $schema = $request->execute(); if ($schema) { - file_put_contents($path, Doctrine_Parser::dump($schema, $this->getConfig()->get('format'))); + file_put_contents($path, Doctrine_Parser::dump($schema, 'xml')); } } if (file_exists($path) && $schema) { $import = new Doctrine_Import_Schema(); - $schema = $import->buildSchema($path, $this->getConfig()->get('format')); + $schema = $import->buildSchema($path, 'xml'); if (!file_exists($classesPath)) { $build = " $details) { - $build .= "class " . $className . " extends Doctrine_Resource_Record { protected \$_model = '".$className."'; public function __construct(\$loadRelations = true) { parent::__construct(\$this->_model, \$loadRelations); } }\n"; + $build .= "class " . $className . " extends Doctrine_Resource_Record { protected \$_model = '".$className."'; public function __construct() { parent::__construct(\$this->_model); } }\n"; $schema['schema'][$className]['relations'] = isset($schema['relations'][$className]) ? $schema['relations'][$className]:array(); } diff --git a/lib/Doctrine/Resource/Collection.php b/lib/Doctrine/Resource/Collection.php index 78aa47044..431701590 100644 --- a/lib/Doctrine/Resource/Collection.php +++ b/lib/Doctrine/Resource/Collection.php @@ -36,18 +36,12 @@ class Doctrine_Resource_Collection extends Doctrine_Resource_Access implements C protected $_data = array(); protected $_config = array(); protected $_model = null; - protected $_parent = null; public function __construct($model) { $this->_model = $model; } - public function setParent($parent) - { - $this->_parent = $parent; - } - public function getConfig($key = null) { return Doctrine_Resource_Client::getInstance()->getConfig($key); @@ -60,7 +54,7 @@ class Doctrine_Resource_Collection extends Doctrine_Resource_Access implements C public function get($key) { - if (!$key || !isset($this->_data[$key])) { + if (!isset($key) || !isset($this->_data[$key])) { return $this->add(); } else { return $this->_data[$key]; @@ -69,7 +63,7 @@ class Doctrine_Resource_Collection extends Doctrine_Resource_Access implements C public function set($key, $value) { - if (!$key || !isset($this->_data[$key])) { + if (!isset($key) || !isset($this->_data[$key])) { $this->_data[$key] = $value; } else { $val = $this->add(); @@ -78,29 +72,17 @@ class Doctrine_Resource_Collection extends Doctrine_Resource_Access implements C } } - public function add($value = null) + public function add(Doctrine_Resource_Record $value = null) { if (!$value) { - $model = $this->_model; - - $value = new $model(false); - $table = $value->getTable(); - $relation = $table->getRelationByClassName(get_class($this->_parent)); - $alias = $relation['alias']; - - if ($relation['type'] === Doctrine_Relation::ONE) { - $value->set($alias, $this->_parent); - } else { - $collection = new Doctrine_Resource_Collection($relation['class']); - $collection[] = $this->_parent; - - $value->set($alias, $collection); - } + $value = new $this->_model; } - $this->_data[] = $value; - - return $value; + if ($value) { + $this->_data[] = $value; + + return $value; + } } public function getIterator() @@ -115,15 +97,20 @@ class Doctrine_Resource_Collection extends Doctrine_Resource_Access implements C public function toArray($deep = false) { - $array = array(); + $data = array(); foreach ($this->_data as $key => $record) { - if ($record->exists() || $record->hasChanges()) { - $array[$this->_model . '_' .$key] = $record->toArray($deep); - } + $data[$key] = $record->toArray($deep); } - return $array; + return $data; + } + + public function fromArray(array $array) + { + foreach ($array as $key => $record) { + $this->add()->fromArray($record); + } } public function save() diff --git a/lib/Doctrine/Resource/Query.php b/lib/Doctrine/Resource/Query.php index 6a172c037..5dfbc5e66 100644 --- a/lib/Doctrine/Resource/Query.php +++ b/lib/Doctrine/Resource/Query.php @@ -55,25 +55,23 @@ class Doctrine_Resource_Query $request = new Doctrine_Resource_Request(); $request->set('dql', $this->getDql()); $request->set('params', $params); - $request->set('format', $this->getConfig()->get('format')); - $request->set('type', 'query'); + $request->set('action', 'query'); $request->set('model', $this->getModel()); $response = $request->execute(); - // If we have a response then lets parse it and hydrate it if (!empty($response)) { - return $request->hydrate($response, $this->getModel()); - // Otherwise lets return an empty collection for the queried for model + + $collection = new Doctrine_Resource_Collection($this->getModel()); + $collection->fromArray($response); } else { $model = $this->getModel(); - $collection = new Doctrine_Resource_Collection($this->getModel()); - - $collection[] = new $model(false); - - return $collection; + $collection = new Doctrine_Resource_Collection($model); + $collection[] = new $model(); } + + return $collection; } public function getDql() diff --git a/lib/Doctrine/Resource/Record.php b/lib/Doctrine/Resource/Record.php index cd7f5a59b..69a8da882 100644 --- a/lib/Doctrine/Resource/Record.php +++ b/lib/Doctrine/Resource/Record.php @@ -37,11 +37,11 @@ class Doctrine_Resource_Record extends Doctrine_Resource_Access implements Count protected $_model = null; protected $_changes = array(); - public function __construct($model, $loadRelations = true) + public function __construct($model) { $this->_model = $model; - $this->initialize($loadRelations); + $this->initialize(); } public function clearChanges() @@ -63,19 +63,6 @@ class Doctrine_Resource_Record extends Doctrine_Resource_Access implements Count } } } - - if (isset($schema['relations']) && $loadRelations) { - $relations = $schema['relations']; - - foreach ($relations as $relation) { - if ($relation['type'] === Doctrine_Relation::ONE) { - $this->_data[$relation['alias']] = new $relation['class'](false); - } else { - $this->_data[$relation['alias']] = new Doctrine_Resource_Collection($relation['class']); - $this->_data[$relation['alias']]->setParent($this); - } - } - } } public function getConfig($key = null) @@ -85,7 +72,7 @@ class Doctrine_Resource_Record extends Doctrine_Resource_Access implements Count public function get($key) { - if (!$key) { + if (!isset($key)) { return; } @@ -102,7 +89,7 @@ class Doctrine_Resource_Record extends Doctrine_Resource_Access implements Count public function set($key, $value) { - if (!$key) { + if (!isset($key)) { return; } @@ -127,18 +114,9 @@ class Doctrine_Resource_Record extends Doctrine_Resource_Access implements Count $class = $relation['class']; if ($relation['type'] === Doctrine_Relation::ONE) { - $return = new $class(false); - $table = $return->getTable(); - $returnRelation = $table->getRelationByClassName(get_class($this)); - - if ($returnRelation) { - $returnClass = new $returnRelation['class'](false); - - $return->set($returnRelation['alias'], $returnClass); - } + $return = new $class(); } else { $return = new Doctrine_Resource_Collection($class); - $return->setParent($this); } return $return; @@ -154,31 +132,6 @@ class Doctrine_Resource_Record extends Doctrine_Resource_Access implements Count return new ArrayIterator($this->_data); } - public function sameAs(Doctrine_Resource_Record $record) - { - // If we have same class name - if (get_class($this) == get_class($record)) { - - // If we have 2 records that exist and are persistant - if ($record->exists() && $this->exists()) { - if ($record->identifier() === $this->identifier()) { - return true; - } else { - return false; - } - // If we have unsaved records then lets compare the data - } else { - if ($record->toArray(false) === $this->toArray(false)) { - return true; - } else { - return false; - } - } - } else { - return false; - } - } - public function getChanges() { global $gotten; @@ -232,29 +185,21 @@ class Doctrine_Resource_Record extends Doctrine_Resource_Access implements Count public function save() { - $format = $this->getConfig('format'); - $request = new Doctrine_Resource_Request(); - $request->set('format', $format); - $request->set('type', 'save'); + $request->set('action', 'save'); $request->set('model', $this->getModel()); - $request->set('data', $this->getChanges()); $request->set('identifier', $this->identifier()); + $request->set('data', $this->getChanges()); $response = $request->execute(); - $this->_data = $request->hydrate(array($response), $this->_model, array($this))->getFirst()->_data; - - $this->clearChanges(); + $this->fromArray($response); } public function delete() { - $format = $this->getConfig('format'); - $request = new Doctrine_Resource_Request(); - $request->set('format', $format); - $request->set('type', 'delete'); + $request->set('action', 'delete'); $request->set('model', $this->getModel()); $request->set('identifier', $this->identifier()); @@ -306,42 +251,28 @@ class Doctrine_Resource_Record extends Doctrine_Resource_Access implements Count public function toArray($deep = false) { - global $gotten; - - if (!$gotten) { - $gotten = array(); - } - - $md5Hash = $this->getMd5Hash(); - - if (!in_array($md5Hash, $gotten)) { - $gotten[] = $md5Hash; - } - - $array = array(); + $data = array(); foreach ($this->_data as $key => $value) { - if ($deep && $this->getTable()->hasRelation($key)) { - if ($value instanceof Doctrine_Resource_Collection) { - if ($value->count() > 0) { - foreach ($value as $key2 => $record) { - if (($record->exists() || $record->hasChanges()) && !in_array($record->getMd5Hash(), $gotten)) { - $array[$key][get_class($record) . '_' . $key2] = $record->toArray($deep); - } - } - } - } else if ($value instanceof Doctrine_Resource_Record) { - if (($value->exists() || $value->hasChanges()) && !in_array($value->getMd5Hash(), $gotten)) { - $array[$key] = $value->toArray($deep); - } - } - } else if (!$this->getTable()->hasRelation($key) && $this->getTable()->hasColumn($key)) { - $array[$key] = $value; + $data[$key] = $this->$key->toArray($deep); + } else if ($this->getTable()->hasColumn($key)) { + $data[$key] = $value; } } - return $array; + return $data; + } + + public function fromArray(array $array) + { + foreach ($array as $key => $value) { + if ($this->getTable()->hasRelation($key) && is_array($value)) { + $this->$key->fromArray($value); + } else if ($this->getTable()->hasColumn($key)) { + $this->$key = $value; + } + } } public function getMd5Hash() diff --git a/lib/Doctrine/Resource/Request.php b/lib/Doctrine/Resource/Request.php index 87c3204cd..0f2148a14 100644 --- a/lib/Doctrine/Resource/Request.php +++ b/lib/Doctrine/Resource/Request.php @@ -43,14 +43,15 @@ class Doctrine_Resource_Request extends Doctrine_Resource_Params public function execute() { $url = $this->getConfig()->get('url'); - $data = array('type' => $this->get('type'), 'format' => $this->getConfig()->get('format'), 'data' => Doctrine_Parser::dump($this->getAll(), $this->getConfig()->get('format'))); + + $request = array('xml' => Doctrine_Parser::dump($this->getAll(), 'xml')); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POST, 1); - - curl_setopt($ch, CURLOPT_POSTFIELDS, $data); + + curl_setopt($ch, CURLOPT_POSTFIELDS, $request); $response = curl_exec($ch); if (curl_errno($ch)) { @@ -71,66 +72,4 @@ class Doctrine_Resource_Request extends Doctrine_Resource_Params return $array; } - - public function hydrate(array $array, $model, $records = array()) - { - $collection = new Doctrine_Resource_Collection($model); - - foreach ($array as $recordKey => $record) { - if (isset($records[$recordKey])) { - $r = $records[$recordKey]; - } else { - $r = new $model(false); - } - - foreach ($record as $key => $value) { - if ($r->getTable()->hasRelation($key) && !empty($value)) { - $relation = $r->getTable()->getRelation($key); - - if ($relation['type'] === Doctrine_Relation::MANY) { - $relationCollection = $this->hydrate($value, $relation['class']); - $relationCollection->setParent($r); - - foreach ($relationCollection as $relationRecord) { - $relationTable = $relationRecord->getTable(); - - if ($relation = $relationTable->getRelationByClassName($model)) { - if ($relation['type'] === Doctrine_Relation::ONE) { - $relationRecord->set($relation['alias'], $r); - $relationRecord->clearChanges(); - } else { - $coll = new Doctrine_Resource_Collection($relation['class']); - $coll[] = $r; - - $relationRecord->set($relation['alias'], $coll); - } - - $relationRecord->clearChanges(); - } - } - - $r->set($key, $relationCollection); - } else { - $relationRecord = $this->hydrate(array($value), $relation['class'])->getFirst(); - $relationTable = $relationRecord->getTable(); - - if ($relation = $relationTable->getRelationByClassName($model)) { - $relationRecord->set($relation['alias'], $r); - $relationRecord->clearChanges(); - } - - $r->set($key, $relationRecord); - } - } else if($r->getTable()->hasColumn($key)) { - $r->set($key, $value); - } - - $r->clearChanges(); - } - - $collection[] = $r; - } - - return $collection; - } } \ No newline at end of file diff --git a/lib/Doctrine/Resource/Server.php b/lib/Doctrine/Resource/Server.php index ed6762d9c..1b3e9ad4c 100644 --- a/lib/Doctrine/Resource/Server.php +++ b/lib/Doctrine/Resource/Server.php @@ -52,7 +52,42 @@ class Doctrine_Resource_Server extends Doctrine_Resource return $instance; } + + public function validate($errors) + { + if (!empty($errors)) { + throw new Doctrine_Resource_Exception(count($errors) . ' error(s) occurred: ' . implode('. ', $errors)); + } else { + return true; + } + } + + public function validateOpenRecord($request) + { + $errors = array(); + if (!$request->has('model') || !$request->get('model')) { + $errors[] = 'You must specify the model/class name you are deleting'; + } + + if (!$request->has('identifier') || !is_array($request->get('identifier'))) { + $errors[] = 'You must specify an array containing the identifiers for the model you wish to delete'; + } + + return $errors; + } + + public function validateSave($request) + { + $errors = $this->validateOpenRecord($request); + + if (!$request->has('data') || !$request->get('data')) { + $errors[] = 'You must specify an containing the changed data to save to the model'; + } + + return $errors; + } + public function executeSave($request) { $model = $request->get('model'); @@ -80,6 +115,11 @@ class Doctrine_Resource_Server extends Doctrine_Resource return $record->toArray(true, true); } + public function validateDelete($request) + { + return $this->validateOpenRecord($request); + } + public function executeDelete($request) { $model = $request->get('model'); @@ -89,7 +129,22 @@ class Doctrine_Resource_Server extends Doctrine_Resource $record = $table->find($identifier); - $record->delete(); + if ($record) { + $record->delete(); + } else { + throw new Doctrine_Resource_Exception('Record could not be deleted because it is not a valid record'); + } + } + + public function validateQuery($request) + { + $errors = array(); + + if (!$request->has('dql') || !$request->get('dql')) { + $errors[] = 'You must specify a dql string in order to execute a query'; + } + + return $errors; } public function executeQuery($request) @@ -102,16 +157,23 @@ class Doctrine_Resource_Server extends Doctrine_Resource return $conn->query($dql, $params)->toArray(true, true); } + public function validateLoad($request) + { + $errors = array(); + + return $errors; + } + public function executeLoad($request) { - $path = '/tmp/' . rand() . '.' . $request->get('format'); + $path = '/tmp/' . rand(); $models = $this->getConfig('models') ? $this->getConfig('models'):array(); $export = new Doctrine_Export_Schema(); - $export->exportSchema($path, $request->get('format'), null, $models); + $export->exportSchema($path, 'xml', null, $models); - $schema = Doctrine_Parser::load($path, $request->get('format')); + $schema = Doctrine_Parser::load($path, 'xml'); unlink($path); @@ -120,28 +182,28 @@ class Doctrine_Resource_Server extends Doctrine_Resource public function execute(array $r) { - if (!isset($r['data'])) { - throw new Doctrine_Resource_Exception('You must specify a data xml string in your request'); - } - - $type = $r['type']; - $format = isset($r['format']) ? $r['format']:'xml'; - $data = Doctrine_Parser::load($r['data'], $format); - - $funcName = 'execute' . Doctrine::classify($type); - - $requestObj = new Doctrine_Resource_Request($data); - - if (method_exists($this, $funcName)) { - $result = $this->$funcName($requestObj); - } else { - throw new Doctrine_Resource_Exception('Unknown Doctrine Resource Server function'); + if (!isset($r['xml'])) { + throw new Doctrine_Resource_Exception('You must specify an xml string in your request'); } - if ($result) { - return Doctrine_Parser::dump($result, $format); + $requestArray = Doctrine_Parser::load($r['xml']); + + $request = new Doctrine_Resource_Request($requestArray); + + $funcName = 'execute' . Doctrine::classify($request->get('action')); + + if (method_exists($this, $funcName)) { + $validateFuncName = 'validate' . Doctrine::classify($request->get('action')); + + $errors = $this->$validateFuncName($request); + + if ($this->validate($errors)) { + $result = $this->$funcName($request); + + return Doctrine_Parser::dump($result, 'xml'); + } } else { - return null; + throw new Doctrine_Resource_Exception('Unknown Doctrine Resource Server function'); } } diff --git a/lib/Doctrine/Resource/Table.php b/lib/Doctrine/Resource/Table.php index 4f4775735..65f942825 100644 --- a/lib/Doctrine/Resource/Table.php +++ b/lib/Doctrine/Resource/Table.php @@ -119,19 +119,6 @@ class Doctrine_Resource_Table } } - public function getRelationByClassName($name) - { - $relations = $this->getRelations(); - - foreach ($relations as $relation) { - if ($relation['class'] === $name) { - return $relation; - } - } - - return false; - } - public function getIdentifier() { $identifier = array(); diff --git a/playground/index.php b/playground/index.php index f594357d3..c652b72c4 100644 --- a/playground/index.php +++ b/playground/index.php @@ -1,9 +1,7 @@ run($_REQUEST); } else { - $url = 'http://localhost/~jwage/doctrine_trunk/playground/index.php?action=server'; - $config = array('format' => 'yml'); + $url = 'http://localhost/~jwage/doctrine_trunk/playground/index.php?server'; + $config = array('format' => 'xml'); // Instantiate a new client $client = Doctrine_Resource_Client::getInstance($url, $config); - /* $query = new Doctrine_Resource_Query(); - $users = $query->from('User u, u.Group g')->execute(); - print_r($users->toArray(true)); - */ + $users = $query->from('User u')->execute(); - /* - $group = new Group(); - $group->name = 'Jon'; - $group->save(); - - print_r($group->toArray()); - */ - - //$client->printSchema(); - - /* - // Retrieve a models table object - $table = $client->getTable('User'); - - $user = new User(); - $user->name = 'Jon Wage'; - - $user->Email->address = 'jonwage@gmail.com'; - - $phone = $user->Phonenumber[0]; - $phone->phonenumber = '555-5555'; - - $phone = $user->Phonenumber[1]; - $phone->phonenumber = '555-55555'; - - $user->Phonenumber[2]->phonenumber = '555'; - - $user->Account->amount = 50.00; - - $user->Account->amount = 25.25; - - $address = $user->Address[0]; - - $address->address = '112 2nd Ave North'; - - $album = $user->Album[0]; - $album->name = 'test album'; - - $song = $album->Song[0]; - $song->title = 'test author'; - - $user->save(); - - print_r($user->toArray(true)); - */ + print_r($users->toArray()); } \ No newline at end of file