anchor.diff:          , audit_readGT/5    %% (User, Channel, Item, TS1, Limit)    read audit info after Timestamp1, return Limit results or less
           , hist_read/3       %% (User, Channel, KeyList)             return history list as maps for given keys
           , hist_read_deleted/3 %% (User, Channel, Key)               return the oldvalue of the deleted object
  -        , hist_read_shallow/3 %% (User, Channel, Key)               return the shallow list of deleted objects
  -        , search_deleted/6  %% (User, Channel, Ckey1, Ckey2, Text, DelStatus) from key at or after CKey1 to last key before CKey2, finds {K,V} with text in V
  -        , search_deleted_clients/6 %% (User, Channel, Ckey1, Ckey2, Text, Limit) from key at or after CKey1 to last key before CKey2, finds {K,V} with text in V in deleted clients
  -        , search_deleted_objects/6 %% (User, Channel, Ckey1, Ckey2, Text, Limit) from key at or after CKey1 to last key before CKey2, finds {K,V} with text in V in deleted objects
           , remove/3          %% (User, Channel, RowList)             delete a resource will fail if it was modified, rows should be in map format
           , remove/4          %% (User, Channel, RowList, Opts)       delete a resource will fail if it was modified, rows should be in map format, with trigger options
           , delete/3          %% (User, Channel, KeyTable)            do not complain if keys do not exist
  
positive.code: 
  skvh_rec_to_map(#skvhTable{ckey=EncodedKey, cvalue=CValue, chash=CHash}) ->
      CKey = imem_datatype:binterm_to_term(EncodedKey),
      #{ckey => CKey, cvalue => CValue, chash => CHash}.
  
  skvh_audit_to_map(#skvhAudit{time = Time, ckey = EncodedKey, ovalue = OldValue,
                               nvalue = NewValue, cuser = User}) ->
  
negative.code: hist_read_deleted(User, Channel, DecodedKey) ->
  [#{cvhist := [#{ovalue := Value} |_]}] = hist_read(User, Channel, [DecodedKey]),
      Value.
  
  %% Data Access per key range
  
  