Sic.Framework-Nanjing-Baishi/MECF.Framework.Common/Aitex/Core/RT/DBCore/DataBaseCleaner.cs

123 lines
4.1 KiB
C#

using Aitex.Core.RT.Log;
using Aitex.Core.RT.SCCore;
using Aitex.Core.Util;
using System;
using System.Collections.Generic;
using System.Data.Common;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace Aitex.Core.RT.DBCore
{
public sealed class DataBaseCleaner
{
private List<string> tableNames = new List<string>();
private int _daysOfRetainData = 90;
private DateTime _dateDataKeepTo;
public void Initialize()
{
if (SC.GetValue<bool>("System.EnableDataBaseClean"))
{
_daysOfRetainData = SC.GetValue<int>("System.DataKeepDays");
_dateDataKeepTo = DateTime.Now.AddDays(-_daysOfRetainData);
CleanData();
}
}
public bool CleanData()
{
try
{
DeviceTimer deviceTimer = new DeviceTimer();
string[,] array = new string[5, 2]
{
{ "carrier_data", "load_time" },
{ "event_data", "occur_time" },
{ "process_data", "process_begin_time" },
{ "wafer_data", "create_time" },
{ "wafer_move_history", "arrive_time" }
};
for (int i = 0; i < array.GetLength(0); i++)
{
string sql = $"select count(*) from information_schema.columns where table_schema='public' and table_name ='{array[i, 0]}' and column_name='{array[i, 1]}'";
int num = Convert.ToInt32(DB.ExecuteScalar(sql));
if (num == 1)
{
deviceTimer.Start(300000.0);
sql = string.Format($"delete from \"{array[i, 0]}\" where \"{array[i, 1]}\" <= '{_dateDataKeepTo.ToString("yyyy/MM/dd HH:mm:ss.fff")}'");
if (DB.ExecuteNonQuery(sql) > 0)
{
LOG.Info($"当前日期为{DateTime.Now.ToString("D")},删除{_daysOfRetainData}天前的数据表{array[i, 0]}," +
$"用时{deviceTimer.GetElapseTime() / 1000.0}秒");
}
Thread.Sleep(50);
}
}
tableNames.Clear();
GetTableNames();
if (tableNames.Count == 0)
{
return true;
}
foreach (string tableName in tableNames)
{
deviceTimer.Start(300000.0);
DB.ExecuteNonQuery($"drop table \"{tableName}\"");
LOG.Info($"当前日期为{DateTime.Now.ToString("D")},删除{_daysOfRetainData}天前的数据表{tableName}," +
$"用时{deviceTimer.GetElapseTime() / 1000.0}秒");
Thread.Sleep(50);
}
}
catch (Exception ex)
{
LOG.Error(ex.Message);
}
return true;
}
public void GetTableNames()
{
try
{
string cmdText = "select tablename from pg_tables where schemaname='public' and tablename like '20%' order by tablename asc";
DbDataReader dataReader = DB.ExecuteReader(cmdText);
while (dataReader.Read())
{
for (int i = 0; i < dataReader.FieldCount; i++)
{
string text = dataReader[i].ToString();
text = text.Substring(0, 8);
if (DateTime.ParseExact(text, "yyyyMMdd", CultureInfo.InvariantCulture) <= _dateDataKeepTo)
{
tableNames.Add(dataReader[i].ToString());
}
}
}
dataReader.Close();
dataReader.Dispose();
}
catch (Exception ex)
{
LOG.Error(ex.Message);
}
}
public void Terminate()
{
}
}
}