Current section
Files
Jump to
Current section
Files
lib/plug/pagecache/adapter/ets.ex
defmodule Plug.PageCache.Adapter.ETS do
@moduledoc """
PageCache adapter for ETS storage.
"""
use Plug.PageCache.Adapter
require Logger
# Adapter lifecycle
def init(opts) do
ets_tid = case opts[:table] do
nil ->
Logger.warn "No ETS table configured for cache '#{ opts[:name] }'." <>
" Cache will be noop!"
nil
table -> :ets.new(table, [ :protected, :named_table, :set ])
end
{ :ok, %{ auto_expire: opts[:auto_expire] || 0,
ets_tid: ets_tid }}
end
# Adapter methods
def clean(state) do
_ = :ets.delete_all_objects(state.ets_tid)
{ state, :ok }
end
def load(state, path) do
case :ets.lookup(state.ets_tid, path) do
[{ ^path, page, expire_after }] ->
case :os.system_time(:seconds) <= expire_after do
true -> { state, page }
false -> { state, nil }
end
_ -> { state, nil }
end
end
def remove(state, path) do
_ = :ets.delete(state.ets_tid, path)
{ state, :ok }
end
def save(state, path, page) do
expire_after = :os.system_time(:seconds) + state.auto_expire
_ = :ets.insert(state.ets_tid, { path, page, expire_after })
{ state, :ok }
end
end