anchor.diff:  -type return_type() :: dict | list | proplist | tuple | insert | update.
   -type return_value() :: insert_id() | affected_rows()
                           | [list() | tuple() | t_dict() | proplist()].
  +-ifdef(has_maps).
  +-type proplist_or_map() :: proplist() | map().
  +-else.
  +-type proplist_or_map() :: proplist().
  +-endif.
   
   -export_type([
       sql/0,
  
positive.code:         _ -> 
              plu(Table,KeyField,PropList)
      end.
  
  -spec filter_fields(Table :: table(), PropList :: proplist()) -> proplist().
  % @doc removes from Proplist any fields that aren't found in the table "Table"
  
negative.code:     ok = ?ADAPTER:connect(DB, ?USER, ?PASS, ?HOST, ?PORT),
      DB.
  
  -spec save(Table :: table(), Data :: proplist_or_map()) -> insert_id() | affected_rows().
  save(Table, Data0) ->
      Data = ensure_proplist(Data0),
      save_(Table, Data).
  
  -spec save(Table :: table(), KeyField :: field(), Data0 :: proplist_or_map()) -> insert_id().
  save(Table, KeyField, Data0) ->
      Data = ensure_proplist(Data0),
      save_(Table, KeyField, Data).
      
  save_(Table,PropList) when is_atom(Table) ->
      save_(atom_to_list(Table),PropList);
  save_(Table,PropList) when is_list(Table) ->
      KeyField = Table ++ "id",
      save_(Table,KeyField,PropList).
  
  save_(Table,KeyField,PropList) when is_atom(Table) ->
      save_(atom_to_list(Table),KeyField,PropList);
  save_(Table,KeyField,PropList) when is_list(KeyField) ->
      save_(Table,list_to_atom(KeyField),PropList);
  save_(Table,KeyField,PropList) when is_list(Table) ->
      KeyValue = proplists:get_value(KeyField,PropList,0),
      case KeyValue of
          Zero when Zero == 0;
  