예제 #1
0
        /// <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);
                }
            }
        }
예제 #2
0
        /// <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);
        }
예제 #3
0
        /// <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);
            }
        }