SafeNet/Teltonika_SOC/DBconnThreads.cs
2021-02-24 13:50:23 +02:00

212 lines
8.1 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SafeNetLib;
using System.Threading;
using System.Net.NetworkInformation;
namespace Teltonika_SOC
{
class DBconnThread
{
private static string MyConString;
private string gatewayID;
private DBhandle DB;
public DBconnThread(string p_dbConStr, string p_gatewayID)
{
MyConString = p_dbConStr;
gatewayID = p_gatewayID;
DB = new DBhandle(MyConString, gatewayID);
}
private void StartDB()
{
try
{
DB.StartDB();
}
catch (Exception ex)
{
Utils.ConsWrite(DebugMSG_Type.always, ex.ToString());
}
}
private void StopDB()
{
DB.StopDB();
}
int count = 0;
//for GPS DB thread
public void HandleConnectionGPS()
{
Utils.ConsWrite(DebugMSG_Type.DB, "GPS DB thread...");
while (true)
{
try
{
while (!DB.DBconnected)
{
Utils.ConsWrite(DebugMSG_Type.DB, "Reconneting to DB!!!");
StartDB();
Thread.Sleep(3000);
}
htCell_t cell = SN_Queues.DBQueueLocation.GetItem(100);
if (cell != null)
{
DateTime before = DateTime.Now;
bool ret = DB.Insert_messages(cell);
if (ret)
{
SN_Queues.initAddressQueue.PostItem(cell);
DateTime after = DateTime.Now;
TimeSpan diff = after.Subtract(before);
count++;
Utils.ConsWrite(DebugMSG_Type.DB, "GPS SUID: " + cell.suid + " LAT<" + cell.lat + " > LNG<" + cell.lng + ">");
LOGS.LOG(DateTime.Now.ToString() + " : GPS SUID: " + cell.suid + " LAT<" + cell.lat + " > LNG<" + cell.lng + ">");
Utils.ConsWrite(DebugMSG_Type.DB, "Added count:" + count + " in queue:" + SN_Queues.DBQueueLocation.Count + " Time for insert(msecs):" + diff.Ticks / TimeSpan.TicksPerMillisecond + "." + diff.Ticks % TimeSpan.TicksPerMillisecond);
LOGS.LOG(DateTime.Now.ToString() + " : Added count:" + count + " in queue:" + SN_Queues.DBQueueLocation.Count + " Time for insert(msecs):" + diff.Ticks / TimeSpan.TicksPerMillisecond + "." + diff.Ticks % TimeSpan.TicksPerMillisecond);
Console.WriteLine("-----------------------------------");
}
}
}
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 (true)
{
count++;
if (count % 60 == 0)
{
Int64 upTime = Utils.DateTo70Format(DateTime.Now) - Utils.DateTo70Format(Program.startTime);
Version v = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version;
GWstatus gws = new GWstatus();
gws.gw_id = Program.cfg.gatewayID;
gws.status = 1;
gws.message = String.Format("Teltonika GW: Uptime:{0};Version:{1};Connections:{2}", upTime, v.ToString(), ConnectionThread.connections);
SN_Queues.gwstatusQueue.PostItem(gws);
}
while (!DB.DBconnected)
{
Thread.Sleep(1000);
}
if (countUnit > 5 * 60)//every 5 minutes
{
Program.unitsLoaded = DB.LoadUnitInfo(gatewayID);
countUnit = 0;
if (Program.setupMode && !Program.loadUnitsFromFile)
{
DB.LoadImeiHashtable(gatewayID, ref Program.ImeiHT);
Utils.WriteLine("Setup mode: Done loading " + Program.ImeiHT.Count + " units from DB!", ConsoleColor.Cyan, Program.isUnix);
}
}
GWstatus gw_msg = SN_Queues.gwstatusQueue.GetItem(10);
while (gw_msg != null)
{
DB.Insert_GW_status(gw_msg.gw_id, gw_msg.status, gw_msg.message);
gw_msg = SN_Queues.gwstatusQueue.GetItem(10);
}
countUnit++;
Thread.Sleep(1000);
} // end while (true)
}
//for inserting address Thread
public void HandleConnectionAddr()
{
Utils.ConsWrite(DebugMSG_Type.DB, "Address DB thread ...");
//get address list
while (!DB.DBconnected)
{
Utils.ConsWrite(DebugMSG_Type.DB, "Address DB thread waiting for DB connection!!");
LOGS.LOG(DateTime.Now.ToString() + " : Address DB thread waiting for DB connection!!");
Thread.Sleep(1000);
}
//Program.addressLoaded = DB.LoadAddressList(gatewayID);
while (!Program.addressLoaded)
{
Program.addressLoaded = DB.LoadAddressList(gatewayID);
Utils.ConsWrite(DebugMSG_Type.DB, "Address DB thread waiting for address list!!");
LOGS.LOG(DateTime.Now.ToString() + " : Address DB thread waiting for address list!!");
Thread.Sleep(1000);
}
Utils.ConsWrite(DebugMSG_Type.DB, " SN_Queues.ht_addressList.Count" + SN_Queues.ht_addressList.Count);
LOGS.LOG(DateTime.Now.ToString() + " : SN_Queues.ht_addressList.Count" + SN_Queues.ht_addressList.Count);
while (true)
{
while (!Program.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 from queue...");
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);
LOGS.LOG(DateTime.Now.ToString() + " : 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
}
}
}
} // end while (true)
}
}
}