public void Iterate(bool sortTableByNameAsc = false) { LoadGlobalInfo(sortTableByNameAsc); foreach (var singleton in _singletons) { if (_visitor != null && !_visitor.VisitSingleton(singleton.Key, _tableId2Name.TryGetValue(singleton.Key, out var name) ? name : null, singleton.Value)) { continue; } MarkTableName(singleton.Key); if (_trkv.Find(Vuint2ByteBuffer(ObjectDB.TableSingletonsPrefix, singleton.Key), 0) == FindResult.Exact) { _fastVisitor.MarkCurrentKeyAsUsed(_trkv); } IterateOid(singleton.Value); } foreach (var relation in _relationId2Info) { if (_visitor != null && !_visitor.StartRelation(relation.Value)) { continue; } MarkRelationName(relation.Key); IterateRelation(relation.Value); _visitor?.EndRelation(); } }
public bool Contains(TKey item) { var keyBytes = KeyToByteArray(item); _keyValueTrProtector.Start(); _keyValueTr.SetKeyPrefix(_prefix); return(_keyValueTr.Find(keyBytes) == FindResult.Exact); }
public void Iterate(bool sortTableByNameAsc = false) { LoadTableNamesDict(); LoadRelationNamesDict(); MarkLastDictId(); _trkv.SetKeyPrefixUnsafe(ObjectDB.TableSingletonsPrefix); var keyReader = new KeyValueDBKeyReader(_trkv); var valueReader = new KeyValueDBValueReader(_trkv); _singletons = new Dictionary <uint, ulong>(); while (_trkv.FindNextKey()) { keyReader.Restart(); valueReader.Restart(); _singletons.Add(keyReader.ReadVUInt32(), valueReader.ReadVUInt64()); } if (sortTableByNameAsc) { _singletons = _singletons.OrderBy(item => { string name; return(_tableId2Name.TryGetValue(item.Key, out name) ? name : string.Empty); }).ToDictionary(item => item.Key, item => item.Value); } foreach (var singleton in _singletons) { string name; if (_visitor != null && !_visitor.VisitSingleton(singleton.Key, _tableId2Name.TryGetValue(singleton.Key, out name) ? name : null, singleton.Value)) { continue; } MarkTableName(singleton.Key); _trkv.SetKeyPrefixUnsafe(ObjectDB.TableSingletonsPrefix); if (_trkv.Find(Vuint2ByteBuffer(singleton.Key)) == FindResult.Exact) { _fastVisitor.MarkCurrentKeyAsUsed(_trkv); } IterateOid(singleton.Value); } foreach (var relation in _relationId2Name) { if (_visitor != null && !_visitor.StartRelation(relation.Value)) { continue; } MarkRelationName(relation.Key); IterateRelation(relation.Key, relation.Value); if (_visitor != null) { _visitor.EndRelation(); } } }
public AdvancedEnumerator(ODBSet <TKey> owner, AdvancedEnumeratorParam <TKey> param) { _owner = owner; _keyValueTr = _owner._keyValueTr; _ascending = param.Order == EnumerationOrder.Ascending; _prevModificationCounter = _owner._modificationCounter; _prevProtectionCounter = _keyValueTr.CursorMovedCounter; _keyValueTr.FindFirstKey(_owner._prefix); var prefixIndex = _keyValueTr.GetKeyIndex(); long startIndex; long endIndex; if (param.EndProposition == KeyProposition.Ignored) { _keyValueTr.FindLastKey(_owner._prefix); endIndex = _keyValueTr.GetKeyIndex() - prefixIndex - 1; } else { var keyBytes = _owner.KeyToByteArray(param.End); switch (_keyValueTr.Find(keyBytes, (uint)_owner._prefix.Length)) { case FindResult.Exact: endIndex = _keyValueTr.GetKeyIndex() - prefixIndex; if (param.EndProposition == KeyProposition.Excluded) { endIndex--; } break; case FindResult.Previous: endIndex = _keyValueTr.GetKeyIndex() - prefixIndex; break; case FindResult.Next: endIndex = _keyValueTr.GetKeyIndex() - prefixIndex - 1; break; case FindResult.NotFound: endIndex = -1; break; default: throw new ArgumentOutOfRangeException(); } } if (param.StartProposition == KeyProposition.Ignored) { startIndex = 0; } else { var keyBytes = _owner.KeyToByteArray(param.Start); switch (_keyValueTr.Find(keyBytes, (uint)_owner._prefix.Length)) { case FindResult.Exact: startIndex = _keyValueTr.GetKeyIndex() - prefixIndex; if (param.StartProposition == KeyProposition.Excluded) { startIndex++; } break; case FindResult.Previous: startIndex = _keyValueTr.GetKeyIndex() - prefixIndex + 1; break; case FindResult.Next: startIndex = _keyValueTr.GetKeyIndex() - prefixIndex; break; case FindResult.NotFound: startIndex = 0; break; default: throw new ArgumentOutOfRangeException(); } } _count = (uint)Math.Max(0, endIndex - startIndex + 1); _startPos = (uint)(_ascending ? startIndex : endIndex); _pos = 0; _seekState = SeekState.Undefined; }
public bool Contains(TKey item) { var keyBytes = KeyToByteArray(item); return(_keyValueTr.Find(keyBytes, 0) == FindResult.Exact); }
public RelationAdvancedOrderedEnumerator(IRelationDbManipulator manipulator, ByteBuffer prefixBytes, uint prefixFieldCount, EnumerationOrder order, KeyProposition startKeyProposition, ByteBuffer startKeyBytes, KeyProposition endKeyProposition, ByteBuffer endKeyBytes, bool initKeyReader, int loaderIndex) { _prefixFieldCount = prefixFieldCount; _manipulator = manipulator; ItemLoader = _manipulator.RelationInfo.ItemLoaderInfos[loaderIndex]; _tr = manipulator.Transaction; _ascending = order == EnumerationOrder.Ascending; _keyValueTr = _tr.KeyValueDBTransaction; _keyValueTrProtector = _tr.TransactionProtector; _prevProtectionCounter = _keyValueTrProtector.ProtectionCounter; _keyBytes = prefixBytes; if (endKeyProposition == KeyProposition.Included) { endKeyBytes = RelationAdvancedEnumerator <TValue> .FindLastKeyWithPrefix(_keyBytes, endKeyBytes, _keyValueTr, _keyValueTrProtector); } _keyValueTrProtector.Start(); _keyValueTr.SetKeyPrefix(_keyBytes); long startIndex; long endIndex; if (endKeyProposition == KeyProposition.Ignored) { endIndex = _keyValueTr.GetKeyValueCount() - 1; } else { switch (_keyValueTr.Find(endKeyBytes)) { case FindResult.Exact: endIndex = _keyValueTr.GetKeyIndex(); if (endKeyProposition == KeyProposition.Excluded) { endIndex--; } break; case FindResult.Previous: endIndex = _keyValueTr.GetKeyIndex(); break; case FindResult.Next: endIndex = _keyValueTr.GetKeyIndex() - 1; break; case FindResult.NotFound: endIndex = -1; break; default: throw new ArgumentOutOfRangeException(); } } if (startKeyProposition == KeyProposition.Ignored) { startIndex = 0; } else { switch (_keyValueTr.Find(startKeyBytes)) { case FindResult.Exact: startIndex = _keyValueTr.GetKeyIndex(); if (startKeyProposition == KeyProposition.Excluded) { startIndex++; } break; case FindResult.Previous: startIndex = _keyValueTr.GetKeyIndex() + 1; break; case FindResult.Next: startIndex = _keyValueTr.GetKeyIndex(); break; case FindResult.NotFound: startIndex = 0; break; default: throw new ArgumentOutOfRangeException(); } } _count = (uint)Math.Max(0, endIndex - startIndex + 1); _startPos = (uint)(_ascending ? startIndex : endIndex); _pos = 0; _seekState = SeekState.Undefined; if (initKeyReader) { var primaryKeyFields = manipulator.RelationInfo.ClientRelationVersionInfo.GetPrimaryKeyFields(); var advancedEnumParamField = primaryKeyFields[(int)_prefixFieldCount]; if (advancedEnumParamField.Handler.NeedsCtx()) { throw new BTDBException("Not supported."); } _keyReader = (Func <AbstractBufferedReader, IReaderCtx, TKey>)manipulator.RelationInfo .GetSimpleLoader(new RelationInfo.SimpleLoaderType(advancedEnumParamField.Handler, typeof(TKey))); _lengthOfNonDataPrefix = manipulator.RelationInfo.Prefix.Length; } }
public RelationAdvancedEnumerator( IRelationDbManipulator manipulator, ByteBuffer prefixBytes, uint prefixFieldCount, EnumerationOrder order, KeyProposition startKeyProposition, ByteBuffer startKeyBytes, KeyProposition endKeyProposition, ByteBuffer endKeyBytes, int loaderIndex) { _prefixFieldCount = prefixFieldCount; _manipulator = manipulator; ItemLoader = _manipulator.RelationInfo.ItemLoaderInfos[loaderIndex]; _ascending = order == EnumerationOrder.Ascending; _tr = manipulator.Transaction; _keyValueTr = _tr.KeyValueDBTransaction; _keyValueTrProtector = _tr.TransactionProtector; _prevProtectionCounter = _keyValueTrProtector.ProtectionCounter; _keyBytes = prefixBytes; if (endKeyProposition == KeyProposition.Included) { endKeyBytes = FindLastKeyWithPrefix(_keyBytes, endKeyBytes, _keyValueTr, _keyValueTrProtector); } _keyValueTrProtector.Start(); _keyValueTr.SetKeyPrefix(_keyBytes); _prevModificationCounter = manipulator.ModificationCounter.ModificationCounter; long startIndex; long endIndex; if (endKeyProposition == KeyProposition.Ignored) { endIndex = _keyValueTr.GetKeyValueCount() - 1; } else { switch (_keyValueTr.Find(endKeyBytes)) { case FindResult.Exact: endIndex = _keyValueTr.GetKeyIndex(); if (endKeyProposition == KeyProposition.Excluded) { endIndex--; } break; case FindResult.Previous: endIndex = _keyValueTr.GetKeyIndex(); break; case FindResult.Next: endIndex = _keyValueTr.GetKeyIndex() - 1; break; case FindResult.NotFound: endIndex = -1; break; default: throw new ArgumentOutOfRangeException(); } } if (startKeyProposition == KeyProposition.Ignored) { startIndex = 0; } else { switch (_keyValueTr.Find(startKeyBytes)) { case FindResult.Exact: startIndex = _keyValueTr.GetKeyIndex(); if (startKeyProposition == KeyProposition.Excluded) { startIndex++; } break; case FindResult.Previous: startIndex = _keyValueTr.GetKeyIndex() + 1; break; case FindResult.Next: startIndex = _keyValueTr.GetKeyIndex(); break; case FindResult.NotFound: startIndex = 0; break; default: throw new ArgumentOutOfRangeException(); } } _count = (uint)Math.Max(0, endIndex - startIndex + 1); _startPos = (uint)(_ascending ? startIndex : endIndex); _pos = 0; _seekNeeded = true; _lengthOfNonDataPrefix = manipulator.RelationInfo.Prefix.Length; }
public IEnumerable <object> Enumerate(Type type) { if (type == typeof(object)) { type = null; } else if (type != null) { AutoRegisterType(type); } ulong oid = 0; ulong finalOid = _owner.GetLastAllocatedOid(); long prevProtectionCounter = 0; while (true) { _keyValueTrProtector.Start(); if (oid == 0) { prevProtectionCounter = _keyValueTrProtector.ProtectionCounter; _keyValueTr.SetKeyPrefix(ObjectDB.AllObjectsPrefix); if (!_keyValueTr.FindFirstKey()) { break; } } else { if (_keyValueTrProtector.WasInterupted(prevProtectionCounter)) { _keyValueTr.SetKeyPrefix(ObjectDB.AllObjectsPrefix); oid++; var key = BuildKeyFromOid(oid); var result = _keyValueTr.Find(ByteBuffer.NewSync(key)); if (result == FindResult.Previous) { if (!_keyValueTr.FindNextKey()) { result = FindResult.NotFound; } } if (result == FindResult.NotFound) { oid--; break; } } else { if (!_keyValueTr.FindNextKey()) { break; } } prevProtectionCounter = _keyValueTrProtector.ProtectionCounter; } oid = ReadOidFromCurrentKeyInTransaction(); var o = GetObjFromObjCacheByOid(oid); if (o != null) { if (type == null || type.IsInstanceOfType(o)) { yield return(o); } continue; } TableInfo tableInfo; var reader = ReadObjStart(oid, out tableInfo); if (type != null && !type.IsAssignableFrom(tableInfo.ClientType)) { continue; } var obj = ReadObjFinish(oid, tableInfo, reader); yield return(obj); } if (_dirtyObjSet == null) { yield break; } var dirtyObjsToEnum = _dirtyObjSet.Where(p => p.Key > oid && p.Key <= finalOid).ToList(); dirtyObjsToEnum.Sort((p1, p2) => { if (p1.Key < p2.Key) { return(-1); } if (p1.Key > p2.Key) { return(1); } return(0); }); foreach (var dObjPair in dirtyObjsToEnum) { var obj = dObjPair.Value; if (type != null && !type.IsInstanceOfType(obj)) { continue; } yield return(obj); } }
public FindResult Find(ByteBuffer key) { return(_keyValueDBTransaction.Find(key)); }
public IEnumerable <KeyValuePair <TKey, TValue> > GetIncreasingEnumerator(TKey start) { var startKeyBytes = KeyToByteArray(start); long prevProtectionCounter = 0; var prevModificationCounter = 0; long pos = 0; while (true) { _keyValueTrProtector.Start(); if (pos == 0) { prevModificationCounter = _modificationCounter; _keyValueTr.SetKeyPrefix(_prefix); bool startOk; switch (_keyValueTr.Find(ByteBuffer.NewSync(startKeyBytes))) { case FindResult.Exact: case FindResult.Next: startOk = true; break; case FindResult.Previous: startOk = _keyValueTr.FindNextKey(); break; case FindResult.NotFound: startOk = false; break; default: throw new ArgumentOutOfRangeException(); } if (!startOk) { break; } pos = _keyValueTr.GetKeyIndex(); } else { if (_keyValueTrProtector.WasInterupted(prevProtectionCounter)) { if (prevModificationCounter != _modificationCounter) { ThrowModifiedDuringEnum(); } _keyValueTr.SetKeyPrefix(_prefix); if (!_keyValueTr.SetKeyIndex(pos)) { break; } } else { if (!_keyValueTr.FindNextKey()) { break; } } } prevProtectionCounter = _keyValueTrProtector.ProtectionCounter; var keyBytes = _keyValueTr.GetKeyAsByteArray(); var valueBytes = _keyValueTr.GetValueAsByteArray(); var key = ByteArrayToKey(keyBytes); var value = ByteArrayToValue(valueBytes); yield return(new KeyValuePair <TKey, TValue>(key, value)); pos++; } }
public AdvancedEnumerator(ODBDictionary <TKey, TValue> owner, AdvancedEnumeratorParam <TKey> param) { _owner = owner; _keyValueTrProtector = _owner._keyValueTrProtector; _keyValueTr = _owner._keyValueTr; _ascending = param.Order == EnumerationOrder.Ascending; _keyValueTrProtector.Start(); _prevModificationCounter = _owner._modificationCounter; _prevProtectionCounter = _keyValueTrProtector.ProtectionCounter; _keyValueTr.SetKeyPrefix(_owner._prefix); long startIndex; long endIndex; if (param.EndProposition == KeyProposition.Ignored) { endIndex = _keyValueTr.GetKeyValueCount() - 1; } else { var keyBytes = _owner.KeyToByteArray(param.End); switch (_keyValueTr.Find(ByteBuffer.NewSync(keyBytes))) { case FindResult.Exact: endIndex = _keyValueTr.GetKeyIndex(); if (param.EndProposition == KeyProposition.Excluded) { endIndex--; } break; case FindResult.Previous: endIndex = _keyValueTr.GetKeyIndex(); break; case FindResult.Next: endIndex = _keyValueTr.GetKeyIndex() - 1; break; case FindResult.NotFound: endIndex = -1; break; default: throw new ArgumentOutOfRangeException(); } } if (param.StartProposition == KeyProposition.Ignored) { startIndex = 0; } else { var keyBytes = _owner.KeyToByteArray(param.Start); switch (_keyValueTr.Find(ByteBuffer.NewSync(keyBytes))) { case FindResult.Exact: startIndex = _keyValueTr.GetKeyIndex(); if (param.StartProposition == KeyProposition.Excluded) { startIndex++; } break; case FindResult.Previous: startIndex = _keyValueTr.GetKeyIndex() + 1; break; case FindResult.Next: startIndex = _keyValueTr.GetKeyIndex(); break; case FindResult.NotFound: startIndex = 0; break; default: throw new ArgumentOutOfRangeException(); } } _count = (uint)Math.Max(0, endIndex - startIndex + 1); _startPos = (uint)(_ascending ? startIndex : endIndex); _pos = 0; _seekNeeded = true; }
public bool Insert(T obj) { Debug.Assert(typeof(T) == obj.GetType(), AssertNotDerivedTypesMsg); var keyBytes = KeyBytes(obj); var valueBytes = ValueBytes(obj); ResetKeyPrefix(); if (_kvtr.Find(keyBytes) == FindResult.Exact) { return(false); } _kvtr.CreateOrUpdateKeyValue(keyBytes, valueBytes); if (_hasSecondaryIndexes) { AddIntoSecondaryIndexes(obj); } _modificationCounter.MarkModification(); return(true); }
public static bool FindExactKey(this IKeyValueDBTransaction transaction, byte[] keyBuf) { return(transaction.Find(ByteBuffer.NewSync(keyBuf)) == FindResult.Exact); }