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 tableNames = new List(); private int _daysOfRetainData = 90; private DateTime _dateDataKeepTo; public void Initialize() { if (SC.GetValue("System.EnableDataBaseClean")) { _daysOfRetainData = SC.GetValue("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() { } } }