-module(identity_policy_ets). -include("policy.hrl"). -export([init/0]). -export([get_policies/1, insert/1, delete/1, update/2]). init() -> ets:new(identity_policy, [named_table, bag, public, {keypos, 2}, {read_concurrency, true}]). -spec get_policies(IdentityId :: integer()) -> [PolicyId :: integer()]. get_policies(IdentityId) when is_integer(IdentityId) -> Records = ets:lookup(identity_policy, IdentityId), lists:map(fun(#identity_policy{policy_id = PolicyId}) -> PolicyId end, Records). insert(#{<<"identity_id">> := IdentityId, <<"policy_id">> := PolicyId}) -> insert(#identity_policy{identity_id = IdentityId, policy_id = PolicyId}); insert(IdentityPolicy=#identity_policy{}) -> true = ets:insert(identity_policy, IdentityPolicy). delete(#{<<"identity_id">> := IdentityId, <<"policy_id">> := PolicyId}) -> ets:delete_object(identity_policy, #identity_policy{identity_id = IdentityId, policy_id = PolicyId}); delete(IdentityPolicy = #identity_policy{}) -> true = ets:delete_object(identity_policy, IdentityPolicy). update(NewData=#{<<"identity_id">> := IdentityId, <<"policy_id">> := PolicyId}, OldData) -> %% 清理老的数据 #{<<"identity_id">> := OldIdentityId, <<"policy_id">> := OldPolicyId} = maps:merge(NewData, OldData), ets:delete_object(identity_policy, #identity_policy{identity_id = OldIdentityId, policy_id = OldPolicyId}), ets:insert(identity_policy, #identity_policy{identity_id = IdentityId, policy_id = PolicyId}).