Пример #1
0
        public T CreateType <T>(CompiledInfo <T> info, List <object> fields)
        {
            string key = info.ToString();

            if (!compiled_cache.ContainsKey(key))
            {
                compiled_cache[key] = info.GetActivator();
            }
            //create an instance:
            T instance = (compiled_cache[key] as CompiledInfo <T> .ObjectActivator)(fields.ToArray());

            return(instance);
        }
Пример #2
0
        public static List <R> CreateGrouppedAnonymousType <R>(ServerResult server_res, Tuple <Dictionary <string, string>, Dictionary <string, short> > def, Ldb _db, List <string> props)
        {
            CompiledInfo <R> cinfo        = new CompiledInfo <R>();
            var           cdata           = server_res.SelectGroupResult;
            HashSet <int> distinct_groups = new HashSet <int>(cdata.Select(f => f.Key));

            List <R> result = new List <R>();

            foreach (var gr in distinct_groups)
            {
                var cresult = _db.CreateType <R>(cinfo, cdata[gr]);
                result.Add(cresult);
            }

            return(result);
        }
Пример #3
0
        public static List <R> CreateAnonymousType <R>(ServerResult server_res, Tuple <Dictionary <string, string>, Dictionary <string, short> > def, Ldb _db, List <string> props)
        {
            List <R> result = new List <R>();
            List <KeyValuePair <int, R> > ordered_result = new List <KeyValuePair <int, R> >();
            var data = server_res.SelectEntityResult;
            var fv   = data[data.Keys.First()];

            if (fv == null)
            {
                return(new List <R>());
            }
            int[] currents     = new int[def.Item1.Count() + 1];
            int[] currents_ids = new int[def.Item1.Count() + 1];
            int   id_nr        = 0;

            Tuple <List <int>, List <byte> >[] data_array = new Tuple <List <int>, List <byte> > [def.Item1.Count() + 1];
            int c = -1;

            foreach (var item in def.Item1)
            {
                c++;
                if (item.Key == "Id")
                {
                    id_nr = c;
                }
                currents[c]     = 0;
                currents_ids[c] = 0;
            }

            int cc_ = -1;
            var cc  = new Dictionary <string, int>();

            foreach (var name in props)
            {
                cc_++;
                if (cc_ == id_nr && name != "Id")
                {
                    cc_++;
                }
                data_array[cc_] = data[name];
                cc[name]        = cc_;
            }
            cc["Id"]          = id_nr;
            data_array[id_nr] = data["Id"];
            for (int i = 0; i < server_res.Count; i++)
            {
                int id = data_array[id_nr].Item1[currents_ids[id_nr]];
                if (!props.Contains("Id"))
                {
                    currents_ids[id_nr]++;
                }
                List <object> cdata = new List <object>();
                foreach (var name in props)
                {
                    int nr = cc[name];
                    if (!data.ContainsKey(name))
                    {
                        continue;
                    }
                    var    type = _db.StringTypeToLinqType(def.Item1[name]);
                    var    by   = data_array[nr];
                    byte[] val  = null;
                    bool   skip = false;
                    if (currents_ids[nr] >= by.Item1.Count || id < by.Item1[currents_ids[nr]])
                    {
                        skip = true;
                    }
                    else
                    {
                        currents_ids[nr]++;
                    }
                    if (by.Item2.Any() && !skip)
                    {
                        if (type == LinqDbTypes.int_)
                        {
                            if (by.Item2[currents[nr]] == 1)
                            {
                                currents[nr]++;
                                val = new byte[4];
                                for (int j = 0; j < 4; j++)
                                {
                                    val[j] = by.Item2[currents[nr]];
                                    currents[nr]++;
                                }
                            }
                            else if (by.Item2[currents[nr]] == 250)
                            {
                                currents[nr]++;
                                val    = new byte[1];
                                val[0] = NullConstant[0];
                            }
                            else
                            {
                                currents[nr]++;
                            }
                        }
                        else if (type == LinqDbTypes.double_ || type == LinqDbTypes.DateTime_)
                        {
                            if (by.Item2[currents[nr]] == 1)
                            {
                                currents[nr]++;
                                val = new byte[8];
                                for (int j = 0; j < 8; j++)
                                {
                                    val[j] = by.Item2[currents[nr]];
                                    currents[nr]++;
                                }
                            }
                            else if (by.Item2[currents[nr]] == 250)
                            {
                                currents[nr]++;
                                val    = new byte[1];
                                val[0] = NullConstant[0];
                            }
                            else
                            {
                                currents[nr]++;
                            }
                        }
                        else
                        {
                            int size = BitConverter.ToInt32(new byte[4] {
                                by.Item2[currents[nr]], by.Item2[currents[nr] + 1], by.Item2[currents[nr] + 2], by.Item2[currents[nr] + 3]
                            }, 0);
                            currents[nr] += 4;
                            if (size > 0)
                            {
                                val = new byte[size];
                                for (int j = 0; j < size; j++)
                                {
                                    val[j] = by.Item2[currents[nr]];
                                    currents[nr]++;
                                }
                            }
                            else if (size == -2)
                            {
                                val    = new byte[1];
                                val[0] = NullConstant[0];
                            }
                        }
                    }
                    if (type != LinqDbTypes.binary_ && type != LinqDbTypes.string_)
                    {
                        if (val == null)
                        {
                            switch (type)
                            {
                            case LinqDbTypes.DateTime_:
                                cdata.Add(new DateTime(0001, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc));
                                break;

                            case LinqDbTypes.double_:
                                cdata.Add((double)0);
                                break;

                            case LinqDbTypes.int_:
                                cdata.Add(0);
                                break;

                            default:
                                throw new LinqDbException("Linqdb: Unsupported type");
                            }
                        }
                        else if (ValsEqual(val, NullConstant))
                        {
                            cdata.Add(null);
                        }
                        else
                        {
                            switch (type)
                            {
                            case LinqDbTypes.DateTime_:
                                cdata.Add(new DateTime(0001, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc).AddMilliseconds(BitConverter.ToDouble(MyReverseWithCopy(val), 0)));
                                break;

                            case LinqDbTypes.double_:
                                cdata.Add(BitConverter.ToDouble(MyReverseWithCopy(val), 0));
                                break;

                            case LinqDbTypes.int_:
                                int int_v = BitConverter.ToInt32(MyReverseWithCopy(val), 0);
                                cdata.Add(int_v);
                                break;

                            default:
                                throw new LinqDbException("Linqdb: Unsupported type");
                            }
                        }
                    }
                    else if (type == LinqDbTypes.binary_)
                    {
                        if (val == null || val.Length == 1)
                        {
                            cdata.Add(null);
                        }
                        else
                        {
                            cdata.Add(val.Skip(1).ToArray());
                        }
                    }
                    else
                    {
                        if (val == null || val.Length == 1)
                        {
                            cdata.Add(null);
                        }
                        else
                        {
                            cdata.Add(Encoding.Unicode.GetString(val.Skip(1).ToArray()));
                        }
                    }
                }

                CompiledInfo <R> cinfo = new CompiledInfo <R>();
                if (server_res.IsOrdered)
                {
                    var cresult = _db.CreateType <R>(cinfo, cdata);
                    //if (id != null)
                    //{
                    ordered_result.Add(new KeyValuePair <int, R>((int)id, cresult));
                    //}
                    //else
                    //{
                    //    var by = data["Id"];
                    //    currents["Id"] += 1;
                    //    byte[] val = new byte[4];
                    //    for (int j = 0; j < 4; j++)
                    //    {
                    //        val[j] = by[currents["Id"]];
                    //        currents["Id"]++;
                    //    }
                    //    id = BitConverter.ToInt32(MyReverseWithCopy(val), 0);
                    //    ordered_result.Add(new KeyValuePair<int, R>((int)id, cresult));
                    //}
                }
                else
                {
                    var cresult = _db.CreateType <R>(cinfo, cdata);
                    result.Add(cresult);
                }
            }

            if (server_res.IsOrdered)
            {
                result = ordered_result.OrderBy(f => server_res.OrderedIds[f.Key]).Select(f => f.Value).ToList();
            }

            return(result);
        }