SafeNet/MotoTRBO_SOC/DBconnThread.cs
2021-02-24 13:50:23 +02:00

456 lines
16 KiB
C#

using System;
using System.Collections.Generic;
using System.Text;
using SafeNetLib;
using System.Threading;
namespace MotoTRBO_SOC
{
public class DBconnThread
{
private static string MyConString;
private string gatewayID;
private bool working = false;
public DBhandle DB;
public DBconnThread(string p_dbConStr, string p_gatewayID)
{
MyConString = p_dbConStr;
gatewayID = p_gatewayID;
working = true;
DB = new DBhandle(MyConString, gatewayID);
}
public void StartDB()
{
try
{
working = true;
DB.StartDB();
}
catch (Exception ex)
{
Utils.ConsWrite(DebugMSG_Type.always, ex.ToString());
}
}
public void StopDB()
{
try
{
working = false;
DB.StopDB();
}
catch (Exception ex)
{
Utils.ConsWrite(DebugMSG_Type.always, ex.ToString());
}
}
int count = 0;
//for ARS DB thread
public void HandleConnectionARS()
{
Utils.ConsWrite(DebugMSG_Type.DB, "ARS DB thread...");
while (MotoTRBO_GW.running)
{
try
{
while (!DB.DBconnected && MotoTRBO_GW.running)
{
Thread.Sleep(500);
}
//add ARS in DB
ArsMSG ars_msg = SN_Queues.arsMsgQueue.GetItem(100);
while (ars_msg != null)
{
//Utils.ConsWrite(DebugMSG_Type.Debug, "Got ARS updating DB suid:" + ars_msg.imei + "msg:" + ars_msg.msg);
//insertARSinDB(ars_msg.suid, ars_msg.msg);
//insert ars in ars message table
int suDBid = 0;
suDBid = GetDbID4RadioID(ars_msg.imei);
if (suDBid == 0)
{
Utils.ConsWrite(DebugMSG_Type.Debug, "Unit with IMEI:" + ars_msg.imei + " not found in DB!!!!");
LOGS.LOG("Unit with IMEI:" + ars_msg.imei + " not found in DB!!!!");
}
else
{
if (ars_msg.imei != "0" && ars_msg.imei != "")
{
MotoTRBO_GW.lastEntry = DateTime.Now;
DB.Insert_ARSmsg(suDBid, ars_msg.msg);
}
else
{
Utils.ConsWrite(DebugMSG_Type.Debug, "%%%%% Got ARS invalid suid:" + ars_msg.suid + "msg:" + ars_msg.msg);
}
//update ARS last pos.
//Update_ARSlp(dbID);
}
ars_msg = SN_Queues.arsMsgQueue.GetItem(10);
}
}
catch (ThreadAbortException)
{
}
catch (Exception ex)
{
Utils.ConsWrite(DebugMSG_Type.always, ex.ToString());
}
} // end while (true)
}
//for GPS DB thread
public void HandleConnectionGPS()
{
Utils.ConsWrite(DebugMSG_Type.DB, "GPS DB thread...");
// first time the connection is made outside this loop
while (!DB.DBconnected)
{
Thread.Sleep(500);
}
int count = 0;
while (MotoTRBO_GW.running)
{
try
{
while (!DB.DBconnected && MotoTRBO_GW.running)
{
if (++count % 10 == 0)
{
StopDB();
Thread.Sleep(500);
//Utils.ConsWrite(DebugMSG_Type.DB, "Reconneting to DB!!!");
Utils.WriteLine("Database is not connected!!! Restarting it...", ConsoleColor.Red);
StartDB();
count = 0;
}
Thread.Sleep(500);
}
htCell_t cell = SN_Queues.DBQueueLocation.GetItem(100);
if (cell != null)
{
SN_Queues.initAddressQueue.PostItem(cell);
DateTime before = DateTime.Now;
bool ret = DB.Insert_messages(cell);
MotoTRBO_GW.lastEntry = DateTime.Now;
if (ret)
{
DateTime after = DateTime.Now;
TimeSpan diff = after.Subtract(before);
count++;
//Utils.ConsWrite(DebugMSG_Type.always, "GPS SUID: " + cell.suid + " LAT<" + cell.lat + " > LNG<" + cell.lng + ">");
//Utils.ConsWrite(DebugMSG_Type.always, "Added count:" + count + " in queue:" + SN_Queues.DBQueueLocation.Count + " Time for insert(msecs):" + diff.Ticks / TimeSpan.TicksPerMillisecond + "." + diff.Ticks % TimeSpan.TicksPerMillisecond);
}
//Utils.ConsWrite(DebugMSG_Type.always, "-----------------------------------");
}
}
catch (ThreadAbortException)
{
}
catch (Exception ex)
{
Utils.ConsWrite(DebugMSG_Type.always, ex.ToString());
DB.DBconnected = false;
}
} // end while (true)
}
//for Aux DB thread (units, gateway status)
int countUnit = 30*61;
public void HandleConnectionAux()
{
Utils.ConsWrite(DebugMSG_Type.DB, "Aux DB thread ...");
while (MotoTRBO_GW.running)
{
while (!DB.DBconnected && MotoTRBO_GW.running)
{
Thread.Sleep(500);
}
try
{
if (countUnit > 2 * 60)//every 5 minutes
{
MotoTRBO_GW.unitsLoaded = DB.LoadUnitInfo(gatewayID);
countUnit = 0;
}
GWstatus gw_msg = SN_Queues.gwstatusQueue.GetItem(10);
while (gw_msg != null)
{
while (!DB.DBconnected && MotoTRBO_GW.running)
{
Thread.Sleep(500);
}
bool result = false;
if(gw_msg.message != null && gw_msg.message.Length > 0)
result = DB.Insert_GW_status(gw_msg.gw_id, gw_msg.status, gw_msg.message);
else
result = DB.Insert_GW_status(gw_msg.gw_id, gw_msg.status);
/*
if (result)
MotoTRBO_GW.lastEntry = DateTime.Now;
*/
gw_msg = SN_Queues.gwstatusQueue.GetItem(10);
}
countUnit++;
Thread.Sleep(300);
}
catch (ThreadAbortException)
{
}
catch (Exception ex)
{
Utils.ConsWrite(DebugMSG_Type.always, ex.ToString());
}
} // end while (true)
}
//for Tallysman events Thread
public void HandleTallysmanEvents()
{
Utils.ConsWrite(DebugMSG_Type.always, "Tallysman Events DB thread ...");
int count = 0;
while (MotoTRBO_GW.running)
{
while (!DB.DBconnected && MotoTRBO_GW.running)
{
Thread.Sleep(500);
}
if (++count % 10 == 0)
{
//update GPS in DB from poll response
MotoTRBO_SOC.TallysmanReceiveThread.TallysmanEventArgs tallysmanMsg = MotoTRBO_GW.tallysmanEventsQueue.GetItem(100);
if (tallysmanMsg != null)
{
//Utils.ConsWrite(DebugMSG_Type.DB, "Got poll location updating DB [" + gps_msg.DBid + "] suid:" + gps_msg.suid);
DB.InsertTallysmanEvent(tallysmanMsg.GetTallysmanMessage());
}
count = 0;
}
Thread.Sleep(500);
//TODO check if polls have expired -> were sent more than 2 hours ago
} // end while (true)
}
//for SMS DB thread
public void HandleConnectionSMS()
{
Utils.ConsWrite(DebugMSG_Type.DB, "SMS DB thread ...");
int count = 0;
while (MotoTRBO_GW.running)
{
while (!DB.DBconnected && MotoTRBO_GW.running)
{
Thread.Sleep(500);
}
if (++count % 15 == 0)
{
LOGS.LOG("@SMS@ " + DateTime.Now.ToString("HH:mm:ss") + "->Check for SMS in DB (DB OK!!!)");
//Utils.ConsWrite(DebugMSG_Type.DB, DateTime.Now.ToString("HH:mm:ss") + "->Check for SMS in DB (DB OK!!!)");
DB.checkSMSinDB();
count =0;
}
Thread.Sleep(500);
} // end while (true)
}
//for SMS Conf DB thread
public void HandleConnectionSMS_conf()
{
Utils.ConsWrite(DebugMSG_Type.DB, "SMS_conf DB thread ...");
int count = 0;
while (MotoTRBO_GW.running)
{
while (!DB.DBconnected && MotoTRBO_GW.running)
{
Thread.Sleep(500);
}
if (++count % 11 == 0)
{
//check SMS confirmation
SMSmsg msg = SN_Queues.confSMSQueue.GetItem(100);
while (msg != null)
{
//Utils.ConsWrite(DebugMSG_Type.DB, "Confirming SMS in DB. DBmsgID:" + msg.DBmsg_id + " msg:" + msg.msg);
DB.confirmSMS(msg);
msg = SN_Queues.confSMSQueue.GetItem(100);
}
count = 0;
}
Thread.Sleep(500);
} // end while (true)
}
//for inserting address Thread
public void HandleConnectionAddr()
{
Utils.ConsWrite(DebugMSG_Type.DB, "Address DB thread ...");
//get address list
while (!DB.DBconnected && MotoTRBO_GW.running)
{
//Utils.ConsWrite(DebugMSG_Type.DB, "Address DB thread waiting for DB connection!!");
Thread.Sleep(500);
}
MotoTRBO_GW.addressLoaded = DB.LoadAddressList(gatewayID);
while (!MotoTRBO_GW.addressLoaded)
{
Utils.ConsWrite(DebugMSG_Type.DB, "Address DB thread waiting for address list!!");
Thread.Sleep(500);
}
while (MotoTRBO_GW.running)
{
while (!MotoTRBO_GW.addressLoaded)
Thread.Sleep(100);
//add addr to tb if needed
htCell_t cell = SN_Queues.initAddressQueue.GetItem(100);
if (cell != null)
{
//Utils.ConsWrite(DebugMSG_Type.DB, "Address thread item fetched...");
string addr_hash = Utils.Compute4digitALG(cell.d_lat, cell.d_lng);
Address addr = new Address(cell);
lock (SN_Queues.ht_addressList.SyncRoot)
{
if (!SN_Queues.ht_addressList.ContainsKey(addr_hash))
{
//insert value in DB
DB.Insert_AddressList(cell);
//Utils.ConsWrite(DebugMSG_Type.DB, "addr_hash:" + addr_hash + " addr.addr_hash:" + addr.addr_hash + " SN_Queues.ht_addressList.Count" + SN_Queues.ht_addressList.Count);
//add to comp addr queue
/*
if (SN_Queues.computeAddressQueue.Count < 100)
{
SN_Queues.computeAddressQueue.PostItem(addr);
}
*/
//add in our own ht
SN_Queues.ht_addressList.Add(addr.addr_hash, addr);
}
else
{
//no need to add to DB .. addr already in
}
}
}
Thread.Sleep(50);
} // end while (true)
}
//for poll Thread
public void HandleConnectionPOLL()
{
Utils.ConsWrite(DebugMSG_Type.DB, "POLL DB thread ...");
int count = 0;
while (MotoTRBO_GW.running)
{
while (!DB.DBconnected && MotoTRBO_GW.running)
{
Thread.Sleep(500);
}
if (++count % 18 == 0)
{
//Utils.ConsWrite(DebugMSG_Type.DB, "Checking for poll at:" + DateTime.Now);
//get new POLL requests
DB.GetPollRequests4Conventional();
//check Poll sent
POLLmsg p_msg = SN_Queues.sentPOLLQueue.GetItem(100);
if (p_msg != null)
{
//Utils.ConsWrite(DebugMSG_Type.DEV, "MotoTRBOGW.sentPOLLQueue.GetItem(100);");
DB.UpdatePollSentTime(p_msg.DBid, p_msg.sent);
}
//update GPS in DB from poll response
POLLmsg gps_msg = SN_Queues.recvPOLLQueue.GetItem(100);
if (gps_msg != null)
{
//Utils.ConsWrite(DebugMSG_Type.DB, "Got poll location updating DB [" + gps_msg.DBid + "] suid:" + gps_msg.suid);
DB.UpdatePollGPSConventional(gps_msg);
//remove poll from hashtable ... poll completed sucsessfully
lock (SN_Queues.ht_POLL_List.SyncRoot)
{
SN_Queues.ht_POLL_List.Remove(gps_msg.DBid);
}
}
count = 0;
}
Thread.Sleep(500);
//TODO check if polls have expired -> were sent more than 2 hours ago
} // end while (true)
}
public static int GetDbID4RadioID(string radioID)
{
int result = 0;
lock (SN_Queues.ht_SUInfo.SyncRoot)
{
if (SN_Queues.ht_SUInfo != null)
{
if (SN_Queues.ht_SUInfo.ContainsKey(radioID))
result = ((SUinfo)SN_Queues.ht_SUInfo[radioID]).DBid;
}
}
return result;
}
}
}