feyris-tan ef86554f9a Import
2025-05-12 22:09:16 +02:00

233 lines
13 KiB
C#

using MySqlConnector;
using skyscraper5.Dvb.Descriptors;
using skyscraper5.Dvb.Psi.Model;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static skyscraper5.Dvb.Descriptors.LinkageDescriptor;
namespace skyscraper5.Data.MySql
{
partial class MySqlDataStorage
{
private void InsertSdtLinkages(MySqlConnection connection, Guid source, ICollection<LinkageDescriptor> Linkages, MySqlTransaction transaction)
{
if (Linkages == null)
return;
if (Linkages.Count == 0)
return;
MySqlCommand mySqlCommand = connection.CreateCommand();
mySqlCommand.Transaction = transaction;
mySqlCommand.CommandText = "INSERT INTO dvb_linkages " +
" (uuid, linkage_type, handover_type, handover_origin_type, handover_network_id, handover_initial_service_id, target_event_id, target_event_listed, target_event_simulcasted, table_type, private_data_bytes, bouquet_id, original_network_id, transport_stream_id, service_id) " +
"VALUES " +
" (@uuid, @linkage_type, @handover_type,@handover_origin_type,@handover_network_id,@handover_initial_service_id,@target_event_id,@target_event_listed,@target_event_simulcasted,@target_type,@private_data_bytes, @bouquet_id, @original_network_id, @transport_stream_id, @service_id)";
mySqlCommand.Parameters.Add("@uuid", MySqlDbType.VarChar);
mySqlCommand.Parameters.Add("@linkage_type", MySqlDbType.Int32);
mySqlCommand.Parameters.Add("@handover_type", MySqlDbType.Int32);
mySqlCommand.Parameters.Add("@handover_origin_type", MySqlDbType.Bool);
mySqlCommand.Parameters.Add("@handover_network_id", MySqlDbType.Int32);
mySqlCommand.Parameters.Add("@handover_initial_service_id", MySqlDbType.Int32);
mySqlCommand.Parameters.Add("@target_event_id", MySqlDbType.Int32);
mySqlCommand.Parameters.Add("@target_event_listed", MySqlDbType.Bool);
mySqlCommand.Parameters.Add("@target_event_simulcasted", MySqlDbType.Bool);
mySqlCommand.Parameters.Add("@target_type", MySqlDbType.Int32);
mySqlCommand.Parameters.Add("@private_data_bytes", MySqlDbType.TinyBlob);
mySqlCommand.Parameters.Add("@bouquet_id", MySqlDbType.Int32);
mySqlCommand.Parameters.Add("@original_network_id", MySqlDbType.Int32);
mySqlCommand.Parameters.Add("@transport_stream_id", MySqlDbType.Int32);
mySqlCommand.Parameters.Add("@service_id", MySqlDbType.Int32);
mySqlCommand.Parameters["@uuid"].Value = source.ToString();
foreach (LinkageDescriptor linkageDescriptor in Linkages)
{
if (TestForLinkage(transaction, source, linkageDescriptor.LinkageType, linkageDescriptor.OriginalNetworkId, linkageDescriptor.TransportStreamId, linkageDescriptor.ServiceId))
continue;
mySqlCommand.Parameters["@linkage_type"].Value = (int)linkageDescriptor.LinkageType;
mySqlCommand.Parameters["@handover_type"].Value = linkageDescriptor.HandoverType;
mySqlCommand.Parameters["@handover_origin_type"].Value = linkageDescriptor.HandoverOriginType;
mySqlCommand.Parameters["@handover_network_id"].Value = linkageDescriptor.HandoverNetworkId;
mySqlCommand.Parameters["@handover_initial_service_id"].Value = linkageDescriptor.HandoverInitialServiceId;
mySqlCommand.Parameters["@target_event_id"].Value = linkageDescriptor.TargetEventId;
mySqlCommand.Parameters["@target_event_listed"].Value = linkageDescriptor.TargetEventListed;
mySqlCommand.Parameters["@target_event_simulcasted"].Value = linkageDescriptor.TargetEventSimulcasted;
mySqlCommand.Parameters["@target_type"].Value = (int)linkageDescriptor.TableType;
mySqlCommand.Parameters["@private_data_bytes"].Value = linkageDescriptor.PrivateDataBytes;
mySqlCommand.Parameters["@bouquet_id"].Value = linkageDescriptor.BouquetId;
mySqlCommand.Parameters["@original_network_id"].Value = linkageDescriptor.OriginalNetworkId;
mySqlCommand.Parameters["@transport_stream_id"].Value = linkageDescriptor.TransportStreamId;
mySqlCommand.Parameters["@service_id"].Value = linkageDescriptor.ServiceId;
SetNulls(mySqlCommand);
mySqlCommand.ExecuteNonQuery();
InsertSdtLinkageExtendedEvent(connection, source, linkageDescriptor);
InsertSdtLinkageIpMac(connection, source, linkageDescriptor);
InsertSdtLinkageSsu(transaction, source, linkageDescriptor);
}
}
private bool TestForLinkage(MySqlTransaction transaction, Guid source, LinkageDescriptor.LinkageTypeEnum linkageDescriptorLinkageType, ushort linkageDescriptorOriginalNetworkId, ushort linkageDescriptorTransportStreamId, ushort linkageDescriptorServiceId)
{
MySqlCommand command = transaction.Connection.CreateCommand();
command.Transaction = transaction;
command.CommandText =
"SELECT dateadded FROM dvb_linkages WHERE uuid = @uuid AND linkage_type = @linkage_type AND original_network_id = @original_network_id " +
"AND transport_stream_id = @transport_stream_id AND service_id = @service_id";
command.Parameters.AddWithValue("@uuid", source.ToString());
command.Parameters.AddWithValue("@linkage_type", (int)linkageDescriptorLinkageType);
command.Parameters.AddWithValue("@original_network_id", linkageDescriptorOriginalNetworkId);
command.Parameters.AddWithValue("@transport_stream_id", linkageDescriptorTransportStreamId);
command.Parameters.AddWithValue("@service_id", linkageDescriptorServiceId);
MySqlDataReader dataReader = command.ExecuteReader();
bool result = dataReader.Read();
dataReader.Close();
return result;
}
private void InsertSdtLinkageSsu(MySqlTransaction transaction, Guid source, LinkageDescriptor linkageDescriptor)
{
if (linkageDescriptor.SystemSoftwareUpdateLinkStructure == null)
return;
if (linkageDescriptor.SystemSoftwareUpdateLinkStructure.Count == 0)
return;
MySqlCommand mySqlCommand = transaction.Connection.CreateCommand();
mySqlCommand.Transaction = transaction;
mySqlCommand.CommandText =
"INSERT INTO dvb_linkages_ssu (uuid, oui, selector) VALUES (@uuid, @oui, @selector)";
mySqlCommand.Parameters.Add("@uuid", MySqlDbType.VarChar);
mySqlCommand.Parameters.Add("@oui", MySqlDbType.VarChar);
mySqlCommand.Parameters.Add("@selector", MySqlDbType.TinyBlob);
mySqlCommand.Parameters["@uuid"].Value = source.ToString();
foreach (LinkageDescriptor.OuiPrivateData ouiPrivateData in linkageDescriptor.SystemSoftwareUpdateLinkStructure)
{
if (!TestForLinkageSsu(transaction, source, ouiPrivateData.OUI))
{
mySqlCommand.Parameters["@oui"].Value = BitConverter.ToString(ouiPrivateData.OUI);
mySqlCommand.Parameters["@selector"].Value = ouiPrivateData.Selector;
mySqlCommand.ExecuteNonQuery();
}
}
}
private bool TestForLinkageSsu(MySqlTransaction transaction, Guid uuid, byte[] oui)
{
MySqlCommand command = transaction.Connection.CreateCommand();
command.Transaction = transaction;
command.CommandText = "SELECT dateadded FROM dvb_linkages_ssu WHERE uuid = @uuid AND oui = @oui";
command.Parameters.AddWithValue("@uuid", uuid.ToString());
command.Parameters.AddWithValue("@oui", BitConverter.ToString(oui));
MySqlDataReader dataReader = command.ExecuteReader();
bool result = dataReader.Read();
dataReader.Close();
return result;
}
private void InsertSdtLinkageIpMac(MySqlConnection connection, Guid source, LinkageDescriptor linkageDescriptor)
{
if (linkageDescriptor.IpMacNotificationLinkages == null)
return;
if (linkageDescriptor.IpMacNotificationLinkages.Count == 0)
return;
MySqlCommand mySqlCommand = connection.CreateCommand();
mySqlCommand.CommandText =
"INSERT INTO dvb_sdt_linkages_ipmac (uuid, id) VALUES (@uuid, @id)";
mySqlCommand.Parameters.Add("@uuid", MySqlDbType.VarChar);
mySqlCommand.Parameters.Add("@id", MySqlDbType.Int32);
mySqlCommand.Parameters["@uuid"].Value = source.ToString();
foreach (LinkageDescriptor.IpMacNotificationLinkage ipMacNotificationLinkage in linkageDescriptor.IpMacNotificationLinkages)
{
mySqlCommand.Parameters["@id"].Value = ipMacNotificationLinkage.Id;
mySqlCommand.ExecuteNonQuery();
InsertSdtLinkageIpMacNames(connection, source, ipMacNotificationLinkage);
}
}
private void InsertSdtLinkageIpMacNames(MySqlConnection connection, Guid source, LinkageDescriptor.IpMacNotificationLinkage ipMacNotificationLinkage)
{
if (ipMacNotificationLinkage.Names == null)
return;
if (ipMacNotificationLinkage.Names.Count == 0)
return;
MySqlCommand mySqlCommand = connection.CreateCommand();
mySqlCommand.CommandText =
"INSERT INTO dvb_sdt_linkages_ipmac_names (uuid, id, lang, name) VALUES (@uuid, @id, @lang, @name)";
mySqlCommand.Parameters.Add("@uuid", MySqlDbType.VarChar);
mySqlCommand.Parameters.Add("@id", MySqlDbType.Int32);
mySqlCommand.Parameters.Add("@lang", MySqlDbType.VarChar);
mySqlCommand.Parameters.Add("@name", MySqlDbType.VarChar);
mySqlCommand.Parameters["@uuid"].Value = source.ToString();
mySqlCommand.Parameters["@id"].Value = ipMacNotificationLinkage.Id;
foreach (Tuple<string, string> tuple in ipMacNotificationLinkage.Names)
{
mySqlCommand.Parameters["@lang"].Value = tuple.Item1;
mySqlCommand.Parameters["@name"].Value = tuple.Item2;
mySqlCommand.ExecuteNonQuery();
}
}
private void InsertSdtLinkageExtendedEvent(MySqlConnection connection, Guid source, LinkageDescriptor linkageDescriptor)
{
if (linkageDescriptor.ExtendedEventLinkages == null)
return;
if (linkageDescriptor.ExtendedEventLinkages.Length == 0)
return;
MySqlCommand mySqlCommand = connection.CreateCommand();
mySqlCommand.CommandText =
"INSERT INTO dvb_sdt_linkages_extended_event_linkages " +
" (uuid, target_event, target_listed, event_simulcast, link_type, user_defined_id, target_tsid, target_onid, target_service_id) " +
"VALUES " +
" (@uuid,@target_event,@target_listed,@event_simulcast,@link_type,@user_defined_id,@target_tsid,@target_onid,@target_service_id)";
mySqlCommand.Parameters.Add("@uuid", MySqlDbType.VarChar);
mySqlCommand.Parameters.Add("@target_event", MySqlDbType.Int32);
mySqlCommand.Parameters.Add("@target_listed", MySqlDbType.Bool);
mySqlCommand.Parameters.Add("@event_simulcast", MySqlDbType.Bool);
mySqlCommand.Parameters.Add("@link_type", MySqlDbType.Int32);
mySqlCommand.Parameters.Add("@user_defined_id", MySqlDbType.Int32);
mySqlCommand.Parameters.Add("@target_tsid", MySqlDbType.Int32);
mySqlCommand.Parameters.Add("@target_onid", MySqlDbType.Int32);
mySqlCommand.Parameters.Add("@target_service_id", MySqlDbType.Int32);
mySqlCommand.Parameters["@uuid"].Value = source.ToString();
foreach (LinkageDescriptor.ExtendedEventLinkageInfo eventLinkage in linkageDescriptor.ExtendedEventLinkages)
{
mySqlCommand.Parameters["@target_event"].Value = eventLinkage.TargetEventId;
mySqlCommand.Parameters["@target_listed"].Value = eventLinkage.TargetListed;
mySqlCommand.Parameters["@event_simulcast"].Value = eventLinkage.EventSimulcast;
mySqlCommand.Parameters["@link_type"].Value = eventLinkage.LinkType;
mySqlCommand.Parameters["@user_defined_id"].Value = eventLinkage.UserDefinedId;
mySqlCommand.Parameters["@target_tsid"].Value = eventLinkage.TargetTransportStreamId;
mySqlCommand.Parameters["@target_onid"].Value = eventLinkage.TargetOriginalNetworkId;
mySqlCommand.Parameters["@target_service_id"].Value = eventLinkage.TargetServiceId;
SetNulls(mySqlCommand);
mySqlCommand.ExecuteNonQuery();
}
}
private bool HasLinkages(ICollection<LinkageDescriptor> links)
{
if (links == null)
return false;
if (links.Count == 0)
return false;
return true;
}
}
}