Go to the documentation of this file.00001 <?php
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00015 abstract class StorableDAO extends ProtoDAO
00016 {
00017 public function take(Identifiable $object)
00018 {
00019 return
00020 $object->getId()
00021 ? $this->merge($object, true)
00022 : $this->add($object);
00023 }
00024
00025 public function add(Identifiable $object)
00026 {
00027 return
00028 $this->inject(
00029 OSQL::insert(),
00030 $object->setId(
00031 DBPool::getByDao($this)->obtainSequence(
00032 $this->getSequence()
00033 )
00034 )
00035 );
00036 }
00037
00038 public function save(Identifiable $object)
00039 {
00040 return
00041 $this->inject(
00042 $this->targetizeUpdateQuery(OSQL::update(), $object),
00043 $object
00044 );
00045 }
00046
00047 public function import(Identifiable $object)
00048 {
00049 return
00050 $this->inject(
00051 OSQL::insert(),
00052 $object
00053 );
00054 }
00055
00056 public function merge(Identifiable $object, $cacheOnly = true)
00057 {
00058 Assert::isNotNull($object->getId());
00059
00060 $this->checkObjectType($object);
00061
00062 $old = Cache::worker($this)->getCachedById($object->getId());
00063
00064 if (!$old) {
00065 if ($cacheOnly)
00066 return $this->save($object);
00067 else
00068 $old = Cache::worker($this)->getById($object->getId());
00069 }
00070
00071 return $this->unite($object, $old);
00072 }
00073
00074 public function unite(
00075 Identifiable $object, Identifiable $old
00076 )
00077 {
00078 Assert::isNotNull($object->getId());
00079
00080 Assert::isTypelessEqual(
00081 $object->getId(), $old->getId(),
00082 'cannot merge different objects'
00083 );
00084
00085 $query = OSQL::update($this->getTable());
00086
00087 foreach ($this->getProtoClass()->getPropertyList() as $property) {
00088 $getter = $property->getGetter();
00089
00090 if ($property->getClassName() === null) {
00091 $changed = ($old->$getter() !== $object->$getter());
00092 } else {
00097 $changed =
00098 ($old->$getter() !== $object->$getter())
00099 || ($old->$getter() != $object->$getter());
00100 }
00101
00102 if ($changed)
00103 $property->fillQuery($query, $object);
00104 }
00105
00106 if (!$query->getFieldsCount())
00107 return $object;
00108
00109 $this->targetizeUpdateQuery($query, $object);
00110
00111 return $this->doInject($query, $object);
00112 }
00113
00117 private function targetizeUpdateQuery(
00118 UpdateQuery $query,
00119 Identifiable $object
00120 )
00121 {
00122 return $query->where(Expression::eqId($this->getIdName(), $object));
00123 }
00124 }
00125 ?>