BulkDbMix.cs 4.2 KB
using FLY.OBJComponents.IService;
using FLY.Weight.IService;
using FObjBase;
using FObjBase.Reflect;
using SQLite;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace FLY.Weight.Server.Model
{
    public class BulkDbMix<TDb>:IBulkDbMixService
        where TDb : IDbBase, new()
    {
        DBTable<TDb> dbTable;
        SQLiteHelper sqliteHelper;
        Func<Lc_Mix, TDb> mapLc2Db;
        Func<TDb, Lc_Mix> mapDb2Lc;

        public long LastId { get; private set; }
        public int Index { get; private set; }
        public event PropertyChangedEventHandler PropertyChanged;


        public BulkDbMix()
        {

        }
        public void Init(DBTable<TDb> dbTable, int index,
            Func<Lc_Mix, TDb> mapLc2Db, Func<TDb, Lc_Mix> mapDb2Lc)
        {
            this.Index = index;
            this.dbTable = dbTable;
            this.sqliteHelper = dbTable.sqliteHelper;
            this.mapLc2Db = mapLc2Db;
            this.mapDb2Lc = mapDb2Lc;



            //获取最后一行数据
            LastId = dbTable.MaxID;
        }


        public void Add(Lc_Mix lc)
        {
            //添加 数据库必要的 field
            lc.ID = dbTable.FreeID;
            lc.Idx = Index;
            //SQLs
            List<string> sqls = new List<string>();
            sqls.Add(SQLiteHelper.GetInsertCommandText(mapLc2Db(lc)));
            sqliteHelper.QueryTranAsync(sqls);

            LastId = lc.ID;
        }
        public void AddRange(IEnumerable<Lc_Mix> lcs)
        {
            //SQLs
            List<string> sqls = new List<string>();

            foreach (var lc in lcs)
            {
                //添加 数据库必要的 field
                lc.ID = dbTable.FreeID;
                lc.Idx = Index;
                sqls.Add(SQLiteHelper.GetInsertCommandText(mapLc2Db(lc)));
            }
            sqliteHelper.QueryTranAsync(sqls);

            LastId = lcs.Last().ID;
        }


        public async void GetTrend(Pack_GetTrendRequest request, AsyncCBHandler asyncDelegate, object asyncContext)
        {

            Pack_GetTrendReponse<Lc_Mix> reponse = new Pack_GetTrendReponse<Lc_Mix>();
            reponse.Request = request;

            if (request.Count > 400)//数量限制,避免死机
                request.Count = 400;
            else if (request.Count < 1)
                request.Count = 1;

            if (request.Interval < 1)//避免 /0
                request.Interval = 1;


            await Task.Factory.StartNew(() =>
            {
                List<TDb> dbs = null;
                if (!request.IsSearchByTime)
                {
                    if (request.Id <= 0)
                        dbs = dbTable.Find(
                            $"WHERE (ID % {request.Interval} = 0)" +
                            $" AND (Idx = {Index})" +
                            $" ORDER BY ID DESC" +
                            $" LIMIT {request.Count} OFFSET {-request.Id}");
                    else
                        dbs = dbTable.Find(
                            $"WHERE (ID <= {request.Id})" +
                            $" AND (ID % {request.Interval} = 0)" +
                            $" AND (Idx = {Index})" +
                            $" ORDER BY ID DESC" +
                            $" LIMIT {request.Count}");
                }
                else
                {
                    dbs = dbTable.Find(
                            $"WHERE ( Time <= {request.Time.ToStringOfSQLiteFieldType()})" +
                            $" AND ( ID % {request.Interval} = 0)" +
                            $" AND ( Idx = {Index})" +
                            $" ORDER BY ID DESC" +
                            $" LIMIT {request.Count}");
                }


                if (dbs.Count() == 0)
                    return;

                //转为 Lc_Mix
                List<Lc_Mix> lcMixs = new List<Lc_Mix>();
                foreach (var db in dbs) {
                    lcMixs.Add(mapDb2Lc(db));
                }

                //从尾向前排的!!!!
                reponse.Values = lcMixs;
            });

            asyncDelegate(asyncContext, reponse);
        }
    }
}