using System; using System.Collections.Generic; using System.Text; using SafeMobileLib; using System.Threading; using SafeMobileLib.MessageDecoders; namespace MotoRepeater { public class DBconnThread { private string gatewayID; private bool working = false; public DBhandle DB; public DBconnThread(string Server, string Database, string User, string Password, string p_gatewayID) { gatewayID = p_gatewayID; working = true; DB = new DBhandle(Server, Database, User, Password); DBhandle.gatewayID = p_gatewayID; } public void StartDB() { try { working = true; DB.StartDB(); } catch (Exception ex) { Utils.WriteLine("StartDB Exception: " + ex.ToString(), ConsoleColor.Red); } } public void StopDB() { try { working = false; DB.StopDB(); } catch (Exception ex) { Utils.WriteLine("StopDB Exception: " + ex.ToString(), ConsoleColor.Red); } } int count = 0; //for ARS DB thread public void HandleConnectionARS() { Utils.WriteLine("ARS DB thread..."); while (MotoRepeater_GW.isRunning) { try { while (!DB.DBconnected && MotoRepeater_GW.isRunning) { 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.WriteLine("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 != "") { MotoRepeater_GW.lastEntry = DateTime.Now; DB.Insert_ARSmsg(suDBid, ars_msg.msg); } else { Utils.WriteLine("%%%%% 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.WriteLine("Handle ARS Exception: " + ex.ToString(), ConsoleColor.Red); } } // end while (true) } public DateTime startInsertGPS = DateTime.Now; public DateTime endInsertGPS = DateTime.Now; //for GPS DB thread public void HandleConnectionGPS() { Utils.WriteLine("GPS DB thread..."); // first time the connection is made outside this loop while (!DB.DBconnected) { Thread.Sleep(500); } int count = 0; int gpsCount = 0; while (MotoRepeater_GW.isRunning) { try { while (!DB.DBconnected && MotoRepeater_GW.isRunning) { 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(++gpsCount % 100 == 0) { Utils.WriteLine("GPS Queue contains " + SN_Queues.DBQueueLocation.Count + " positions", ConsoleColor.Green); gpsCount = 0; } if (cell != null) { SN_Queues.initAddressQueue.PostItem(cell); startInsertGPS = DateTime.Now; bool ret = DB.Insert_messages(cell); MotoRepeater_GW.lastEntry = DateTime.Now; if (ret) { endInsertGPS = DateTime.Now; TimeSpan diff = endInsertGPS.Subtract(endInsertGPS); 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 tae) { Utils.WriteLine("Handle GPS ThreadAbortException Exception: " + tae.ToString(), ConsoleColor.Red); } catch (Exception ex) { Utils.WriteLine("Handle GPS Exception: " + ex.ToString(), ConsoleColor.Red); DB.DBconnected = false; } } // end while (true) Utils.WriteLine("Handle GPS Thread is getting killed", ConsoleColor.Yellow); } //for Aux DB thread (units, gateway status) int countUnit = 30 * 61; public void HandleConnectionAux() { Utils.WriteLine("Aux DB thread ..."); while (MotoRepeater_GW.isRunning) { while (!DB.DBconnected && MotoRepeater_GW.isRunning) { Thread.Sleep(500); } try { if (countUnit > 2 * 60)//every 5 minutes { DB.LoadUnitInfo(gatewayID); countUnit = 0; // check last GPS inserted if ((DateTime.Now - SN_Queues.DBQueueLocation.LastReadTime) > new TimeSpan(0, 1, 0)) { Utils.WriteLine($"Last GPS check was @{SN_Queues.DBQueueLocation.LastReadTime}", ConsoleColor.Yellow); OnGPSInsertedBlocked?.Invoke(); } } GWstatus gw_msg = SN_Queues.gwstatusQueue.GetItem(200); while (gw_msg != null) { while (!DB.DBconnected && MotoRepeater_GW.isRunning) { 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); // check last inserted GPS to prevent blocked insert if(endInsertGPS < startInsertGPS && Math.Abs(endInsertGPS.Subtract(endInsertGPS).Seconds) > 5) { Utils.WriteLine($"GPS INSERT HAD BLOCKED!!! Last inserted GPS was @ {endInsertGPS.ToString()}", ConsoleColor.Magenta); OnGPSInsertedBlocked?.Invoke(); } /* if (result) MotoTRBO_GW.lastEntry = DateTime.Now; */ gw_msg = SN_Queues.gwstatusQueue.GetItem(200); } countUnit++; } catch (ThreadAbortException) { } catch (Exception ex) { Utils.WriteLine("Handle ARS Exception: " + ex.ToString(), ConsoleColor.Red); } } // end while (true) } //for SMS DB thread public void HandleConnectionSMS() { Utils.WriteLine("SMS DB thread ..."); int count = 0; while (MotoRepeater_GW.isRunning) { while (!DB.DBconnected && MotoRepeater_GW.isRunning) { 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.WriteLine("SMS_conf DB thread ..."); int count = 0; while (MotoRepeater_GW.isRunning) { while (!DB.DBconnected && MotoRepeater_GW.isRunning) { 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.WriteLine("Address DB thread ..."); //get address list while (!DB.DBconnected && MotoRepeater_GW.isRunning) { //Utils.ConsWrite(DebugMSG_Type.DB, "Address DB thread waiting for DB connection!!"); Thread.Sleep(500); } //MotoTRBO_GW.addressLoaded = DB.LoadAddressList(gatewayID); while (!MotoRepeater_GW.addressLoaded) { Utils.WriteLine("Address DB thread waiting for address list!!"); Thread.Sleep(500); } while (MotoRepeater_GW.isRunning) { while (!MotoRepeater_GW.addressLoaded && MotoRepeater_GW.isRunning) 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.WriteLine("POLL DB thread ..."); int count = 0; while (MotoRepeater_GW.isRunning) { while (!DB.DBconnected && MotoRepeater_GW.isRunning) { Thread.Sleep(500); } if (++count % 10 == 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) } //for Tallysman events Thread public void HandleTallysmanEvents() { Utils.WriteLine("Tallysman Events DB thread ..."); int count = 0; while (MotoRepeater_GW.isRunning) { while (!DB.DBconnected && MotoRepeater_GW.isRunning) { Thread.Sleep(500); } if (++count % 10 == 0) { //update GPS in DB from poll response TallysmanEventArgs tallysmanMsg = DataBaseSN.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) } 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; } public delegate void GPSInsertedBlockedDel(); public event GPSInsertedBlockedDel OnGPSInsertedBlocked; } }