Ejemplo n.º 1
0
 /**
  * все сохранение делается внутри транзакции (включая beforeSave и afterSave), если будет исключение - транзакция будет откачена PDO
  */
 public function save()
 {
     ActiveRecordHelper::exceptionIfObjectIsIncompatibleWithActiveRecord($this);
     $obj_class_name = get_class($this);
     $obj_db_id = $obj_class_name::DB_ID;
     $transaction_is_my = false;
     if (!DBWrapper::inTransaction($obj_db_id)) {
         DBWrapper::beginTransaction($obj_db_id);
         $transaction_is_my = true;
     }
     $this->beforeSave();
     \OLOG\Model\ActiveRecordHelper::saveModelObj($this);
     // не вызываем afterSave если это вызов save для этого объекта изнутри aftersave этого же объекта (для предотвращения бесконечного рекурсивного вызова afterSave)
     static $__inprogress = [];
     $inprogress_key = FullObjectId::getFullObjectId($this);
     if (!array_key_exists($inprogress_key, $__inprogress)) {
         $__inprogress[$inprogress_key] = 1;
         $this->afterSave();
         unset($__inprogress[$inprogress_key]);
     }
     // комитим только если мы же и стартовали транзакцию (на случай вложенных вызовов)
     if ($transaction_is_my) {
         DBWrapper::commitTransaction($obj_db_id);
     }
 }
Ejemplo n.º 2
0
 /**
  * все удаление делается внутри транзакции (включая canDelete и afterDelete), если будет исключение - транзакция будет откачена PDO
  */
 public static function deleteModel($obj)
 {
     self::exceptionIfObjectIsIncompatibleWithActiveRecord($obj);
     $obj_class_name = get_class($obj);
     $obj_db_id = $obj_class_name::DB_ID;
     $transaction_is_my = false;
     if (!DBWrapper::inTransaction($obj_db_id)) {
         DBWrapper::beginTransaction($obj_db_id);
         $transaction_is_my = true;
     }
     $can_delete_message = '';
     if ($obj instanceof \OLOG\Model\InterfaceDelete) {
         if (!$obj->canDelete($can_delete_message)) {
             if ($transaction_is_my) {
                 DBWrapper::rollBackTransaction($obj_db_id);
             }
             throw new \Exception($can_delete_message);
         }
     }
     \OLOG\Model\ActiveRecordHelper::deleteModelObj($obj);
     if ($obj instanceof \OLOG\Model\InterfaceDelete) {
         $obj->afterDelete();
     }
     if ($transaction_is_my) {
         DBWrapper::commitTransaction($obj_db_id);
     }
 }