All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.jladder.actions.impl.LatchAction Maven / Gradle / Ivy

package com.jladder.actions.impl;

import com.jladder.data.Record;
import com.jladder.data.*;
import com.jladder.datamodel.IDataModel;
import com.jladder.db.DaoSeesion;
import com.jladder.db.IDao;
import com.jladder.db.Rs;
import com.jladder.db.SqlText;
import com.jladder.db.enums.DbDialectType;
import com.jladder.hub.DataHub;
import com.jladder.hub.LatchHub;
import com.jladder.lang.Core;
import com.jladder.lang.Security;
import com.jladder.lang.Strings;

import java.util.HashMap;
import java.util.List;
import java.util.Map;


/// 
/// 数据寄存器
/// 
public class LatchAction
{
    /// 
    /// 操作锁
    /// 
    private static Object Locked = new Object();

    /// 
    /// 全局实例
    /// 
    public static LatchAction Instance = new LatchAction();
    /// 
    /// 一级缓存存储
    /// 
    private static final Map RamData = new HashMap();




    /// 
    /// 缓存策略是否可用
    /// 
    public boolean Enable = true;



//        /// 
//        /// 计时器
//        /// 
//        private Timer Timer { get; set; } = new Timer();




    /// 
    /// 安装方法
    /// 
    private void install()
    {
//            Files.CreateDirectory(LatchHub.CacheFileDir);
        Enable = true;
    }


    /// 
    /// 初始化
    /// 
    /// 缓存文件目录
    public static void init(String dir)
    {
        if (Strings.isBlank(dir)) Instance.install();
        else
        {
            LatchHub.CacheFileDir = dir;
            Instance.install();
        }
    }

    /// 
    /// 初始化
    /// 
    /// 锁存器列表
//        public void Init(IEnumerable latchs)
//        {
//            Instance.Install();
//        }

    /// 
    /// 设置分页数据
    /// 
    /// 数据模型
    /// 分页结果集
    public static void setPageData(IDataModel dm, BasicPageResult pageResult)
    {
//            if (dm.Raw.CacheItems.IsBlank() || pageResult == null || pageResult.records.IsBlank()) return;
//            if (!Instance.Enable) return;
//            switch (dm.Raw.CacheItems)
//            {
//                case "CndCache":
//                    DataHub.WorkCache.AddLatchDataCache(dm.Raw.Name, dm.PagingSqlText(dm.DbDialect, pageResult.pager).ToString().Md5() + "page", pageResult,LatchHub.StayTime);
//                    break;
//                case "CndRAM":
//                    RamData.Put(dm.Raw.Name + "_" + dm.PagingSqlText(dm.DbDialect, pageResult.pager)?.ToString().Md5() + "page",
//                        pageResult);
//                    break;
//                case "CndLocal":
//                    try
//                    {
//                        File.WriteAllText(
//                            LatchHub.CacheFileDir + "/" + dm.Raw.Name + "_" +
//                            dm.PagingSqlText(dm.DbDialect, pageResult.pager)?.ToString().Md5() + "page.dat",
//                            Json.ToJson(pageResult));
//                    }
//                    catch (Exception e)
//                    {
////                        Logs.Write("CacheLocal:" + e.Message);
//                        Logs.Write(new LogForError(e.Message, "SetPageData").SetModule("LatchAction").SetStackTrace(e.StackTrace),LogOption.Exception);
//                    }
//                    break;
//                case "ExternCondition":
//                        if (LatchHub.Extern != null)
//                            LatchHub.Extern.SetCache(dm.Raw.Name + "_" + dm.PagingSqlText(dm.DbDialect, pageResult.pager)?.ToString().Md5() + "page", pageResult);
//                    break;
//            }
    }

    /// 
    /// 获取分页的缓存
    /// 
    /// 
    /// 
    /// 
    public static BasicPageResult getPageData(IDataModel dm, Pager pager){
        if (Strings.isBlank(dm.getRaw().CacheItems)) return new PageResult(404);
        //return null;
        if (!Instance.Enable) return new PageResult(405);
        BasicPageResult pageresult = null;
        if (DbDialectType.Default.equals(dm.getDialect() )){
//                dm.DbDialect = (dm.Dao == null ? (DaoSeesion.GetDao(dm.Conn)?.Dialect) : dm.Dao.Dialect);
            if (dm.getDao() == null){
                IDao dao = DaoSeesion.GetDao(dm.getConn());
                dm.setDialect(dao.getDialect());
            }
            else{
                dm.setDialect(dm.getDao().getDialect());
            }
        }
        SqlText sqlText=new SqlText();//缓存的sql文
        switch (dm.getRaw().CacheItems){
            case "CndCache":
                sqlText = dm.pagingSqlText(dm.getDialect(), pager);
                pageresult =(BasicPageResult) DataHub.WorkCache.getLatchDataCache(dm.getName(), Security.md5(sqlText.toString()) + "page");
                break;
            case "CndRAM":
                sqlText = dm.pagingSqlText(dm.getDialect(), pager);
                if (RamData.containsKey(dm.getName() + "_" + Security.md5(sqlText.toString()))){
                    pageresult = (BasicPageResult)RamData.get(dm.getName() + "_" + Security.md5(sqlText.toString()) + "page");
                }
                break;
            case "CndLocal":
//                try
//                {
//                    sqlText = dm.PagingSqlText(dm.DbDialect, pager);
//                    if (Files.IsExistFile(LatchHub.CacheFileDir + "/" + dm.Raw.Name + "_" + sqlText?.ToString().Md5() + "page.dat"))
//                    {
//                        var content = File.ReadAllText(LatchHub.CacheFileDir + "/" + dm.Raw.Name + "_" + sqlText?.ToString().Md5() + "page.dat");
//                        pageresult = Json.ToObject(content);
//                    }
//                }
//                catch (Exception e)
//                {
////                        Logs.Write("CacheLocal:" + e.Message);
//                    Logs.Write(new LogForError(e.Message, "GetPageData").SetModule("LatchAction").SetStackTrace(e.StackTrace),LogOption.Exception );
//                }

                break;
            case "Table":
//                if (com.jladder.core.lang.Files.exist(LatchHub.CacheFileDir + "/" + dm.Raw.Name + "_alldata.dat"))
//                {
//                    var content = File.ReadAllText(LatchHub.CacheFileDir + "/" + dm.Raw.Name + "_alldata.dat");
//                    if (content.IsBlank() || content == "null")
//                    {
//                        SetDataForAllTable(dm.Raw.Name);
//                        break;
//                    }
//                    var rs = Json.ToObject>(content);
//                    if(rs==null)break;
//                    rs = rs.Find(dm);
//                    if (rs.IsBlank()) break;
//                    pager.SetRecordCount(rs.Count);
//                    rs = rs.Paging(pager);
//                    pageresult = new BasicPageResult
//                    {
//                        statusCode = 200,
//                        pager = pager,
//                        records = rs
//                    };
//                }
//                else
//                {
//                    SetDataForAllTable(dm.Raw.Name);
//                }
                break;
            //全表内存,可用于模版的交换数据
            case "TableRAM":
                if(RamData.containsKey(dm.getRaw().Name))
                {
                    List rows = (List)RamData.get(dm.getRaw().Name);
                    if (rows == null) break;
                    rows = Rs.find(rows,dm.getCondition());
                    if (Rs.isBlank(rows)) break;
                    pager.setRecordCount(rows.size());
                    rows = Rs.paging(rows,pager);
                    pageresult = new BasicPageResult();
                    pageresult.statusCode = 200;
                    pageresult.pager = pager;
                    pageresult.records = rows;
                }
                break;
            case "DataModel":
                if (Strings.hasValue(dm.getRaw().Data))
                {
//                    List rs = Json.toObject(dm.Raw.Data, new TypeReference>() { });
//                    rs = rs.Find(dm);
//                    if (rs.IsBlank()) break;
//                    pager.SetRecordCount(rs.Count);
//                    rs = rs.Paging(pager);
//                    pageresult = new BasicPageResult
//                    {
//                        statusCode = 200,
//                        pager = pager,
//                        records = rs
//                    };
                }
                break;
            case "ExternCondition":
//                if (LatchHub.Extern != null)
//                {
//                    sqlText = dm.PagingSqlText(dm.DbDialect, pager);
//                    pageresult = LatchHub.Extern.GetCache(dm.Raw.Name + "_" + sqlText?.ToString().Md5() + "page");
//                }
                break;
            case "ExternAll":

//                if (LatchHub.Extern != null)
//                {
//                    var rs = LatchHub.Extern.GetTableCache(dm.Raw.Name);
//                    if (rs == null)
//                    {
//                        LatchHub.Extern.SetTableCache(dm.Raw.Name);
//                        break;
//                    }
//                    rs = rs.Find(dm);
//                    if (rs.IsBlank()) break;
//                    pager.SetRecordCount(rs.Count);
//                    rs = rs.Paging(pager);
//                    pageresult = new BasicPageResult
//                    {
//                        statusCode = 200,
//                        pager = pager,
//                        records = rs
//                    };
//                }

                break;

        }
        //if(DataHub.SqlDebug)Logs.Write(new LogForSql(sqlText.Text, dm.Conn).SetType("latch").SetData(sqlText.Parameters).SetEnd(),LogOption.Sql);
        if(pageresult!=null)return pageresult;
        return new BasicPageResult(404);
    }

    /// 
    /// 获取缓存数据
    /// 
    /// 数据模型
    /// 

    public static Receipt getData(IDataModel dm)
    {
        if (Strings.isBlank(dm.getRaw().CacheItems)) return new Receipt(false, "无缓存策略");
        if(!Instance.Enable && dm.getRaw().CacheItems!= "DataModel") return new Receipt(false,"缓存策略禁用");
        List rs = null;
        switch (dm.getRaw().CacheItems)
        {
            case "CndCache":
                //rs = (List) DataHub.WorkCache.GetLatchDataCache(dm.Raw.Name, dm.SqlText()?.ToString().Md5());
                break;
            case "CndRAM":
//                    if (RamData.ContainsKey(dm.Raw.Name + "_" + dm.SqlText()?.ToString().Md5()))
//                    {
//                        rs = (List)RamData[dm.Raw.Name + "_" + dm.SqlText()?.ToString().Md5()];
//                    }
                break;
            case "CndLocal":
//                    if (Files.IsExistFile(LatchHub.CacheFileDir + "/" + dm.Raw.Name + "_" + dm.SqlText()?.ToString().Md5() + ".dat"))
//                    {
//                        var content = File.ReadAllText(LatchHub.CacheFileDir + "/" + dm.Raw.Name + "_" + dm.SqlText()?.ToString().Md5() + ".dat");
//                        rs = Json.ToObject>(content);
//                    }
                break;
            case "Table":
//                    if (Files.IsExistFile(LatchHub.CacheFileDir + "/" + dm.Raw.Name + "_alldata.dat"))
//                    {
//                        var content = File.ReadAllText(LatchHub.CacheFileDir + "/" + dm.Raw.Name + "_alldata.dat");
//                        if (content.IsBlank() || content == "null")
//                        {
//                            SetDataForAllTable(dm.Raw.Name);
//                            break;
//                        }
//                        rs = Json.ToObject>(content);
//                        rs = rs.Find(dm);
//                    }
//                    else
//                    {
//                        SetDataForAllTable(dm.Raw.Name);
//                    }
                break;
            case "TableRAM":
                    if (RamData.containsKey(dm.getRaw().Name))
                    {
                        rs = (List)RamData.get(dm.getRaw().Name);
                        rs =  Rs.find(rs,dm.getCondition());
                    }
                break;
            case "DataModel":
//                    if (dm.Raw.Data.HasValue())
//                    {
//                        rs = Json.FromJson>(dm.Raw.Data);
//                        rs = rs.Find(dm);
//                    }
                break;
            case "ExternAll":
//                    if (LatchHub.Extern != null)
//                    {
//                        rs = LatchHub.Extern.GetTableCache(dm.Raw.Name);
//                        if (rs == null)
//                        {
//                            LatchHub.Extern.SetTableCache(dm.Raw.Name);
//                            break;
//                        }
//                        rs = rs.Find(dm);
//                    }
                break;
            case "ExternCondition":
//                    if (LatchHub.Extern != null)
//                    {
//                        rs = LatchHub.Extern.GetCache>(dm.Raw.Name + "_" + dm.SqlText().toString().Md5());
//                    }
                break;

        }
        return rs == null ? new Receipt(false, "存储数据为空") : new Receipt().setData(rs);
    }
    /// 
    /// 获取缓存数据
    /// 
    /// 数据模型
    /// 记录集
    /// 
    public static void setData(IDataModel dm, List rs){
        if (Strings.isBlank(dm.getRaw().CacheItems) || Core.isEmpty(rs)) return;
        if (!Instance.Enable) return;
        switch (dm.getRaw().CacheItems){
            case "CndCache":
                //DataHub.WorkCache.AddLatchDataCache(dm.Raw.Name, dm.SqlText().ToString().Md5(), rs,LatchHub.StayTime);
                break;
            case "CndRAM":
                //RamData.Put(dm.Raw.Name + "_" + dm.SqlText()?.ToString().Md5(), rs);
                break;
            case "CndLocal":
//                    try
//                    {
//                        File.WriteAllText(LatchHub.CacheFileDir + "/" + dm.Raw.Name + "_" + dm.SqlText()?.ToString().Md5() + ".dat",
//                            Json.ToJson(rs));
//                    }
//                    catch (Exception e)
//                    {
////                        Logs.Write("CacheLocal:" + e.Message);
//                        Logs.Write(new LogForError(e.Message, "SetData").SetModule("LatchAction").SetStackTrace(e.StackTrace), LogOption.Exception);
//                    }
                break;
            case "TableRAM":
                RamData.put(dm.getRaw().Name, rs);
                break;

            case "ExternCondition":
//                    if (LatchHub.Extern != null)
//                    {
//                        LatchHub.Extern.SetCache(dm.Raw.Name + "_" + dm.SqlText().toString().Md5(), rs);
//                    }
                break;
//                case "Table":
//                    try
//                    {
//                        File.WriteAllText(CacheFileDir + "/" + dm.Raw.Name + "_alldata.dat", Json.ToJson(rs));
//                    }
//                    catch (Exception e)
//                    {
//                        Logs.Write("CacheLocal:" + e.Message);
//                    }
//                    break;
        }

    }

    /// 
    /// 设置静态全表数据
    /// 
    /// 键表名
    /// 记录集
    public static void setDataForAllTable(String tableName, List rs)
    {
//            if (rs == null)
//            {
//                Task.Factory.StartNew(() =>
//                {
//                    var dm = DaoSeesion.GetDataModel(tableName);
//                    var dao = new Dao(dm.Conn);
//                    try
//                    {
//                        var data = dao.Query(dm.SqlText());
//                        if (!data.IsBlank()) File.WriteAllText(LatchHub.CacheFileDir + "/" + tableName + "_alldata.dat", Json.ToJson(data));
//                    }
//                    catch (Exception e)
//                    {
//                        //Logs.Write("CacheLocal:" + e.Message);
//                        Logs.Write(new LogForError(e.Message, "SetDataForAllTable").SetModule("LatchAction").SetStackTrace(e.StackTrace), LogOption.Exception);
//
//                    }
//                    finally
//                    {
//                        dao.Close();
//                    }
//                });
//                return;
//            }
//            try
//            {
//                File.WriteAllText(LatchHub.CacheFileDir + "/" + tableName + "_alldata.dat", Json.ToJson(rs));
//            }
//            catch (Exception e)
//            {
//                Logs.Write(new LogForError(e.Message, "SetDataForAllTable").SetModule("LatchAction").SetStackTrace(e.StackTrace), LogOption.Exception);
//            }
    }

    /// 
    /// 扫描活动的表
    /// 
    /// 间隔时间(秒)

//        public static void Activate(int second)
//        {
//            Instance.Timer.Stop();
//            Instance.Timer.Elapsed += Instance.OnTimer;
//            Instance.Timer.Interval = second*1000;
//            Instance.Timer.Enabled = true;
//            Instance.Timer.Start();
//        }
//        /// 
//        /// 时间轮询事件
//        /// 
//        /// 
//        /// 
//        private void OnTimer(Object sender, ElapsedEventArgs e)
//        {
//            var dao = new Dao(DataHub.TemplateConn);
//            var tableName = Configs.GetString("_ScanWrokingTable") ?? "sys_scanworking";
//            string tn = DataHub.TemplateTableName;
//            var device = Core.GenUuid();
//            try
//            {
//                lock (Locked)
//                {
//                    //获取第一条记录的sql语句
//                    var onesql = "(" +
//                                 dao.PagingSqlText(
//                                     new SqlText("select c.id from (select id from sys_scanworking where ishandle=0) c"),
//                                     new Pager(1, 1)) + ")";
//                    //更新顶上一条数据
//                    var count = dao.Update(tableName, new Record("device", device).Put("ishandle", 1),
//                        new Cnd("*id", onesql));
//                    if (count > 0)
//                    {
//                        var bean = dao.Fetch(tableName, new Cnd("device", device));
//                        while (bean != null && count > 0)
//                        {
//                            //是实表
//                            if (bean.GetInt("type") == 0)
//                            {
//                                var rs =
//                                    dao.Query(new SqlText("select name from " + tn + " where cacheitems is not null and depends like '%" +
//                                              bean.GetString("tablename") + "%'"));
//                                if (!rs.IsBlank())
//                                {
//                                    rs.ForEach(x => RemoveLatch(x.GetString("name")));
//                                }
//                            }
//                            //是模版
//                            else
//                            {
//                                RemoveLatch(bean.GetString("tablename"));
//                            }
//                            dao.Delete(tableName, new Cnd("device", device));
//                            count = dao.Update(tableName, new Record("device", device).Put("ishandle", 1),
//                                new Cnd("*id", onesql));
//                            bean = dao.Fetch(tableName, new Cnd("device", device));
//                        }
//                    }
//                }
//            }
//            catch (Exception error)
//            {
//                Logs.Write(new LogForError(error.Message, "SetDataForAllTable").SetModule("LatchAction").SetStackTrace(error.StackTrace), LogOption.Exception);
//            }
//            finally
//            {
//                dao.Close();
//            }
//        }

    /// 
    /// 添加缓存
    /// 
    /// 键名
    /// sql密文
    /// 模版
    private static void addCache(String key, String cryptosql, Object data)
    {
//            var cache = Cache.Instance;
//            cache.Set("YiFeng_DataCache_" + key + "_" + cryptosql, data, TimeSpan.FromMinutes(LatchHub.StayTime));
    }

    /// 
    /// 添加缓存
    /// 
    /// 键名
    /// sql密文
    /// 模版
    /// 停留时间
    public static void addCache(String key, String cryptosql, Object data, int staytime)
    {
//            var cache = Cache.Instance;
//            cache.Set("YiFeng_DataCache_" + key + "_" + cryptosql, data, TimeSpan.FromMinutes(staytime));
    }

    /// 
    /// 获取缓存
    /// 
    /// 键名
    /// sql密文
    /// 
    private static Object getCache(String key, String cryptosql)
    {
        return null;
//            var cache = Cache.Instance;
//            return cache.Get("YiFeng_DataCache_" + key + "_" + cryptosql);
    }

    /// 
    /// 移除缓存
    /// 
    /// 键名
    /// sql密文
    private static void removeCache(String key, String cryptosql)
    {
        //            if (cryptosql.IsBlank())
        //            {
        //                var cache = Cache.Cache.Instance;
        //                IDictionaryEnumerator cacheEnum = (cache as MemoryCache).Count;
        //
        //
        //
        //                while (cacheEnum.MoveNext())
        //                {
        //                    if (key.StartsWith("YiFeng_DataCache_" + key)) cache.Remove(key);
        //                }
        //            }
        //            else
        //            {
        //                HttpRuntime.Cache.Remove("YiFeng_DataCache_" + key + "_" + cryptosql);
        //            }
    }

    /// 
    /// 清理关联表的缓存
    /// 
    /// 实表名
    /// 

    public static void clearLatch(String tableName)
    {
        if(!Instance.Enable)return;
        return;
        //throw Core.makeThrow("未实现");
//
//            //web请求作用域
//            if (WebScope.Configs!=null && WebScope.Configs.IsLatch == false) return;
//            Task.Factory.StartNew(() =>
//            {
//                lock (Locked)
//                {
//                    var dependcaches = DataHub.WorkCache.GetLatchDependsCache(DataHub.TemplateTableName + DataHub.TemplateConn + tableName);
//
//                    if (dependcaches == null)
//                    {
//                        string tn = DataHub.TemplateTableName;
//                        var dao = new Dao(DataHub.TemplateConn);
//                        try
//                        {
//                            var rs = dao.Query(new SqlText("select name from " + tn + " where cacheitems is not null and depends like '%" + tableName + "%'"));
//                            if (!rs.IsBlank())
//                            {
//                                rs.ForEach(x => RemoveLatch(x.GetString("name")));
//                                DataHub.WorkCache.AddLatchDependsCache(DataHub.TemplateTableName + DataHub.TemplateConn + tableName, rs.Select(x=>x.GetString("name")).ToList());
//                            }
//                            else
//                            {
//                                DataHub.WorkCache.AddLatchDependsCache(DataHub.TemplateTableName + DataHub.TemplateConn + tableName,new List());
//                            }
//                            return;
//                        }
//                        catch (Exception)
//                        {
//                            return;
//                        }
//                        finally
//                        {
//                            dao.Close();
//                        }
//                    }
//                    else
//                    {
//                        dependcaches.ForEach(x =>
//                        {
//                            RemoveLatch(x);
//                        });
//                    }
//                    return;
//                }
//            });
    }


    /// 
    /// 移除缓存
    /// 
    /// 键名
    private static boolean removeLatch(String key)
    {
        try
        {
            throw Core.makeThrow("未实现");
//                if(LatchHub.Extern!=null)LatchHub.Extern.RemoveNotice(key);
//                //清除文件
//                DirectoryInfo di = new DirectoryInfo(LatchHub.CacheFileDir);
//                var files = di.GetFiles(key + "_*.dat");
//                if (!files.IsBlank())
//                {
//                    files.ForEach(x => Files.DeleteFile(x.FullName));
//                }
//                //清除二级缓存
//                DataHub.WorkCache.RemoveLatchDataCache(key);
//                //清除一级缓存
//                List keys = new List();
//                RamData.ForEach(x =>
//                {
//                    if (x.Key.StartsWith(key + "_")) keys.Add(x.Key);
//                });
//                keys.ForEach(x => RamData.Remove(x));
//                Logs.Write("CacheLocal:"+ key + "清理缓存文件-" + files?.Length+",一级缓存:"+ keys?.Count,LogOption.Need);
//                return true;
        }
        catch (Exception e)
        {
            return false;
        }

    }


}





© 2015 - 2025 Weber Informatics LLC | Privacy Policy