/**
  * 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;
 }
 /**
  * @param moodle_database $db the database connection to use to access the cache.
  * @return int the number of entries in the cache.
  */
 public static function entries_count($db)
 {
     return $db->count_records('qtype_stack_cas_cache');
 }