
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