158 lines
7.3 KiB
C#
158 lines
7.3 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Runtime.Versioning;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
using MySqlConnector;
|
|
using skyscraper5.Dvb.Descriptors;
|
|
using skyscraper8.Skyscraper.Scraper.Storage;
|
|
|
|
namespace skyscraper5.Data.MySql
|
|
{
|
|
public partial class MySqlDataStorage : DataStorage
|
|
{
|
|
private DateTime? TestForTimeOffset(MySqlTransaction transaction, int currentNetworkId, int currentTransportStreamId, string timeOffsetCountryCode)
|
|
{
|
|
DateTime? result = null;
|
|
if (_totCoordinates == null)
|
|
_totCoordinates = new HashSet<TotCoordinate>();
|
|
TotCoordinate coordinate = new TotCoordinate(currentNetworkId, currentTransportStreamId, timeOffsetCountryCode);
|
|
TotCoordinate cachedCoordinate;
|
|
bool wasCached = _totCoordinates.TryGetValue(coordinate, out cachedCoordinate);
|
|
if (wasCached)
|
|
return cachedCoordinate.Timestamp;
|
|
|
|
MySqlCommand command = transaction.Connection.CreateCommand();
|
|
command.Transaction = transaction;
|
|
command.CommandText = "SELECT utc FROM dvb_tot WHERE nid = @nid AND tsid = @tsid AND countrycode = @country_code";
|
|
command.Parameters.AddWithValue("@nid", currentNetworkId);
|
|
command.Parameters.AddWithValue("@tsid", currentTransportStreamId);
|
|
command.Parameters.AddWithValue("@country_code", timeOffsetCountryCode);
|
|
MySqlDataReader dataReader = command.ExecuteReader();
|
|
if (dataReader.Read())
|
|
{
|
|
result = dataReader.GetDateTime(0);
|
|
coordinate.Timestamp = result.Value;
|
|
}
|
|
|
|
dataReader.Close();
|
|
return result;
|
|
}
|
|
|
|
private void UpdateTimeOffset(MySqlTransaction transaction, int currentNetworkId, int currentTransportStreamId, DateTime utcTime, LocalTimeOffsetDescriptor.LocalTime timeOffset)
|
|
{
|
|
MySqlCommand command = transaction.Connection.CreateCommand();
|
|
command.Transaction = transaction;
|
|
command.CommandText =
|
|
"UPDATE dvb_tot SET utc = @utc, local_time_offset = @local_time_offset, time_of_change = @time_of_change, next_time_offset = @next_time_offset " +
|
|
"WHERE nid = @nid AND tsid = @tsid AND countrycode = @country_code";
|
|
command.Parameters.AddWithValue("@nid", currentNetworkId);
|
|
command.Parameters.AddWithValue("@tsid", currentTransportStreamId);
|
|
command.Parameters.AddWithValue("@country_code", timeOffset.CountryCode);
|
|
command.Parameters.AddWithValue("@utc", utcTime);
|
|
command.Parameters.AddWithValue("@local_time_offset", (int)timeOffset.LocalTimeOffset.TotalSeconds);
|
|
command.Parameters.AddWithValue("@time_of_change", timeOffset.TimeOfChange);
|
|
command.Parameters.AddWithValue("@next_time_offset", timeOffset.NextTimeOffset);
|
|
command.ExecuteNonQuery();
|
|
}
|
|
|
|
private void InsertTimeOffset(MySqlTransaction transaction, int currentNetworkId, int currentTransportStreamId, DateTime utcTime, LocalTimeOffsetDescriptor.LocalTime timeOffset)
|
|
{
|
|
MySqlCommand command = transaction.Connection.CreateCommand();
|
|
command.Transaction = transaction;
|
|
command.CommandText =
|
|
"INSERT dvb_tot (nid, tsid, utc, countrycode, country_region_id, local_time_offset_polarity, local_time_offset, time_of_change, next_time_offset) " +
|
|
"VALUES (@nid, @tsid, @utc, @countrycode, @country_region_id, @local_time_offset_polarity, @local_time_offset, @time_of_change, @next_time_offset)";
|
|
command.Parameters.AddWithValue("@nid", currentNetworkId);
|
|
command.Parameters.AddWithValue("@tsid", currentTransportStreamId);
|
|
command.Parameters.AddWithValue("@utc", utcTime);
|
|
command.Parameters.AddWithValue("@countrycode", timeOffset.CountryCode);
|
|
command.Parameters.AddWithValue("@country_region_id", timeOffset.CountryRegionId);
|
|
command.Parameters.AddWithValue("@local_time_offset_polarity", timeOffset.LocalTimeOffsetPolarity);
|
|
command.Parameters.AddWithValue("@local_time_offset", (int)timeOffset.LocalTimeOffset.TotalSeconds);
|
|
command.Parameters.AddWithValue("@time_of_change", timeOffset.TimeOfChange);
|
|
command.Parameters.AddWithValue("@next_time_offset", timeOffset.NextTimeOffset);
|
|
command.ExecuteNonQuery();
|
|
|
|
TdtCoordinate tdtCoordinate = new TdtCoordinate(currentNetworkId, currentTransportStreamId);
|
|
tdtCoordinate.CoordinateTimestamp = utcTime;
|
|
_tdtCoordinates.Add(tdtCoordinate);
|
|
}
|
|
|
|
struct TotCoordinate
|
|
{
|
|
private readonly int _currentNetworkId;
|
|
private readonly int _currentTransportStreamId;
|
|
private readonly string _timeOffsetCountryCode;
|
|
|
|
public TotCoordinate(int currentNetworkId, int currentTransportStreamId, string timeOffsetCountryCode)
|
|
{
|
|
_currentNetworkId = currentNetworkId;
|
|
_currentTransportStreamId = currentTransportStreamId;
|
|
_timeOffsetCountryCode = timeOffsetCountryCode;
|
|
Timestamp = DateTime.MinValue;
|
|
}
|
|
|
|
public bool Equals(TotCoordinate other)
|
|
{
|
|
return _currentNetworkId == other._currentNetworkId && _currentTransportStreamId == other._currentTransportStreamId && _timeOffsetCountryCode == other._timeOffsetCountryCode;
|
|
}
|
|
|
|
public override bool Equals(object obj)
|
|
{
|
|
return obj is TotCoordinate other && Equals(other);
|
|
}
|
|
|
|
public override int GetHashCode()
|
|
{
|
|
return HashCode.Combine(_currentNetworkId, _currentTransportStreamId, _timeOffsetCountryCode);
|
|
}
|
|
|
|
public DateTime Timestamp { get; set; }
|
|
}
|
|
|
|
private HashSet<TotCoordinate> _totCoordinates;
|
|
|
|
public bool UpdateTimeOffsetTable(int currentNetworkId, int currentTransportStreamId, DateTime utcTime, LocalTimeOffsetDescriptor ltod)
|
|
{
|
|
if (ltod.LocalTimeOffsets == null)
|
|
return false;
|
|
|
|
if (ltod.LocalTimeOffsets.Length == 0)
|
|
return false;
|
|
|
|
using (MySqlConnection connection = new MySqlConnection(_mcsb.ToString()))
|
|
{
|
|
bool result = false;
|
|
connection.Open();
|
|
MySqlTransaction transaction = connection.BeginTransaction();
|
|
foreach (LocalTimeOffsetDescriptor.LocalTime timeOffset in ltod.LocalTimeOffsets)
|
|
{
|
|
DateTime? older = TestForTimeOffset(transaction, currentNetworkId, currentTransportStreamId, timeOffset.CountryCode);
|
|
if (older.HasValue)
|
|
{
|
|
if (utcTime > older.Value)
|
|
{
|
|
//UpdateTimeOffset(transaction, currentNetworkId, currentTransportStreamId, utcTime, timeOffset);
|
|
EnqueueSpeedhack(SpeedhackType.UpdateTimeOffset, currentNetworkId, currentTransportStreamId, utcTime, timeOffset);
|
|
result = true;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
//InsertTimeOffset(transaction, currentNetworkId, currentTransportStreamId, utcTime, timeOffset);
|
|
EnqueueSpeedhack(SpeedhackType.InsertTimeOffset, currentNetworkId, currentTransportStreamId, utcTime, timeOffset);
|
|
result = true;
|
|
}
|
|
}
|
|
transaction.Commit();
|
|
connection.Close();
|
|
return result;
|
|
}
|
|
}
|
|
|
|
|
|
}
|
|
}
|