uint ReadRelationVersions(uint relationIndex, string name, Dictionary <uint, RelationVersionInfo> relationVersions) { uint lastPersistedVersion = 0; var relationInfoResolver = new RelationInfoResolver((ObjectDB)_tr.Owner); var writer = new ByteBufferWriter(); writer.WriteByteArrayRaw(ObjectDB.RelationVersionsPrefix); writer.WriteVUInt32(relationIndex); _trkv.SetKeyPrefix(writer.Data); if (!_trkv.FindFirstKey()) { return(lastPersistedVersion); } var keyReader = new KeyValueDBKeyReader(_trkv); var valueReader = new KeyValueDBValueReader(_trkv); do { keyReader.Restart(); valueReader.Restart(); lastPersistedVersion = keyReader.ReadVUInt32(); var relationVersionInfo = RelationVersionInfo.LoadUnresolved(valueReader, name); relationVersionInfo.ResolveFieldHandlers(relationInfoResolver.FieldHandlerFactory); relationVersions[lastPersistedVersion] = relationVersionInfo; } while (_trkv.FindNextKey()); return(lastPersistedVersion); }
void LoadVersionInfos(IKeyValueDBTransaction tr) { LastPersistedVersion = 0; var writer = new ByteBufferWriter(); writer.WriteByteArrayRaw(ObjectDB.RelationVersionsPrefix); writer.WriteVUInt32(_id); tr.SetKeyPrefix(writer.Data); if (!tr.FindFirstKey()) { return; } var keyReader = new KeyValueDBKeyReader(tr); var valueReader = new KeyValueDBValueReader(tr); do { keyReader.Restart(); valueReader.Restart(); LastPersistedVersion = keyReader.ReadVUInt32(); var relationVersionInfo = RelationVersionInfo.Load(valueReader, _relationInfoResolver.FieldHandlerFactory, _name); _relationVersions[LastPersistedVersion] = relationVersionInfo; } while (tr.FindNextKey()); }
public IEnumerator <T> GetEnumerator() { var keyWriter = new ByteBufferWriter(); keyWriter.WriteByteArrayRaw(ObjectDB.AllRelationsPKPrefix); keyWriter.WriteVUInt32(_relationInfo.Id); return(new RelationEnumerator <T>(_transaction, _relationInfo, keyWriter.Data.ToAsyncSafe())); }
void CalculateSecondaryKey(IInternalObjectDBTransaction tr, IList <KeyValuePair <uint, SecondaryKeyInfo> > indexes) { var keyWriter = new ByteBufferWriter(); var enumeratorType = typeof(RelationEnumerator <>).MakeGenericType(_clientType); keyWriter.WriteByteArrayRaw(ObjectDB.AllRelationsPKPrefix); keyWriter.WriteVUInt32(Id); var enumerator = (IEnumerator)Activator.CreateInstance(enumeratorType, tr, this, keyWriter.GetDataAndRewind().ToAsyncSafe(), new SimpleModificationCounter()); var keySavers = new Action <IInternalObjectDBTransaction, AbstractBufferedWriter, object> [indexes.Count]; for (int i = 0; i < indexes.Count; i++) { keySavers[i] = CreateSaver(ClientRelationVersionInfo.GetSecondaryKeyFields(indexes[i].Key), $"Relation_{Name}_Upgrade_SK_{indexes[i].Value.Name}_KeySaver"); } while (enumerator.MoveNext()) { var obj = enumerator.Current; tr.TransactionProtector.Start(); tr.KeyValueDBTransaction.SetKeyPrefix(ObjectDB.AllRelationsSKPrefix); for (int i = 0; i < indexes.Count; i++) { keyWriter.WriteVUInt32(Id); keyWriter.WriteVUInt32(indexes[i].Key); keySavers[i](tr, keyWriter, obj); var keyBytes = keyWriter.GetDataAndRewind(); if (!tr.KeyValueDBTransaction.CreateOrUpdateKeyValue(keyBytes, ByteBuffer.NewEmpty())) { throw new BTDBException("Internal error, secondary key bytes must be always unique."); } } } }
public RelationInfo(uint id, string name, IRelationInfoResolver relationInfoResolver, Type interfaceType, Type clientType, IInternalObjectDBTransaction tr) { _id = id; _name = name; _relationInfoResolver = relationInfoResolver; _interfaceType = interfaceType; _clientType = clientType; ClientRelationVersionInfo = CreateVersionInfoByReflection(); LoadVersionInfos(tr.KeyValueDBTransaction); ApartFields = FindApartFields(interfaceType, ClientRelationVersionInfo); if (LastPersistedVersion > 0 && RelationVersionInfo.Equal(_relationVersions[LastPersistedVersion], ClientRelationVersionInfo)) { _relationVersions[LastPersistedVersion] = ClientRelationVersionInfo; ClientTypeVersion = LastPersistedVersion; } else { ClientTypeVersion = LastPersistedVersion + 1; _relationVersions.Add(ClientTypeVersion, ClientRelationVersionInfo); var writerk = new ByteBufferWriter(); writerk.WriteByteArrayRaw(ObjectDB.RelationVersionsPrefix); writerk.WriteVUInt32(_id); writerk.WriteVUInt32(ClientTypeVersion); var writerv = new ByteBufferWriter(); ClientRelationVersionInfo.Save(writerv); tr.KeyValueDBTransaction.SetKeyPrefix(ByteBuffer.NewEmpty()); tr.KeyValueDBTransaction.CreateOrUpdateKeyValue(writerk.Data, writerv.Data); if (LastPersistedVersion > 0) { CheckThatPrimaryKeyHasNotChanged(name, ClientRelationVersionInfo, _relationVersions[LastPersistedVersion]); UpdateSecondaryKeys(tr, ClientRelationVersionInfo, _relationVersions[LastPersistedVersion]); } } _typeConvertorGenerator = tr.Owner.TypeConvertorGenerator; }