103 lines
3.6 KiB
C#

using MySqlConnector;
using skyscraper8.Skyscraper.Scraper.Storage;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace skyscraper5.Data.MySql
{
public partial class MySqlDataStorage : DataStorage
{
private class TsdtCoordinate
{
public int CurrentNetworkId { get; }
public int CurrentTransportStreamId { get; }
public string Compliance { get; }
public string StationIdentification { get; set; }
public TsdtCoordinate(int currentNetworkId, int currentTransportStreamId, string compliance)
{
CurrentNetworkId = currentNetworkId;
CurrentTransportStreamId = currentTransportStreamId;
Compliance = compliance;
StationIdentification = null;
}
public bool Equals(TsdtCoordinate other)
{
return CurrentNetworkId == other.CurrentNetworkId && CurrentTransportStreamId == other.CurrentTransportStreamId && Compliance == other.Compliance;
}
public override bool Equals(object obj)
{
return obj is TsdtCoordinate other && Equals(other);
}
public override int GetHashCode()
{
return HashCode.Combine(CurrentNetworkId, CurrentTransportStreamId, Compliance);
}
}
private HashSet<TsdtCoordinate> _tsdtCoordinates;
public bool IsCompliant(int currentNetworkId, int currentTransportStreamId, string compliance)
{
if (_tsdtCoordinates == null)
_tsdtCoordinates = new HashSet<TsdtCoordinate>();
TsdtCoordinate coordinate = new TsdtCoordinate(currentNetworkId, currentTransportStreamId, compliance);
if (_tsdtCoordinates.Contains(coordinate))
return true;
using (MySqlConnection conn = new MySqlConnection(_mcsb.ToString()))
{
conn.Open();
MySqlCommand command = conn.CreateCommand();
command.CommandText = "SELECT dateadded FROM dvb_tsdt WHERE cnid = @cnid AND ctsid = @ctsid AND compliance = @compliance";
command.Parameters.AddWithValue("@cnid", currentNetworkId);
command.Parameters.AddWithValue("@ctsid", currentTransportStreamId);
command.Parameters.AddWithValue("@compliance", compliance);
MySqlDataReader dataReader = command.ExecuteReader();
bool result = dataReader.Read();
if (result)
_tsdtCoordinates.Add(coordinate);
dataReader.Close();
conn.Close();
return result;
}
}
public void MarkAsCompliant(int currentNetworkId, int currentTransportStreamId, string compliance)
{
TsdtCoordinate coordinate = new TsdtCoordinate(currentNetworkId, currentTransportStreamId, compliance);
EnqueueSpeedhack(SpeedhackType.InsertTsdt, coordinate);
_tsdtCoordinates.Add(coordinate);
}
public bool SetStationIdentification(int currentNetworkId, int currentTransportStreamId, string stationIdentification)
{
if (_tsdtCoordinates == null)
return false;
TsdtCoordinate tsdtCoordinate = _tsdtCoordinates.Where(x =>
x.CurrentNetworkId == currentNetworkId && x.CurrentTransportStreamId == currentTransportStreamId)
.First();
if (tsdtCoordinate.CurrentNetworkId == 0 && tsdtCoordinate.CurrentTransportStreamId == 0)
return false;
if (!stationIdentification.Equals(tsdtCoordinate.StationIdentification))
{
EnqueueSpeedhack(SpeedhackType.UpdateTsdtStationIdentification, currentNetworkId, currentTransportStreamId, stationIdentification);
tsdtCoordinate.StationIdentification = stationIdentification;
return true;
}
return false;
}
}
}