/** * Check for existing session with id $sid. * * Note: this verifies the storage backend only, not the actual session records. * * @param string $sid * @return bool true if session found. */ public function session_exists($sid) { try { return $this->database->record_exists('sessions', array('sid' => $sid, 'state' => 0)); } catch (\dml_exception $ex) { return false; } }
/** * Create and get a lock * @param string $resource - The identifier for the lock. Should use frankenstyle prefix. * @param int $timeout - The number of seconds to wait for a lock before giving up. * @param int $maxlifetime - Unused by this lock type. * @return boolean - true if a lock was obtained. */ public function get_lock($resource, $timeout, $maxlifetime = 86400) { $token = $this->generate_unique_token(); $now = time(); $giveuptime = $now + $timeout; $expires = $now + $maxlifetime; if (!$this->db->record_exists('lock_db', array('resourcekey' => $resource))) { $record = new \stdClass(); $record->resourcekey = $resource; $result = $this->db->insert_record('lock_db', $record); } $params = array('expires' => $expires, 'token' => $token, 'resourcekey' => $resource, 'now' => $now); $sql = 'UPDATE {lock_db} SET expires = :expires, owner = :token WHERE resourcekey = :resourcekey AND (owner IS NULL OR expires < :now)'; do { $now = time(); $params['now'] = $now; $this->db->execute($sql, $params); $countparams = array('owner' => $token, 'resourcekey' => $resource); $result = $this->db->count_records('lock_db', $countparams); $locked = $result === 1; if (!$locked) { usleep(rand(10000, 250000)); // Sleep between 10 and 250 milliseconds. } // Try until the giveup time. } while (!$locked && $now < $giveuptime); if ($locked) { $this->openlocks[$token] = 1; return new lock($token, $this); } return false; }