Ejemplo n.º 1
0
        /// <summary>
        /// Recupera os registros serializados no leitor informado.
        /// </summary>
        /// <param name="reader"></param>
        /// <returns></returns>
        public static IEnumerable <Record> GetRecords(Colosoft.Serialization.IO.CompactReader reader)
        {
            var hasDescriptor = reader.ReadByte() == 1;

            if (hasDescriptor)
            {
                var descriptor = new Record.RecordDescriptor();
                ((Colosoft.Serialization.ICompactSerializable)descriptor).Deserialize(reader);
                while (reader.ReadByte() == 1)
                {
                    var r = new Record(descriptor);
                    ((Colosoft.Serialization.ICompactSerializable)r).Deserialize(reader);
                    yield return(r);
                }
            }
        }
 /// <summary>
 /// Compara a instancia com um descritor.
 /// </summary>
 /// <param name="other"></param>
 /// <returns></returns>
 public bool Equals(Record.RecordDescriptor other)
 {
     if (other.Count == _properties.Count)
     {
         var comparer = StringComparer.InvariantCultureIgnoreCase;
         foreach (var field in other)
         {
             if (!_properties.Exists(f => comparer.Equals(f.FieldName, field.Name)))
             {
                 return(false);
             }
         }
         return(true);
     }
     return(false);
 }
Ejemplo n.º 3
0
        /// <summary>
        /// Construtor usado na deserialização dos dados.
        /// </summary>
        /// <param name="info"></param>
        /// <param name="context"></param>
        private QueryResult(SerializationInfo info, StreamingContext context)
        {
            _descriptor = info.GetValue("Descriptor", typeof(Record.RecordDescriptor)) as Record.RecordDescriptor;
            var count   = info.GetInt32("C");
            var records = new List <Record>();

            for (var i = 0; i < count; i++)
            {
                var values = new object[_descriptor.Count];
                for (var j = 0; j < _descriptor.Count; j++)
                {
                    values[j] = info.GetValue(string.Format("{0}_{1}", i, j), _descriptor[j].Type);
                }
                records.Add(_descriptor.CreateRecord(values));
            }
            _records = records;
        }
Ejemplo n.º 4
0
        /// <summary>
        /// Cria uma instancia com o registros encontrados e as subconsultas.
        /// </summary>
        /// <param name="descriptor"></param>
        /// <param name="records"></param>
        /// <param name="info">Informações da consulta.</param>
        /// <param name="executer">Ponteiro para o método responsável por executar um consulta com base no QueryInfo</param>
        public QueryResult(Record.RecordDescriptor descriptor, IEnumerable <Record> records, QueryInfo info, Func <QueryInfo, IQueryResult> executer) : this(descriptor, records)
        {
            _queryInfo = info;
            _executer  = executer;
            var referenceParameters = new List <ReferenceParameter>();

            if (info != null && info.NestedQueries != null)
            {
                foreach (var query in info.NestedQueries)
                {
                    if (query.Parameters != null)
                    {
                        foreach (var parameter in query.Parameters)
                        {
                            if (parameter.Value is ReferenceParameter)
                            {
                                var refParameter = (ReferenceParameter)parameter.Value;
                                if (!referenceParameters.Exists(f => StringComparer.InvariantCultureIgnoreCase.Equals(f.ColumnName, refParameter.ColumnName)))
                                {
                                    referenceParameters.Add(refParameter);
                                }
                            }
                        }
                    }
                    if (query.ExecutePredicate != null && query.ExecutePredicate.RequiredFields != null)
                    {
                        foreach (var requiredField in query.ExecutePredicate.RequiredFields)
                        {
                            var columnName = requiredField.Name;
                            if (string.IsNullOrEmpty(columnName) && requiredField.Index >= 0 && requiredField.Index < descriptor.Count)
                            {
                                columnName = descriptor[requiredField.Index].Name;
                            }
                            if (!string.IsNullOrEmpty(columnName) && !referenceParameters.Exists(f => StringComparer.InvariantCultureIgnoreCase.Equals(f.ColumnName, columnName)))
                            {
                                referenceParameters.Add(new ReferenceParameter(columnName));
                            }
                        }
                    }
                }
            }
            _referenceParameters = referenceParameters.ToArray();
        }
Ejemplo n.º 5
0
        /// <summary>
        /// Formata a mensagem do erro.
        /// </summary>
        /// <param name="fieldName"></param>
        /// <param name="descriptor"></param>
        /// <param name="queryResult">Resulta da consulta associada.</param>
        /// <returns></returns>
        private static string FormatMessage(string fieldName, Record.RecordDescriptor descriptor, IQueryResult queryResult)
        {
            QueryCommand command = null;

            if (queryResult is IQueryCommandContainer)
            {
                command = ((IQueryCommandContainer)queryResult).Command;
            }
            var fieldsAvailables = string.Join("; ", descriptor.Select(f => f.Name).ToArray());

            if (command != null)
            {
                return(ResourceMessageFormatter.Create(() => Properties.Resources.RecordFieldNotFoundExceptionWithQueryCommand_Message, fieldName, fieldsAvailables, command.ToString()).Format());
            }
            else
            {
                return(ResourceMessageFormatter.Create(() => Properties.Resources.RecordFieldNotFoundException_Message, fieldName, fieldsAvailables).Format());
            }
        }
Ejemplo n.º 6
0
 /// <summary>
 /// Recupera o esquema que será usado para converter os dados do registro.
 /// </summary>
 /// <param name="descriptor"></param>
 /// <returns></returns>
 private TypeBindRecordDescriptorSchema GetRecordSchema(Record.RecordDescriptor descriptor)
 {
     lock (_schemas)
     {
         if (_schemas.Count > 0)
         {
             foreach (var i in _schemas)
             {
                 if (i.Equals(descriptor))
                 {
                     return(i);
                 }
             }
         }
         var schema = new TypeBindRecordDescriptorSchema(this, descriptor);
         _schemas.Add(schema);
         return(schema);
     }
 }
Ejemplo n.º 7
0
        /// <summary>
        /// Valida o resultado da consulta.
        /// </summary>
        /// <param name="queryResult"></param>
        /// <returns></returns>
        public static ValidationQueryResult Validate(this IQueryResult queryResult)
        {
            QueryInfo queryInfo = null;

            Record.RecordDescriptor descriptor = null;
            if (queryResult is IQueryResultExt)
            {
                queryInfo = ((IQueryResultExt)queryResult).QueryInfo;
            }
            if (queryInfo == null)
            {
                return(new ValidationQueryResult(ValidationQueryResult.ValidationError.None, null));
            }
            descriptor = queryResult.Descriptor;
            if (descriptor != null && queryInfo.Projection != null && queryInfo.Projection.Count > 0)
            {
                var projection = queryInfo.Projection;
                var isMatch    = (descriptor.Count == projection.Count);
                if (isMatch)
                {
                    for (var i = 0; i < projection.Count; i++)
                    {
                        var fieldName = GetFieldName(projection[i]);
                        if (string.IsNullOrEmpty(fieldName))
                        {
                            continue;
                        }
                        if (!StringComparer.InvariantCultureIgnoreCase.Equals(fieldName, descriptor[i].Name))
                        {
                            isMatch = false;
                            break;
                        }
                    }
                }
                if (!isMatch)
                {
                    var message = ResourceMessageFormatter.Create(() => Properties.Resources.ValidationQueryResult_NotMatchFields, string.Join("; ", projection.Select(f => GetFieldName(f)).ToArray()), string.Join("; ", descriptor.Select(f => f.Name).ToArray()));
                    return(new ValidationQueryResult(ValidationQueryResult.ValidationError.InvalidFields, message));
                }
            }
            return(new ValidationQueryResult(ValidationQueryResult.ValidationError.None, null));
        }
        /// <summary>
        /// Construtor padrão.
        /// </summary>
        /// <param name="typeBindStrategy">Instancia da estratégia de vinculação associada.</param>
        /// <param name="descriptor"></param>
        public TypeBindRecordDescriptorSchema(TypeBindStrategy typeBindStrategy, Record.RecordDescriptor descriptor)
        {
            _properties = new List <Property>();
            var typeProperties = typeBindStrategy.Type.GetProperties(System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public);
            var stringComparer = StringComparer.InvariantCultureIgnoreCase;

            foreach (var field in descriptor)
            {
                var prop = typeProperties.Where(f => f.CanWrite && stringComparer.Equals(f.Name, field.Name)).FirstOrDefault();
                if (prop != null)
                {
                    if (_properties.Exists(f => stringComparer.Equals(f.FieldName, field.Name)))
                    {
                        throw new TypeBindStrategyException(ResourceMessageFormatter.Create(() => Properties.Resources.TypeBindStrategy_DuplicateFieldName, field.Name, typeBindStrategy.Type.FullName, string.Join(", ", descriptor.Select(f => f.Name).ToArray())).Format());
                    }
                    var converter = System.ComponentModel.TypeDescriptor.GetConverter(prop.PropertyType);
                    _properties.Add(new Property(field.Name, prop, converter));
                }
            }
        }
Ejemplo n.º 9
0
        /// <summary>
        /// Deserializa os dados na instancia.
        /// </summary>
        /// <param name="reader"></param>
        void Colosoft.Serialization.ICompactSerializable.Deserialize(Colosoft.Serialization.IO.CompactReader reader)
        {
            var hasDescriptor = reader.ReadByte() == 1;

            if (hasDescriptor)
            {
                _descriptor = new Record.RecordDescriptor();
                ((Colosoft.Serialization.ICompactSerializable)_descriptor).Deserialize(reader);
                var records = new List <Record>();
                while (reader.ReadByte() == 1)
                {
                    var r = new Record(_descriptor);
                    ((Colosoft.Serialization.ICompactSerializable)r).Deserialize(reader);
                    records.Add(r);
                }
                _records = records;
            }
            else
            {
                _records = new Record[0];
            }
        }
Ejemplo n.º 10
0
        void System.Xml.Serialization.IXmlSerializable.ReadXml(System.Xml.XmlReader reader)
        {
            reader.ReadStartElement();
            var records = new List <Record>();

            while (reader.NodeType != XmlNodeType.EndElement)
            {
                if (!reader.IsEmptyElement && reader.LocalName == "Descriptor")
                {
                    reader.MoveToElement();
                    _descriptor = new Record.RecordDescriptor();
                    ((System.Xml.Serialization.IXmlSerializable)_descriptor).ReadXml(reader);
                }
                else if (!reader.IsEmptyElement && reader.LocalName == "Records")
                {
                    reader.ReadStartElement();
                    while (reader.NodeType != XmlNodeType.EndElement)
                    {
                        if (reader.LocalName == "Record")
                        {
                            var record = new Record(_descriptor);
                            ((IXmlSerializable)record).ReadXml(reader);
                            records.Add(record);
                        }
                        else
                        {
                            reader.Skip();
                        }
                    }
                    reader.ReadEndElement();
                }
                else
                {
                    reader.Skip();
                }
            }
            reader.ReadEndElement();
            _records = records;
        }
Ejemplo n.º 11
0
 /// <summary>
 /// Construtor padrão.
 /// </summary>
 /// <param name="descriptor">Instancia do descritor do resultado.</param>
 /// <param name="records"></param>
 public QueryResult(Record.RecordDescriptor descriptor, IEnumerable <Record> records)
 {
     _descriptor = descriptor;
     _records    = records;
 }
 /// <summary>
 /// Formata a mensagem do erro.
 /// </summary>
 /// <param name="descriptor"></param>
 /// <returns></returns>
 private static string FormatMessage(Record.RecordDescriptor descriptor)
 {
     return(ResourceMessageFormatter.Create(() => Properties.Resources.InvalidRecordChecksumException_Message, string.Join("; ", descriptor.Select(f => f.Name).ToArray())).Format());
 }
Ejemplo n.º 13
0
 /// <summary>
 /// Cria a instancia com as informações do campo não encontrado.
 /// </summary>
 /// <param name="fieldName"></param>
 /// <param name="descriptor"></param>
 /// <param name="queryResult">Resultado da consulta associada.</param>
 public RecordFieldNotFoundException(string fieldName, Record.RecordDescriptor descriptor, IQueryResult queryResult) : base(FormatMessage(fieldName, descriptor, queryResult))
 {
 }
Ejemplo n.º 14
0
 /// <summary>
 /// Cria uma sessão de estratégia de vinculação para o descritor informado.
 /// </summary>
 /// <param name="recordDescriptor">Descritor dos registros para fazer a vinculação.</param>
 /// <returns></returns>
 public IQueryResultBindStrategySession CreateSession(Record.RecordDescriptor recordDescriptor)
 {
     return(new TypeBindStrategySession(GetRecordSchema(recordDescriptor)));
 }
Ejemplo n.º 15
0
 /// <summary>
 /// Cria uma sessão de vinculação.
 /// </summary>
 /// <param name="recordDescriptor"></param>
 /// <returns></returns>
 IQueryResultBindStrategySession IQueryResultBindStrategy.CreateSession(Record.RecordDescriptor recordDescriptor)
 {
     throw new NotSupportedException();
 }
Ejemplo n.º 16
0
 /// <summary>
 /// Construtor vazio.
 /// </summary>
 public QueryResult()
 {
     _descriptor = new Record.RecordDescriptor("Empty", new Record.Field[0]);
     _records    = new Record[0];
 }
 /// <summary>
 /// Cria a instancia com as informações do campo não encontrado.
 /// </summary>
 /// <param name="descriptor"></param>
 public InvalidRecordChecksumException(Record.RecordDescriptor descriptor) : base(FormatMessage(descriptor))
 {
 }