using System; using System.Collections.Generic; using System.Data; using System.Diagnostics.Metrics; using System.Linq; using System.Text; using System.Threading.Tasks; using MySqlConnector; using skyscraper5.Dvb.Descriptors; using skyscraper5.Dvb.Descriptors.Extension; using skyscraper5.Dvb.Psi.Model; using skyscraper5.Skyscraper.Scraper.Storage.Split; namespace skyscraper5.Data.MySql { public partial class MySqlDataStorage : DataStorage { private void InsertNitCells(MySqlConnection connection, NitNetwork nitNetwork) { if (nitNetwork.Cells == null) return; if (nitNetwork.Cells.Count == 0) return; MySqlCommand mySqlCommand = connection.CreateCommand(); mySqlCommand.CommandText = "INSERT INTO dvb_nit_cells" + " (nid_id, cell_id, cell_longitude, cell_latitude, extend_of_latitude, extend_of_longitude) " + "VALUES" + " (@nid_id,@cell_id,@cell_longitude,@cell_laitutde,@extend_of_latitude,@extend_of_longitude)"; mySqlCommand.Parameters.Add("@nid_id", MySqlDbType.Int32); mySqlCommand.Parameters.Add("@cell_id", MySqlDbType.Int32); mySqlCommand.Parameters.Add("@cell_longitude", MySqlDbType.Int32); mySqlCommand.Parameters.Add("@cell_laitutde", MySqlDbType.Int32); mySqlCommand.Parameters.Add("@extend_of_latitude", MySqlDbType.Int32); mySqlCommand.Parameters.Add("@extend_of_longitude", MySqlDbType.Int32); mySqlCommand.Parameters["@nid_id"].Value = nitNetwork.NetworkId; foreach (CellListDescriptor.Cell cell in nitNetwork.Cells) { mySqlCommand.Parameters["@cell_id"].Value = cell.CellId; mySqlCommand.Parameters["@cell_longitude"].Value = cell.CellLongitude; mySqlCommand.Parameters["@cell_laitutde"].Value = cell.CellLatitude; mySqlCommand.Parameters["@extend_of_latitude"].Value = cell.ExtentOfLatitude; mySqlCommand.Parameters["@extend_of_longitude"].Value = cell.ExtentOfLongitude; mySqlCommand.ExecuteNonQuery(); InsertNitCellSubcells(connection, nitNetwork.NetworkId, cell); } } private void InsertNitCellSubcells(MySqlConnection connection, ushort nitNetworkNetworkId, CellListDescriptor.Cell cell) { if (cell.Subcells == null) return; if (cell.Subcells.Length == 0) return; MySqlCommand mySqlCommand = connection.CreateCommand(); mySqlCommand.CommandText = "INSERT INTO dvb_nit_cells_subcells " + " (nid, cell_id, cell_id_extension, subcell_latitude, subcell_longitude, subcell_extent_of_latitude, subcell_extent_of_longitude) " + "VALUES " + " (@nid,@cell_id,@cell_id_extension,@subcell_latitude,@subcell_longitude,@subcell_extend_of_latitude,@subcell_extend_of_longitude"; mySqlCommand.Parameters.Add("@nid", MySqlDbType.Int32); mySqlCommand.Parameters.Add("@cell_id", MySqlDbType.Int32); mySqlCommand.Parameters.Add("@cell_id_extension", MySqlDbType.Int16); mySqlCommand.Parameters.Add("@subcell_latitude", MySqlDbType.Int32); mySqlCommand.Parameters.Add("@subcell_longitude", MySqlDbType.Int32); mySqlCommand.Parameters.Add("@subcell_extend_of_latitude", MySqlDbType.Int32); mySqlCommand.Parameters.Add("@subcell_extend_of_longitude", MySqlDbType.Int32); mySqlCommand.Parameters["@nid"].Value = nitNetworkNetworkId; mySqlCommand.Parameters["@cell_id"].Value = cell.CellId; foreach (CellListDescriptor.Subcell subcell in cell.Subcells) { mySqlCommand.Parameters["@cell_id_extension"].Value = subcell.CellIdExtension; mySqlCommand.Parameters["@subcell_latitude"].Value = subcell.SubcellLatitude; mySqlCommand.Parameters["@subcell_longitude"].Value = subcell.SubcellLongitude; mySqlCommand.Parameters["@subcell_extend_of_latitude"].Value = subcell.SubcellExtentOfLatitude; mySqlCommand.Parameters["@subcell_extend_of_longitude"].Value = subcell.SubcellExtentOfLongitude; mySqlCommand.ExecuteNonQuery(); } } private void InsertNitMessages(MySqlConnection connection, NitNetwork nitNetwork) { if (nitNetwork.Messages == null) return; if (nitNetwork.Messages.Count == 0) return; MySqlCommand mySqlCommand = connection.CreateCommand(); mySqlCommand.CommandText = "INSERT INTO dvb_nit_messages (network_id, message_id, language_code, message) VALUES (@network_id,@message_id,@language_code,@message)"; mySqlCommand.Parameters.Add("@network_id", MySqlDbType.Int32); mySqlCommand.Parameters.Add("@message_id", MySqlDbType.Int32); mySqlCommand.Parameters.Add("@language_code", MySqlDbType.VarChar); mySqlCommand.Parameters.Add("@message", MySqlDbType.VarChar); mySqlCommand.Parameters["@network_id"].Value = nitNetwork.NetworkId; foreach (MessageDescriptor message in nitNetwork.Messages) { mySqlCommand.Parameters["@message_id"].Value = message.MessageId; mySqlCommand.Parameters["@language_code"].Value = message.Iso639LanguageCode; mySqlCommand.Parameters["@message"].Value = message.Message; mySqlCommand.ExecuteNonQuery(); } } private void InsertNitMultilingualName(MySqlConnection connection, NitNetwork nitNetwork) { if (nitNetwork.MultilingualNetworkName == null) return; if (nitNetwork.MultilingualNetworkName.Count == 0) return; MySqlCommand mySqlCommand = connection.CreateCommand(); mySqlCommand.CommandText = "INSERT INTO dvb_nit_multilingual_name (id, language, name) VALUES (@id,@language,@name)"; mySqlCommand.Parameters.Add("@id", MySqlDbType.Int32); mySqlCommand.Parameters.Add("@language", MySqlDbType.VarChar); mySqlCommand.Parameters.Add("@name", MySqlDbType.VarChar); mySqlCommand.Parameters["@id"].Value = nitNetwork.NetworkId; foreach (KeyValuePair pair in nitNetwork.MultilingualNetworkName) { mySqlCommand.Parameters["@language"].Value = pair.Key; mySqlCommand.Parameters["@name"].Value = pair.Value; mySqlCommand.ExecuteNonQuery(); } } private void InsertNitRegionNames(MySqlConnection connection, NitNetwork nitNetwork) { if (nitNetwork.RegionNames == null) return; if (nitNetwork.RegionNames.Count == 0) return; MySqlCommand mySqlCommand = connection.CreateCommand(); mySqlCommand.CommandText = "INSERT INTO dvb_nit_region_names (id, name, primary_code, secondary_code, teritary_code) VALUES (@id,@name,@primary,@secondary,@teritary)"; mySqlCommand.Parameters.Add("@id", MySqlDbType.Int32); mySqlCommand.Parameters.Add("@name", MySqlDbType.VarChar); mySqlCommand.Parameters.Add("@primary", MySqlDbType.Int16); mySqlCommand.Parameters.Add("@secondary", MySqlDbType.Int16); mySqlCommand.Parameters.Add("@teritary", MySqlDbType.Int32); mySqlCommand.Parameters["@id"].Value = nitNetwork.NetworkId; foreach (TargetRegionNameDescriptor.TargetRegionName regionName in nitNetwork.RegionNames) { mySqlCommand.Parameters["@name"].Value = regionName.RegionName; mySqlCommand.Parameters["@primary"].Value = regionName.PrimaryRegionCode; mySqlCommand.Parameters["@secondary"].Value = regionName.SecondaryRegionCode; mySqlCommand.Parameters["@teritary"].Value = regionName.TertiaryRegionCode; SetNulls(mySqlCommand); mySqlCommand.ExecuteNonQuery(); } } private void InsertNitRegions(MySqlConnection connection, NitNetwork nitNetwork) { if (nitNetwork.Regions == null) return; if (nitNetwork.RegionNames.Count == 0) return; MySqlCommand mySqlCommand = connection.CreateCommand(); mySqlCommand.CommandText = "INSERT INTO dvb_nit_regions " + "(id, country_code, primary_region_code, secondary_region_code, teritary_region_code) " + "VALUES " + "(@id,@country,@primary,@secondary,@teritary)"; mySqlCommand.Parameters.Add("@id", MySqlDbType.Int32); mySqlCommand.Parameters.Add("@country", MySqlDbType.VarChar); mySqlCommand.Parameters.Add("@primary", MySqlDbType.Int16); mySqlCommand.Parameters.Add("@secondary", MySqlDbType.Int16); mySqlCommand.Parameters.Add("@teritary", MySqlDbType.Int32); mySqlCommand.Parameters["@id"].Value = nitNetwork.NetworkId; foreach (TargetRegionDescriptor.TargetRegion region in nitNetwork.Regions) { mySqlCommand.Parameters["@country"].Value = region.CountryCode; mySqlCommand.Parameters["@primary"].Value = region.PrimaryRegionCode; mySqlCommand.Parameters["@secondary"].Value = region.SecondaryRegionCode; mySqlCommand.Parameters["@teritary"].Value = region.TertiaryRegionCode; SetNulls(mySqlCommand); mySqlCommand.ExecuteNonQuery(); } } private void InsertNitServices(MySqlConnection connection, NitNetwork nitNetwork) { if (nitNetwork.ServiceList == null) return; if (nitNetwork.ServiceList.Length == 0) return; MySqlCommand mySqlCommand = connection.CreateCommand(); mySqlCommand.CommandText = "INSERT INTO dvb_nit_services (network_id, service_id, service_type) VALUES (@network_id,@service_id,@service_type)"; mySqlCommand.Parameters.Add("@network_id", MySqlDbType.Int32); mySqlCommand.Parameters.Add("@service_id", MySqlDbType.Int32); mySqlCommand.Parameters.Add("@service_type", MySqlDbType.Int32); mySqlCommand.Parameters["@network_id"].Value = nitNetwork.NetworkId; foreach (ServiceListDescriptor.Service service in nitNetwork.ServiceList) { mySqlCommand.Parameters["@service_id"].Value = service.ServiceId; mySqlCommand.Parameters["@service_type"].Value = (int)service.ServiceType; mySqlCommand.ExecuteNonQuery(); } } private NitNetwork GetNitNetwork(ushort newerNetworkId) { using (MySqlConnection connection = new MySqlConnection(_mcsb.ToString())) { connection.Open(); MySqlCommand mySqlCommand = connection.CreateCommand(); mySqlCommand.CommandText = "SELECT * FROM dvb_nit WHERE id = @id"; mySqlCommand.Parameters.Add("@id", MySqlDbType.Int32); mySqlCommand.Parameters["@id"].Value = newerNetworkId; MySqlDataReader dataReader = mySqlCommand.ExecuteReader(); NitNetwork result = null; if (dataReader.Read()) { ushort id = dataReader.GetUInt16(0); result = new NitNetwork(id); if (!dataReader.IsDBNull(1)) result.Name = dataReader.GetString(1); if (!dataReader.IsDBNull(2)) ; if (!dataReader.IsDBNull(3)) result.PrivateDataSpecifierId = dataReader.GetUInt32(3); if (!dataReader.IsDBNull(4)) result.XaitPid = dataReader.GetUInt16(4); if (!dataReader.IsDBNull(5)) result.RegionNameCountryCode = dataReader.GetString(5); if (!dataReader.IsDBNull(6)) result.RegionNameLanguageCode = dataReader.GetString(6); if (!dataReader.IsDBNull(7)) result.RegionCountryCode = dataReader.GetString(7); if (!dataReader.IsDBNull(8)) result.MinPollingInterval = dataReader.GetUInt16(8); if (!dataReader.IsDBNull(9)) result.Uri = dataReader.GetString(9); if (!dataReader.IsDBNull(10)) result.UriLinkageType = dataReader.GetByte(10); dataReader.Close(); } connection.Close(); return result; } } private void InsertNitTransportStreamCellFrequencies(MySqlConnection connection, ushort networkId, NitTransportStream transportStream) { if (transportStream.CellFrequencies == null) return; if (transportStream.CellFrequencies.Count == 0) return; MySqlCommand mySqlCommand = connection.CreateCommand(); mySqlCommand.CommandText = "INSERT INTO dvb_nit_transport_stream_cell_frequencies (nid, tsid, cell_id, frequency) VALUES (@nid,@tsid,@cell_id, @frequency)"; mySqlCommand.Parameters.Add("@nid", MySqlDbType.Int32); mySqlCommand.Parameters.Add("@tsid", MySqlDbType.Int32); mySqlCommand.Parameters.Add("@cell_id", MySqlDbType.Int32); mySqlCommand.Parameters.Add("@frequency", MySqlDbType.Int64); mySqlCommand.Parameters["@nid"].Value = networkId; mySqlCommand.Parameters["@tsid"].Value = transportStream.TransportStreamId; foreach (CellFrequencyLinkDescriptor.Cell cell in transportStream.CellFrequencies) { mySqlCommand.Parameters["@cell_id"].Value = cell.CellId; mySqlCommand.Parameters["@frequency"].Value = cell.Frequency; mySqlCommand.ExecuteNonQuery(); } } private void InsertNitTransportStreamCellInfos(MySqlConnection connection, ushort networkId, NitTransportStream transportStream) { if (transportStream.CellInfos == null) return; if (transportStream.CellInfos.Count == 0) return; MySqlCommand mySqlCommand = connection.CreateCommand(); mySqlCommand.CommandText = "INSERT INTO dvb_nit_transport_stream_cell_infos (nid, tsid, cell_id) VALUES (@nid,@tsid,@cell_id)"; mySqlCommand.Parameters.Add("@nid", DbType.Int32); mySqlCommand.Parameters.Add("@tsid", DbType.Int32); mySqlCommand.Parameters.Add("@cell_id", DbType.Int32); mySqlCommand.Parameters["@nid"].Value = networkId; mySqlCommand.Parameters["@tsid"].Value = transportStream.TransportStreamId; foreach (T2DeliverySystemDescriptor.CellInfo cellInfo in transportStream.CellInfos) { mySqlCommand.Parameters["@cell_id"].Value = cellInfo.CellId; mySqlCommand.ExecuteNonQuery(); InsertNitTransportStreamCellInfosCenterFrequencies(connection, networkId, transportStream.TransportStreamId, cellInfo); InsertNitTransportStreamCellInfosSubcellInfos(connection, networkId, transportStream.TransportStreamId, cellInfo); } } private void InsertNitTransportStreamCellInfosSubcellInfos(MySqlConnection connection, ushort networkId, ushort transportStreamTransportStreamId, T2DeliverySystemDescriptor.CellInfo cellInfo) { if (cellInfo.CentreFrequencies == null) return; if (cellInfo.CentreFrequencies.Length == 0) return; MySqlCommand mySqlCommand = connection.CreateCommand(); mySqlCommand.CommandText = "INSERT INTO dvb_nit_transport_stream_cell_infos_subcell_infos (nid, tsid, cell_id, ordinal, cell_id_extension, transposer_frequency) " + "VALUES (@nid,@tsid,@cell_id,@ordinal,@cell_id_extension,@transposeer_frequency)"; mySqlCommand.Parameters.Add("@nid", MySqlDbType.Int32); mySqlCommand.Parameters.Add("@tsid", MySqlDbType.Int32); mySqlCommand.Parameters.Add("@cell_id", MySqlDbType.Int32); mySqlCommand.Parameters.Add("@ordinal", MySqlDbType.Int32); mySqlCommand.Parameters.Add("@cell_id_extension", MySqlDbType.Int32); mySqlCommand.Parameters.Add("@transposer_frequency", MySqlDbType.Int32); mySqlCommand.Parameters["@nid"].Value = networkId; mySqlCommand.Parameters["@tsid"].Value = transportStreamTransportStreamId; mySqlCommand.Parameters["@cell_id"].Value = cellInfo.CellId; for (int i = 0; i < cellInfo.SubcellInfos.Length; i++) { mySqlCommand.Parameters["@ordinal"].Value = i; mySqlCommand.Parameters["@cell_id_extension"].Value = cellInfo.SubcellInfos[i].CellIdExtension; mySqlCommand.Parameters["@transposer_frequency"].Value = cellInfo.SubcellInfos[i].TransposerFrequency; mySqlCommand.ExecuteNonQuery(); } } private void InsertNitTransportStreamCellInfosCenterFrequencies(MySqlConnection connection, ushort networkId, ushort transportStreamTransportStreamId, T2DeliverySystemDescriptor.CellInfo cellInfo) { if (cellInfo.CentreFrequencies == null) return; if (cellInfo.CentreFrequencies.Length == 0) return; MySqlCommand mySqlCommand = connection.CreateCommand(); mySqlCommand.CommandText = "INSERT INTO dvb_nit_transport_stream_cell_infos_center_frequencies (nid, tsid, cell_id, ordinal, frequency) " + "VALUES (@nid, @tsid, @cell_id, @ordinal, @frequency)"; mySqlCommand.Parameters.Add("@nid", MySqlDbType.Int32); mySqlCommand.Parameters.Add("@tsid", MySqlDbType.Int32); mySqlCommand.Parameters.Add("@cell_id", MySqlDbType.Int32); mySqlCommand.Parameters.Add("@ordinal", MySqlDbType.Int32); mySqlCommand.Parameters.Add("@frequency", MySqlDbType.Int64); mySqlCommand.Parameters["@nid"].Value = networkId; mySqlCommand.Parameters["@tsid"].Value = transportStreamTransportStreamId; mySqlCommand.Parameters["@cell_id"].Value = cellInfo.CellId; for (int i = 0; i < cellInfo.CentreFrequencies.Length; i++) { mySqlCommand.Parameters["@ordinal"].Value = i; mySqlCommand.Parameters["@frequency"].Value = cellInfo.CentreFrequencies[i]; mySqlCommand.ExecuteNonQuery(); } } private void InsertNitTransportStreamCells(MySqlConnection connection, ushort networkId, NitTransportStream transportStream) { if (transportStream.Cells == null) return; if (transportStream.Cells.Count == 0) return; MySqlCommand mySqlCommand = connection.CreateCommand(); mySqlCommand.CommandText = "INSERT INTO dvb_nit_transport_stream_cells (nid, tsid, cell_id, cell_lat, cell_lon, extent_lat, extent_lon) " + "VALUES (@nid, @tsid, @cell_id, @cell_lat, @cell_lon, @extent_lat, @extent_lon)"; mySqlCommand.Parameters.Add("@nid", MySqlDbType.Int32); mySqlCommand.Parameters.Add("@tsid", MySqlDbType.Int32); mySqlCommand.Parameters.Add("@cell_id", MySqlDbType.Int32); mySqlCommand.Parameters.Add("@cell_lat", MySqlDbType.Int32); mySqlCommand.Parameters.Add("@cell_lon", MySqlDbType.Int32); mySqlCommand.Parameters.Add("@extent_lat", MySqlDbType.Int64); mySqlCommand.Parameters.Add("@extent_lon", MySqlDbType.Int64); mySqlCommand.Parameters["@nid"].Value = networkId; mySqlCommand.Parameters["@tsid"].Value = transportStream.TransportStreamId; foreach (CellListDescriptor.Cell cell in transportStream.Cells) { mySqlCommand.Parameters["@cell_id"].Value = cell.CellId; mySqlCommand.Parameters["@cell_lat"].Value = cell.CellLatitude; mySqlCommand.Parameters["@cell_lon"].Value = cell.CellLongitude; mySqlCommand.Parameters["@extent_lat"].Value = cell.ExtentOfLatitude; mySqlCommand.Parameters["@extent_lon"].Value = cell.ExtentOfLongitude; mySqlCommand.ExecuteNonQuery(); InsertDvbNitTransportStreamCellSubcells(connection, networkId, transportStream.TransportStreamId, cell); } } private void InsertDvbNitTransportStreamCellSubcells(MySqlConnection connection, ushort networkId, ushort transportStreamTransportStreamId, CellListDescriptor.Cell cell) { if (cell.Subcells == null) return; if (cell.Subcells.Length == 0) return; MySqlCommand mySqlCommand = connection.CreateCommand(); mySqlCommand.CommandText = "INSERT INTO dvb_nit_transport_stream_cells_subcells (nid, tsid, cell_id, cell_id_extension, subcell_lat, subcell_lon, subcell_extent_lat, subcell_extent_lon) " + "VALUES (@nid, @tsid, @cell_id, @cell_id_extension, @subcell_lat, @subcell_lon, @subcell_extent_lat, @subcell_extent_lon)"; mySqlCommand.Parameters.Add("@nid", MySqlDbType.Int32); mySqlCommand.Parameters.Add("@tsid", MySqlDbType.Int32); mySqlCommand.Parameters.Add("@cell_id", MySqlDbType.Int32); mySqlCommand.Parameters.Add("@cell_id_extension", MySqlDbType.Int32); mySqlCommand.Parameters.Add("@subcell_lat", MySqlDbType.Int32); mySqlCommand.Parameters.Add("@subcell_lon", MySqlDbType.Int32); mySqlCommand.Parameters.Add("@subcell_extent_lat", MySqlDbType.Int32); mySqlCommand.Parameters.Add("@subcell_extent_lon", MySqlDbType.Int32); mySqlCommand.Parameters["@nid"].Value = networkId; mySqlCommand.Parameters["@tsid"].Value = transportStreamTransportStreamId; mySqlCommand.Parameters["@cell_id"].Value = cell.CellId; foreach (CellListDescriptor.Subcell subcell in cell.Subcells) { mySqlCommand.Parameters["@cell_id_extension"].Value = subcell.CellIdExtension; mySqlCommand.Parameters["@subcell_lat"].Value = subcell.SubcellLatitude; mySqlCommand.Parameters["@subcell_lon"].Value = subcell.SubcellLongitude; mySqlCommand.Parameters["@subcell_extent_lat"].Value = subcell.SubcellExtentOfLatitude; mySqlCommand.Parameters["@subcell_extent_lon"].Value = subcell.SubcellExtentOfLongitude; mySqlCommand.ExecuteNonQuery(); } } private void InsertNitTransportStreamCentreFrequencies(MySqlConnection connection, ushort networkId, NitTransportStream transportStream) { if (transportStream.CentreFrequencies == null) return; if (transportStream.CentreFrequencies.Length == 0) return; MySqlCommand mySqlCommand = connection.CreateCommand(); mySqlCommand.CommandText = "INSERT INTO dvb_nit_transport_stream_centre_frequencies (nid, tsid, ordinal, frequency) " + "VALUES (@nid,@tsid,@ordinal,@frequency)"; mySqlCommand.Parameters.Add("@nid", MySqlDbType.Int32); mySqlCommand.Parameters.Add("@tsid", MySqlDbType.Int32); mySqlCommand.Parameters.Add("@ordinal", MySqlDbType.Int32); mySqlCommand.Parameters.Add("@frequency", MySqlDbType.Int64); mySqlCommand.Parameters["@nid"].Value = networkId; mySqlCommand.Parameters["@tsid"].Value = transportStream.TransportStreamId; for (int i = 0; i < transportStream.CentreFrequencies.Length; i++) { mySqlCommand.Parameters["@ordinal"].Value = i; mySqlCommand.Parameters["@frequency"].Value = transportStream.CentreFrequencies[i]; mySqlCommand.ExecuteNonQuery(); } } private void InsertNitTransportStreamServices(MySqlConnection connection, ushort networkId, NitTransportStream transportStream, MySqlTransaction transaction) { if (transportStream.Services == null) return; if (transportStream.Services.Services == null) return; if (transportStream.Services.Services.Length == 0) return; MySqlCommand command = connection.CreateCommand(); command.Transaction = transaction; command.CommandText = "INSERT INTO dvb_nit_transport_stream_services (nid, tsid, service_id, service_type) " + "VALUES (@nid, @tsid, @service_id, @service_type)"; command.Parameters.Add("@nid", MySqlDbType.Int32); command.Parameters.Add("@tsid", MySqlDbType.Int32); command.Parameters.Add("@service_id", MySqlDbType.Int32); command.Parameters.Add("@service_type", MySqlDbType.Int32); command.Parameters["@nid"].Value = networkId; command.Parameters["@tsid"].Value = transportStream.TransportStreamId; foreach (ServiceListDescriptor.Service service in transportStream.Services.Services) { command.Parameters["@service_id"].Value = service.ServiceId; command.Parameters["@service_type"].Value = (int)service.ServiceType; command.ExecuteNonQuery(); } } private void InsertNitTransportStreamTargetRegions(MySqlConnection connection, ushort networkId, NitTransportStream transportStream) { if (transportStream.TargetRegions == null) return; if (transportStream.TargetRegions.Count == 0) return; MySqlCommand command = connection.CreateCommand(); command.CommandText = "INSERT INTO dvb_nit_transport_stream_target_regions (nid, tsid, country_code, primary_rc, secondary_rc, teritary_rc) " + "VALUES (@nid,@tsid,@country_code,@primary_rc,@secondary_rc,@teritary_rc)"; command.Parameters.Add("@nid", MySqlDbType.Int32); command.Parameters.Add("@tsid", MySqlDbType.Int32); command.Parameters.Add("@country_code", MySqlDbType.VarChar); command.Parameters.Add("@primary_rc", MySqlDbType.Int16); command.Parameters.Add("@secondary_rc", MySqlDbType.Int16); command.Parameters.Add("@teritary_rc", MySqlDbType.Int32); command.Parameters["@nid"].Value = networkId; command.Parameters["@tsid"].Value = transportStream.TransportStreamId; foreach (TargetRegionDescriptor.TargetRegion targetRegion in transportStream.TargetRegions) { command.Parameters["@country_code"].Value = targetRegion.CountryCode; command.Parameters["@primary_rc"].Value = targetRegion.PrimaryRegionCode; command.Parameters["@secondary_rc"].Value = targetRegion.SecondaryRegionCode; command.Parameters["@teritary_rc"].Value = targetRegion.TertiaryRegionCode; SetNulls(command); command.ExecuteNonQuery(); } } private NitTransportStream GetNitTransportStream(MySqlConnection connection, ushort networkId, ushort olderTransportStreamId) { MySqlCommand mySqlCommand = connection.CreateCommand(); mySqlCommand.CommandText = "SELECT * FROM dvb_nit_transport_stream WHERE nid = @nid AND tsid = @tsid"; mySqlCommand.Parameters.Add("@nid", MySqlDbType.Int32); mySqlCommand.Parameters.Add("@tsid", MySqlDbType.Int32); mySqlCommand.Parameters["@nid"].Value = networkId; mySqlCommand.Parameters["@tsid"].Value = olderTransportStreamId; MySqlDataReader dataReader = mySqlCommand.ExecuteReader(); if (!dataReader.Read()) { dataReader.Close(); return null; } ushort transportStreamId = dataReader.GetUInt16(1); ushort originalNetworkId = dataReader.GetUInt16(3); NitTransportStream.TransportMedium deliveryMethod = (NitTransportStream.TransportMedium)dataReader.GetInt32(4); NitTransportStream result = new NitTransportStream(originalNetworkId, transportStreamId); result.DeliveryMethod = deliveryMethod; if (!dataReader.IsDBNull(5)) result.East = dataReader.GetBoolean(5); if (!dataReader.IsDBNull(6)) result.FecInner = (SatelliteDeliverySystemDescriptor.InnerFecScheme)dataReader.GetInt32(6); if (!dataReader.IsDBNull(7)) result.Frequency = dataReader.GetInt64(7); if (!dataReader.IsDBNull(8)) result.OrbitalPosition = dataReader.GetFloat(8); if (!dataReader.IsDBNull(9)) result.Polarization = (SatelliteDeliverySystemDescriptor.PolarizationEnum)dataReader.GetInt32(9); if (!dataReader.IsDBNull(10)) result.RollOff = dataReader.GetFloat(10); if (!dataReader.IsDBNull(11)) result.S2 = dataReader.GetBoolean(11); if (!dataReader.IsDBNull(12)) result.SymbolRate = dataReader.GetInt64(12); if (!dataReader.IsDBNull(13)) result.ScramblingSequenceIndex = dataReader.GetInt32(13); if (!dataReader.IsDBNull(14)) result.InputStreamIdentifier = dataReader.GetByte(14); if (!dataReader.IsDBNull(15)) result.TimesliceNumber = dataReader.GetByte(15); if (!dataReader.IsDBNull(16)) result.TsGsMode = (S2SatelliteDeliverySystemDescriptor.TsGsModeCoding)dataReader.GetInt32(16); if (!dataReader.IsDBNull(17)) result.PrivateDataSpecifierId = dataReader.GetUInt32(17); if (!dataReader.IsDBNull(18)) result.TfsFlag = dataReader.GetBoolean(18); if (!dataReader.IsDBNull(19)) result.Bandwidth = dataReader.GetInt32(19); if (!dataReader.IsDBNull(20)) result.GuardInterval = dataReader.GetInt32(20); if (!dataReader.IsDBNull(21)) result.OtherFrequencyFlag = dataReader.GetBoolean(21); if (!dataReader.IsDBNull(22)) result.PlpId = dataReader.GetByte(22); if (!dataReader.IsDBNull(23)) result.SisoMiso = dataReader.GetInt32(23); if (!dataReader.IsDBNull(24)) result.T2SystemId = dataReader.GetUInt16(24); if (!dataReader.IsDBNull(25)) result.TransmissionMode = dataReader.GetInt32(25); if (!dataReader.IsDBNull(26)) result.CodingType = (FrequencyListDescriptor.CodingTypeValue)dataReader.GetInt32(26); if (!dataReader.IsDBNull(27)) result.ModulationType = dataReader.GetInt32(27); if (!dataReader.IsDBNull(28)) result.FecOuter = (CableDeliverySystemDescriptor.OuterFecScheme)dataReader.GetInt32(28); if (!dataReader.IsDBNull(29)) result.CodeRateHpStream = (TerristialDeliverySystemDescriptor.CodeRate)dataReader.GetInt32(29); if (!dataReader.IsDBNull(30)) result.CodeRateLpStream = (TerristialDeliverySystemDescriptor.CodeRate)dataReader.GetInt32(30); if (!dataReader.IsDBNull(31)) result.HierarchyInformation = (TerristialDeliverySystemDescriptor.HierarchySignallingFormat)dataReader.GetInt32(31); if (!dataReader.IsDBNull(32)) result.MpeFecIndicator = dataReader.GetBoolean(32); if (!dataReader.IsDBNull(33)) result.Priority = dataReader.GetBoolean(33); if (!dataReader.IsDBNull(34)) result.TimeSlicingIndicator = dataReader.GetInt32(34); if (!dataReader.IsDBNull(35)) result.NetworkName = dataReader.GetString(35); if (!dataReader.IsDBNull(36)) result.TargetRegionCountryCode = dataReader.GetString(36); dataReader.Close(); return result; } struct NitTransportStreamCoordinate { private readonly ushort _networkId; private readonly ushort _transportStreamTransportStreamId; public NitTransportStreamCoordinate(ushort networkId, ushort transportStreamTransportStreamId) { _networkId = networkId; _transportStreamTransportStreamId = transportStreamTransportStreamId; } public bool Equals(NitTransportStreamCoordinate other) { return _networkId == other._networkId && _transportStreamTransportStreamId == other._transportStreamTransportStreamId; } public override bool Equals(object obj) { return obj is NitTransportStreamCoordinate other && Equals(other); } public override int GetHashCode() { return HashCode.Combine(_networkId, _transportStreamTransportStreamId); } } private HashSet _nitTransportStreamCoordinates; private HashSet _nitTransportStreamUpdateCoordinates; public bool TestForNitNetwork(NitNetwork nitNetwork) { using (MySqlConnection connection = new MySqlConnection(_mcsb.ToString())) { connection.Open(); MySqlCommand mySqlCommand = connection.CreateCommand(); mySqlCommand.CommandText = "SELECT dateadded FROM dvb_nit WHERE id = @id"; mySqlCommand.Parameters.Add("@id", MySqlDbType.Int32); mySqlCommand.Parameters["@id"].Value = nitNetwork.NetworkId; MySqlDataReader mySqlDataReader = mySqlCommand.ExecuteReader(); bool result = mySqlDataReader.Read(); mySqlDataReader.Close(); connection.Close(); return result; } } public void StoreNitNetwork(NitNetwork nitNetwork) { bool hasLinkages = HasLinkages(nitNetwork.Linkages); Guid linkageGuid = default(Guid); if (hasLinkages) linkageGuid = Guid.NewGuid(); using (MySqlConnection connection = new MySqlConnection(_mcsb.ToString())) { connection.Open(); MySqlTransaction transaction = connection.BeginTransaction(); MySqlCommand mySqlCommand = connection.CreateCommand(); mySqlCommand.Transaction = transaction; mySqlCommand.CommandText = "INSERT INTO dvb_nit" + " (id, name, uuid, private_data_specifier_id, xait_pid, region_name_country_code, region_name_language_code, region_country_code, min_polling_interval, uri, uri_linkage_type) " + "VALUES" + " (@id,@name,@uuid,@private_data_specifier,@xait_pid,@region_name_country_code,@region_name_language_code,@region_country_code,@min_polling_interval,@uri,@uri_linkage_type)"; mySqlCommand.Parameters.Add("@id", MySqlDbType.Int32); mySqlCommand.Parameters.Add("@name", MySqlDbType.VarChar); mySqlCommand.Parameters.Add("@uuid", MySqlDbType.VarChar); mySqlCommand.Parameters.Add("@private_data_specifier", MySqlDbType.Int64); mySqlCommand.Parameters.Add("@xait_pid", MySqlDbType.Int32); mySqlCommand.Parameters.Add("@region_name_country_code", MySqlDbType.VarChar); mySqlCommand.Parameters.Add("@region_name_language_code", MySqlDbType.VarChar); mySqlCommand.Parameters.Add("@region_country_code", MySqlDbType.VarChar); mySqlCommand.Parameters.Add("@min_polling_interval", MySqlDbType.Int32); mySqlCommand.Parameters.Add("@uri", MySqlDbType.VarChar); mySqlCommand.Parameters.Add("@uri_linkage_type", MySqlDbType.Int32); mySqlCommand.Parameters["@id"].Value = nitNetwork.NetworkId; mySqlCommand.Parameters["@name"].Value = nitNetwork.Name; if (hasLinkages) mySqlCommand.Parameters["@uuid"].Value = linkageGuid.ToString(); mySqlCommand.Parameters["@private_data_specifier"].Value = nitNetwork.PrivateDataSpecifierId; mySqlCommand.Parameters["@xait_pid"].Value = nitNetwork.XaitPid; mySqlCommand.Parameters["@region_name_country_code"].Value = nitNetwork.RegionNameCountryCode; mySqlCommand.Parameters["@region_name_language_code"].Value = nitNetwork.RegionNameLanguageCode; mySqlCommand.Parameters["@region_country_code"].Value = nitNetwork.RegionCountryCode; mySqlCommand.Parameters["@min_polling_interval"].Value = nitNetwork.MinPollingInterval; mySqlCommand.Parameters["@uri"].Value = nitNetwork.Uri; mySqlCommand.Parameters["@uri_linkage_type"].Value = nitNetwork.UriLinkageType; SetNulls(mySqlCommand); mySqlCommand.ExecuteNonQuery(); if (hasLinkages) InsertSdtLinkages(connection, linkageGuid, nitNetwork.Linkages, transaction); InsertNitCells(connection, nitNetwork); InsertNitMessages(connection, nitNetwork); InsertNitMultilingualName(connection, nitNetwork); InsertNitRegionNames(connection, nitNetwork); InsertNitRegions(connection, nitNetwork); InsertNitServices(connection, nitNetwork); transaction.Commit(); connection.Close(); } } public bool UpdateNitNetwork(NitNetwork newer) { NitNetwork older = GetNitNetwork(newer.NetworkId); if (older.NeedsUpdate(newer)) { using (MySqlConnection connection = new MySqlConnection(_mcsb.ToString())) { connection.Open(); MySqlCommand mySqlCommand = connection.CreateCommand(); mySqlCommand.CommandText = "UPDATE dvb_nit " + "SET name = @name, private_data_specifier_id = @private_data_specifier, xait_pid = @xait_pid, region_name_country_code = @region_name_country_code, region_name_language_code = @region_name_language_code, region_country_code = @region_country_code, min_polling_interval = @min_polling_interval, uri = @uri, uri_linkage_type = @uri_linkage_type, numupdates = numupdates + 1, dateupdated = CURRENT_TIMESTAMP " + "WHERE id = @id"; mySqlCommand.Parameters.Add("@id", MySqlDbType.Int32); mySqlCommand.Parameters.Add("@name", MySqlDbType.VarChar); mySqlCommand.Parameters.Add("@private_data_specifier", MySqlDbType.Int64); mySqlCommand.Parameters.Add("@xait_pid", MySqlDbType.Int32); mySqlCommand.Parameters.Add("@region_name_country_code", MySqlDbType.VarChar); mySqlCommand.Parameters.Add("@region_name_language_code", MySqlDbType.VarChar); mySqlCommand.Parameters.Add("@region_country_code", MySqlDbType.VarChar); mySqlCommand.Parameters.Add("@min_polling_interval", MySqlDbType.Int32); mySqlCommand.Parameters.Add("@uri", MySqlDbType.VarChar); mySqlCommand.Parameters.Add("@uri_linkage_type", MySqlDbType.Int32); mySqlCommand.Parameters["@id"].Value = newer.NetworkId; mySqlCommand.Parameters["@name"].Value = newer.Name; mySqlCommand.Parameters["@private_data_specifier"].Value = newer.PrivateDataSpecifierId; mySqlCommand.Parameters["@xait_pid"].Value = newer.XaitPid; mySqlCommand.Parameters["@region_name_country_code"].Value = newer.RegionNameCountryCode; mySqlCommand.Parameters["@region_name_language_code"].Value = newer.RegionNameLanguageCode; mySqlCommand.Parameters["@region_country_code"].Value = newer.RegionCountryCode; mySqlCommand.Parameters["@min_polling_interval"].Value = newer.MinPollingInterval; mySqlCommand.Parameters["@uri"].Value = newer.Uri; mySqlCommand.Parameters["@uri_linkage_type"].Value = newer.UriLinkageType; mySqlCommand.ExecuteNonQuery(); connection.Close(); return true; } } return false; } public bool TestForNitTransportStream(ushort networkId, NitTransportStream transportStream) { if (_nitTransportStreamCoordinates == null) _nitTransportStreamCoordinates = new HashSet(); NitTransportStreamCoordinate coordinate = new NitTransportStreamCoordinate(networkId, transportStream.TransportStreamId); if (_nitTransportStreamCoordinates.Contains(coordinate)) return true; using (MySqlConnection connection = new MySqlConnection(_mcsb.ToString())) { connection.Open(); MySqlCommand mySqlCommand = connection.CreateCommand(); mySqlCommand.CommandText = "SELECT dateadded FROM dvb_nit_transport_stream WHERE nid=@nid AND tsid=@tsid"; mySqlCommand.Parameters.Add("@nid", MySqlDbType.Int32); mySqlCommand.Parameters.Add("@tsid", MySqlDbType.Int32); mySqlCommand.Parameters["@nid"].Value = networkId; mySqlCommand.Parameters["@tsid"].Value = transportStream.TransportStreamId; MySqlDataReader mySqlDataReader = mySqlCommand.ExecuteReader(); bool result = mySqlDataReader.Read(); if (result) _nitTransportStreamCoordinates.Add(coordinate); mySqlDataReader.Close(); connection.Close(); return result; } } public void StoreNitTransportStream(ushort networkId, NitTransportStream transportStream) { EnqueueSpeedhack(SpeedhackType.InsertNitTransportStream, networkId, transportStream); NitTransportStreamCoordinate coordinate = new NitTransportStreamCoordinate(networkId, transportStream.TransportStreamId); _nitTransportStreamCoordinates.Add(coordinate); } public bool UpdateNitTransportStream(ushort networkId, NitTransportStream newer) { if (_nitTransportStreamUpdateCoordinates == null) _nitTransportStreamUpdateCoordinates = new HashSet(); NitTransportStreamCoordinate coordinate = new NitTransportStreamCoordinate(networkId, newer.TransportStreamId); if (_nitTransportStreamUpdateCoordinates.Contains(coordinate)) return false; using (MySqlConnection connection = new MySqlConnection(_mcsb.ToString())) { connection.Open(); NitTransportStream older = GetNitTransportStream(connection, networkId, newer.TransportStreamId); connection.Close(); if (older == null) { return false; } _nitTransportStreamUpdateCoordinates.Add(coordinate); if (older.NeedUpdate(newer)) { EnqueueSpeedhack(SpeedhackType.UpdateNitTransportStream, networkId, newer); return true; } return false; } } public int CountNitEntries() { using (MySqlConnection connectino = new MySqlConnection(_mcsb.ToString())) { connectino.Open(); using (MySqlCommand command = connectino.CreateCommand()) { command.CommandText = "SELECT COUNT(*) FROM dvb_nit_transport_stream"; MySqlDataReader dataReader = command.ExecuteReader(); dataReader.Read(); int result = dataReader.GetInt32(0); dataReader.Close(); connectino.Close(); return result; } } } public IEnumerable EnumerateNitTransportStreams() { using (MySqlConnection connection = new MySqlConnection(_mcsb.ToString())) { connection.Open(); using (MySqlCommand command = connection.CreateCommand()) { command.CommandText = "SELECT * FROM dvb_nit_transport_stream"; MySqlDataReader dataReader = command.ExecuteReader(); while (dataReader.Read()) { ushort nid = dataReader.GetUInt16(0); ushort tsid = dataReader.GetUInt16(1); DateTime dateAdded = dataReader.GetDateTime(2); int onid = dataReader.GetUInt16(3); NitTransportStream child = new NitTransportStream(nid, tsid); child.DeliveryMethod = (NitTransportStream.TransportMedium)dataReader.GetInt32(4); if (!dataReader.IsDBNull(5)) child.East = dataReader.GetBoolean(5); if (!dataReader.IsDBNull(6)) child.FecInner = (SatelliteDeliverySystemDescriptor.InnerFecScheme)dataReader.GetInt32(6); if (!dataReader.IsDBNull(7)) child.Frequency = dataReader.GetInt64(7); if (!dataReader.IsDBNull(8)) child.OrbitalPosition = dataReader.GetFloat(8); if (!dataReader.IsDBNull(9)) child.Polarization = (SatelliteDeliverySystemDescriptor.PolarizationEnum)dataReader.GetInt32(9); if (!dataReader.IsDBNull(10)) child.RollOff = dataReader.GetFloat(10); if (!dataReader.IsDBNull(11)) child.S2 = dataReader.GetBoolean(11); if (!dataReader.IsDBNull(12)) child.SymbolRate = dataReader.GetInt64(12); if (!dataReader.IsDBNull(13)) child.ScramblingSequenceIndex = dataReader.GetInt32(13); if (!dataReader.IsDBNull(14)) child.InputStreamIdentifier = dataReader.GetByte(14); if (!dataReader.IsDBNull(15)) child.TimesliceNumber = dataReader.GetByte(15); if (!dataReader.IsDBNull(16)) child.TsGsMode = (S2SatelliteDeliverySystemDescriptor.TsGsModeCoding)dataReader.GetInt32(16); if (!dataReader.IsDBNull(17)) child.PrivateDataSpecifierId = (uint)dataReader.GetUInt32(17); if (!dataReader.IsDBNull(18)) child.TfsFlag = dataReader.GetBoolean(18); if (!dataReader.IsDBNull(19)) child.Bandwidth = dataReader.GetInt32(19); if (!dataReader.IsDBNull(20)) child.GuardInterval = dataReader.GetInt32(20); if (!dataReader.IsDBNull(21)) child.OtherFrequencyFlag = dataReader.GetBoolean(21); if (!dataReader.IsDBNull(22)) child.PlpId = dataReader.GetByte(22); if (!dataReader.IsDBNull(23)) child.SisoMiso = dataReader.GetInt32(23); if (!dataReader.IsDBNull(24)) child.T2SystemId = dataReader.GetUInt16(24); if (!dataReader.IsDBNull(25)) child.TransmissionMode = dataReader.GetInt32(25); if (!dataReader.IsDBNull(26)) child.CodingType = (FrequencyListDescriptor.CodingTypeValue)dataReader.GetInt32(26); if (!dataReader.IsDBNull(27)) child.ModulationType = dataReader.GetInt32(27); if (!dataReader.IsDBNull(28)) child.FecOuter = (CableDeliverySystemDescriptor.OuterFecScheme)dataReader.GetInt32(28); if (!dataReader.IsDBNull(29)) child.CodeRateHpStream = (TerristialDeliverySystemDescriptor.CodeRate)dataReader.GetInt32(29); if (!dataReader.IsDBNull(30)) child.CodeRateLpStream = (TerristialDeliverySystemDescriptor.CodeRate)dataReader.GetInt32(30); if (!dataReader.IsDBNull(31)) child.HierarchyInformation = (TerristialDeliverySystemDescriptor.HierarchySignallingFormat)dataReader.GetInt32(31); if (!dataReader.IsDBNull(32)) child.MpeFecIndicator = dataReader.GetBoolean(32); if (!dataReader.IsDBNull(33)) child.Priority = dataReader.GetBoolean(33); if (!dataReader.IsDBNull(34)) child.TimeSlicingIndicator = dataReader.GetInt32(34); if (!dataReader.IsDBNull(35)) child.NetworkName = dataReader.GetString(35); if (!dataReader.IsDBNull(36)) child.TargetRegionCountryCode = dataReader.GetString(36); if (!dataReader.IsDBNull(37)) Guid.Parse(dataReader.GetString(37)); if (!dataReader.IsDBNull(38)) dataReader.GetInt32(38); if (!dataReader.IsDBNull(39)) dataReader.GetDateTime(39); yield return child; } dataReader.Close(); } connection.Close(); } } } }