using skyscraper5.Skyscraper.Scraper.Storage.Split; using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Text; using System.Threading.Tasks; using MySqlConnector; using skyscraper5.Dvb.Descriptors; using skyscraper5.Dvb.Psi.Model; using static skyscraper5.Dvb.Descriptors.ServiceListDescriptor; namespace skyscraper5.Data.MySql { public partial class MySqlDataStorage : DataStorage { private void InsertSdtCaIdentifiers(MySqlTransaction transaction, ushort transportStreamId, ushort originalNetworkId, SdtService sdtService) { if (sdtService.CaIdentifiers == null) return; if (sdtService.CaIdentifiers.Length == 0) return; MySqlCommand mySqlCommand = transaction.Connection.CreateCommand(); mySqlCommand.Transaction = transaction; mySqlCommand.CommandText = "INSERT INTO dvb_sdt_ca_identifiers" + " (tsid, onid, service_id, ca_identifier) " + "VALUES" + " (@tsid,@onid,@service_id,@ca_identifier)"; mySqlCommand.Parameters.Add("@tsid", MySqlDbType.Int32); mySqlCommand.Parameters.Add("@onid", MySqlDbType.Int32); mySqlCommand.Parameters.Add("@service_id", MySqlDbType.Int32); mySqlCommand.Parameters.Add("@ca_identifier", MySqlDbType.Int32); mySqlCommand.Parameters["@tsid"].Value = transportStreamId; mySqlCommand.Parameters["@onid"].Value = originalNetworkId; mySqlCommand.Parameters["@service_id"].Value = sdtService.ServiceId; foreach (ushort sdtServiceCaIdentifier in sdtService.CaIdentifiers) { mySqlCommand.Parameters["@ca_identifier"].Value = sdtServiceCaIdentifier; mySqlCommand.ExecuteNonQuery(); } } private void InsertSdtCountryAvailability(MySqlTransaction transaction, ushort transportStreamId, ushort originalNetworkId, SdtService sdtService) { if (sdtService.CountryAvailability == null) return; if (sdtService.CountryAvailability.Count == 0) return; MySqlCommand mySqlCommand = transaction.Connection.CreateCommand(); mySqlCommand.Transaction = transaction; mySqlCommand.CommandText = "INSERT INTO dvb_sdt_country_availability" + " (tsid, onid, service_id, country, availability) " + "VALUES " + " (@tsid,@onid,@service_id,@country,@availability)"; mySqlCommand.Parameters.Add("@tsid", MySqlDbType.Int32); mySqlCommand.Parameters.Add("@onid", MySqlDbType.Int32); mySqlCommand.Parameters.Add("@service_id", MySqlDbType.Int32); mySqlCommand.Parameters.Add("@country", MySqlDbType.VarChar); mySqlCommand.Parameters.Add("@availability", MySqlDbType.Bool); mySqlCommand.Parameters["@tsid"].Value = transportStreamId; mySqlCommand.Parameters["@onid"].Value = originalNetworkId; mySqlCommand.Parameters["@service_id"].Value = sdtService.ServiceId; foreach (KeyValuePair keyValuePair in sdtService.CountryAvailability) { mySqlCommand.Parameters["@country"].Value = keyValuePair.Key; mySqlCommand.Parameters["@availability"].Value = keyValuePair.Value; mySqlCommand.ExecuteNonQuery(); } } private void InsertSdtMultilingualServiceName(MySqlConnection connection, ushort transportStreamId, ushort originalNetworkId, SdtService sdtService) { if (sdtService.MultilingualServiceName == null) return; if (sdtService.MultilingualServiceName.Count == 0) return; MySqlCommand mySqlCommand = connection.CreateCommand(); mySqlCommand.CommandText = "INSERT INTO dvb_sdt_multilingual_service_name" + " (tsid, onid, service_id, language_code, service_provider_name, service_name)" + "VALUES" + " (@tsid, @onid, @service_id, @language_code, @service_provider_name, @service_name)"; mySqlCommand.Parameters.Add("@tsid", MySqlDbType.Int32); mySqlCommand.Parameters.Add("@onid", MySqlDbType.Int32); mySqlCommand.Parameters.Add("@service_id", MySqlDbType.Int32); mySqlCommand.Parameters.Add("@language_code", MySqlDbType.VarChar); mySqlCommand.Parameters.Add("@service_provider_name", MySqlDbType.VarChar); mySqlCommand.Parameters.Add("@service_name", MySqlDbType.VarChar); mySqlCommand.Parameters["@tsid"].Value = transportStreamId; mySqlCommand.Parameters["@onid"].Value = originalNetworkId; mySqlCommand.Parameters["@service_id"].Value = sdtService.ServiceId; foreach (MultilingualServiceNameDescriptor.MultilingualServiceName multilingualServiceName in sdtService .MultilingualServiceName) { mySqlCommand.Parameters["@language_code"].Value = multilingualServiceName.Iso639LanguageCode; mySqlCommand.Parameters["@service_provider_name"].Value = multilingualServiceName.ServiceProviderName; mySqlCommand.Parameters["@service_name"].Value = multilingualServiceName.ServiceName; mySqlCommand.ExecuteNonQuery(); } } private void InsertSdtNvodReferences(MySqlTransaction transaction, ushort transportStreamId, ushort originalNetworkId, SdtService sdtService) { if (sdtService.NvodReferences == null) return; if (sdtService.NvodReferences.Length == 0) return; MySqlCommand mySqlCommand = transaction.Connection.CreateCommand(); mySqlCommand.Transaction = transaction; mySqlCommand.CommandText = "INSERT INTO dvb_sdt_nvod_references " + " (tsid, onid, service_id, other_tsid, other_onid, other_service_id) " + "VALUES " + " (@tsid, @onid, @service_id, @other_tsid, @other_onid, @other_service_id)"; mySqlCommand.Parameters.Add("@tsid", MySqlDbType.Int32); mySqlCommand.Parameters.Add("@onid", MySqlDbType.Int32); mySqlCommand.Parameters.Add("@service_id", MySqlDbType.Int32); mySqlCommand.Parameters.Add("@other_tsid", MySqlDbType.Int32); mySqlCommand.Parameters.Add("@other_onid", MySqlDbType.Int32); mySqlCommand.Parameters.Add("@other_service_id", MySqlDbType.Int32); mySqlCommand.Parameters["@tsid"].Value = transportStreamId; mySqlCommand.Parameters["@onid"].Value = originalNetworkId; mySqlCommand.Parameters["@service_id"].Value = sdtService.ServiceId; foreach (NvodReferenceDescriptor.NvodReference nvodReference in sdtService.NvodReferences) { mySqlCommand.Parameters["@other_tsid"].Value = nvodReference.TransportStreamId; mySqlCommand.Parameters["@other_onid"].Value = nvodReference.OriginalNetworkId; mySqlCommand.Parameters["@other_service_id"].Value = nvodReference.ServiceId; mySqlCommand.ExecuteNonQuery(); } } private static SdtService GetSdt(ushort transportStreamId, ushort originalNetworkId, ushort oldServiceId, MySqlConnection connection) { MySqlCommand mySqlCommand = connection.CreateCommand(); mySqlCommand.CommandText = "SELECT * FROM dvb_sdt WHERE tsid = @tsid AND onid = @onid AND service_id = @service_id"; mySqlCommand.Parameters.Add("@tsid", DbType.Int32); mySqlCommand.Parameters.Add("@onid", DbType.Int32); mySqlCommand.Parameters.Add("@service_id", DbType.Int32); mySqlCommand.Parameters["@tsid"].Value = transportStreamId; mySqlCommand.Parameters["@onid"].Value = originalNetworkId; mySqlCommand.Parameters["@service_id"].Value = oldServiceId; MySqlDataReader mySqlDataReader = mySqlCommand.ExecuteReader(); SdtService result = null; if (mySqlDataReader.Read()) { ushort tsid = mySqlDataReader.GetUInt16(0); ushort onid = mySqlDataReader.GetUInt16(1); ushort serviceId = mySqlDataReader.GetUInt16(2); bool eitSchedule = mySqlDataReader.GetBoolean(3); bool eitScheduleFollowing = mySqlDataReader.GetBoolean(4); RunningStatus runningStatus = (RunningStatus)mySqlDataReader.GetInt16(5); bool freeCaMode = mySqlDataReader.GetBoolean(6); result = new SdtService(serviceId, eitSchedule, eitScheduleFollowing, runningStatus, freeCaMode); if (!mySqlDataReader.IsDBNull(7)) result.ServiceName = mySqlDataReader.GetString(7); if (!mySqlDataReader.IsDBNull(8)) result.ServiceProviderName = mySqlDataReader.GetString(8); if (!mySqlDataReader.IsDBNull(9)) result.ServiceType = (ServiceDescriptor.ServiceTypeCoding)mySqlDataReader.GetInt32(9); if (!mySqlDataReader.IsDBNull(10)) result.PrivateDataSpecifier = mySqlDataReader.GetUInt32(10); if (!mySqlDataReader.IsDBNull(11)) result.DataBroadcastId = mySqlDataReader.GetUInt16(11); if (!mySqlDataReader.IsDBNull(12)) result.Selector = mySqlDataReader.GetByteArray(12); if (!mySqlDataReader.IsDBNull(13)) result.ReferenceServiceId = mySqlDataReader.GetUInt16(13); if (!mySqlDataReader.IsDBNull(14)) result.DefaultAuthority = mySqlDataReader.GetString(14); if (!mySqlDataReader.IsDBNull(15)) result.ControlRemoteAccessOverInternet = mySqlDataReader.GetInt32(15); if (!mySqlDataReader.IsDBNull(16)) result.DoNotApplyRevocation = mySqlDataReader.GetBoolean(16); if (!mySqlDataReader.IsDBNull(17)) result.DoNotScramble = mySqlDataReader.GetBoolean(17); if (!mySqlDataReader.IsDBNull(18)) result.OldOriginalNetworkId = mySqlDataReader.GetUInt16(18); if (!mySqlDataReader.IsDBNull(19)) result.OldServiceId = mySqlDataReader.GetUInt16(19); if (!mySqlDataReader.IsDBNull(20)) result.OldTransportStreamId = mySqlDataReader.GetUInt16(20); if (!mySqlDataReader.IsDBNull(21)) Guid.Parse(mySqlDataReader.GetString(21)); DateTime dateAdded = mySqlDataReader.GetDateTime(22); long numUpdates = mySqlDataReader.GetInt64(23); if (!mySqlDataReader.IsDBNull(24)) mySqlDataReader.GetDateTime(24); //DateUpdated if (!mySqlDataReader.IsDBNull(25)) result.ComponentTag = mySqlDataReader.GetByte(25); if (!mySqlDataReader.IsDBNull(26)) result.Iso639LanguageCode = mySqlDataReader.GetString(26); if (!mySqlDataReader.IsDBNull(27)) result.Text = mySqlDataReader.GetString(27); } mySqlDataReader.Close(); return result; } private struct SdtCoordinate { public ushort TransportStreamId { get; } public ushort OriginalNetworkId { get; } public ushort SdtServiceServiceId { get; } public SdtCoordinate(ushort transportStreamId, ushort originalNetworkId, ushort sdtServiceServiceId) { TransportStreamId = transportStreamId; OriginalNetworkId = originalNetworkId; SdtServiceServiceId = sdtServiceServiceId; } public bool Equals(SdtCoordinate other) { return TransportStreamId == other.TransportStreamId && OriginalNetworkId == other.OriginalNetworkId && SdtServiceServiceId == other.SdtServiceServiceId; } public override bool Equals(object obj) { return obj is SdtCoordinate other && Equals(other); } public override int GetHashCode() { return HashCode.Combine(TransportStreamId, OriginalNetworkId, SdtServiceServiceId); } } private HashSet _sdtCoordinates; private HashSet _sdtUpdateCoordinates; private void InsertSdtComponents(MySqlTransaction transaction, ushort transportStreamId, ushort originalNetworkId, SdtService sdtService) { if (sdtService.Components == null) return; if (sdtService.Components.Count == 0) return; MySqlCommand command = transaction.Connection.CreateCommand(); command.Transaction = transaction; command.CommandText = "INSERT INTO dvb_sdt_components (tsid, nid, service_id, component_tag, stream_content_ext, stream_content, component_type, iso_639_language_code, text) " + "VALUES (@tsid, @nid, @service_id, @component_tag, @stream_content_ext, @stream_content, @component_type, @iso_639_language_code, @text)"; command.Parameters.AddWithValue("@tsid", transportStreamId); command.Parameters.AddWithValue("@nid", originalNetworkId); command.Parameters.AddWithValue("@service_id", sdtService.ServiceId); command.Parameters.Add("@component_tag", MySqlDbType.Int16); command.Parameters.Add("@stream_content_ext", MySqlDbType.Int16); command.Parameters.Add("@stream_content", MySqlDbType.Int16); command.Parameters.Add("@component_type", MySqlDbType.Int16); command.Parameters.Add("@iso_639_language_code", MySqlDbType.VarChar); command.Parameters.Add("@text", MySqlDbType.Text); bool[] componentTags = new bool[256]; foreach (ComponentDescriptor component in sdtService.Components) { if (componentTags[component.ComponentTag]) continue; componentTags[component.ComponentTag] = true; command.Parameters["@component_tag"].Value = component.ComponentTag; command.Parameters["@stream_content_ext"].Value = component.StreamContentExt; command.Parameters["@stream_content"].Value = component.StreamContent; command.Parameters["@component_type"].Value = component.ComponentType; command.Parameters["@iso_639_language_code"].Value = component.Iso639LanguageCode; command.Parameters["@text"].Value = component.Text; command.ExecuteNonQuery(); } } public bool TestForSdtService(ushort transportStreamId, ushort originalNetworkId, SdtService sdtService) { if (_sdtCoordinates == null) _sdtCoordinates = new HashSet(); SdtCoordinate coordinate = new SdtCoordinate(transportStreamId, originalNetworkId, sdtService.ServiceId); if (_sdtCoordinates.Contains(coordinate)) return true; using (MySqlConnection connection = new MySqlConnection(_mcsb.ToString())) { bool read; connection.Open(); using (MySqlCommand mySqlCommand = connection.CreateCommand()) { mySqlCommand.CommandText = "SELECT dateadded FROM dvb_sdt WHERE tsid=@tsid AND onid=@onid AND service_id=@sid"; mySqlCommand.Parameters.Add("@tsid", DbType.Int32); mySqlCommand.Parameters.Add("@onid", DbType.Int32); mySqlCommand.Parameters.Add("@sid", DbType.Int32); mySqlCommand.Parameters["@tsid"].Value = transportStreamId; mySqlCommand.Parameters["@onid"].Value = originalNetworkId; mySqlCommand.Parameters["@sid"].Value = sdtService.ServiceId; MySqlDataReader mySqlDataReader = mySqlCommand.ExecuteReader(); read = mySqlDataReader.Read(); if (read) _sdtCoordinates.Add(coordinate); mySqlDataReader.Close(); } connection.Close(); return read; } } public bool UpdateSdtService(ushort transportStreamId, ushort originalNetworkId, SdtService newer) { if (_sdtUpdateCoordinates == null) _sdtUpdateCoordinates = new HashSet(); SdtCoordinate sdtCoordinate = new SdtCoordinate(transportStreamId, originalNetworkId, newer.ServiceId); if (_sdtUpdateCoordinates.Contains(sdtCoordinate)) return false; using (MySqlConnection connection = new MySqlConnection(_mcsb.ToString())) { connection.Open(); SdtService older = GetSdt(transportStreamId, originalNetworkId, newer.ServiceId, connection); if (older == null) { connection.Close(); return false; } if (!older.NeedsUpdate(newer)) { connection.Close(); return false; } EnqueueSpeedhack(SpeedhackType.UpdateSdt, transportStreamId, originalNetworkId, newer); _sdtUpdateCoordinates.Add(sdtCoordinate); connection.Close(); return true; } } public void StoreSdtService(ushort transportStreamId, ushort originalNetworkId, SdtService sdtService) { SdtCoordinate coordinate = new SdtCoordinate(transportStreamId, originalNetworkId, sdtService.ServiceId); _sdtCoordinates.Add(coordinate); EnqueueSpeedhack(SpeedhackType.InsertSdt, transportStreamId, originalNetworkId, sdtService); } } }