1 entity.controller.inc public EntityDatabaseStorageController::save(EntityInterface $entity)

Implements EntityStorageControllerInterface::save().

Overrides EntityStorageControllerInterface::save

File

core/modules/entity/entity.controller.inc, line 754
Entity API controller classes and interface.

Class

EntityDatabaseStorageController
Implements the entity storage controller interface for the database.

Code

public function save(EntityInterface $entity) {
  $transaction = db_transaction();
  try {
    // Load the stored entity, if any.
    if (!$entity->isNew() && !isset($entity->original)) {
      $entity->original = entity_load_unchanged($this->entityType, $entity->id());
    }

    $this->preSave($entity);
    $this->invokeHook('presave', $entity);

    if (!$entity->isNew()) {
      $return = backdrop_write_record($this->entityInfo['base table'], $entity, $this->idKey);
      $this->resetCache(array($entity->{$this->idKey}));
      $this->postSave($entity, TRUE);
      $this->invokeHook('update', $entity);
    }
    else {
      $return = backdrop_write_record($this->entityInfo['base table'], $entity);
      // Reset general caches, but keep caches specific to certain entities.
      $this->resetCache(array());
      $this->postSave($entity, FALSE);
      $this->invokeHook('insert', $entity);
    }

    // Ignore replica server temporarily.
    db_ignore_replica();
    unset($entity->is_new);
    unset($entity->original);

    return $return;
  }
  catch (Exception $e) {
    $transaction->rollback();
    watchdog_exception($this->entityType, $e);
    throw new EntityStorageException($e->getMessage(), (int) $e->getCode(), $e);
  }
}