Current section

Files

Jump to
krug lib krug ecto base.ecto.dao.sql.cache.ex
Raw

lib/krug/ecto/base.ecto.dao.sql.cache.ex

defmodule Krug.BaseEctoDAOSqlCache do
@moduledoc false
alias Krug.StringUtil
alias Krug.MapUtil
alias Krug.EtsUtil
alias Krug.DateUtil
def extract_table_name(sql) do
sql = sql |> StringUtil.trim() |> StringUtil.replace("("," ") |> StringUtil.replace(" "," ")
split_string = cond do
(sql |> String.contains?("insert into ")) -> "insert into "
(sql |> String.contains?("update ")) -> "update "
true -> " from "
end
sql |> StringUtil.split(split_string) |> Enum.at(1) |> StringUtil.split(" ") |> Enum.at(0)
end
def load_from_cache(sql,params) do
EtsUtil.new(:krug_base_ecto_dao_sql_tables_cache,"public")
EtsUtil.read_from_cache(:krug_sql_tables_cache,extract_table_name(sql))
|> extract_key_par_list(sql,params)
end
def put_cache(sql,params,resultset) do
EtsUtil.new(:krug_base_ecto_dao_sql_tables_cache,"public")
table = extract_table_name(sql)
list_new = EtsUtil.read_from_cache(:krug_base_ecto_dao_sql_tables_cache,table)
|> replace_key_par_in_list(sql,params,resultset,0)
EtsUtil.store_in_cache(:krug_base_ecto_dao_sql_tables_cache,table,list_new)
resultset
end
def clear_cache(sql) do
EtsUtil.new(:krug_base_ecto_dao_sql_tables_cache,"public")
EtsUtil.remove_from_cache(:krug_base_ecto_dao_sql_tables_cache,extract_table_name(sql))
end
defp replace_key_par_in_list(list,sql,params,resultset,counter) do
cond do
(nil == list or counter >= length(list))
-> append_new_resultset_params_in_list(list,sql,params,resultset)
(list |> Enum.at(counter) |> MapUtil.get(:sql) != sql)
-> replace_key_par_in_list(list,sql,params,resultset,counter + 1)
(list |> Enum.at(counter) |> MapUtil.get(:params) != params)
-> replace_key_par_in_list(list,sql,params,resultset,counter + 1)
true -> replace_resultset_at_list(list,counter,resultset)
end
end
defp replace_resultset_at_list(list,position,resultset) do
map = list |> Enum.at(position) |> MapUtil.replace(:resultset,resultset)
map = map |> MapUtil.replace(:lastusedtime,DateUtil.get_date_time_now_millis())
List.replace_at(list,position,map)
end
defp extract_key_par_list(list,sql,params) do
cond do
(nil == list or length(list) == 0) -> nil
(list |> hd() |> MapUtil.get(:sql) == sql
and list |> hd() |> MapUtil.get(:params) == params)
-> list |> hd() |> MapUtil.get(:resultset)
true -> extract_key_par_list(list |> tl(),sql,params)
end
end
defp append_new_resultset_params_in_list(list,sql,params,resultset) do
map = %{
sql: sql,
params: params,
resultset: resultset,
lastusedtime: DateUtil.get_date_time_now_millis()
}
cond do
(nil == list or length(list) == 0) -> [map]
true -> [map | list] |> remove_old_cache_results()
end
end
defp remove_old_cache_results(list) do
cond do
(length(list) < 4) -> list
true -> Enum.sort(list, &(&1.lastusedtime > &2.lastusedtime))
|> Enum.slice(0,4)
end
end
end