Example #1
0
    protected DistributedShell()
    {
        var resetComposer =
            new ShellComposer
        {
            new ShellComponent(
                "soft",
                (expr, session) =>
            {
                var dist = Parsing.DistributedQuery(ref expr, session.Client);
                var rng  = Parsing.Range(ref expr, session.Client) ?? DateFilter.Unconstrained;
                Parsing.Eof(expr);
                return(ExecuteResetSoft(dist, rng, session));
            }),
            new ShellComponent(
                "mixed",
                (expr, session) =>
            {
                var dist = Parsing.DistributedQuery(ref expr, session.Client);
                var rng  = Parsing.Range(ref expr, session.Client) ?? DateFilter.Unconstrained;
                Parsing.Eof(expr);
                return(ExecuteResetMixed(dist, rng, session));
            }),
            new ShellComponent(
                "hard",
                (expr, session) =>
            {
                var dist     = Parsing.DistributedQuery(ref expr, session.Client);
                var vouchers = Parsing.OptColVouchers(ref expr, session.Client);
                Parsing.Eof(expr);
                return(ExecuteResetHard(dist, vouchers, session));
            }),
        };

        m_Composer =
            new ShellComposer
        {
            new ShellComponent(
                "all",
                (expr, session) =>
            {
                var safe = Parsing.Token(ref expr, false, static t => t == "unsafe") == null;
                var dist = Parsing.DistributedQuery(ref expr, session.Client);
                Parsing.Eof(expr);
                if (dist.IsDangerous() && safe)
                {
                    throw new SecurityException("检测到弱检索式");
                }

                return(ExecuteList(dist, null, false, session));
            }),
        protected DistributedShell(Accountant helper)
        {
            Accountant = helper;
            var resetComopser =
                new ShellComposer
            {
                new ShellComponent(
                    "soft",
                    (expr, serializer) =>
                {
                    var dist = Parsing.DistributedQuery(ref expr);
                    var rng  = Parsing.Range(ref expr) ?? DateFilter.Unconstrained;
                    Parsing.Eof(expr);
                    return(ExecuteResetSoft(dist, rng));
                }),
                new ShellComponent(
                    "mixed",
                    (expr, serializer) =>
                {
                    var dist = Parsing.DistributedQuery(ref expr);
                    var rng  = Parsing.Range(ref expr) ?? DateFilter.Unconstrained;
                    Parsing.Eof(expr);
                    return(ExcuteResetMixed(dist, rng));
                }),
                new ShellComponent(
                    "hard",
                    (expr, serializer) =>
                {
                    var dist     = Parsing.DistributedQuery(ref expr);
                    var vouchers = Parsing.OptColVouchers(ref expr);
                    Parsing.Eof(expr);
                    return(ExecuteResetHard(dist, vouchers));
                })
            };

            m_Composer =
                new ShellComposer
            {
                new ShellComponent(
                    "all",
                    (expr, serializer) =>
                {
                    var safe = Parsing.Token(ref expr, false, t => t == "unsafe") == null;
                    var dist = Parsing.DistributedQuery(ref expr);
                    Parsing.Eof(expr);
                    if (dist.IsDangerous() && safe)
                    {
                        throw new SecurityException("检测到弱检索式");
                    }

                    return(ExecuteList(dist, null, false, serializer));
                }),
                new ShellComponent(
                    "li",
                    (expr, serializer) =>
                {
                    var safe = Parsing.Token(ref expr, false, t => t == "unsafe") == null;
                    var dt   = Parsing.UniqueTime(ref expr) ?? ClientDateTime.Today;
                    var dist = Parsing.DistributedQuery(ref expr);
                    Parsing.Eof(expr);
                    if (dist.IsDangerous() && safe)
                    {
                        throw new SecurityException("检测到弱检索式");
                    }

                    return(ExecuteList(dist, dt, true, serializer));
                }),
                new ShellComponent(
                    "q",
                    (expr, serializer) =>
                {
                    var safe = Parsing.Token(ref expr, false, t => t == "unsafe") == null;
                    var dist = Parsing.DistributedQuery(ref expr);
                    Parsing.Eof(expr);
                    if (dist.IsDangerous() && safe)
                    {
                        throw new SecurityException("检测到弱检索式");
                    }

                    return(ExecuteQuery(dist, serializer));
                }),
                new ShellComponent(
                    "reg",
                    (expr, serializer) =>
                {
                    var dist     = Parsing.DistributedQuery(ref expr);
                    var rng      = Parsing.Range(ref expr) ?? DateFilter.Unconstrained;
                    var vouchers = Parsing.OptColVouchers(ref expr);
                    Parsing.Eof(expr);
                    return(ExecuteRegister(dist, rng, vouchers, serializer));
                }),
                new ShellComponent(
                    "unreg",
                    (expr, serializer) =>
                {
                    var dist     = Parsing.DistributedQuery(ref expr);
                    var rng      = Parsing.Range(ref expr) ?? DateFilter.Unconstrained;
                    var vouchers = Parsing.OptColVouchers(ref expr);
                    Parsing.Eof(expr);
                    return(ExecuteUnregister(dist, rng, vouchers, serializer));
                }),
                new ShellComponent(
                    "recal",
                    (expr, serializer) =>
                {
                    var dist = Parsing.DistributedQuery(ref expr);
                    Parsing.Eof(expr);
                    return(ExecuteRecal(dist, serializer));
                }),
                new ShellComponent("rst", (expr, serializer) => resetComopser.Execute(expr, serializer)),
                new ShellComponent(
                    "ap",
                    (expr, serializer) =>
                {
                    var collapse = Parsing.Optional(ref expr, "col");
                    var dist     = Parsing.DistributedQuery(ref expr);
                    var rng      = Parsing.Range(ref expr) ?? DateFilter.Unconstrained;
                    Parsing.Eof(expr);
                    return(ExecuteApply(dist, rng, collapse));
                }),
                new ShellComponent(
                    "chk",
                    (expr, serializer) =>
                {
                    var dist = Parsing.DistributedQuery(ref expr);
                    Parsing.Eof(expr);
                    return(ExecuteCheck(dist, new DateFilter(null, ClientDateTime.Today), serializer));
                }),
                new ShellComponent(
                    null,
                    (expr, serializer) =>
                {
                    var dt   = Parsing.UniqueTime(ref expr) ?? ClientDateTime.Today;
                    var dist = Parsing.DistributedQuery(ref expr);
                    Parsing.Eof(expr);
                    return(ExecuteList(dist, dt, false, serializer));
                })
            };
        }