/** * Persists this object to the database. * * If the object is new, it inserts it; otherwise an update is performed. * All modified related objects will also be persisted in the doSave() * method. This method wraps all precipitate database operations in a * single transaction. * * @param PropelPDO $con * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. * @throws PropelException * @throws Exception * @see doSave() */ public function save(PropelPDO $con = null) { if ($this->isDeleted()) { throw new PropelException("You cannot save an object that has been deleted."); } if ($con === null) { $con = Propel::getConnection(LinkPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); } $con->beginTransaction(); $isInsert = $this->isNew(); try { $ret = $this->preSave($con); if ($isInsert) { $ret = $ret && $this->preInsert($con); // denyable behavior if (!(LinkPeer::isIgnoringRights() || $this->mayOperate("insert"))) { throw new PropelException(new NotPermittedException("insert.by_role", array("role_key" => "links"))); } // extended_timestampable behavior if (!$this->isColumnModified(LinkPeer::CREATED_AT)) { $this->setCreatedAt(time()); } if (!$this->isColumnModified(LinkPeer::UPDATED_AT)) { $this->setUpdatedAt(time()); } // attributable behavior if (Session::getSession()->isAuthenticated()) { if (!$this->isColumnModified(LinkPeer::CREATED_BY)) { $this->setCreatedBy(Session::getSession()->getUser()->getId()); } if (!$this->isColumnModified(LinkPeer::UPDATED_BY)) { $this->setUpdatedBy(Session::getSession()->getUser()->getId()); } } } else { $ret = $ret && $this->preUpdate($con); // denyable behavior if (!(LinkPeer::isIgnoringRights() || $this->mayOperate("update"))) { throw new PropelException(new NotPermittedException("update.by_role", array("role_key" => "links"))); } // extended_timestampable behavior if ($this->isModified() && !$this->isColumnModified(LinkPeer::UPDATED_AT)) { $this->setUpdatedAt(time()); } // attributable behavior if (Session::getSession()->isAuthenticated()) { if ($this->isModified() && !$this->isColumnModified(LinkPeer::UPDATED_BY)) { $this->setUpdatedBy(Session::getSession()->getUser()->getId()); } } } if ($ret) { $affectedRows = $this->doSave($con); if ($isInsert) { $this->postInsert($con); } else { $this->postUpdate($con); } $this->postSave($con); LinkPeer::addInstanceToPool($this); } else { $affectedRows = 0; } $con->commit(); return $affectedRows; } catch (Exception $e) { $con->rollBack(); throw $e; } }