Exemplo n.º 1
0
        public ISerializableObject CreateISerializableObject(Type type)
        {
            AttributeWorker w = AttributeWorker.GetInstance(Target);

            ISerializableObject iso = null;

            try
            {
                iso = (ISerializableObject)Activator.CreateInstance(type);
            }
            catch (InvalidCastException)
            {
                throw new SerializerException();
            }

            _objectPool.Register(iso);

            ResolverData <ISerializableObject> data = new ResolverData <ISerializableObject>();

            data.FieldsToResolve = AttributeWorker.RetrieveAllFields(iso.GetType());
            data.HandledItem     = iso;
            CreateHandler handler = new CreateHandler(this);
            RelationResolver <ISerializableObject> resolver = new RelationResolver <ISerializableObject>();

            resolver.Handler = handler;
            resolver.StartRelationResolving(data);

            return(iso);
        }
Exemplo n.º 2
0
        internal void Delete(ISerializableObject iso, ISerializerTransaction transaction)
        {
            if (!IsManaged(iso))
            {
                return;
            }



            AttributeWorker w = AttributeWorker.GetInstance(Target);


            ResolverData <ISerializableObject> data = new ResolverData <ISerializableObject>();

            data.FieldsToResolve = AttributeWorker.RetrieveAllFields(iso.GetType());
            data.HandledItem     = iso;

            DeleteHandler h = new DeleteHandler(this);
            RelationResolver <ISerializableObject> res = new RelationResolver <ISerializableObject>();

            res.Handler = h;


            h.MODE = DeleteHandler.DOWNMODE;
            res.StartRelationResolving(data);


            _objectPool.DeleteObject(iso, _connection, transaction);

            h.MODE = DeleteHandler.UPMODE;
            res.StartRelationResolving(data);
        }
Exemplo n.º 3
0
        /// <summary>
        /// Получает функцию резолвинга.
        /// </summary>
        /// <typeparam name="T">Тип резолвинга.</typeparam>
        /// <typeparam name="TResolver">Тип резолвера.</typeparam>
        /// <param name="needAuth">Необходимость авторизованных запросов.</param>
        /// <returns>Функция резолвинга.</returns>
        protected Func <ResolveFieldContext <T>, Task <T> > GetResolver <T, TResolver>(bool needAuth = false)
            where TResolver : class, ITypeResolver <T>

        {
            var data = new ResolverData <T, TResolver, ResolveFieldContext <T> >(needAuth);

            return(data.Resolve);
        }
Exemplo n.º 4
0
        public void Resolver_Complex()
        {
            var target   = new PackageIdentity("EntityFramework", NuGetVersion.Parse("7.0.0-beta4"));
            var packages = ResolverData.CreateEntityFrameworkPackageGraph();

            var resolver = new PackageResolver();
            var context  = CreatePackageResolverContext(DependencyBehavior.Lowest, target, packages);
            var solution = resolver.Resolve(context, CancellationToken.None);

            Assert.True(solution.Contains(target, PackageIdentityComparer.Default));
        }
Exemplo n.º 5
0
        internal ISerializableObject Load(Type type, string table, IRestriction restriction, ISerializerTransaction transaction)
        {
            bool found    = false;
            bool multiple = false;
            bool isLoaded = false;


            DbDataReader        reader = CreateDataReader(type, table, restriction, transaction);
            ISerializableObject data   = null;

            if (reader.Read())
            {
                data  = _objectPool.RetrieveObject(type, reader, ref isLoaded);
                found = true;
            }



            if (reader.Read())
            {
                multiple = true;
            }
            reader.Close();

            if (multiple)
            {
                throw new MultipleResultException("More than one Result found for the given Restriction ...");
            }

            if (data == null)
            {
                return(null);
            }

            bool doRelationLoading = found && isLoaded;


            if (doRelationLoading)
            {
                ResolverData <ISerializableObject> rData = new ResolverData <ISerializableObject>();
                rData.HandledItem     = data;
                rData.FieldsToResolve = AttributeWorker.RetrieveAllFields(data.GetType());

                LoadHandler handler = new LoadHandler(this);
                RelationResolver <ISerializableObject> res = new RelationResolver <ISerializableObject>();
                res.Handler = handler;
                res.StartRelationResolving(rData);
            }

            return(data);
        }
Exemplo n.º 6
0
        internal T Load <T>(IRestriction restriction, int readerPosition, ISerializerTransaction transaction) where T : ISerializableObject
        {
            if (readerPosition < 0)
            {
                throw new ArgumentOutOfRangeException("The passed reader position is less than 0.");
            }


            bool found    = false;
            bool isLoaded = false;


            DbDataReader reader = CreateDataReader(typeof(T), restriction, transaction);
            T            data   = default(T);



            for (int i = 0; i <= readerPosition; i++)
            {
                if (!reader.Read())
                {
                    reader.Close();
                    throw new ArgumentOutOfRangeException("The passed reader position is too big.");
                }
            }

            data  = (T)_objectPool.RetrieveObject(typeof(T), reader, ref isLoaded);
            found = true;
            reader.Close();

            if (data == null)
            {
                return(default(T));
            }

            bool doRelationLoading = found && isLoaded;

            if (doRelationLoading)
            {
                ResolverData <ISerializableObject> rData = new ResolverData <ISerializableObject>();
                rData.HandledItem     = data;
                rData.FieldsToResolve = AttributeWorker.RetrieveAllFields(data.GetType());

                LoadHandler handler = new LoadHandler(this);
                RelationResolver <ISerializableObject> res = new RelationResolver <ISerializableObject>();
                res.Handler = handler;
                res.StartRelationResolving(rData);
            }

            return(data);
        }
Exemplo n.º 7
0
        internal void InitSyncContainer(IDictionary <Guid, SyncContainer> pooledObjects)
        {
            ResolverData <ISerializableObject> data = new ResolverData <ISerializableObject>();

            ISerializableObject iso = FetchObject(_sourceSerializer, _sourceGuid);

            data.HandledItem     = iso;
            data.FieldsToResolve = AttributeWorker.RetrieveAllFields(iso.GetType());//Sind alle nötig?

            DependencyRelationHandler h = new DependencyRelationHandler(this, pooledObjects);
            RelationResolver <ISerializableObject> r = new RelationResolver <ISerializableObject>();

            r.Handler = h;
            r.StartRelationResolving(data);
        }
Exemplo n.º 8
0
        public ResolverData GetResolverData(string id)
        {
            foreach (ResolverData resolverData in ResolverDatas)
            {
                if (resolverData.ResolverId == id)
                {
                    return(resolverData);
                }
            }

            ResolverData newResolver = new ResolverData();

            newResolver.ResolverId = id;

            ResolverDatas.Add(newResolver);

            return(newResolver);
        }
Exemplo n.º 9
0
        internal void Save(ISerializableObject iso, ISerializerTransaction transaction)
        {
            AttributeWorker w = AttributeWorker.GetInstance(Target);

            if (!IsManaged(iso))
            {
//                Console.WriteLine("SERIALIZE");
                _objectPool.InsertObject(iso, _connection, transaction);

                ResolverData <ISerializableObject> rData = new ResolverData <ISerializableObject>();
                rData.HandledItem     = iso;
                rData.FieldsToResolve = AttributeWorker.RetrieveAllFields(iso.GetType());

                LoadHandler handler = new LoadHandler(this);
                RelationResolver <ISerializableObject> res = new RelationResolver <ISerializableObject>();
                res.Handler = handler;
                res.StartRelationResolving(rData);
            }
            else
            {
//                Console.WriteLine("UPDATE");
                UpdateStates state = _objectPool.UpdateObject(iso, _connection, transaction);

                if (state == UpdateStates.NO_ROWS_AFFECTED)
                {
                    throw new SerializerException("entry could not be updated ...");
                }
                else if (state == UpdateStates.PRIMARYKEY_MODIFIED)
                {
                    UpdateEventArgs args = new UpdateEventArgs(state);
                    OnUpdateEvent(args);
                }

                ResolverData <ISerializableObject> data = new ResolverData <ISerializableObject>();
                data.HandledItem     = iso;
                data.FieldsToResolve = AttributeWorker.RetrieveAllFields(iso.GetType());

                RelationResolver <ISerializableObject> res = new RelationResolver <ISerializableObject>();
                res.Handler = new UpdateHandler(this);
                res.StartRelationResolving(data);
            }
        }
Exemplo n.º 10
0
        public static DnsDatagram ResolveViaNameServers(DnsQuestionRecord question, NameServerAddress[] nameServers = null, IDnsCache cache = null, NetProxy proxy = null, bool preferIPv6 = false, bool tcp = false, int retries = 2, int maxStackCount = 10)
        {
            if ((nameServers != null) && (nameServers.Length > 0))
            {
                //create copy of name servers array so that the values in original array are not messed due to shuffling feature
                NameServerAddress[] nameServersCopy = new NameServerAddress[nameServers.Length];
                Array.Copy(nameServers, nameServersCopy, nameServers.Length);
                nameServers = nameServersCopy;
            }

            Stack <ResolverData> resolverStack = new Stack <ResolverData>();
            int stackNameServerIndex           = 0;

            while (true) //stack loop
            {
                if (resolverStack.Count > maxStackCount)
                {
                    while (resolverStack.Count > 0)
                    {
                        ResolverData data = resolverStack.Pop();

                        question = data.Question;
                    }

                    throw new DnsClientException("DnsClient exceeded the maximum stack count to resolve the domain: " + question.Name);
                }

                if (cache != null)
                {
                    DnsDatagram request       = new DnsDatagram(new DnsHeader(0, false, DnsOpcode.StandardQuery, false, false, true, false, false, false, DnsResponseCode.NoError, 1, 0, 0, 0), new DnsQuestionRecord[] { question }, null, null, null);
                    DnsDatagram cacheResponse = cache.Query(request);

                    switch (cacheResponse.Header.RCODE)
                    {
                    case DnsResponseCode.NoError:
                        if (cacheResponse.Answer.Length > 0)
                        {
                            if (resolverStack.Count == 0)
                            {
                                return(cacheResponse);
                            }
                            else
                            {
                                ResolverData data = resolverStack.Pop();

                                question             = data.Question;
                                nameServers          = data.NameServers;
                                stackNameServerIndex = data.NameServerIndex;

                                switch (cacheResponse.Answer[0].Type)
                                {
                                case DnsResourceRecordType.AAAA:
                                    nameServers[stackNameServerIndex] = new NameServerAddress(nameServers[stackNameServerIndex].Domain, (cacheResponse.Answer[0].RDATA as DnsAAAARecord).Address);
                                    break;

                                case DnsResourceRecordType.A:
                                    nameServers[stackNameServerIndex] = new NameServerAddress(nameServers[stackNameServerIndex].Domain, (cacheResponse.Answer[0].RDATA as DnsARecord).Address);
                                    break;

                                default:
                                    //didnt find IP for current name server
                                    stackNameServerIndex++;         //increment to skip current name server
                                    break;
                                }

                                continue;     //stack loop
                            }
                        }

                        if (cacheResponse.Authority.Length > 0)
                        {
                            if (cacheResponse.Authority[0].Type == DnsResourceRecordType.SOA)
                            {
                                if (resolverStack.Count == 0)
                                {
                                    return(cacheResponse);
                                }
                                else
                                {
                                    if (question.Type == DnsResourceRecordType.AAAA)
                                    {
                                        question = new DnsQuestionRecord(question.Name, DnsResourceRecordType.A, question.Class);
                                    }
                                    else
                                    {
                                        //didnt find IP for current name server
                                        //pop and try next name server
                                        ResolverData data = resolverStack.Pop();

                                        question             = data.Question;
                                        nameServers          = data.NameServers;
                                        stackNameServerIndex = data.NameServerIndex + 1;     //increment to skip current name server
                                    }

                                    continue;     //to stack loop
                                }
                            }

                            if ((nameServers == null) || (nameServers.Length == 0))
                            {
                                NameServerAddress[] cacheNameServers = NameServerAddress.GetNameServersFromResponse(cacheResponse, preferIPv6, true);

                                if (cacheNameServers.Length > 0)
                                {
                                    nameServers = cacheNameServers;
                                }
                            }
                        }

                        break;

                    case DnsResponseCode.NameError:
                        if (resolverStack.Count == 0)
                        {
                            return(cacheResponse);
                        }
                        else
                        {
                            //current name server domain doesnt exists
                            //pop and try next name server
                            ResolverData data = resolverStack.Pop();

                            question             = data.Question;
                            nameServers          = data.NameServers;
                            stackNameServerIndex = data.NameServerIndex + 1; //increment to skip current name server

                            continue;                                        //stack loop
                        }
                    }
                }

                if ((nameServers == null) || (nameServers.Length == 0))
                {
                    //create copy of root name servers array so that the values in original array are not messed due to shuffling feature
                    if (preferIPv6)
                    {
                        nameServers = new NameServerAddress[ROOT_NAME_SERVERS_IPv6.Length];
                        Array.Copy(ROOT_NAME_SERVERS_IPv6, nameServers, ROOT_NAME_SERVERS_IPv6.Length);
                    }
                    else
                    {
                        nameServers = new NameServerAddress[ROOT_NAME_SERVERS_IPv4.Length];
                        Array.Copy(ROOT_NAME_SERVERS_IPv4, nameServers, ROOT_NAME_SERVERS_IPv4.Length);
                    }
                }

                NameServerAddress.Shuffle(nameServers);

                int hopCount = 0;
                while ((hopCount++) < MAX_HOPS) //resolver loop
                {
                    //copy and reset stack name server index since its one time use only after stack pop
                    int i = stackNameServerIndex;
                    stackNameServerIndex = 0;

                    //query name servers one by one
                    for (; i < nameServers.Length; i++) //retry next server loop
                    {
                        NameServerAddress currentNameServer = nameServers[i];

                        if (question.Name == currentNameServer.Domain)
                        {
                            continue; //obvious!
                        }
                        if (currentNameServer.EndPoint == null)
                        {
                            resolverStack.Push(new ResolverData(question, nameServers, i));

                            if (preferIPv6)
                            {
                                question = new DnsQuestionRecord(currentNameServer.Domain, DnsResourceRecordType.AAAA, question.Class);
                            }
                            else
                            {
                                question = new DnsQuestionRecord(currentNameServer.Domain, DnsResourceRecordType.A, question.Class);
                            }

                            nameServers = null;
                            goto stackLoop;
                        }

                        DnsClient client = new DnsClient(currentNameServer);

                        client._proxy      = proxy;
                        client._preferIPv6 = preferIPv6;
                        client._tcp        = tcp;
                        client._retries    = retries;

                        DnsDatagram request = new DnsDatagram(new DnsHeader(0, false, DnsOpcode.StandardQuery, false, false, true, false, false, false, DnsResponseCode.NoError, 1, 0, 0, 0), new DnsQuestionRecord[] { question }, null, null, null);
                        DnsDatagram response;

                        try
                        {
                            response = client.Resolve(request);
                        }
                        catch (DnsClientException)
                        {
                            continue; //resolver loop
                        }

                        if (response.Header.Truncation)
                        {
                            if (tcp)
                            {
                                return(response);
                            }

                            client._tcp = true;
                            response    = client.Resolve(request);
                        }

                        if (cache != null)
                        {
                            cache.CacheResponse(response);
                        }

                        switch (response.Header.RCODE)
                        {
                        case DnsResponseCode.NoError:
                            if (response.Answer.Length > 0)
                            {
                                if (!response.Answer[0].Name.Equals(question.Name, StringComparison.CurrentCultureIgnoreCase))
                                {
                                    continue;     //continue to next name server since current name server may be misconfigured
                                }
                                if (resolverStack.Count == 0)
                                {
                                    return(response);
                                }
                                else
                                {
                                    ResolverData data = resolverStack.Pop();

                                    question             = data.Question;
                                    nameServers          = data.NameServers;
                                    stackNameServerIndex = data.NameServerIndex;

                                    switch (response.Answer[0].Type)
                                    {
                                    case DnsResourceRecordType.AAAA:
                                        nameServers[stackNameServerIndex] = new NameServerAddress(nameServers[stackNameServerIndex].Domain, (response.Answer[0].RDATA as DnsAAAARecord).Address);
                                        break;

                                    case DnsResourceRecordType.A:
                                        nameServers[stackNameServerIndex] = new NameServerAddress(nameServers[stackNameServerIndex].Domain, (response.Answer[0].RDATA as DnsARecord).Address);
                                        break;

                                    default:
                                        //didnt find IP for current name server
                                        stackNameServerIndex++;         //increment to skip current name server
                                        break;
                                    }

                                    goto resolverLoop;
                                }
                            }

                            if (response.Authority.Length == 0)
                            {
                                continue;     //continue to next name server since current name server may be misconfigured
                            }
                            if (response.Authority[0].Type == DnsResourceRecordType.SOA)
                            {
                                //no entry for given type
                                if (resolverStack.Count == 0)
                                {
                                    return(response);
                                }
                                else
                                {
                                    if (question.Type == DnsResourceRecordType.AAAA)
                                    {
                                        question = new DnsQuestionRecord(question.Name, DnsResourceRecordType.A, question.Class);
                                    }
                                    else
                                    {
                                        //didnt find IP for current name server
                                        //pop and try next name server
                                        ResolverData data = resolverStack.Pop();

                                        question             = data.Question;
                                        nameServers          = data.NameServers;
                                        stackNameServerIndex = data.NameServerIndex + 1;     //increment to skip current name server
                                    }

                                    goto stackLoop;     //goto stack loop
                                }
                            }

                            nameServers = NameServerAddress.GetNameServersFromResponse(response, preferIPv6, false);

                            if (nameServers.Length == 0)
                            {
                                continue;     //continue to next name server since current name server may be misconfigured
                            }
                            goto resolverLoop;

                        case DnsResponseCode.NameError:
                            if (resolverStack.Count == 0)
                            {
                                return(response);
                            }
                            else
                            {
                                //current name server domain doesnt exists
                                //pop and try next name server
                                ResolverData data = resolverStack.Pop();

                                question             = data.Question;
                                nameServers          = data.NameServers;
                                stackNameServerIndex = data.NameServerIndex + 1; //increment to skip current name server

                                goto stackLoop;                                  //goto stack loop
                            }

                        default:
                            continue;     //continue to next name server since current name server may be misconfigured
                        }
                    }

                    if (resolverStack.Count == 0)
                    {
                        throw new DnsClientException("DnsClient failed to resolve the request: no response from name servers.");
                    }
                    else
                    {
                        //didnt find IP for current name server
                        //pop and try next name server
                        ResolverData data = resolverStack.Pop();

                        question             = data.Question;
                        nameServers          = data.NameServers;
                        stackNameServerIndex = data.NameServerIndex + 1; //increment to skip current name server

                        break;                                           //to stack loop
                    }

                    resolverLoop :;
                }

                stackLoop :;
            }
        }