| 1902 | } |
| 1903 | |
| 1904 | void ReadYourWritesTransaction::writeRangeToNativeTransaction(KeyRangeRef const& keys) { |
| 1905 | WriteMap::iterator it(&writes); |
| 1906 | it.skip(keys.begin); |
| 1907 | |
| 1908 | bool inClearRange = false; |
| 1909 | ExtStringRef clearBegin; |
| 1910 | |
| 1911 | // Clear ranges must be done first because of keys that are both cleared and set to a new value |
| 1912 | for (; it.beginKey() < keys.end; ++it) { |
| 1913 | if (it.is_cleared_range() && !inClearRange) { |
| 1914 | clearBegin = std::max(ExtStringRef(keys.begin), it.beginKey()); |
| 1915 | inClearRange = true; |
| 1916 | } else if (!it.is_cleared_range() && inClearRange) { |
| 1917 | tr.clear(KeyRangeRef(clearBegin.toArenaOrRef(arena), it.beginKey().toArenaOrRef(arena)), |
| 1918 | AddConflictRange::False); |
| 1919 | inClearRange = false; |
| 1920 | } |
| 1921 | } |
| 1922 | |
| 1923 | if (inClearRange) { |
| 1924 | tr.clear(KeyRangeRef(clearBegin.toArenaOrRef(arena), keys.end), AddConflictRange::False); |
| 1925 | } |
| 1926 | |
| 1927 | it.skip(keys.begin); |
| 1928 | |
| 1929 | bool inConflictRange = false; |
| 1930 | ExtStringRef conflictBegin; |
| 1931 | |
| 1932 | for (; it.beginKey() < keys.end; ++it) { |
| 1933 | if (it.is_conflict_range() && !inConflictRange) { |
| 1934 | conflictBegin = std::max(ExtStringRef(keys.begin), it.beginKey()); |
| 1935 | inConflictRange = true; |
| 1936 | } else if (!it.is_conflict_range() && inConflictRange) { |
| 1937 | tr.addWriteConflictRange(KeyRangeRef(conflictBegin.toArenaOrRef(arena), it.beginKey().toArenaOrRef(arena))); |
| 1938 | inConflictRange = false; |
| 1939 | } |
| 1940 | |
| 1941 | // SOMEDAY: make atomicOp take set to avoid switch |
| 1942 | if (it.is_operation()) { |
| 1943 | auto op = it.op(); |
| 1944 | for (int i = 0; i < op.size(); ++i) { |
| 1945 | switch (op[i].type) { |
| 1946 | case MutationRef::SetValue: |
| 1947 | if (op[i].value.present()) { |
| 1948 | tr.set(it.beginKey().assertRef(), op[i].value.get(), AddConflictRange::False); |
| 1949 | } else { |
| 1950 | tr.clear(it.beginKey().assertRef(), AddConflictRange::False); |
| 1951 | } |
| 1952 | break; |
| 1953 | case MutationRef::AddValue: |
| 1954 | case MutationRef::AppendIfFits: |
| 1955 | case MutationRef::And: |
| 1956 | case MutationRef::Or: |
| 1957 | case MutationRef::Xor: |
| 1958 | case MutationRef::Max: |
| 1959 | case MutationRef::Min: |
| 1960 | case MutationRef::SetVersionstampedKey: |
| 1961 | case MutationRef::SetVersionstampedValue: |
no test coverage detected