/// <summary> /// Saves metadata for this session. /// </summary> /// <param name="typeId">Type ID.</param> /// <param name="typeName">Type name.</param> /// <param name="affKeyFieldName">Affinity key field name.</param> /// <param name="fields">Fields metadata.</param> internal void SaveMetadata(int typeId, string typeName, string affKeyFieldName, IDictionary <string, int> fields) { if (_metas == null) { PortableMetadataImpl meta = new PortableMetadataImpl(typeId, typeName, fields, affKeyFieldName); _metas = new Dictionary <int, IPortableMetadata>(1); _metas[typeId] = meta; } else { IPortableMetadata meta; if (_metas.TryGetValue(typeId, out meta)) { IDictionary <string, int> existingFields = ((PortableMetadataImpl)meta).FieldsMap(); foreach (KeyValuePair <string, int> field in fields) { if (!existingFields.ContainsKey(field.Key)) { existingFields[field.Key] = field.Value; } } } else { _metas[typeId] = new PortableMetadataImpl(typeId, typeName, fields, affKeyFieldName); } } }
/// <summary> /// Put metadata to Grid. /// </summary> /// <param name="metas">Metadatas.</param> internal void PutMetadata(IDictionary <int, IPortableMetadata> metas) { DoOutOp(OpMeta, stream => { PortableWriterImpl metaWriter = _marsh.StartMarshal(stream); metaWriter.WriteInt(metas.Count); foreach (var meta in metas.Values) { PortableMetadataImpl meta0 = (PortableMetadataImpl)meta; metaWriter.WriteInt(meta0.TypeId); metaWriter.WriteString(meta0.TypeName); metaWriter.WriteString(meta0.AffinityKeyFieldName); IDictionary <string, int> fields = meta0.FieldsMap(); metaWriter.WriteInt(fields.Count); foreach (var field in fields) { metaWriter.WriteString(field.Key); metaWriter.WriteInt(field.Value); } } _marsh.FinishMarshal(metaWriter); }); _marsh.OnMetadataSent(metas); }
/// <summary> /// Callback invoked when metadata has been sent to the server and acknowledged by it. /// </summary> /// <param name="newMetas"></param> public void OnMetadataSent(IDictionary <int, IPortableMetadata> newMetas) { foreach (KeyValuePair <int, IPortableMetadata> metaEntry in newMetas) { PortableMetadataImpl meta = (PortableMetadataImpl)metaEntry.Value; IDictionary <int, Tuple <string, int> > mergeInfo = new Dictionary <int, Tuple <string, int> >(meta.FieldsMap().Count); foreach (KeyValuePair <string, int> fieldMeta in meta.FieldsMap()) { int fieldId = PortableUtils.FieldId(metaEntry.Key, fieldMeta.Key, null, null); mergeInfo[fieldId] = new Tuple <string, int>(fieldMeta.Key, fieldMeta.Value); } _metas[metaEntry.Key].Merge(mergeInfo); } }