예제 #1
0
 static void ReadData(NodeReference node)
 {
     try
     {
         node.AppendSubscript("");
         string subscr = node.NextSubscript();
         while (!subscr.Equals(""))
         {
             node.SetSubscript(node.GetSubscriptCount(), subscr);
             if (node.HasData())
             {
                 Console.Write(" ".PadLeft(node.GetSubscriptCount() * 4, '-') + subscr + "  ->  ");
                 GetData(node);
             }
             if (node.HasSubnodes())
             {
                 ReadData(node);
             }
             subscr = node.NextSubscript();
         }
     }
     catch (GlobalsException ex)
     {
         Console.WriteLine(ex.Message);
     }
     finally
     {
         node.SetSubscriptCount(node.GetSubscriptCount() - 1);
     }
 }
        private static object ReadArray(NodeReference node, Type columnType)
        {
            var arrayLengthsString = node.GetString(EnumerableLengthsSubscriptName);

            if (string.IsNullOrEmpty(arrayLengthsString))
            {
                return(null);
            }

            var elementType  = columnType.GetElementType();
            var arrayLengths = ToArrayIndexes(arrayLengthsString);
            var instance     = Array.CreateInstance(elementType, arrayLengths);

            var subscript = node.NextSubscript(EnumerableLengthsSubscriptName);

            while (!subscript.Equals(""))
            {
                node.AppendSubscript(subscript);

                var item    = ReadNode(node, elementType);
                var indexes = ToArrayIndexes(subscript);

                instance.SetValue(item, indexes);

                subscript = node.NextSubscript();
                node.SetSubscriptCount(node.GetSubscriptCount() - 1);
            }

            return(instance);
        }
        private static object ReadEnumerable(NodeReference node, Type columnType)
        {
            var instance    = (IList)Activator.CreateInstance(columnType);
            var elementType = columnType.IsGenericType ? columnType.GetGenericArguments().Single() : typeof(object);

            if (string.IsNullOrEmpty(node.NextSubscript("")))
            {
                return(null);
            }

            var subscript = node.NextSubscript(EnumerableLengthsSubscriptName);

            while (!subscript.Equals(""))
            {
                node.AppendSubscript(subscript);

                var item = ReadNode(node, elementType);
                instance.Add(item);

                subscript = node.NextSubscript();
                node.SetSubscriptCount(node.GetSubscriptCount() - 1);
            }

            return(instance);
        }
        private static bool IsNullableComplexColumnEmpty(NodeReference node)
        {
            node.AppendSubscript("");
            var isEmpty = string.IsNullOrEmpty(node.NextSubscript());

            node.SetSubscriptCount(node.GetSubscriptCount() - 1);
            return(isEmpty);
        }
        private static void WriteComplexEntity <TEntity>(TEntity entity, NodeReference node)
        {
            if (entity == null)
            {
                return;
            }

            var entityType     = entity.GetType();
            var underlyingType = EntityTypeDescriptor.IsNullableType(entityType)
                ? Nullable.GetUnderlyingType(entityType)
                : entityType;

            var columns = EntityTypeDescriptor.GetTypeDescription(underlyingType).Columns;

            foreach (var column in columns)
            {
                node.AppendSubscript(column.ColumnAttribute.Name ?? column.ColumnInfo.Name);

                if (column.IsSimpleColumn)
                {
                    var value = column.ColumnInfo.GetValue(entity, null);

                    if (value != null)
                    {
                        if (column.IsNullableColumn)
                        {
                            node.Set(value != null ? value.ToString() : null);
                        }
                        else
                        {
                            node.Set(value.ToString());
                        }
                    }
                }
                else if (column.IsArrayColumn)
                {
                    var array = column.ColumnInfo.GetValue(entity, null) as Array;
                    WriteArray(node, array);
                }
                else if (column.IsEnumerableColumn)
                {
                    var items = column.ColumnInfo.GetValue(entity, null) as IEnumerable;

                    if (items != null)
                    {
                        WriteEnumerable(node, items);
                    }
                }
                else
                {
                    WriteComplexEntity(column.ColumnInfo.GetValue(entity, null), node);
                }

                node.SetSubscriptCount(node.GetSubscriptCount() - 1);
            }
        }
        private static void WriteEnumerable(NodeReference node, IEnumerable items)
        {
            var index = 0;

            node.Kill();

            foreach (var item in items)
            {
                node.AppendSubscript(ToSubscriptString(index));

                WriteItem(item, node);

                node.SetSubscriptCount(node.GetSubscriptCount() - 1);
                index++;
            }

            node.AppendSubscript(EnumerableLengthsSubscriptName);
            node.Set(ToSubscriptString(index));
            node.SetSubscriptCount(node.GetSubscriptCount() - 1);
        }
        private static void WriteArray(NodeReference node, Array array)
        {
            node.Kill();

            if (array == null)
            {
                return;
            }

            node.AppendSubscript(EnumerableLengthsSubscriptName);
            node.Set(ToSubscriptString(GetArrayLengths(array)));
            node.SetSubscriptCount(node.GetSubscriptCount() - 1);

            var indexedElements = GetIndexedElements(array, new List <int>());

            foreach (var indexedElement in indexedElements)
            {
                node.AppendSubscript(ToSubscriptString(indexedElement.Item2));
                WriteItem(indexedElement.Item1, node);
                node.SetSubscriptCount(node.GetSubscriptCount() - 1);
            }
        }
예제 #8
0
        static void GetData(NodeReference node)
        {
            Object value = node.GetObject();

            if (value is string)
            {
                if ((node.GetSubscriptCount() == 1) || (node.GetSubscriptCount() == 2))
                {
                    Console.WriteLine(value.ToString());
                }
                else if (node.GetSubscriptCount() == 5)
                {
                    ValueList outList = node.GetList();
                    outList.ResetToFirst();

                    for (int i = 0; i < outList.Length - 1; i++)
                    {
                        Console.Write(outList.GetNextObject() + ", ");
                    }
                    Console.WriteLine(outList.GetNextObject());
                    outList.Close();
                }
                else if (node.GetSubscriptCount() == 4)
                {
                    string tempString = Encoding.GetEncoding(1251).GetString(node.GetBytes());
                    Console.WriteLine(tempString);
                }
            }
            else if (value is double)
            {
                Console.WriteLine(value.ToString());
            }
            else if (value is int)
            {
                Console.WriteLine(value.ToString());
            }
        }
        private static object ReadComplexNode(NodeReference node, Type objectType)
        {
            var isNullable = EntityTypeDescriptor.IsNullableType(objectType);

            if (isNullable && IsNullableComplexColumnEmpty(node))
            {
                return(null);
            }

            var underlyingType = !isNullable
                ? objectType
                : Nullable.GetUnderlyingType(objectType);

            var typeDescription = EntityTypeDescriptor.GetTypeDescription(underlyingType);

            var instance = InstanceCreator.CreateInstance(underlyingType);

            foreach (var column in typeDescription.Columns)
            {
                var subscript = column.ColumnAttribute.Name ?? column.ColumnInfo.Name;

                if (column.IsSimpleColumn)
                {
                    node.AppendSubscript(subscript);
                    var nodeValue = node.GetObject();
                    column.ColumnInfo.SetValue(instance, ConvertValue(nodeValue, column.ColumnInfo.PropertyType), null);
                }
                else if (column.IsArrayColumn)
                {
                    node.AppendSubscript(subscript);
                    column.ColumnInfo.SetValue(instance, ReadArray(node, column.ColumnInfo.PropertyType), null);
                }
                else if (column.IsEnumerableColumn)
                {
                    node.AppendSubscript(subscript);
                    column.ColumnInfo.SetValue(instance, ReadEnumerable(node, column.ColumnInfo.PropertyType), null);
                }
                else if (column.IsComplexColumn)
                {
                    node.AppendSubscript(subscript);
                    column.ColumnInfo.SetValue(instance,
                                               ReadComplexNode(node, column.ColumnInfo.PropertyType), null);
                }

                node.SetSubscriptCount(node.GetSubscriptCount() - 1);
            }

            return(instance);
        }
        internal static IEnumerable <NodeReference> GetEntitiesNodes(NodeReference node, DataContext context)
        {
            var result = new List <NodeReference>();

            node.AppendSubscript("");

            var subscript = node.NextSubscript();

            while (!subscript.Equals(""))
            {
                if (!string.Equals(subscript, IdentityValueSubscriptName))
                {
                    var entityNode = context.CreateNodeReference(node.GetName());
                    entityNode.AppendSubscript(subscript);
                    result.Add(entityNode);
                }
                node.SetSubscript(node.GetSubscriptCount(), subscript);
                subscript = node.NextSubscript();
            }

            return(result);
        }
        private static bool IsKeyExists(string key, NodeReference node)
        {
            if (string.IsNullOrEmpty(key))
            {
                return(false);
            }

            node.AppendSubscript(GetPreviousSubscriptKey(key));

            var subscript = node.NextSubscript();

            while (!subscript.Equals(""))
            {
                if (string.Equals(subscript, key))
                {
                    return(true);
                }
                node.SetSubscript(node.GetSubscriptCount(), subscript);
                subscript = node.NextSubscript();
            }

            return(false);
        }
예제 #12
0
        internal NodeReference CopyReference(NodeReference reference)
        {
            var result = CreateNodeReference();

            result.SetName(reference.GetName());

            var subscriptCount = reference.GetSubscriptCount();

            if (subscriptCount <= 0)
            {
                return(result);
            }

            for (var position = 1; position <= subscriptCount; position++)
            {
                var subscript = reference.GetObjectSubscript(position);

                if (subscript is int)
                {
                    result.AppendSubscript((int)subscript);
                }
                else if (subscript is long)
                {
                    result.AppendSubscript((long)subscript);
                }
                else if (subscript is double)
                {
                    result.AppendSubscript((double)subscript);
                }
                else
                {
                    result.AppendSubscript((string)subscript);
                }
            }

            return(result);
        }