/** * 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; }