class Cache
Provides a local in-memory cache for DNS resources.
Definitions
def initialize
Create a new cache.
Implementation
def initialize
@store = {}
end
def fetch(name, resource_classes)
Fetch a resource from the cache, or if it is not present, yield to the block to fetch it.
Signature
-
parameter
nameString The name of the resource.
-
parameter
resource_classesArray(Class(Resolv::DNS::Resource)) The classes of the resources to fetch.
-
yields
{|name, resource_class| ...} The block to fetch the resource, it should call
#storeto store the resource in the cache.
Implementation
def fetch(name, resource_classes)
now = Async::Clock.now
resource_classes.map do |resource_class|
key = [name, resource_class]
if entries = @store[key]
entries.delete_if do |entry|
!entry.fresh?(now)
end
else
entries = (@store[key] = [])
end
if entries.empty?
yield(name, resource_class)
end
entries
end.flatten.map(&:resource)
end
def store(name, resource_class, resource)
Store a resource in the cache.
Signature
-
parameter
nameString The name of the resource.
-
parameter
resource_classClass(Resolv::DNS::Resource) The class of the resource.
-
parameter
resourceResolv::DNS::Resource The resource to store.
Implementation
def store(name, resource_class, resource)
key = [name, resource_class]
entries = (@store[key] ||= [])
entries << Entry.new(Async::Clock.now, name, resource_class, resource)
end