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); }
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); }
/// <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); }
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)); }
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); }
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); }
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); }
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); }
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); } }
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 :; } }