using Cdy.Tag;
using System;
using System.Text;
using System.Linq;
using System.Collections.Generic;
using System.IO;
using System.Diagnostics;
using System.IO.Pipes;
using System.Threading;
using Microsoft.Extensions.Logging;
using System.Net.Http.Headers;
using System.Runtime.InteropServices;
using System.Reflection;
using System.Xml.Linq;
namespace DBStudio
{
class Program:DBDevelopService.IDatabaseManager
{
///
///
///
static bool mIsExited = false;
static object mLockObj = new object();
///
///
///
public class Config
{
#region ... Variables ...
///
///
///
public static Config Instance = new Config();
#endregion ...Variables...
#region ... Events ...
#endregion ...Events...
#region ... Constructor...
#endregion ...Constructor...
#region ... Properties ...
///
///
///
public bool IsWebApiEnable { get; set; }
///
///
///
public int WebApiPort { get; set; } = 9000;
///
///
///
public bool IsGrpcEnable { get; set; }
///
///
///
public int GrpcPort { get; set; } = 5001;
#endregion ...Properties...
#region ... Methods ...
///
///
///
public void Load()
{
string spath = System.IO.Path.Combine(System.IO.Path.GetDirectoryName(this.GetType().Assembly.FullName), "DbInStudioServer.cfg");
if(System.IO.File.Exists(spath))
{
var xxx = XElement.Load(spath);
this.IsWebApiEnable = bool.Parse(xxx.Attribute("IsWebApiEnable")?.Value);
this.IsGrpcEnable = bool.Parse(xxx.Attribute("IsGrpcEnable")?.Value);
this.WebApiPort = int.Parse(xxx.Attribute("WebApiPort")?.Value);
this.GrpcPort = int.Parse(xxx.Attribute("GrpcPort")?.Value);
}
}
#endregion ...Methods...
#region ... Interfaces ...
#endregion ...Interfaces...
}
static void Main(string[] args)
{
Program pg = new Program();
Config.Instance.Load();
ServiceLocator.Locator.Registor(typeof(DBDevelopService.IDatabaseManager), pg);
int port = Config.Instance.GrpcPort;
int webPort = Config.Instance.WebApiPort;
if (args.Length > 0)
{
port = int.Parse(args[0]);
}
if (args.Length > 1)
{
webPort = int.Parse(args[1]);
}
WindowConsolHelper.DisbleQuickEditMode();
Console.CancelKeyPress += Console_CancelKeyPress;
AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
LogoHelper.Print();
DBDevelopService.Service.Instanse.Start(port, webPort,Config.Instance.IsGrpcEnable,Config.Instance.IsWebApiEnable);
Thread.Sleep(100);
OutByLine("", Res.Get("HelpMsg"));
while (!mIsExited)
{
OutInLine("", "");
var vv = Console.ReadLine();
if (vv != null)
{
string[] cmd = vv.Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries);
if (cmd.Length == 0) continue;
string cmsg = cmd[0].ToLower();
if (cmsg == "exit")
{
OutByLine("", "确定要退出?输入y确定,输入其他任意字符取消");
cmd = Console.ReadLine().Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries);
if (cmd.Length == 0) continue;
if (cmd[0].ToLower() == "y")
break;
}
else if (cmsg == "db")
{
if (cmd.Length > 1)
ProcessDatabaseCreate(cmd[1]);
}
else if (cmsg == "list")
{
ListDatabase();
}
else if (cmsg == "h")
{
OutByLine("", GetHelpString());
}
else if (cmsg == "**")
{
LogoHelper.PrintAuthor();
}
}
}
DBDevelopService.Service.Instanse.Stop();
}
private static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
LoggerService.Service.Erro("GrpcDBService", e.ExceptionObject.ToString());
}
///
///
///
///
///
private static void Console_CancelKeyPress(object sender, ConsoleCancelEventArgs e)
{
mIsExited = true;
e.Cancel = true;
Console.ForegroundColor = ConsoleColor.Yellow;
Console.WriteLine(Res.Get("AnyKeyToExit"));
Console.ResetColor();
}
///
///
///
///
///
private static void OutByLine(string prechar, string msg)
{
Console.WriteLine(prechar + ">" + msg);
}
///
///
///
///
///
private static void OutInLine(string prechar, string msg)
{
Console.Write(prechar + ">" + msg);
}
///
///
///
private static void ListDatabase()
{
if (!DBDevelopService.DbManager.Instance.IsLoaded)
DBDevelopService.DbManager.Instance.Load();
StringBuilder sb = new StringBuilder();
foreach (var vdd in DBDevelopService.DbManager.Instance.ListDatabase())
{
sb.Append(vdd + ",");
}
sb.Length = sb.Length > 1 ? sb.Length - 1 : sb.Length;
OutByLine("", sb.ToString());
}
///
///
///
///
///
private static void ProcessDatabaseCommand(Database db, string msg)
{
try
{
string[] cmd = msg.Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries);
string cmsg = cmd[0].ToLower();
if (cmsg == "save")
{
new DatabaseSerise() { Dbase = db }.Save();
}
else if (cmsg == "add")
{
AddTag(db, cmd[1].ToLower(), cmd[2], cmd[3], int.Parse(cmd[4]));
}
else if (cmsg == "remove")
{
RemoveTag(db, cmd[1].ToLower());
}
else if (cmsg == "update")
{
UpdateTag(db, cmd[1].ToLower(), cmd[2], cmd[3]);
}
else if (cmsg == "updatehis")
{
UpdateHisTag(db, cmd[1].ToLower(), cmd[2], cmd[3]);
}
else if (cmsg == "import")
{
Import(db, cmd[1].ToLower());
}
}
catch
{
}
}
///
///
///
///
private static void ProcessDatabaseCreate(string name)
{
if (!DBDevelopService.DbManager.Instance.IsLoaded)
DBDevelopService.DbManager.Instance.Load();
Database db = DBDevelopService.DbManager.Instance.GetDatabase(name);
if (db == null)
{
db = Database.New(name);
}
OutByLine(name, Res.Get("HelpMsg"));
while (true)
{
OutInLine(name, "");
string[] cmd = Console.ReadLine().Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries);
if (cmd.Length == 0) continue;
string cmsg = cmd[0].ToLower();
try
{
if (cmsg == "save")
{
new DatabaseSerise() { Dbase = db }.Save();
}
else if (cmsg == "add")
{
AddTag(db, cmd[1].ToLower(), cmd[2], cmd[3], int.Parse(cmd[4]));
}
else if (cmsg == "remove")
{
RemoveTag(db, cmd[1].ToLower());
}
else if (cmsg == "clear")
{
ClearTag(db);
}
else if (cmsg == "update")
{
UpdateTag(db, cmd[1].ToLower(), cmd[2], cmd[3]);
}
else if (cmsg == "start")
{
if (!CheckStart(db.Name))
{
StartDb(db.Name);
}
else
{
Console.WriteLine("database " + db.Name + " is in running.");
}
}
else if (cmsg == "rerun")
{
if (!CheckStart(db.Name))
{
StartDb(db.Name);
}
else
{
ReLoadDatabase(db.Name);
}
}
else if (cmsg == "restart")
{
StopDatabase(db.Name);
while (CheckStart(db.Name)) Thread.Sleep(100);
StartDb(db.Name);
}
else if (cmsg == "isstarted")
{
if(CheckStart(db.Name))
{
Console.WriteLine("database "+db.Name+" is start.");
}
else
{
Console.WriteLine("database " + db.Name + " is stop.");
}
}
else if (cmsg == "stop")
{
StopDatabase(db.Name);
}
else if (cmsg == "updatehis")
{
UpdateHisTag(db, cmd[1].ToLower(), cmd[2], cmd[3]);
}
else if (cmsg == "import")
{
if (cmd.Length > 1)
Import(db, cmd[1].ToLower());
else
{
Import(db, name + ".csv");
}
}
else if (cmsg == "export")
{
if (cmd.Length > 1)
ExportToCSV(db, cmd[1].ToLower());
else
{
ExportToCSV(db, name + ".csv");
}
}
else if (cmsg == "list")
{
string ctype = cmd.Length > 1 ? cmd[1] : "";
ListDatabase(db, ctype);
}
else if (cmsg == "h")
{
if (cmd.Length == 1)
{
Console.WriteLine(GetDbManagerHelpString());
}
}
else if (cmsg == "sp")
{
Sp(db,int.Parse(cmd[1]),int.Parse(cmd[2]), cmd.Skip(3).ToArray());
}
else if (cmsg == "exit")
{
break;
}
}
catch(Exception ex)
{
OutByLine(name, Res.Get("ErroParameter")+" " +ex.Message);
}
}
}
///
///
///
///
private static bool StartDb(string name)
{
try
{
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
{
var info = new ProcessStartInfo() { FileName = "DBInRun.exe" };
info.UseShellExecute = true;
info.Arguments = "start " + name;
info.WorkingDirectory = System.IO.Path.GetDirectoryName(typeof(Program).Assembly.Location);
Process.Start(info).WaitForExit(1000);
}
else
{
var info = new ProcessStartInfo() { FileName = "dotnet" };
info.UseShellExecute = true;
info.CreateNoWindow = false;
info.Arguments = "./DBInRun.dll start " + name;
info.WorkingDirectory = System.IO.Path.GetDirectoryName(typeof(Program).Assembly.Location);
Process.Start(info).WaitForExit(1000);
}
}
catch(Exception ex)
{
Console.WriteLine(ex.Message);
}
return false;
}
///
///
///
///
///
private static void Sp(Database db,int ctp,int addressType, params string[] paras)
{
Cdy.Tag.RealDatabase test = db.RealDatabase;
Cdy.Tag.HisDatabase htest = db.HisDatabase;
string address = "";
if (paras.Length > 0)
{
int dcount = int.Parse(paras[0]);
for (int i = 0; i < dcount; i++)
{
if(addressType==0)
{
address = "";
}
else
{
if (i % 3 == 0)
{
address = "Sim:sin";
}
else if (i % 3 == 1)
{
address = "Sim:cos";
}
else
{
address = "Sim:step";
}
}
var vtag = new Cdy.Tag.DoubleTag() { Name = "Double" + i, Group = "Double", LinkAddress = address };
test.Append(vtag);
htest.AddHisTags(new Cdy.Tag.HisTag() { Id = vtag.Id, TagType = Cdy.Tag.TagType.Double, Circle = 1000, Type = Cdy.Tag.RecordType.Timer, CompressType = ctp });
}
}
if (paras.Length > 1)
{
int fcount = int.Parse(paras[1]);
for (int i = 0; i < fcount; i++)
{
if (addressType == 0)
{
address = "";
}
else
{
if (i % 3 == 0)
{
address = "Sim:sin";
}
else if (i % 3 == 1)
{
address = "Sim:cos";
}
else
{
address = "Sim:step";
}
}
var vtag = new Cdy.Tag.FloatTag() { Name = "Float" + i, Group = "Float", LinkAddress = address };
test.Append(vtag);
htest.AddHisTags(new Cdy.Tag.HisTag() { Id = vtag.Id, TagType = Cdy.Tag.TagType.Float, Circle = 1000, Type = Cdy.Tag.RecordType.Timer, CompressType = ctp });
}
}
if (paras.Length > 2)
{
int fcount = int.Parse(paras[2]);
if (addressType == 0)
{
address = "";
}
else
{
address = "Sim:step";
}
for (int i = 0; i < fcount; i++)
{
var vtag = new Cdy.Tag.LongTag() { Name = "Long" + i, Group = "Long", LinkAddress = address };
test.Append(vtag);
htest.AddHisTags(new Cdy.Tag.HisTag() { Id = vtag.Id, TagType = Cdy.Tag.TagType.Long, Circle = 1000, Type = Cdy.Tag.RecordType.Timer, CompressType = ctp });
}
}
if (paras.Length > 3)
{
if (addressType == 0)
{
address = "";
}
else
{
address = "Sim:step";
}
int fcount = int.Parse(paras[3]);
for (int i = 0; i < fcount; i++)
{
var vtag = new Cdy.Tag.IntTag() { Name = "Int" + i, Group = "Int", LinkAddress = address };
test.Append(vtag);
htest.AddHisTags(new Cdy.Tag.HisTag() { Id = vtag.Id, TagType = Cdy.Tag.TagType.Int, Circle = 1000, Type = Cdy.Tag.RecordType.Timer, CompressType = ctp });
}
}
if (paras.Length > 4)
{
if (addressType == 0)
{
address = "";
}
else
{
address = "Sim:square";
}
int fcount = int.Parse(paras[4]);
for (int i = 0; i < fcount; i++)
{
var vtag = new Cdy.Tag.BoolTag() { Name = "Bool" + i, Group = "Bool", LinkAddress = address };
test.Append(vtag);
htest.AddHisTags(new Cdy.Tag.HisTag() { Id = vtag.Id, TagType = Cdy.Tag.TagType.Bool, Circle = 1000, Type = Cdy.Tag.RecordType.Timer, CompressType = ctp });
}
}
if (paras.Length > 5)
{
if (addressType == 0)
{
address = "";
}
else
{
address = "Sim:steppoint";
}
int fcount = int.Parse(paras[5]);
for (int i = 0; i < fcount; i++)
{
var vtag = new Cdy.Tag.IntPointTag() { Name = "IntPoint" + i, Group = "IntPoint", LinkAddress = address };
test.Append(vtag);
htest.AddHisTags(new Cdy.Tag.HisTag() { Id = vtag.Id, TagType = Cdy.Tag.TagType.IntPoint, Circle = 1000, Type = Cdy.Tag.RecordType.Timer, CompressType = ctp });
}
}
}
///
///
///
///
private static string GetDbManagerHelpString()
{
StringBuilder re = new StringBuilder();
re.AppendLine();
re.AppendLine("save // save database ");
re.AppendLine("start // start database ");
re.AppendLine("restart // restart database ");
re.AppendLine("stop // stop database ");
re.AppendLine("add [tagtype] [tagname] [linkaddress] [repeat] // add numbers tag to database ");
re.AppendLine("remove [tagname] // remove a tag");
re.AppendLine("clear // clear all tags in database");
re.AppendLine("update [tagname] [propertyname] [propertyvalue] // update value of a poperty in a tag");
re.AppendLine("updatehis [tagname] [propertyname] [propertyvalue] // update value of a poperty in a tag's his config");
re.AppendLine("import [filename] //import tags from a csvfile");
re.AppendLine("export [filename] //export tags to a csvfile");
re.AppendLine("list [tagtype] //the sumery info of specical type tags or all tags");
re.AppendLine("sp [compressType] [enable sim address][double tag number] [float tag number] [long tag number] [int tag number] [bool tag number] [intpoint tag number] //Quickly generate a specified number of tags for test purposes");
re.AppendLine("exit //exit and back to parent");
return re.ToString();
}
///
///
///
///
///
private static void ListDatabase(Database database, string type="")
{
if(!string.IsNullOrEmpty(type))
{
int count = database.RealDatabase.Tags.Values.Where(e => e.Type == (TagType)Enum.Parse(typeof(TagType),type)).Count();
OutByLine(database.Name,string.Format(Res.Get("TagMsg"), count, type));
}
else
{
foreach (TagType vv in Enum.GetValues(typeof(TagType)))
{
int count = database.RealDatabase.Tags.Values.Where(e => e.Type == vv).Count();
OutByLine(database.Name, string.Format(Res.Get("TagMsg"), count, vv.ToString()));
}
}
}
///
///
///
///
///
private static void ExportToCSV(Database database, string file)
{
string sfile = file;
if (!System.IO.Path.IsPathRooted(sfile))
{
sfile = System.IO.Path.Combine(System.IO.Path.GetDirectoryName(typeof(Program).Assembly.Location), sfile);
}
var stream = new StreamWriter(File.Open(sfile, FileMode.OpenOrCreate, FileAccess.ReadWrite));
foreach(var vv in database.RealDatabase.Tags)
{
if(database.HisDatabase.HisTags.ContainsKey(vv.Key))
{
stream.WriteLine(SaveToCSVString(vv.Value, database.HisDatabase.HisTags[vv.Key]));
}
else
{
stream.WriteLine(SaveToCSVString(vv.Value, null));
}
}
stream.Close();
}
///
///
///
///
///
///
public static string SaveToCSVString(Tagbase mRealTagMode,HisTag mHisTagMode)
{
StringBuilder sb = new StringBuilder();
sb.Append(mRealTagMode.Id + ",");
sb.Append(mRealTagMode.Name + ",");
sb.Append(mRealTagMode.Desc + ",");
sb.Append(mRealTagMode.Group + ",");
sb.Append(mRealTagMode.Type + ",");
sb.Append(mRealTagMode.LinkAddress + ",");
sb.Append((int)mRealTagMode.ReadWriteType + ",");
if(mRealTagMode.Conveter!=null)
sb.Append(mRealTagMode.Conveter.SeriseToString() + ",");
else
{
sb.Append(",");
}
if (mRealTagMode is NumberTagBase)
{
sb.Append((mRealTagMode as NumberTagBase).MaxValue.ToString() + ",");
sb.Append((mRealTagMode as NumberTagBase).MinValue.ToString() + ",");
}
else
{
sb.Append(",");
sb.Append(",");
}
if(mRealTagMode is FloatingTagBase)
{
sb.Append((mRealTagMode as FloatingTagBase).Precision + ",");
}
else
{
sb.Append(",");
}
if (mHisTagMode != null)
{
sb.Append(mHisTagMode.Type + ",");
sb.Append(mHisTagMode.Circle + ",");
sb.Append(mHisTagMode.CompressType + ",");
if (mHisTagMode.Parameters != null)
{
foreach (var vv in mHisTagMode.Parameters)
{
sb.Append(vv.Key + ",");
sb.Append(vv.Value + ",");
}
}
}
sb.Length = sb.Length > 0 ? sb.Length - 1 : sb.Length;
return sb.ToString();
}
///
///
///
///
public static Tuple LoadFromCSVString(string val)
{
string[] stmp = val.Split(new char[] { ',' });
Cdy.Tag.TagType tp = (Cdy.Tag.TagType)Enum.Parse(typeof(Cdy.Tag.TagType), stmp[4]);
var realtag = TagTypeExtends.GetTag(tp);
realtag.Id = int.Parse(stmp[0]);
realtag.Name = stmp[1];
realtag.Desc = stmp[2];
realtag.Group = stmp[3];
realtag.LinkAddress = stmp[5];
realtag.ReadWriteType = (ReadWriteMode)(int.Parse(stmp[6]));
if(stmp[7]!=null)
{
realtag.Conveter = stmp[7].DeSeriseToValueConvert();
}
if(realtag is NumberTagBase)
{
(realtag as NumberTagBase).MaxValue = double.Parse(stmp[8], System.Globalization.NumberStyles.Any);
(realtag as NumberTagBase).MinValue = double.Parse(stmp[9], System.Globalization.NumberStyles.Any);
}
if (realtag is FloatingTagBase)
{
(realtag as FloatingTagBase).Precision = byte.Parse(stmp[10]);
}
if (stmp.Length > 11)
{
Cdy.Tag.HisTag histag = new HisTag();
histag.Type = (Cdy.Tag.RecordType)Enum.Parse(typeof(Cdy.Tag.RecordType), stmp[11]);
histag.Circle = long.Parse(stmp[12]);
histag.CompressType = int.Parse(stmp[13]);
histag.Parameters = new Dictionary();
histag.TagType = realtag.Type;
histag.Id = realtag.Id;
for (int i = 14; i < stmp.Length; i++)
{
string skey = stmp[i];
if (string.IsNullOrEmpty(skey))
{
break;
}
double dval = double.Parse(stmp[i + 1]);
if (!histag.Parameters.ContainsKey(skey))
{
histag.Parameters.Add(skey, dval);
}
i++;
}
return new Tuple(realtag, histag);
}
return new Tuple(realtag, null);
}
///
///
///
///
///
private static void Import(Database database, string file)
{
string sfile = file;
if (!System.IO.Path.IsPathRooted(sfile))
{
sfile = System.IO.Path.Combine(System.IO.Path.GetDirectoryName(typeof(Program).Assembly.Location), sfile);
}
if (System.IO.File.Exists(sfile))
{
var reader = new System.IO.StreamReader(System.IO.File.Open(sfile, System.IO.FileMode.Open));
while (reader.Peek() > 0)
{
var cmd = reader.ReadLine();
if (sfile.EndsWith(".cmd"))
{
ProcessDatabaseCommand(database, cmd);
}
else if (sfile.EndsWith(".csv"))
{
var vres = LoadFromCSVString(cmd);
database.RealDatabase.AddOrUpdate(vres.Item1);
if(vres.Item2!=null)
{
database.HisDatabase.AddOrUpdate(vres.Item2);
}
}
}
}
}
///
///
///
///
///
///
///
private static void UpdateTag(Database database, string tag, string parameterName, string value)
{
var vv = database.RealDatabase.GetTagByName(tag);
if (vv != null)
{
UpdateTagParameter(vv, parameterName, value);
}
}
///
///
///
///
///
///
private static void UpdateTagParameter(Tagbase tag, string parameterName, string value)
{
switch (parameterName)
{
case "linkaddress":
tag.LinkAddress = value;
break;
case "group":
tag.Group = value;
break;
}
}
///
///
///
///
///
///
///
private static void UpdateHisTag(Database database, string tag,string parameterName,string value)
{
var vv = database.RealDatabase.GetTagByName(tag);
if (vv != null)
{
if (database.HisDatabase.HisTags.ContainsKey(vv.Id))
{
UpdateHisTagParameter(database.HisDatabase.HisTags[vv.Id], parameterName, value);
}
else
{
HisTag vtag = new HisTag() { Id = vv.Id, TagType = vv.Type };
database.HisDatabase.AddHisTags(vtag);
UpdateHisTagParameter(vtag, parameterName, value);
}
}
}
///
///
///
///
///
///
private static void UpdateHisTagParameter(HisTag tag,string parameterName,string value)
{
switch(parameterName)
{
case "type":
tag.Type = (RecordType)(int.Parse(value));
break;
case "circle":
tag.Circle = long.Parse(value);
break;
case "compresstype":
tag.CompressType = int.Parse(value);
break;
case "parameters":
var vals = value.Split(new char[';']);
foreach(var vv in vals)
{
string[] sval = vv.Split(new char['=']);
tag.Parameters.Add(sval[0], double.Parse(sval[1]));
}
break;
}
}
///
///
///
///
private static void ClearTag(Database database)
{
database.RealDatabase.Tags.Clear();
database.RealDatabase.MaxId = 0;
database.HisDatabase.HisTags.Clear();
}
///
///
///
///
///
private static void RemoveTag(Database database, string tag)
{
var vv = database.RealDatabase.GetTagByName(tag);
if(vv!=null)
{
database.RealDatabase.Remove(vv.Id);
database.HisDatabase.RemoveHisTag(vv.Id);
}
}
///
///
///
///
///
///
///
///
private static void AddTag(Database database ,string type,string tag,string link,int repeat)
{
if (type == "double")
{
if (repeat == 1)
{
var vtag = new Cdy.Tag.DoubleTag() { Name = tag, LinkAddress = link };
database.RealDatabase.Append(vtag);
database.HisDatabase.AddHisTags(new Cdy.Tag.HisTag() { Id = vtag.Id, TagType = TagType.Double, Type = RecordType.Timer, Circle = 1000, CompressType = 0 });
}
else
{
for (int j = 0; j < repeat; j++)
{
var vtag = new Cdy.Tag.DoubleTag() { Name = tag+j, LinkAddress = link,Group="" };
database.RealDatabase.Append(vtag);
database.HisDatabase.AddHisTags(new Cdy.Tag.HisTag() { Id = vtag.Id, TagType = TagType.Double, Type = RecordType.Timer, Circle = 1000, CompressType = 0 });
}
}
}
else if (type == "float")
{
if (repeat == 1)
{
var vtag = new Cdy.Tag.FloatTag() { Name = tag, LinkAddress = link };
database.RealDatabase.Append(vtag);
database.HisDatabase.AddHisTags(new Cdy.Tag.HisTag() { Id = vtag.Id, TagType = TagType.Float, Type = RecordType.Timer, Circle = 1000, CompressType = 0 });
}
else
{
for (int j = 0; j < repeat; j++)
{
var vtag = new Cdy.Tag.FloatTag() { Name = tag + j, LinkAddress = link };
database.RealDatabase.Append(vtag);
database.HisDatabase.AddHisTags(new Cdy.Tag.HisTag() { Id = vtag.Id, TagType = TagType.Float, Type = RecordType.Timer, Circle = 1000, CompressType = 0 });
}
}
}
else if (type == "int")
{
if (repeat == 1)
{
var vtag = new Cdy.Tag.IntTag() { Name = tag, LinkAddress = link };
database.RealDatabase.Append(vtag);
database.HisDatabase.AddHisTags(new Cdy.Tag.HisTag() { Id = vtag.Id, TagType = TagType.Int, Type = RecordType.Timer, Circle = 1000, CompressType = 0 });
}
else
{
for (int j = 0; j < repeat; j++)
{
var vtag = new Cdy.Tag.IntTag() { Name = tag + j, LinkAddress = link };
database.RealDatabase.Append(vtag);
database.HisDatabase.AddHisTags(new Cdy.Tag.HisTag() { Id = vtag.Id, TagType = TagType.Int, Type = RecordType.Timer, Circle = 1000, CompressType = 0 });
}
}
}
else if (type == "uint")
{
if (repeat == 1)
{
var vtag = new Cdy.Tag.UIntTag() { Name = tag, LinkAddress = link };
database.RealDatabase.Append(vtag);
database.HisDatabase.AddHisTags(new Cdy.Tag.HisTag() { Id = vtag.Id, TagType = TagType.UInt, Type = RecordType.Timer, Circle = 1000, CompressType = 0 });
}
else
{
for (int j = 0; j < repeat; j++)
{
var vtag = new Cdy.Tag.UIntTag() { Name = tag + j, LinkAddress = link };
database.RealDatabase.Append(vtag);
database.HisDatabase.AddHisTags(new Cdy.Tag.HisTag() { Id = vtag.Id, TagType = TagType.UInt, Type = RecordType.Timer, Circle = 1000, CompressType = 0 });
}
}
}
else if (type == "long")
{
if (repeat == 1)
{
var vtag = new Cdy.Tag.LongTag() { Name = tag, LinkAddress = link };
database.RealDatabase.Append(vtag);
database.HisDatabase.AddHisTags(new Cdy.Tag.HisTag() { Id = vtag.Id, TagType = TagType.Long, Type = RecordType.Timer, Circle = 1000, CompressType = 0 });
}
else
{
for (int j = 0; j < repeat; j++)
{
var vtag = new Cdy.Tag.LongTag() { Name = tag + j, LinkAddress = link };
database.RealDatabase.Append(vtag);
database.HisDatabase.AddHisTags(new Cdy.Tag.HisTag() { Id = vtag.Id, TagType = TagType.Long, Type = RecordType.Timer, Circle = 1000, CompressType = 0 });
}
}
}
else if (type == "ulong")
{
if (repeat == 1)
{
var vtag = new Cdy.Tag.ULongTag() { Name = tag, LinkAddress = link };
database.RealDatabase.Append(vtag);
database.HisDatabase.AddHisTags(new Cdy.Tag.HisTag() { Id = vtag.Id, TagType = TagType.ULong, Type = RecordType.Timer, Circle = 1000, CompressType = 0 });
}
else
{
for (int j = 0; j < repeat; j++)
{
var vtag = new Cdy.Tag.ULongTag() { Name = tag + j, LinkAddress = link };
database.RealDatabase.Append(vtag);
database.HisDatabase.AddHisTags(new Cdy.Tag.HisTag() { Id = vtag.Id, TagType = TagType.ULong, Type = RecordType.Timer, Circle = 1000, CompressType = 0 });
}
}
}
else if (type == "short")
{
if (repeat == 1)
{
var vtag = new Cdy.Tag.ShortTag() { Name = tag, LinkAddress = link };
database.RealDatabase.Append(vtag);
database.HisDatabase.AddHisTags(new Cdy.Tag.HisTag() { Id = vtag.Id, TagType = TagType.Short, Type = RecordType.Timer, Circle = 1000, CompressType = 0 });
}
else
{
for (int j = 0; j < repeat; j++)
{
var vtag = new Cdy.Tag.ShortTag() { Name = tag + j, LinkAddress = link };
database.RealDatabase.Append(vtag);
database.HisDatabase.AddHisTags(new Cdy.Tag.HisTag() { Id = vtag.Id, TagType = TagType.Short, Type = RecordType.Timer, Circle = 1000, CompressType = 0 });
}
}
}
else if (type == "ushort")
{
if (repeat == 1)
{
var vtag = new Cdy.Tag.UShortTag() { Name = tag, LinkAddress = link };
database.RealDatabase.Append(vtag);
database.HisDatabase.AddHisTags(new Cdy.Tag.HisTag() { Id = vtag.Id, TagType = TagType.UShort, Type = RecordType.Timer, Circle = 1000, CompressType = 0 });
}
else
{
for (int j = 0; j < repeat; j++)
{
var vtag = new Cdy.Tag.UShortTag() { Name = tag + j, LinkAddress = link };
database.RealDatabase.Append(vtag);
database.HisDatabase.AddHisTags(new Cdy.Tag.HisTag() { Id = vtag.Id, TagType = TagType.UShort, Type = RecordType.Timer, Circle = 1000, CompressType = 0 });
}
}
}
else if (type == "bool")
{
if (repeat == 1)
{
var vtag = new Cdy.Tag.BoolTag() { Name = tag, LinkAddress = link };
database.RealDatabase.Append(vtag);
database.HisDatabase.AddHisTags(new Cdy.Tag.HisTag() { Id = vtag.Id, TagType = TagType.Bool, Type = RecordType.Timer, Circle = 1000, CompressType = 0 });
}
else
{
for (int j = 0; j < repeat; j++)
{
var vtag = new Cdy.Tag.BoolTag() { Name = tag + j, LinkAddress = link };
database.RealDatabase.Append(vtag);
database.HisDatabase.AddHisTags(new Cdy.Tag.HisTag() { Id = vtag.Id, TagType = TagType.Bool, Type = RecordType.Timer, Circle = 1000, CompressType = 0 });
}
}
}
else if (type == "string")
{
if (repeat == 1)
{
var vtag = new Cdy.Tag.StringTag() { Name = tag, LinkAddress = link };
database.RealDatabase.Append(vtag);
database.HisDatabase.AddHisTags(new Cdy.Tag.HisTag() { Id = vtag.Id, TagType = TagType.String, Type = RecordType.Timer, Circle = 1000, CompressType = 0 });
}
else
{
for (int j = 0; j < repeat; j++)
{
var vtag = new Cdy.Tag.StringTag() { Name = tag + j, LinkAddress = link };
database.RealDatabase.Append(vtag);
database.HisDatabase.AddHisTags(new Cdy.Tag.HisTag() { Id = vtag.Id, TagType = TagType.String, Type = RecordType.Timer, Circle = 1000, CompressType = 0 });
}
}
}
else if (type == "datetime")
{
if (repeat == 1)
{
var vtag = new Cdy.Tag.DateTimeTag() { Name = tag, LinkAddress = link };
database.RealDatabase.Append(vtag);
database.HisDatabase.AddHisTags(new Cdy.Tag.HisTag() { Id = vtag.Id, TagType = TagType.String, Type = RecordType.Timer, Circle = 1000, CompressType = 0 });
}
else
{
for (int j = 0; j < repeat; j++)
{
var vtag = new Cdy.Tag.DateTimeTag() { Name = tag + j, LinkAddress = link };
database.RealDatabase.Append(vtag);
database.HisDatabase.AddHisTags(new Cdy.Tag.HisTag() { Id = vtag.Id, TagType = TagType.String, Type = RecordType.Timer, Circle = 1000, CompressType = 0 });
}
}
}
else if (type == "intpoint")
{
if (repeat == 1)
{
var vtag = new Cdy.Tag.IntPointTag() { Name = tag, LinkAddress = link };
database.RealDatabase.Append(vtag);
database.HisDatabase.AddHisTags(new Cdy.Tag.HisTag() { Id = vtag.Id, TagType = TagType.IntPoint, Type = RecordType.Timer, Circle = 1000, CompressType = 0 });
}
else
{
for (int j = 0; j < repeat; j++)
{
var vtag = new Cdy.Tag.IntPointTag() { Name = tag + j, LinkAddress = link };
database.RealDatabase.Append(vtag);
database.HisDatabase.AddHisTags(new Cdy.Tag.HisTag() { Id = vtag.Id, TagType = TagType.IntPoint, Type = RecordType.Timer, Circle = 1000, CompressType = 0 });
}
}
}
else if (type == "uintpoint")
{
if (repeat == 1)
{
var vtag = new Cdy.Tag.UIntPointTag() { Name = tag, LinkAddress = link };
database.RealDatabase.Append(vtag);
database.HisDatabase.AddHisTags(new Cdy.Tag.HisTag() { Id = vtag.Id, TagType = TagType.UIntPoint, Type = RecordType.Timer, Circle = 1000, CompressType = 0 });
}
else
{
for (int j = 0; j < repeat; j++)
{
var vtag = new Cdy.Tag.UIntPointTag() { Name = tag + j, LinkAddress = link };
database.RealDatabase.Append(vtag);
database.HisDatabase.AddHisTags(new Cdy.Tag.HisTag() { Id = vtag.Id, TagType = TagType.UIntPoint, Type = RecordType.Timer, Circle = 1000, CompressType = 0 });
}
}
}
else if (type == "intpoint3")
{
if (repeat == 1)
{
var vtag = new Cdy.Tag.IntPoint3Tag() { Name = tag, LinkAddress = link };
database.RealDatabase.Append(vtag);
database.HisDatabase.AddHisTags(new Cdy.Tag.HisTag() { Id = vtag.Id, TagType = TagType.IntPoint3, Type = RecordType.Timer, Circle = 1000, CompressType = 0 });
}
else
{
for (int j = 0; j < repeat; j++)
{
var vtag = new Cdy.Tag.IntPoint3Tag() { Name = tag + j, LinkAddress = link };
database.RealDatabase.Append(vtag);
database.HisDatabase.AddHisTags(new Cdy.Tag.HisTag() { Id = vtag.Id, TagType = TagType.IntPoint3, Type = RecordType.Timer, Circle = 1000, CompressType = 0 });
}
}
}
else if (type == "uintpoint3")
{
if (repeat == 1)
{
var vtag = new Cdy.Tag.UIntPoint3Tag() { Name = tag, LinkAddress = link };
database.RealDatabase.Append(vtag);
database.HisDatabase.AddHisTags(new Cdy.Tag.HisTag() { Id = vtag.Id, TagType = TagType.UIntPoint3, Type = RecordType.Timer, Circle = 1000, CompressType = 0 });
}
else
{
for (int j = 0; j < repeat; j++)
{
var vtag = new Cdy.Tag.UIntPoint3Tag() { Name = tag + j, LinkAddress = link };
database.RealDatabase.Append(vtag);
database.HisDatabase.AddHisTags(new Cdy.Tag.HisTag() { Id = vtag.Id, TagType = TagType.UIntPoint3, Type = RecordType.Timer, Circle = 1000, CompressType = 0 });
}
}
}
else if (type == "longpoint3")
{
if (repeat == 1)
{
var vtag = new Cdy.Tag.LongPoint3Tag() { Name = tag, LinkAddress = link };
database.RealDatabase.Append(vtag);
database.HisDatabase.AddHisTags(new Cdy.Tag.HisTag() { Id = vtag.Id, TagType = TagType.LongPoint3, Type = RecordType.Timer, Circle = 1000, CompressType = 0 });
}
else
{
for (int j = 0; j < repeat; j++)
{
var vtag = new Cdy.Tag.LongPoint3Tag() { Name = tag + j, LinkAddress = link };
database.RealDatabase.Append(vtag);
database.HisDatabase.AddHisTags(new Cdy.Tag.HisTag() { Id = vtag.Id, TagType = TagType.LongPoint3, Type = RecordType.Timer, Circle = 1000, CompressType = 0 });
}
}
}
else if (type == "longpoint")
{
if (repeat == 1)
{
var vtag = new Cdy.Tag.LongPointTag() { Name = tag, LinkAddress = link };
database.RealDatabase.Append(vtag);
database.HisDatabase.AddHisTags(new Cdy.Tag.HisTag() { Id = vtag.Id, TagType = TagType.LongPoint, Type = RecordType.Timer, Circle = 1000, CompressType = 0 });
}
else
{
for (int j = 0; j < repeat; j++)
{
var vtag = new Cdy.Tag.LongPointTag() { Name = tag + j, LinkAddress = link };
database.RealDatabase.Append(vtag);
database.HisDatabase.AddHisTags(new Cdy.Tag.HisTag() { Id = vtag.Id, TagType = TagType.LongPoint, Type = RecordType.Timer, Circle = 1000, CompressType = 0 });
}
}
}
else if (type == "ulongpoint3")
{
if (repeat == 1)
{
var vtag = new Cdy.Tag.ULongPoint3Tag() { Name = tag, LinkAddress = link };
database.RealDatabase.Append(vtag);
database.HisDatabase.AddHisTags(new Cdy.Tag.HisTag() { Id = vtag.Id, TagType = TagType.ULongPoint3, Type = RecordType.Timer, Circle = 1000, CompressType = 0 });
}
else
{
for (int j = 0; j < repeat; j++)
{
var vtag = new Cdy.Tag.ULongPoint3Tag() { Name = tag + j, LinkAddress = link };
database.RealDatabase.Append(vtag);
database.HisDatabase.AddHisTags(new Cdy.Tag.HisTag() { Id = vtag.Id, TagType = TagType.ULongPoint3, Type = RecordType.Timer, Circle = 1000, CompressType = 0 });
}
}
}
else if (type == "ulongpoint")
{
if (repeat == 1)
{
var vtag = new Cdy.Tag.ULongPointTag() { Name = tag, LinkAddress = link };
database.RealDatabase.Append(vtag);
database.HisDatabase.AddHisTags(new Cdy.Tag.HisTag() { Id = vtag.Id, TagType = TagType.ULongPoint, Type = RecordType.Timer, Circle = 1000, CompressType = 0 });
}
else
{
for (int j = 0; j < repeat; j++)
{
var vtag = new Cdy.Tag.ULongPointTag() { Name = tag + j, LinkAddress = link };
database.RealDatabase.Append(vtag);
database.HisDatabase.AddHisTags(new Cdy.Tag.HisTag() { Id = vtag.Id, TagType = TagType.ULongPoint, Type = RecordType.Timer, Circle = 1000, CompressType = 0 });
}
}
}
}
///
///
///
///
private static string GetHelpString()
{
StringBuilder re = new StringBuilder();
re.AppendLine();
re.AppendLine("db [databasename] // " + Res.Get("GDMsg"));
re.AppendLine("list // List all exist database");
re.AppendLine("exit // " + Res.Get("Exit"));
re.AppendLine("h // " + Res.Get("HMsg"));
return re.ToString();
}
///
///
///
///
public static bool StopDatabase(string name)
{
using (var client = new NamedPipeClientStream(".", name, PipeDirection.InOut))
{
try
{
client.Connect(2000);
client.WriteByte(0);
client.WaitForPipeDrain();
var res = client.ReadByte();
if (res == 1)
{
Console.WriteLine("Stop database " + name + " sucessfull.");
}
return true;
}
catch(Exception ex)
{
Console.WriteLine("Stop database " + name + " failed."+ex.Message);
}
return false;
}
}
///
///
///
///
public static bool ReLoadDatabase(string name)
{
lock (mLockObj)
{
using (var client = new NamedPipeClientStream(".", name, PipeDirection.InOut))
{
try
{
client.Connect(2000);
client.WriteByte(1);
client.FlushAsync();
int count = 0;
while (client.InBufferSize < 1)
{
Thread.Sleep(100);
count++;
if (count > 20) break;
}
var res = client.ReadByte();
if (res == 1)
{
Console.WriteLine("Rerun database" + name + " sucessfull.");
}
return true;
}
catch (Exception ex)
{
Console.WriteLine("ReRun database " + name + " failed. " + ex.Message + " " + ex.StackTrace);
}
return false;
}
}
}
///
///
///
///
///
public static bool CheckStart(string name)
{
lock (mLockObj)
{
using (var client = new NamedPipeClientStream(".", name, PipeDirection.InOut))
{
try
{
client.Connect(1000);
client.Close();
return true;
}
catch (Exception ex)
{
//Console.WriteLine("CheckStart " + name + " failed." + ex.Message + " " + ex.StackTrace);
return false;
}
}
}
}
///
///
///
///
public bool Start(string name)
{
if (!CheckStart(name))
{
return StartDb(name);
}
return true;
}
///
///
///
///
///
public bool Stop(string name)
{
//if (CheckStart(name))
{
return StopDatabase(name);
}
//return true;
}
///
///
///
///
///
public bool Rerun(string name)
{
if (!CheckStart(name))
{
return StartDb(name);
}
else
{
return ReLoadDatabase(name);
}
}
///
///
///
///
///
public bool IsRunning(string name)
{
return CheckStart(name);
}
}
}