public JsonNextLinkConverter()
        {
            var collectionType = typeof(T);

            _reader = ReadAccessor.Create(collectionType, AccessorMemberTypes.Properties, AccessorMemberScope.Public, out _members);
            _writer = WriteAccessor.Create(collectionType, AccessorMemberTypes.Properties, AccessorMemberScope.Public);
        }
Пример #2
0
        public DocumentDbRepository(string slot, IOptionsMonitor <DocumentDbOptions> options,
                                    ISafeLogger <DocumentDbRepository <T> > logger)
        {
            _reads   = ReadAccessor.Create(typeof(T));
            _writes  = WriteAccessor.Create(typeof(T));
            _slot    = slot;
            _options = options;
            _logger  = logger;

            var defaultSettings   = new JsonSerializerSettings();
            var documentDbOptions = options.Get(_slot);

            _client = new DocumentClient(EndpointUri, documentDbOptions.AccountKey, defaultSettings);


            _client2 = new CosmosClient(EndpointUri.ToString(), documentDbOptions.AccountKey,
                                        new CosmosClientOptions
            {
                AllowBulkExecution = true,
                ConnectionMode     = ConnectionMode.Gateway,
                MaxRetryAttemptsOnRateLimitedRequests = 100
            });

            CreateDatabaseIfNotExistsAsync().Wait();
            CreateCollectionIfNotExistsAsync().Wait();
        }
Пример #3
0
 public JsonMergePatch(Type type)
 {
     _reads   = ReadAccessor.Create(type, AccessorMemberTypes.Properties, AccessorMemberScope.Public, out _members);
     _writes  = WriteAccessor.Create(type);
     _data    = Activator.CreateInstance <T>();
     _changed = new HashSet <string>();
 }
        private static void SetMembers(IConfiguration configuration, object instance, BinderOptions options,
                                       AccessorMembers members, ITypeReadAccessor read, ITypeWriteAccessor write,
                                       IEnumerable <ICustomConfigurationBinder> customBinders)
        {
            foreach (var member in members)
            {
                // We don't support set only, non-public, or indexer properties
                if (!member.CanRead || member.MemberInfo is MethodInfo method && method.GetParameters().Length > 0)
                {
                    continue;
                }

                var value = read[instance, member.Name];
                if (value == null && !member.CanWrite)
                {
                    // Property doesn't have a value and we cannot set it so there is no
                    // point in going further down the graph
                    continue;
                }

                var config = configuration.GetSection(member.Name);
                value = BindInstance(member.Type, value, config, options, customBinders);
                if (value == default || !member.CanWrite)
                {
                    continue;
                }

                write.TrySetValue(instance, member.Name, value);
            }
        }
Пример #5
0
        private ValidationResult ValidateSiblings(ValidationContext validationContext, AccessorMembers members,
                                                  ITypeReadAccessor accessor, bool present)
        {
            var provided = Pooling.HashSetPool.Get();
            var all      = Pooling.HashSetPool.Get();

            try
            {
                foreach (var member in members)
                {
                    if (member.Name == validationContext.MemberName ||
                        member.MemberType != AccessorMemberType.Property &&
                        member.MemberType != AccessorMemberType.Field ||
                        !member.CanRead || !member.TryGetAttribute <RequiredOnlyOneAttribute>(out var attribute))
                    {
                        continue;
                    }

                    accessor.TryGetValue(validationContext.ObjectInstance, member.Name, out var memberValue);

                    var memberContext =
                        new ValidationContext(validationContext.ObjectInstance)
                    {
                        MemberName = member.Name
                    };

                    all.Add(memberContext.DisplayName);

                    var result = attribute.BaseIsValid(memberValue, memberContext);
                    if (result == null)
                    {
                        provided.Add(memberContext.DisplayName);
                    }
                }

                switch (provided.Count)
                {
                case 0 when present:
                case 1 when !present:
                    return(ValidationResult.Success);

                case 0:
                    all.Add(validationContext.DisplayName);
                    return(new ValidationResult(string.Format(CultureInfo.CurrentCulture, ErrorMessageString,
                                                              string.Join(", ", all.OrderBy(x => x)))));

                default:
                    provided.Add(validationContext.DisplayName);
                    return(new ValidationResult(string.Format(CultureInfo.CurrentCulture, MoreThanOneErrorMessage,
                                                              string.Join(", ", provided.OrderBy(x => x)))));
                }
            }
            finally
            {
                Pooling.HashSetPool.Return(provided);
                Pooling.HashSetPool.Return(all);
            }
        }
        public SqliteResourceDataService(IStringLocalizer <SqliteResourceDataService <T> > localizer, string filePath,
                                         int revision, ChangeLogBuilder changeLog, ILogger <SqliteResourceDataService <T> > logger)
        {
            _revision  = revision;
            _changeLog = changeLog;
            _localizer = localizer;
            _logger    = logger;
            _reads     = ReadAccessor.Create(typeof(T), AccessorMemberTypes.Properties, AccessorMemberScope.Public, out _members);

            CreateIfNotExists(filePath);
            FilePath = filePath;
        }
Пример #7
0
        public PropertyAccessor(ITypeReadAccessor reads, ITypeWriteAccessor writes, string name)
        {
            var members = AccessorMembers.Create(reads.Type, AccessorMemberTypes.Properties);

            Info = members.PropertyInfo.Single(m => m.Name == name);

            Type = Info.PropertyType;
            Name = name;

            _reads  = reads;
            _writes = writes;
        }
Пример #8
0
        public PropertyAccessor(ITypeReadAccessor reads, ITypeWriteAccessor writes, Type type, string name)
        {
            Type = type;
            Name = name;

            _reads  = reads;
            _writes = writes;

            var members = AccessorMembers.Create(type);

            Info = members.PropertyInfo.SingleOrDefault(m => m.Name == name);

            var member = members.SingleOrDefault(p => p.Name == name);

            if (member == null)
            {
                return;
            }
            _member = member;
        }
Пример #9
0
        public static Query Update(IDataDescriptor descriptor, dynamic set, dynamic where = null)
        {
            ITypeReadAccessor setAccessor = ReadAccessor.Create(set.GetType());
            IReadOnlyDictionary <string, object> setHash = ReadAccessorExtensions.AsReadOnlyDictionary(setAccessor, set);
            var setFilter = descriptor.Updated.Select(c => c.ColumnName).Intersect(setHash.Keys).ToList();

            IReadOnlyDictionary <string, object> whereHash = null;

            if (where != null)
            {
                ITypeReadAccessor whereAccessor = ReadAccessor.Create(where.GetType());
                whereHash = ReadAccessorExtensions.AsReadOnlyDictionary(whereAccessor, where);
            }

            var whereFilter = Dialect.ResolveColumnNames(descriptor);

            if (whereHash != null)
            {
                whereFilter = whereFilter.Intersect(whereHash.Keys);
            }

            return(Update(descriptor, setFilter, whereFilter.ToList(), setHash, whereHash));
        }
Пример #10
0
 public JsonDeltaConverter()
 {
     _reader = ReadAccessor.Create(typeof(T), AccessorMemberTypes.Properties, AccessorMemberScope.Public, out _members);
     _writer = WriteAccessor.Create(typeof(T), AccessorMemberTypes.Properties, AccessorMemberScope.Public);
 }
Пример #11
0
        public static Dictionary <string, object> InsertSql <T>(T resource, string resourceName, ITypeReadAccessor reads,
                                                                AccessorMembers members, int revision, long?sequence, bool deleted, out string sql)
        {
            if (resource == null)
            {
                throw new NullReferenceException();
            }

            var hash = new Dictionary <string, object> {
                { "Sequence", sequence ! }
            };

            sql = Pooling.StringBuilderPool.Scoped(sb =>
            {
                var fields = members.GetValueTypeFields();

                sb.Append("INSERT INTO '");
                sb.Append(resourceName);
                sb.Append("_V");
                sb.Append(revision);
                sb.Append("' (");
                for (var i = 0; i < fields.Length; i++)
                {
                    if (i != 0)
                    {
                        sb.Append(", ");
                    }
                    var column = fields[i];
                    sb.Append("\"");
                    sb.Append(column.Name);
                    sb.Append("\"");
                }

                if (deleted)
                {
                    sb.Append(", \"IsDeleted\"");
                }

                sb.Append(", \"Sequence\") VALUES (");
                for (var i = 0; i < fields.Length; i++)
                {
                    if (i != 0)
                    {
                        sb.Append(", ");
                    }
                    var column = fields[i];
                    sb.Append(":");
                    sb.Append(column.Name);
                }

                if (deleted)
                {
                    sb.Append(", 1");
                }

                sb.Append(", :Sequence)");

                foreach (var member in fields)
                {
                    if (!member.CanRead)
                    {
                        continue;
                    }
                    if (reads.TryGetValue(resource, member.Name, out var value))
                    {
                        hash.Add(member.Name, value);
                    }
                }
            });

            return(hash);
        }