Esempio n. 1
0
 /**
  * Gets information about changed records using a type and id and a logid.
  * RedBean Locking shields you from race conditions by comparing the latest
  * cached insert id with a the highest insert id associated with a write action
  * on the same table. If there is any id between these two the record has
  * been changed and RedBean will throw an exception. This function checks for changes.
  * If changes have occurred it will throw an exception. If no changes have occurred
  * it will insert a new change record and return the new change id.
  * This method locks the log table exclusively.
  * @param  string $type
  * @param  integer $id
  * @param  integer $logid
  * @return integer $newchangeid
  */
 public function checkChanges($type, $id, $logid)
 {
     $type = $this->writer->check($type);
     $id = (int) $id;
     $logid = (int) $logid;
     $num = $this->adapter->getCell("\n        SELECT count(*) FROM __log WHERE tbl=\"{$type}\" AND itemid={$id} AND action=2 AND id > {$logid}");
     if ($num) {
         throw new RedBean_Exception_FailedAccessBean("Locked, failed to access (type:{$type}, id:{$id})");
     }
     $this->adapter->exec("INSERT INTO __log (id,action,tbl,itemid) VALUES(NULL, 2,:tbl,:id)", array(":tbl" => $type, ":id" => $id));
     $newid = $this->adapter->getInsertID();
     if ($this->adapter->getCell("select id from __log where tbl=:tbl AND id < {$newid} and id > {$logid} and action=2 and itemid={$id} ", array(":tbl" => $type))) {
         throw new RedBean_Exception_FailedAccessBean("Locked, failed to access II (type:{$type}, id:{$id})");
     }
     return $newid;
 }