예제 #1
0
        public ICondition Validate(IDataAccessContextBase context, ICondition criteria)
        {
            var user = this.User;

            if (user == null)
            {
                return(criteria);
            }

            if (criteria == null)
            {
                return(Condition.Equal(SITE_ID, user.SiteId));
            }

            if (criteria.Matches(SITE_ID, matched => matched.Value = user.SiteId) > 0)
            {
                return(criteria);
            }

            if (criteria is ConditionCollection conditions && conditions.Combination == ConditionCombination.And)
            {
                conditions.Add(Condition.Equal(SITE_ID, user.SiteId));
                return(conditions);
            }

            return(ConditionCollection.And(Condition.Equal(SITE_ID, user.SiteId), criteria));
        }
예제 #2
0
            public IDataSource GetSource(IDataAccessContextBase context)
            {
                if (this.EnsureSources())
                {
                    return(this.Selector.GetSource(context, _sources) ?? throw new DataException("No matched data source for this data operation."));
                }

                throw new DataException($"No data sources for the '{_name}' data provider was found.");
            }
예제 #3
0
            public IDataSource GetSource(IDataAccessContextBase context, IReadOnlyList <IDataSource> sources)
            {
                if (sources == null)
                {
                    return(_source);
                }

                return(sources[0]);
            }
예제 #4
0
        private DataAccessMode GetAccessMode(IDataAccessContextBase context)
        {
            switch (context.Method)
            {
            case DataAccessMethod.Exists:
            case DataAccessMethod.Select:
            case DataAccessMethod.Aggregate:
                return(DataAccessMode.ReadOnly);

            default:
                return(DataAccessMode.WriteOnly);
            }
        }
예제 #5
0
        public IDataSource GetSource(IDataAccessContextBase context, IReadOnlyList <IDataSource> sources)
        {
            if (sources == null || sources.Count == 0)
            {
                return(null);
            }

            var mode    = this.GetAccessMode(context);
            var matches = sources.Where(p => (p.Mode & mode) == mode).ToArray();

            if (matches.Length == 1)
            {
                return(matches[0]);
            }

            //获取一个随机的下标
            var index = Zongsoft.Common.Randomizer.GenerateInt32() % matches.Length;

            return(matches[index]);
        }
        protected virtual void OnFiltered(IDataAccessContextBase context)
        {
            switch (context.Method)
            {
            case DataAccessMethod.Count:
                this.OnCounted((DataCountContextBase)context);
                break;

            case DataAccessMethod.Exists:
                this.OnExisted((DataExistContextBase)context);
                break;

            case DataAccessMethod.Increment:
                this.OnIncremented((DataIncrementContextBase)context);
                break;

            case DataAccessMethod.Select:
                this.OnSelected((DataSelectContextBase)context);
                break;

            case DataAccessMethod.Delete:
                this.OnDeleted((DataDeleteContextBase)context);
                break;

            case DataAccessMethod.Insert:
                this.OnInserted((DataInsertContextBase)context);
                break;

            case DataAccessMethod.Update:
                this.OnUpdated((DataUpdateContextBase)context);
                break;

            case DataAccessMethod.Upsert:
                this.OnUpserted((DataUpsertContextBase)context);
                break;

            case DataAccessMethod.Execute:
                this.OnExecuted((DataExecuteContextBase)context);
                break;
            }
        }
예제 #7
0
        protected override void OnFiltering(IDataAccessContextBase context)
        {
            //首先调用全局过滤器的前趋部分
            foreach (var filter in DataEnvironment.Filters)
            {
                if (filter == null)
                {
                    continue;
                }

                var predication = filter as Zongsoft.Services.IPredication;

                if (predication == null || predication.Predicate(context))
                {
                    filter.OnFiltering(context);
                }
            }

            //最后调用本数据访问器的过滤器前趋部分
            base.OnFiltering(context);
        }
 void Common.IExecutionFilter <IDataAccessContextBase> .OnFiltering(IDataAccessContextBase context)
 {
     this.OnFiltering(context);
 }
            public void OnFiltered(IDataAccessContextBase context)
            {
                switch (context)
                {
                case DataExistContextBase existing:
                    var exists = _exists;
                    if (exists != null)
                    {
                        foreach (var filter in exists)
                        {
                            filter.OnFiltered(existing);
                        }
                    }

                    break;

                case DataSelectContextBase selection:
                    var selects = _selects;
                    if (selects != null)
                    {
                        foreach (var filter in selects)
                        {
                            filter.OnFiltered(selection);
                        }
                    }

                    break;

                case DataDeleteContextBase deletion:
                    var deletes = _deletes;
                    if (deletes != null)
                    {
                        foreach (var filter in deletes)
                        {
                            filter.OnFiltered(deletion);
                        }
                    }

                    break;

                case DataInsertContextBase insertion:
                    var inserts = _inserts;
                    if (inserts != null)
                    {
                        foreach (var filter in inserts)
                        {
                            filter.OnFiltered(insertion);
                        }
                    }

                    break;

                case DataUpdateContextBase updation:
                    var updates = _updates;
                    if (updates != null)
                    {
                        foreach (var filter in updates)
                        {
                            filter.OnFiltered(updation);
                        }
                    }

                    break;

                case DataUpsertContextBase upsertion:
                    var upserts = _upserts;
                    if (upserts != null)
                    {
                        foreach (var filter in upserts)
                        {
                            filter.OnFiltered(upsertion);
                        }
                    }

                    break;

                case DataExecuteContextBase execution:
                    var executes = _executes;
                    if (executes != null)
                    {
                        foreach (var filter in executes)
                        {
                            filter.OnFiltered(execution);
                        }
                    }

                    break;

                case DataAggregateContextBase aggregation:
                    var aggregates = _aggregates;
                    if (aggregates != null)
                    {
                        foreach (var filter in aggregates)
                        {
                            filter.OnFiltered(aggregation);
                        }
                    }

                    break;
                }
            }
예제 #10
0
 public IDataSource GetSource(IDataAccessContextBase context)
 {
     return(_source);
 }