345
345
sort_db_list(DbList, Sort, Sort, Rev, Rev, KeyNo, KeyNo) ->
346
346
% Already sorted!
348
sort_db_list(DbList, false, OldSort, Rev, OldRev, KeyNo, OldKeyNo) ->
348
sort_db_list(DbList, false, _OldSort, _Rev, _OldRev, _KeyNo, _OldKeyNo) ->
349
349
% No sorting, i.e., the old list order suffices!
351
sort_db_list(DbList, Sort, OldSort, Rev, OldRev, KeyNo, OldKeyNo) ->
351
sort_db_list(DbList, _Sort, _OldSort, Rev, _OldRev, KeyNo, _OldKeyNo) ->
352
352
tv_db_sort:mergesort(KeyNo, DbList, Rev).
580
576
fun({Data,Color}, {Replaced,AccDb}) when element(KeyNo,Data) /= Key ->
581
577
{Replaced, [{Data,Color} | AccDb]};
582
({Data,Color}, {Replaced,AccDb}) when Replaced == false,
578
({_Data,Color}, {Replaced,AccDb}) when Replaced == false,
583
579
OldColor == ?BLACK,
584
580
Color == ?BLACK ->
585
581
{true, [{Obj,?RED1} | AccDb]};
586
({Data,Color}, {Replaced,AccDb}) when Replaced == false,
582
({_Data,Color}, {Replaced,AccDb}) when Replaced == false,
587
583
OldColor /= ?BLACK,
588
584
Color /= ?BLACK ->
589
585
{true, [{Obj,?GREEN1} | AccDb]};
590
({Data,Color}, {Replaced,AccDb}) ->
586
({_Data,_Color}, {Replaced,AccDb}) ->
591
587
{Replaced, AccDb}
594
590
fun({Data,Color}, {Replaced,AccDb}) ->
595
591
ElemKey = element(KeyNo,Data),
618
fun({Data,Color}, {Replaced,AccDb}) when Data == Obj ->
614
fun({Data,_Color}, {Replaced,AccDb}) when Data == Obj ->
619
615
{Replaced, AccDb};
620
616
({Data,Color}, {Replaced,AccDb}) when Data /= OldObj ->
621
617
{Replaced, [{Data,Color} | AccDb]};
622
618
%% Clauses when Data == OldObj.
623
({Data,Color}, {Replaced,AccDb}) when Replaced == false,
619
({_Data,Color}, {Replaced,AccDb}) when Replaced == false,
624
620
OldColor == ?BLACK,
625
621
Color == ?BLACK ->
626
622
{true, [{Obj,?RED1} | AccDb]};
627
({Data,Color}, {Replaced,AccDb}) when Replaced == false,
623
({_Data,Color}, {Replaced,AccDb}) when Replaced == false,
628
624
OldColor /= ?BLACK,
629
625
Color /= ?BLACK ->
630
626
{true, [{Obj,Color} | AccDb]};
631
({Data,Color}, {Replaced,AccDb}) ->
627
({_Data,_Color}, {Replaced,AccDb}) ->
632
628
{Replaced, AccDb}
635
631
fun({Data,Color}, {Replaced,AccDb}) when Data == OldObj,
636
632
Replaced == false,
637
633
OldColor == ?BLACK,
642
638
OldColor /= ?BLACK,
643
639
Color /= ?BLACK ->
644
640
{true, [{Obj,?GREEN1} | AccDb]};
645
({Data,Color}, {Replaced,AccDb}) when Data == OldObj ->
641
({Data,_Color}, {Replaced,AccDb}) when Data == OldObj ->
646
642
{Replaced, AccDb};
647
({Data,Color}, {Replaced,AccDb}) when Data == Obj ->
643
({Data,_Color}, {Replaced,AccDb}) when Data == Obj ->
648
644
{Replaced, AccDb};
649
645
({Data,Color}, {Replaced,AccDb}) ->
650
646
{Replaced, [{Data,Color} | AccDb]}
660
656
{Replaced, [{Data,Color} | AccDb]};
661
657
({Data,Color}, {Replaced,AccDb}) when Data /= OldObj ->
662
658
{Replaced, [{Data,Color} | AccDb]};
663
({Data,Color}, {Replaced,AccDb}) when Replaced == false,
659
({_Data,Color}, {Replaced,AccDb}) when Replaced == false,
664
660
OldColor == ?BLACK,
665
661
Color == ?BLACK ->
666
662
{true, [{Obj,?RED1} | AccDb]};
667
({Data,Color}, {Replaced,AccDb}) when Replaced == false,
663
({_Data,Color}, {Replaced,AccDb}) when Replaced == false,
668
664
OldColor /= ?BLACK,
669
665
Color /= ?BLACK ->
670
666
{true, [{Obj,Color} | AccDb]};
671
667
({Data,Color}, {Replaced,AccDb}) ->
672
668
{Replaced, [{Data,Color} | AccDb]}
675
671
fun({Data,Color}, {Replaced,AccDb}) when Data == OldObj,
676
672
Replaced == false,
677
673
OldColor == ?BLACK,
756
752
etsread_pid = EtsreadPid} = ProcVars,
758
754
#db_data{db = DbList,
760
max_elem_size = MaxElemSize,
761
ets_type = EtsType, %% 'bag', 'set' or 'duplicate_bag'
762
deleted = OldDeleted,
764
rev_sorting = RevSorting,
765
sort_key_no = SortKeyNo,
766
key_no = KeyNo} = DbData,
755
deleted = OldDeleted} = DbData,
768
757
%% Before we try to update the internal database, we have to check to see
769
758
%% whether the ETS/Mnesia update is allowed!
904
892
{true, [{Obj,?GREEN1} | AccDb]};
905
({Data,Color}, {Replaced,AccDb}) when Replaced == false,
893
({_Data,Color}, {Replaced,AccDb}) when Replaced == false,
906
894
Color /= ?BLACK ->
907
895
{true, [{Obj,Color} | AccDb]};
908
({Data,Color}, {Replaced,AccDb}) when Replaced == false,
896
({_Data,Color}, {Replaced,AccDb}) when Replaced == false,
909
897
Color == ?BLACK ->
910
898
{true, [{Obj, ?RED1} | AccDb]};
911
({Data,Color}, {Replaced,AccDb}) when Replaced == true,
899
({_Data,Color}, {Replaced,AccDb}) when Replaced == true,
912
900
Color == ?BLACK ->
914
({Data,Color}, {Replaced,AccDb}) ->
902
({_Data,_Color}, {Replaced,AccDb}) ->
915
903
{Replaced, AccDb}
918
906
fun({Data,Color}, {Replaced,AccDb}) when Data /= Obj ->
919
907
{Replaced, [{Data,Color} | AccDb]};
920
({Data,Color}, {Replaced,AccDb}) when Replaced == false,
908
({_Data,Color}, {Replaced,AccDb}) when Replaced == false,
921
909
Color /= ?BLACK ->
922
910
{true, [{Obj,Color} | AccDb]};
923
({Data,Color}, {Replaced,AccDb}) when Replaced == true,
911
({_Data,Color}, {Replaced,AccDb}) when Replaced == true,
924
912
Color /= ?BLACK ->
926
({Data,Color}, {Replaced,AccDb}) when Replaced == true,
914
({_Data,Color}, {Replaced,AccDb}) when Replaced == true,
927
915
Color == ?BLACK ->
929
({Data,Color}, {Replaced,AccDb}) when Replaced == false,
917
({_Data,Color}, {Replaced,AccDb}) when Replaced == false,
930
918
Color == ?BLACK ->
931
919
{true, [{Obj, ?RED1} | AccDb]};
932
({Data,Color}, {Replaced,AccDb}) ->
920
({_Data,_Color}, {Replaced,AccDb}) ->
933
921
{Replaced, AccDb}
999
add_elements(KeyNo, Inserted, List, false, _RevSorting, _SortKeyNo) ->
987
add_elements(_KeyNo, Inserted, List, false, _RevSorting, _SortKeyNo) ->
1000
988
% Remember that the order of the original list has to be preserved!
1001
989
List ++ list2dblist(Inserted, ?RED1);
1002
add_elements(_KeyNo, Inserted, List, Sorting, RevSorting, SortKeyNo) ->
990
add_elements(_KeyNo, Inserted, List, _Sorting, RevSorting, SortKeyNo) ->
1003
991
% The original list is already sorted - sort the new elements, and
1004
992
% just merge the two lists together!
1005
993
SortedInsertedList = tv_db_sort:mergesort(SortKeyNo,
1032
mark_one_element_deleted(_KeyNo, _KeyValue, Data, [], Acc) ->
1020
mark_one_element_deleted(_KeyNo, _KeyValue, _Data, [], Acc) ->
1034
1022
mark_one_element_deleted(KeyNo, {tuple, KeyValue},
1035
1023
Data, [{DataTuple, Color} | Tail], Acc) ->
1086
1074
replace_one_element(KeyNo, {tuple, Key1}, Data, Tail,
1087
1075
Acc ++ [{DataTuple, Color}])
1089
replace_one_element(KeyNo, _KeyValue, Data, [{DataTuple, Color} | Tail], Acc) ->
1077
replace_one_element(_KeyNo, _KeyValue, _Data, [{DataTuple, Color} | Tail], Acc) ->
1090
1078
% Can't replace an element with no key!
1091
1079
Acc ++ [{DataTuple, Color} | Tail].
1105
1093
%% Since the ETS table is of duplicate_bag type, no element can be updated, i.e.,
1106
1094
%% it can only be deleted and re-inserted, otherwise a new element will be added.
1107
1095
{Inserted, Deleted, []};
1108
group_difflists(set, KeyNo, [], Deleted) ->
1096
group_difflists(set, _KeyNo, [], Deleted) ->
1109
1097
%% Updated elements have to be present in both lists, i.e., if one list is empty,
1110
1098
%% the other contains no updated elements - they are either inserted or deleted!
1111
1099
{[], Deleted, []};
1112
group_difflists(set, KeyNo, Inserted, []) ->
1100
group_difflists(set, _KeyNo, Inserted, []) ->
1113
1101
{Inserted, [], []};
1114
1102
group_difflists(set, KeyNo, InsOrUpd, DelOrUpd) ->
1115
1103
match_difflists(KeyNo, InsOrUpd, DelOrUpd, [], []).
1237
1225
ElapsedHours = get_time_diff(hours, H1, H2),
1238
1226
ElapsedMinutes = get_time_diff(minutes, M1, M2),
1239
1227
ElapsedSeconds = get_time_diff(seconds, S1, S2),
1240
(ElapsedHours * 3600) + (ElapsedHours * 60) + ElapsedSeconds + 1.
1228
(ElapsedHours * 3600) + (ElapsedMinutes * 60) + ElapsedSeconds + 1.
1269
1257
split2(Ctr, N, Acc, [H | T]) when Ctr < N ->
1270
1258
split2(Ctr + 1, N, [H | Acc], T);
1271
split2(Ctr, N, Acc, []) ->
1259
split2(_Ctr, _N, Acc, []) ->
1272
1260
{lists:reverse(Acc), []};
1273
split2(Ctr, N, Acc, List) ->
1261
split2(_Ctr, _N, Acc, List) ->
1274
1262
{lists:reverse(Acc), List}.
1276
1264
basetype(ordered_set) ->