This commit is contained in:
feyris-tan 2025-05-12 22:09:16 +02:00
commit ef86554f9a
1063 changed files with 99313 additions and 0 deletions

108
.gitignore vendored Normal file
View File

@ -0,0 +1,108 @@
/.vs/ProjectEvaluation
/.vs/skyscraper8/DesignTimeBuild
/.vs/skyscraper8/FileContentIndex
/.vs/skyscraper8/v17
*.exe
*.dll
*.pdb
/BlobStorages/skyscraper5.Data.Minio/bin/Debug/net5.0
/BlobStorages/skyscraper5.Data.Minio/bin/Debug/net6.0
/BlobStorages/skyscraper5.Data.Minio/bin/Debug/net8.0
/BlobStorages/skyscraper5.Data.Minio/obj/Debug/net5.0
/BlobStorages/skyscraper5.Data.Minio/obj/Debug/net6.0
/BlobStorages/skyscraper5.Data.Minio/obj/Debug/net8.0
/BlobStorages/skyscraper5.Data.Minio/obj
/DataTableStorages/skyscraper5.Data.MySql/bin/Debug/net5.0
/DataTableStorages/skyscraper5.Data.MySql/bin/Debug/net8.0
/DataTableStorages/skyscraper5.Data.MySql/obj/Debug/net5.0
/DataTableStorages/skyscraper5.Data.MySql/obj/Debug/net6.0
/DataTableStorages/skyscraper5.Data.MySql/obj/Debug/net8.0
/DataTableStorages/skyscraper5.Data.MySql/obj
/DataTableStorages/skyscraper5.Data.PostgreSql/bin/Debug/net6.0
/DataTableStorages/skyscraper5.Data.PostgreSql/bin/Debug/net8.0
/DataTableStorages/skyscraper5.Data.PostgreSql/obj/Debug/net6.0
/DataTableStorages/skyscraper5.Data.PostgreSql/obj/Debug/net8.0
/DataTableStorages/skyscraper5.Data.PostgreSql/obj
/FactoryStorages/skyscraper5.Storage.MariaDbMinio/bin/Debug/net5.0
/FactoryStorages/skyscraper5.Storage.MariaDbMinio/bin/Debug/net8.0
/FactoryStorages/skyscraper5.Storage.MariaDbMinio/obj/Debug/net5.0
/FactoryStorages/skyscraper5.Storage.MariaDbMinio/obj/Debug/net6.0
/FactoryStorages/skyscraper5.Storage.MariaDbMinio/obj/Debug/net8.0
/FactoryStorages/skyscraper5.Storage.MariaDbMinio/obj
/FactoryStorages/skyscraper5.Storage.PostgresqlMinio/bin/Debug/net6.0
/FactoryStorages/skyscraper5.Storage.PostgresqlMinio/bin/Debug/net8.0
/FactoryStorages/skyscraper5.Storage.PostgresqlMinio/obj/Debug/net6.0
/FactoryStorages/skyscraper5.Storage.PostgresqlMinio/obj/Debug/net8.0
/FactoryStorages/skyscraper5.Storage.PostgresqlMinio/obj
/GUIs/skyscraper8.UI.ImGui/bin/Debug/net8.0/SDL2-CS.dll.config
imgui.ini
/GUIs/skyscraper8.UI.ImGui/bin/Debug/net8.0/runtimes/linux-x64/native
/GUIs/skyscraper8.UI.ImGui/bin/Debug/net8.0/runtimes/osx-x64/native
/GUIs/skyscraper8.UI.ImGui/bin/Debug/net8.0/runtimes/osx/native
/GUIs/skyscraper8.UI.ImGui/bin/Debug/net8.0/skyscraper8.UI.ImGui.deps.json
/GUIs/skyscraper8.UI.ImGui/bin/Debug/net8.0/skyscraper8.UI.ImGui.runtimeconfig.json
/GUIs/skyscraper8.UI.ImGui/bin/Debug/net8.0/skyscraper8.deps.json
/GUIs/skyscraper8.UI.ImGui/bin/Debug/net8.0/skyscraper8.runtimeconfig.json
/Gimmicks/skyscraper5.Gimmicks.DvbTBatchCapture/bin/Debug/net6.0
/Gimmicks/skyscraper5.Gimmicks.DvbTBatchCapture/bin/Debug/net8.0
/Gimmicks/skyscraper5.Gimmicks.DvbTBatchCapture/obj/Debug/net6.0
/Gimmicks/skyscraper5.Gimmicks.DvbTBatchCapture/obj/Debug/net8.0
/Gimmicks/skyscraper5.Gimmicks.DvbTBatchCapture/obj
/Gimmicks/skyscraper5.Gimmicks.IptvCollector/bin/Debug/net6.0
/Gimmicks/skyscraper5.Gimmicks.IptvCollector/bin/Debug/net8.0
/Gimmicks/skyscraper5.Gimmicks.IptvCollector/obj/Debug/net6.0
/Gimmicks/skyscraper5.Gimmicks.IptvCollector/obj/Debug/net8.0
/Gimmicks/skyscraper5.Gimmicks.IptvCollector/obj
/Gimmicks/skyscraper5.LyngsatMapsScraper/bin/Debug/net6.0
/Gimmicks/skyscraper5.LyngsatMapsScraper/bin/Debug/net8.0
/Gimmicks/skyscraper5.LyngsatMapsScraper/obj/Debug/net6.0
/Gimmicks/skyscraper5.LyngsatMapsScraper/obj/Debug/net8.0
/Gimmicks/skyscraper5.LyngsatMapsScraper/obj
/Gimmicks/skyscraper5.RSR.IQTester/bin/Debug/net8.0
/Gimmicks/skyscraper5.RSR.IQTester/obj/Debug/net6.0
/Gimmicks/skyscraper5.RSR.IQTester/obj/Debug/net8.0
/Gimmicks/skyscraper5.RSR.IQTester/obj
/GpsPlugins/skyscraper5.NmeaSharpWrapper/bin/Debug/net6.0
/GpsPlugins/skyscraper5.NmeaSharpWrapper/bin/Debug/net8.0
/GpsPlugins/skyscraper5.NmeaSharpWrapper/obj/Debug/net6.0
/GpsPlugins/skyscraper5.NmeaSharpWrapper/obj/Debug/net8.0
/GpsPlugins/skyscraper5.NmeaSharpWrapper/obj
/IoPlugins/skyscraper5.IO.StreamReader.RemoteStreamReaderServer/bin/Debug/net6.0
/IoPlugins/skyscraper5.IO.StreamReader.RemoteStreamReaderServer/bin/Debug/net8.0
/IoPlugins/skyscraper5.IO.StreamReader.RemoteStreamReaderServer/obj/Debug/net6.0
/IoPlugins/skyscraper5.IO.StreamReader.RemoteStreamReaderServer/obj/Debug/net8.0
/IoPlugins/skyscraper5.IO.StreamReader.RemoteStreamReaderServer/obj
/IoPlugins/skyscraper5.IO.StreamReader/bin/Debug/net6.0
/IoPlugins/skyscraper5.IO.StreamReader/bin/Debug/net8.0
/IoPlugins/skyscraper5.IO.StreamReader/obj/Debug/net6.0
/IoPlugins/skyscraper5.IO.StreamReader/obj/Debug/net8.0
/IoPlugins/skyscraper5.IO.StreamReader/obj
/MpePlugins/skyscraper5.Aprs/bin/Debug/net6.0
/MpePlugins/skyscraper5.Aprs/bin/Debug/net8.0
/MpePlugins/skyscraper5.Aprs/obj/Debug/net6.0
/MpePlugins/skyscraper5.Aprs/obj/Debug/net8.0
/MpePlugins/skyscraper5.Aprs/obj
/MpePlugins/skyscraper5.DNS/bin/Debug/net8.0
/PrivateDataSpecifiers/skyscraper5.PrivateDataSpecifiers.ArdZdfOrf/bin/Debug/net6.0
/PrivateDataSpecifiers/skyscraper5.PrivateDataSpecifiers.ArdZdfOrf/bin/Debug/net8.0
/PrivateDataSpecifiers/skyscraper5.PrivateDataSpecifiers.ArdZdfOrf/obj/Debug/net6.0
/PrivateDataSpecifiers/skyscraper5.PrivateDataSpecifiers.ArdZdfOrf/obj/Debug/net8.0
/PrivateDataSpecifiers/skyscraper5.PrivateDataSpecifiers.ArdZdfOrf/obj
/PrivateDataSpecifiers/skyscraper5.PrivateDataSpecifiers.Eacem/bin/Debug/net6.0
/PrivateDataSpecifiers/skyscraper5.PrivateDataSpecifiers.Eacem/bin/Debug/net8.0
/PrivateDataSpecifiers/skyscraper5.PrivateDataSpecifiers.Eacem/obj/Debug/net6.0
/PrivateDataSpecifiers/skyscraper5.PrivateDataSpecifiers.Eacem/obj/Debug/net8.0
/PrivateDataSpecifiers/skyscraper5.PrivateDataSpecifiers.Eacem/obj
/PrivateDataSpecifiers/skyscraper5.PrivateDataSpecifiers.Nordig/bin/Debug/net6.0
/PrivateDataSpecifiers/skyscraper5.PrivateDataSpecifiers.Nordig/bin/Debug/net8.0
/PrivateDataSpecifiers/skyscraper5.PrivateDataSpecifiers.Nordig/obj/Debug/net6.0
/PrivateDataSpecifiers/skyscraper5.PrivateDataSpecifiers.Nordig/obj/Debug/net8.0
/PrivateDataSpecifiers/skyscraper5.PrivateDataSpecifiers.Nordig/obj
/PrivateDataSpecifiers/skyscraper5.PrivateDataSpecifiers.SimpliTV/bin/Debug/net6.0
/PrivateDataSpecifiers/skyscraper5.PrivateDataSpecifiers.SimpliTV/obj
/PrivateDataSpecifiers/skyscraper5.PrivateDataSpecifiers.SimpliTV/bin/Debug/net8.0
/skyscraper8.Tests/bin/Debug/net8.0
/skyscraper8.Tests/obj/Debug/net8.0
/skyscraper8.Tests/obj
/skyscraper8/bin/Debug/net8.0
/skyscraper8/obj

View File

@ -0,0 +1,244 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Threading.Tasks;
using Minio;
using Minio.DataModel;
using Minio.DataModel.Args;
using Minio.Exceptions;
using skyscraper5.Dvb.DataBroadcasting.SkyscraperVfs;
using skyscraper5.Skyscraper.Scraper.Storage.Split;
namespace skyscraper5.Data
{
public class MinioObjectStorage : ObjectStorage
{
private readonly IMinioClient _minioClient;
private readonly string _minioBucket;
private List<Task> _tasks;
private List<string> droppedFiles;
public MinioObjectStorage(IMinioClient minioClient, string minioBucket)
{
_minioClient = minioClient;
_minioBucket = minioBucket;
_tasks = new List<Task>();
droppedFiles = new List<string>();
}
private void WriteObject(string fullName, Stream buffer, string mime = "application/octet-stream", Dictionary<string, string> optionalData = null)
{
PutObjectArgs putObjectArgs = new PutObjectArgs();
putObjectArgs = putObjectArgs.WithBucket(_minioBucket);
putObjectArgs = putObjectArgs.WithObject(fullName);
putObjectArgs = putObjectArgs.WithStreamData(buffer);
putObjectArgs = putObjectArgs.WithObjectSize(buffer.Length);
putObjectArgs = putObjectArgs.WithContentType(mime);
putObjectArgs = putObjectArgs.WithHeaders(optionalData);
lock (_tasks)
{
_tasks.Add(_minioClient.PutObjectAsync(putObjectArgs).ContinueWith(task =>
{
droppedFiles.Add(fullName);
buffer.Close();
buffer.Dispose();
}));
}
CleanTaskList();
}
private void CleanTaskList()
{
while (true)
{
bool done = true;
lock (_tasks)
{
foreach (Task task in _tasks)
{
if (task.IsCompleted)
{
_tasks.Remove(task);
Debug.WriteLine(String.Format("Removed completed Task: {0}", task.ToString()));
done = false;
break;
}
}
}
if (done)
break;
}
}
public bool ObjectCarouselFileArrival(VfsFile vfsFile, int transportStreamId, int networkId)
{
string combine = string.Join('/', "DSM-CC_Objects", networkId.ToString(), transportStreamId.ToString(), vfsFile.SourcePid.ToString(), vfsFile.ToString().Substring(1));
combine = combine.Replace('\\', '/');
if (FileExists(combine))
return false;
Dictionary<string, string> extendedInfo = new Dictionary<string, string>();
extendedInfo.Add(nameof(vfsFile.ObjectLocation.CarouselId), vfsFile.ObjectLocation.CarouselId.ToString());
extendedInfo.Add(nameof(vfsFile.ObjectLocation.ModuleId), vfsFile.ObjectLocation.ModuleId.ToString());
extendedInfo.Add(nameof(vfsFile.ObjectLocation.Version), vfsFile.ObjectLocation.Version.ToString());
extendedInfo.Add(nameof(vfsFile.ObjectLocation.ObjectKey), BitConverter.ToString(vfsFile.ObjectLocation.ObjectKey));
WriteObject(combine,new MemoryStream(vfsFile.FileContent),"application/octet-stream",extendedInfo);
return true;
}
public void DataCarouselModuleArrival(int currentNetworkId, int currentTransportStreamId, int elementaryPid, ushort moduleModuleId, byte moduleModuleVersion, Stream result)
{
string combine = string.Join('/', "DSM-CC_Data", currentNetworkId.ToString(), currentTransportStreamId.ToString(), elementaryPid.ToString(), String.Format("{0}_V{1}.bin", moduleModuleId, moduleModuleVersion));
if (FileExists(combine))
return;
WriteObject(combine, result);
WantedModuleCoordinate coordinate = new WantedModuleCoordinate(currentNetworkId, currentTransportStreamId, elementaryPid, moduleModuleId, moduleModuleVersion);
knownModuleCoordinates.Add(coordinate);
wantedModuleCoordinates.Remove(coordinate);
}
public bool FileExists(string combine)
{
if (definetlyKnownFiles == null)
definetlyKnownFiles = new HashSet<string>();
if (definetlyKnownFiles.Contains(combine))
return true;
if (droppedFiles != null)
{
if (droppedFiles.Contains(combine))
return true;
}
StatObjectArgs soa = new StatObjectArgs().WithBucket(_minioBucket).WithObject(combine);
try
{
ObjectStat objectStat = _minioClient.StatObjectAsync(soa).Result;
definetlyKnownFiles.Add(combine);
return true;
}
catch (AggregateException e)
{
MinioException minioException = e.InnerExceptions[0] as MinioException;
switch (minioException.Response.Code)
{
case "NoSuchKey":
return false;
case "Forbidden":
return true;
default:
throw new NotImplementedException(minioException.Response.Code);
}
}
}
public bool IsDsmCcModuleWanted(int currentNetworkId, int currentTransportStreamId, int elementaryPid, ushort moduleId, byte moduleVersion)
{
if (wantedModuleCoordinates == null)
wantedModuleCoordinates = new HashSet<WantedModuleCoordinate>();
if (knownModuleCoordinates == null)
knownModuleCoordinates = new HashSet<WantedModuleCoordinate>();
WantedModuleCoordinate coordinate = new WantedModuleCoordinate(currentNetworkId, currentTransportStreamId, elementaryPid, moduleId, moduleVersion);
if (wantedModuleCoordinates.Contains(coordinate))
return true;
if (knownModuleCoordinates.Contains(coordinate))
return false;
string combine = String.Join('/', "DSM-CC_Data", currentNetworkId.ToString(), currentTransportStreamId.ToString(), elementaryPid.ToString(), String.Format("{0}_V{1}.bin", moduleId, moduleVersion));
bool isWanted = !FileExists(combine);
if (isWanted)
{
wantedModuleCoordinates.Add(coordinate);
}
else
{
knownModuleCoordinates.Add(coordinate);
}
return isWanted;
}
public bool TestForFramegrab(int currentNetworkId, int transportStreamId, ushort mappingProgramNumber, int mappingStreamElementaryPid)
{
string combine = string.Join('/', "Framegrabs", currentNetworkId.ToString(), transportStreamId.ToString(), String.Format("{1}_{0}.jpg", mappingStreamElementaryPid, mappingProgramNumber));
return FileExists(combine);
}
public void StoreFramegrab(int currentNetworkId, int transportStreamId, ushort mappingProgramNumber, ushort pid, byte[] imageData)
{
string combine = string.Join('/', "Framegrabs", currentNetworkId.ToString(), transportStreamId.ToString(), String.Format("{1}_{0}.jpg", pid, mappingProgramNumber));
WriteObject(combine, new MemoryStream(imageData), "image/jpeg");
}
public void WaitForCompletion()
{
while (_tasks.Count > 0)
{
_tasks[0].Wait();
_tasks.RemoveAt(0);
}
wantedModuleCoordinates?.Clear();
knownModuleCoordinates?.Clear();
definetlyKnownFiles?.Clear();
}
private HashSet<WantedModuleCoordinate> wantedModuleCoordinates;
private HashSet<WantedModuleCoordinate> knownModuleCoordinates;
private HashSet<string> definetlyKnownFiles;
struct WantedModuleCoordinate
{
private int currentNetworkId, currentTransportStreamId, elementaryPid;
private ushort moduleId;
private byte moduleVersion;
public WantedModuleCoordinate(int currentNetworkId, int currentTransportStreamId, int elementaryPid, ushort moduleId, byte moduleVersion)
{
this.currentNetworkId = currentNetworkId;
this.currentTransportStreamId = currentTransportStreamId;
this.elementaryPid = elementaryPid;
this.moduleId = moduleId;
this.moduleVersion = moduleVersion;
}
public bool Equals(WantedModuleCoordinate other)
{
return currentNetworkId == other.currentNetworkId && currentTransportStreamId == other.currentTransportStreamId && elementaryPid == other.elementaryPid && moduleId == other.moduleId && moduleVersion == other.moduleVersion;
}
public override bool Equals(object obj)
{
return obj is WantedModuleCoordinate other && Equals(other);
}
public override int GetHashCode()
{
return HashCode.Combine(currentNetworkId, currentTransportStreamId, elementaryPid, moduleId, moduleVersion);
}
}
private int uiVersion;
public void UiSetVersion(int version)
{
this.uiVersion = version;
}
public object[] GetPluginConnector()
{
return new object[] { _minioClient, _minioBucket };
}
public void Ping()
{
GetVersioningArgs args = new GetVersioningArgs().WithBucket(_minioBucket);
VersioningConfiguration vc = _minioClient.GetVersioningAsync(args).Result;
}
}
}

View File

@ -0,0 +1,15 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Minio" Version="6.0.4" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\skyscraper8\skyscraper8.csproj" />
</ItemGroup>
</Project>

View File

@ -0,0 +1,279 @@

using MySqlConnector;
using skyscraper5.Skyscraper.Scraper.Storage.Split;
using skyscraper5.Mhp.Si;
using skyscraper5.Mhp.Si.Model;
using System.Collections.Generic;
using System.Data;
using skyscraper5.Mhp.Descriptors;
using skyscraper5.Mhp.Descriptors.InteractionTransportSelectors;
using System;
using skyscraper5.Teletext;
namespace skyscraper5.Data.MySql
{
public partial class MySqlDataStorage : DataStorage
{
private HashSet<ApplicationIdentifier> _knownAits;
private void InsertAitAppNames(MySqlTransaction transaction, AitApplication aitApplication)
{
if (aitApplication.ApplicationName == null)
return;
if (aitApplication.ApplicationName.Count == 0)
return;
MySqlCommand command = transaction.Connection.CreateCommand();
command.Transaction = transaction;
command.CommandText =
"INSERT INTO dvb_ait_application_names (org_id, app_id, lang, name) VALUES (@org_id,@app_id,@lang,@name)";
command.Parameters.AddWithValue("@org_id", aitApplication.ApplicationIdentifier.OrganisationId);
command.Parameters.AddWithValue("@app_id", aitApplication.ApplicationIdentifier.ApplicationId);
command.Parameters.Add("@lang", MySqlDbType.VarChar);
command.Parameters.Add("@name", MySqlDbType.VarChar);
foreach (KeyValuePair<string, string> keyValuePair in aitApplication.ApplicationName)
{
command.Parameters["@lang"].Value = keyValuePair.Key;
command.Parameters["@name"].Value = keyValuePair.Value;
command.ExecuteNonQuery();
}
}
private void InsertAitAppProfiles(MySqlTransaction transaction, AitApplication aitApplication)
{
if (aitApplication.ApplicationProfiles == null)
return;
if (aitApplication.ApplicationProfiles.Length == 0)
return;
MySqlCommand command = transaction.Connection.CreateCommand();
command.Transaction = transaction;
command.CommandText =
"INSERT INTO dvb_ait_application_profiles (org_id, app_id, app_profile, major, minor, micro) VALUES (@org_id, @app_id, @app_profile, @major, @minor, @micro)";
command.Parameters.AddWithValue("@org_id", aitApplication.ApplicationIdentifier.OrganisationId);
command.Parameters.AddWithValue("@app_id", aitApplication.ApplicationIdentifier.ApplicationId);
command.Parameters.Add("@app_profile", DbType.Int32);
command.Parameters.Add("@major", MySqlDbType.Int16);
command.Parameters.Add("@minor", MySqlDbType.Int16);
command.Parameters.Add("@micro", MySqlDbType.Int16);
foreach (ApplicationDescriptor.ApplicationProfileEncoding profile in aitApplication.ApplicationProfiles)
{
command.Parameters["@app_profile"].Value = profile.ApplicationProfile;
command.Parameters["@major"].Value = profile.Major;
command.Parameters["@minor"].Value = profile.Minor;
command.Parameters["@micro"].Value = profile.Micro;
command.ExecuteNonQuery();
}
}
private void InsertAitBoundaryExtensions(MySqlTransaction transaction, AitApplication aitApplication)
{
if (aitApplication.BoundaryExtensions == null)
return;
if (aitApplication.BoundaryExtensions.Length == 0)
return;
MySqlCommand command = transaction.Connection.CreateCommand();
command.Transaction = transaction;
command.CommandText =
"INSERT INTO dvb_ait_boundary_extensions (org_id, app_id, extension) VALUES (@org_id, @app_id, @extension)";
command.Parameters.AddWithValue("@org_id", aitApplication.ApplicationIdentifier.OrganisationId);
command.Parameters.AddWithValue("@app_id", aitApplication.ApplicationIdentifier.ApplicationId);
command.Parameters.Add("@extension", MySqlDbType.VarChar);
foreach (string extension in aitApplication.BoundaryExtensions)
{
command.Parameters["@extension"].Value = extension;
command.ExecuteNonQuery();
}
}
private void InsertAitExternalAuthorizations(MySqlTransaction transaction, AitApplication aitApplication)
{
if (aitApplication.ExternalAuthorizations == null)
return;
if (aitApplication.ExternalAuthorizations.Length == 0)
return;
MySqlCommand command = transaction.Connection.CreateCommand();
command.Transaction = transaction;
command.CommandText =
"INSERT INTO dvb_ait_external_authorization (org_id, app_id, ext_org_id, ext_app_id, app_priority) VALUES (@org_id, @app_id, @ext_org_id, @ext_app_id, @app_priority)";
command.Parameters.AddWithValue("@org_id", aitApplication.ApplicationIdentifier.OrganisationId);
command.Parameters.AddWithValue("@app_id", aitApplication.ApplicationIdentifier.ApplicationId);
command.Parameters.Add("@ext_org_id", MySqlDbType.Int32);
command.Parameters.Add("@ext_app_id", MySqlDbType.Int32);
command.Parameters.Add("@app_priority", MySqlDbType.Int16);
foreach (ExternalApplicationAuthorisationDescriptor.ExternalAuthorization externalAuthorization in
aitApplication.ExternalAuthorizations)
{
command.Parameters["@ext_org_id"].Value = externalAuthorization.OrganisationId;
command.Parameters["@ext_app_id"].Value = externalAuthorization.ApplicationId;
command.Parameters["@app_priority"].Value = externalAuthorization.ApplicationPriority;
command.ExecuteNonQuery();
}
}
private void InsertAitTransportProtocols(MySqlTransaction transaction, AitApplication aitApplication)
{
if (aitApplication.TransportProtocols == null)
return;
if (aitApplication.TransportProtocols.Count == 0)
return;
MySqlCommand command = transaction.Connection.CreateCommand();
command.Transaction = transaction;
command.CommandText =
"INSERT INTO dvb_ait_transport_protocols (org_id, app_id, protocol_id, transport_protocol_label, remote_connection, original_network_id, transport_stream_id, service_id, component_tag, url_base) " +
"VALUES " +
"(@org_id, @app_id, @protocol_id, @transport_protocol_label, @remote_connection, @original_network_id, @transport_stream_id, @service_id, @component_tag, @url_base)";
command.Parameters.AddWithValue("@org_id", aitApplication.ApplicationIdentifier.OrganisationId);
command.Parameters.AddWithValue("@app_id", aitApplication.ApplicationIdentifier.ApplicationId);
command.Parameters.Add("@protocol_id", MySqlDbType.Int32);
command.Parameters.Add("@transport_protocol_label", MySqlDbType.Int16);
command.Parameters.Add("@remote_connection", MySqlDbType.Bool);
command.Parameters.Add("@original_network_id", MySqlDbType.Int32);
command.Parameters.Add("@transport_stream_id", MySqlDbType.Int32);
command.Parameters.Add("@service_id", MySqlDbType.Int32);
command.Parameters.Add("@component_tag", MySqlDbType.Int16);
command.Parameters.Add("@url_base", MySqlDbType.VarChar);
foreach (TransportProtocolDescriptor protocol in aitApplication.TransportProtocols)
{
command.Parameters["@protocol_id"].Value = protocol.ProtocolId;
command.Parameters["@transport_protocol_label"].Value = protocol.TransportProtocolLabel;
switch (protocol.ProtocolId)
{
case 1:
ObjectCarouselTransportSelector octs = (ObjectCarouselTransportSelector)protocol.Selector;
command.Parameters["@remote_connection"].Value = octs.RemoteConnection;
command.Parameters["@original_network_id"].Value = octs.OriginalNetworkId;
command.Parameters["@transport_stream_id"].Value = octs.TransportStreamId;
command.Parameters["@service_id"].Value = octs.ServiceId;
command.Parameters["@component_tag"].Value = octs.ComponentTag;
command.Parameters["@url_base"].Value = DBNull.Value;
command.ExecuteNonQuery();
break;
case 3:
InteractionTransportSelector its = (InteractionTransportSelector)protocol.Selector;
command.Parameters["@remote_connection"].Value = DBNull.Value;
command.Parameters["@original_network_id"].Value = DBNull.Value;
command.Parameters["@transport_stream_id"].Value = DBNull.Value;
command.Parameters["@service_id"].Value = DBNull.Value;
command.Parameters["@component_tag"].Value = DBNull.Value;
command.Parameters["@url_base"].Value = its.UrlBase;
command.ExecuteNonQuery();
InsertAitTransportProtocolUrlExtensions(transaction, aitApplication.ApplicationIdentifier, its);
break;
default:
throw new NotImplementedException(String.Format(protocol.ProtocolId.ToString()));
}
}
}
private void InsertAitTransportProtocolUrlExtensions(MySqlTransaction transaction, ApplicationIdentifier aitApplicationApplicationIdentifier, InteractionTransportSelector its)
{
if (its.UrlExtensions == null)
return;
if (its.UrlExtensions.Length == 0)
return;
MySqlCommand command = transaction.Connection.CreateCommand();
command.Transaction = transaction;
command.CommandText =
"INSERT INTO dvb_ait_transport_protocols_url_extensions (org_id, app_id, ordinal, url_extension) VALUES (@org_id, @app_id, @ordinal, @url_extensiion)";
command.Parameters.AddWithValue("@org_id", aitApplicationApplicationIdentifier.OrganisationId);
command.Parameters.AddWithValue("@app_id", aitApplicationApplicationIdentifier.ApplicationId);
command.Parameters.Add("@ordinal", MySqlDbType.Int32);
command.Parameters.Add("@url_extensiion", MySqlDbType.VarChar);
for (int i = 0; i < its.UrlExtensions.Length; i++)
{
command.Parameters["@ordinal"].Value = i;
command.Parameters["@url_extensiion"].Value = its.UrlExtensions[i];
command.ExecuteNonQuery();
}
}
public bool TestForAitApplication(ApplicationIdentifier aitApplicationApplicationIdentifier)
{
if (_knownAits == null)
_knownAits = new HashSet<ApplicationIdentifier>();
if (_knownAits.Contains(aitApplicationApplicationIdentifier))
return true;
using (MySqlConnection connection = new MySqlConnection(_mcsb.ToString()))
{
connection.Open();
MySqlCommand command = connection.CreateCommand();
command.CommandText = "SELECT dateadded FROM dvb_ait WHERE app_id = @app AND org_id = @org";
command.Parameters.AddWithValue("@app", aitApplicationApplicationIdentifier.ApplicationId);
command.Parameters.AddWithValue("@org", aitApplicationApplicationIdentifier.OrganisationId);
MySqlDataReader dataReader = command.ExecuteReader();
bool result = dataReader.Read();
if (result)
_knownAits.Add(aitApplicationApplicationIdentifier);
dataReader.Close();
connection.Close();
return result;
}
}
public void StoreAitApplication(AitApplication aitApplication)
{
using (MySqlConnection connection = new MySqlConnection(_mcsb.ToString()))
{
connection.Open();
MySqlTransaction transaction = connection.BeginTransaction();
MySqlCommand command = connection.CreateCommand();
command.Transaction = transaction;
command.CommandText =
"INSERT INTO dvb_ait (org_id, app_id, app_control_code, app_priority, service_bound_flag, transport_protocol_label, visibility, initial_path, app_usage_code, jvm_arguments, jvm_base_directory, jvm_class_path_extension, jvm_initial_class, version, is_launchable_from_older_version, launchable_completely_from_cache, not_launchable_from_broadcast, application_storage_priority, storage_property, auto_select, service_id, service_name, version_number, launch_order, storage_priority, ip_connection_required)" +
"VALUES " +
"(@org_id, @app_id, @app_control_code, @app_priority, @service_bound_flag, @transport_protocol_label, @visibility, @initial_path, @app_usage_code, @jvm_arguments, @jvm_base_directory, " +
" @jvm_class_path_extension, @jvm_initial_class, @version, @is_launchable_from_older_version, @launchable_completely_from_cache, @not_launchable_from_broadcast, " +
" @application_storage_priority, @storage_property, @auto_select, @service_id, @service_name, @version_number, @launch_order, @storage_priority, @ip_connection_required)";
command.Parameters.AddWithValue("@org_id", aitApplication.ApplicationIdentifier.OrganisationId);
command.Parameters.AddWithValue("@app_id", aitApplication.ApplicationIdentifier.ApplicationId);
command.Parameters.AddWithValue("@app_control_code", aitApplication.ApplicationControlCode);
command.Parameters.AddWithValue("@app_priority", aitApplication.ApplicationPriority);
command.Parameters.AddWithValue("@service_bound_flag", aitApplication.ServiceBoundFlag);
command.Parameters.AddWithValue("@transport_protocol_label", aitApplication.TransportProtocolLabel);
command.Parameters.AddWithValue("@visibility", aitApplication.Visibility);
command.Parameters.AddWithValue("@initial_path", aitApplication.InitialPath);
command.Parameters.AddWithValue("@app_usage_code", aitApplication.ApplicationUsageCode);
if (aitApplication.JvmArguments != null)
command.Parameters.AddWithValue("@jvm_arguments", String.Join(' ', aitApplication.JvmArguments));
else
command.Parameters.AddWithValue("@jvm_arguments", DBNull.Value);
command.Parameters.AddWithValue("@jvm_base_directory", aitApplication.JvmBaseDirectory);
command.Parameters.AddWithValue("@jvm_class_path_extension", aitApplication.JvmClassPathExtension);
command.Parameters.AddWithValue("@jvm_initial_class", aitApplication.JvmInitialClass);
command.Parameters.AddWithValue("@version", aitApplication.Version);
command.Parameters.AddWithValue("@is_launchable_from_older_version", aitApplication.IsLaunchableFromOlderVersion);
command.Parameters.AddWithValue("@launchable_completely_from_cache", aitApplication.LaunchableCompletelyFromCache);
command.Parameters.AddWithValue("@not_launchable_from_broadcast", aitApplication.NotLaunchableFromBroadcast);
command.Parameters.AddWithValue("@application_storage_priority", aitApplication.ApplicationStoragePriority);
command.Parameters.AddWithValue("@storage_property", aitApplication.StoragePriority);
command.Parameters.AddWithValue("@auto_select", aitApplication.AutoSelect);
command.Parameters.AddWithValue("@service_id", aitApplication.ServiceId);
command.Parameters.AddWithValue("@service_name", aitApplication.ServiceName);
command.Parameters.AddWithValue("@version_number", aitApplication.VersionNumber);
command.Parameters.AddWithValue("@launch_order", aitApplication.LaunchOrder);
command.Parameters.AddWithValue("@storage_priority", aitApplication.StoragePriority);
command.Parameters.AddWithValue("@ip_connection_required", aitApplication.IpConnectionRequired);
command.ExecuteNonQuery();
InsertAitAppNames(transaction, aitApplication);
InsertAitAppProfiles(transaction, aitApplication);
InsertAitBoundaryExtensions(transaction, aitApplication);
InsertAitExternalAuthorizations(transaction, aitApplication);
InsertAitTransportProtocols(transaction, aitApplication);
transaction.Commit();
connection.Close();
_knownAits.Add(aitApplication.ApplicationIdentifier);
}
}
}
}

View File

@ -0,0 +1,337 @@
using skyscraper5.Skyscraper.Scraper.Storage.Split;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using MySqlConnector;
using skyscraper5.Dvb.Descriptors;
using skyscraper5.Dvb.Psi.Model;
using skyscraper5.Teletext;
using skyscraper5.Dvb.DataBroadcasting.IntModel;
using System.IO;
using skyscraper5.Skyscraper;
using skyscraper5.Skyscraper.Headless;
using skyscraper5.Skyscraper.Equipment;
using skyscraper5.Mpeg2.Psi.Model;
using skyscraper5.Skyscraper.Gps;
using skyscraper5.src.Skyscraper.FrequencyListGenerator;
using skyscraper5.Skyscraper.IO.CrazycatStreamReader;
using skyscraper5.Skyscraper.Scraper.Storage.Utilities;
using skyscraper5.src.InteractionChannel.Model;
using skyscraper5.src.InteractionChannel.Model.Descriptors;
using System.Net.NetworkInformation;
using System.Net;
using skyscraper5.src.Skyscraper.Scraper.Dns;
namespace skyscraper5.Data.MySql
{
public partial class MySqlDataStorage : DataStorage
{
private void InsertBatCountryAvailability(MySqlConnection connection, MySqlTransaction transaction, BatBouquet batBouquet)
{
if (batBouquet.CountryAvailabilityDictionary == null)
return;
if (batBouquet.CountryAvailabilityDictionary.Count == 0)
return;
MySqlCommand command = connection.CreateCommand();
command.Transaction = transaction;
command.CommandText =
"INSERT INTO dvb_bat_country_availability (id, country, availability) VALUES (@id, @country, @availability)";
command.Parameters.AddWithValue("@id", batBouquet.BouquetId);
command.Parameters.Add("@country", MySqlDbType.VarChar);
command.Parameters.Add("@availability", MySqlDbType.Bool);
foreach (KeyValuePair<string, bool> keyValuePair in batBouquet.CountryAvailabilityDictionary)
{
command.Parameters["@country"].Value = keyValuePair.Key;
command.Parameters["@availability"].Value = keyValuePair.Value;
command.ExecuteNonQuery();
}
}
private void InsertBatMultilingualName(MySqlConnection connection, MySqlTransaction transaction, BatBouquet batBouquet)
{
if (batBouquet.MultilingualBouquetName == null)
return;
if (batBouquet.MultilingualBouquetName.MultilingualBouquetName == null)
return;
if (batBouquet.MultilingualBouquetName.MultilingualBouquetName.Count == 0)
return;
MySqlCommand command = connection.CreateCommand();
command.Transaction = transaction;
command.CommandText =
"INSERT INTO dvb_bat_multilingual_bouquet_name (id, lang, name) VALUES (@id, @lang, @name)";
command.Parameters.AddWithValue("@id", batBouquet.BouquetId);
command.Parameters.Add("@lang", MySqlDbType.VarChar);
command.Parameters.Add("@name", MySqlDbType.VarChar);
foreach (KeyValuePair<string, string> keyValuePair in batBouquet.MultilingualBouquetName
.MultilingualBouquetName)
{
command.Parameters["@lang"].Value = keyValuePair.Key;
command.Parameters["@name"].Value = keyValuePair.Value;
command.ExecuteNonQuery();
}
}
private BatBouquet GetBatBouquet(MySqlConnection connection, ushort newerBouquetId)
{
MySqlCommand command = connection.CreateCommand();
command.CommandText = "SELECT * FROM dvb_bat WHERE id = @id";
command.Parameters.AddWithValue("@id", newerBouquetId);
MySqlDataReader dataReader = command.ExecuteReader();
BatBouquet result = null;
if (dataReader.Read())
{
ushort id = dataReader.GetUInt16(0);
result = new BatBouquet(id);
DateTime dateAdded = dataReader.GetDateTime(1);
if (!dataReader.IsDBNull(2))
result.BouquetName = dataReader.GetString(2);
if (!dataReader.IsDBNull(3))
{
Guid guid = Guid.Parse(dataReader.GetString(3));
}
if (!dataReader.IsDBNull(4))
result.PrivateDataSpecifier = dataReader.GetUInt32(4);
if (!dataReader.IsDBNull(5))
result.UriLinkageType = dataReader.GetByte(5);
if (!dataReader.IsDBNull(6))
result.Uri = dataReader.GetString(6);
if (!dataReader.IsDBNull(7))
result.MinPollingInterval = dataReader.GetUInt16(7);
if (!dataReader.IsDBNull(8))
result.ControlRemoteAccessOverInternet = dataReader.GetInt32(8);
if (!dataReader.IsDBNull(9))
result.DoNotApplyRevocation = dataReader.GetBoolean(9);
if (!dataReader.IsDBNull(10))
result.DoNotScramble = dataReader.GetBoolean(10);
}
dataReader.Close();
return result;
}
private struct BatTransportStreamCoordinate
{
public ushort BouquetId { get; }
public ushort NetworkId { get; }
public ushort TsId { get; }
public BatTransportStreamCoordinate(ushort bouquetId, ushort networkId, ushort tsId)
{
BouquetId = bouquetId;
NetworkId = networkId;
TsId = tsId;
}
public bool Equals(BatTransportStreamCoordinate other)
{
return BouquetId == other.BouquetId && NetworkId == other.NetworkId && TsId == other.TsId;
}
public override bool Equals(object obj)
{
return obj is BatTransportStreamCoordinate other && Equals(other);
}
public override int GetHashCode()
{
return HashCode.Combine(BouquetId, NetworkId, TsId);
}
}
private HashSet<BatTransportStreamCoordinate> _batTransportStreamCoordinates;
private void InsertBatTransportStreamCountryAvailability(MySqlTransaction transaction, ushort batBouquetBouquetId, BatTransportStream child)
{
if (child.CountryAvailability == null)
return;
if (child.CountryAvailability.Count == 0)
return;
MySqlCommand command = transaction.Connection.CreateCommand();
command.Transaction = transaction;
command.CommandText =
"INSERT INTO dvb_bat_transport_stream_country_availability (bouquet_id, original_network_id, transport_stream_id, country, availability) " +
"VALUES (@bouquet_id, @original_network_id, @transport_stream_id, @country, @availability)";
command.Parameters.AddWithValue("@bouquet_id", batBouquetBouquetId);
command.Parameters.AddWithValue("@original_network_id", child.OriginalNetworkId);
command.Parameters.AddWithValue("@transport_stream_id", child.TransportStreamId);
command.Parameters.Add("@country", MySqlDbType.VarChar);
command.Parameters.Add("@availability", MySqlDbType.Bool);
foreach (KeyValuePair<string, bool> valuePair in child.CountryAvailability)
{
command.Parameters["@country"].Value = valuePair.Key;
command.Parameters["@availability"].Value = valuePair.Value;
command.ExecuteNonQuery();
}
}
private void InsertBatTransportStreamServiceList(MySqlTransaction transaction, ushort batBouquetBouquetId, BatTransportStream child)
{
if (child.ServiceList == null)
return;
if (child.ServiceList.Count == 0)
return;
MySqlCommand command = transaction.Connection.CreateCommand();
command.Transaction = transaction;
command.CommandText =
"INSERT INTO dvb_bat_transport_stream_service_list (bouquet_id, original_network_id, transport_stream_id, service_id, service_type) " +
"VALUES (@bouquet_id, @original_network_id, @transport_stream_id, @service_id, @service_type)";
command.Parameters.AddWithValue("@bouquet_id", batBouquetBouquetId);
command.Parameters.AddWithValue("@original_network_id", child.OriginalNetworkId);
command.Parameters.AddWithValue("@transport_stream_id", child.TransportStreamId);
command.Parameters.Add("@service_id", MySqlDbType.Int32);
command.Parameters.Add("@service_type", MySqlDbType.Int32);
foreach (ServiceListDescriptor.Service service in child.ServiceList)
{
command.Parameters["@service_id"].Value = service.ServiceId;
command.Parameters["@service_type"].Value = (int)service.ServiceType;
command.ExecuteNonQuery();
}
}
public bool TestForBatBouquet(BatBouquet batBouquet)
{
using (MySqlConnection connection = new MySqlConnection(_mcsb.ToString()))
{
connection.Open();
MySqlCommand command = connection.CreateCommand();
command.CommandText = "SELECT dateadded FROM dvb_bat WHERE id = @id";
command.Parameters.AddWithValue("@id", batBouquet.BouquetId);
MySqlDataReader dataReader = command.ExecuteReader();
bool result = dataReader.Read();
dataReader.Close();
connection.Close();
return result;
}
}
public bool UpdateBatBouquet(BatBouquet newer)
{
using (MySqlConnection connection = new MySqlConnection(_mcsb.ToString()))
{
connection.Open();
bool result = false;
BatBouquet older = GetBatBouquet(connection, newer.BouquetId);
if (older.NeedUpdate(newer))
{
MySqlCommand command = connection.CreateCommand();
command.CommandText =
"UPDATE dvb_bat SET name = @name, private_dat_specifier = @private_dat_specifier, uri_linkage_type = @uri_linkage_type, url = @url, min_polling_interval =@min_polling_interval, control_remote_access_over_internet = @control_remote_access_over_internet, do_not_apply_revocation = @do_not_apply_revocation, do_not_scramble = @do_not_scramble WHERE id = @id";
command.Parameters.AddWithValue("@id", newer.BouquetId);
command.Parameters.AddWithValue("@name", newer.BouquetName);
command.Parameters.AddWithValue("@private_dat_specifier", newer.PrivateDataSpecifier);
command.Parameters.AddWithValue("@uri_linkage_type", newer.UriLinkageType);
command.Parameters.AddWithValue("@url", newer.Uri);
command.Parameters.AddWithValue("@min_polling_interval", newer.MinPollingInterval);
command.Parameters.AddWithValue("@control_remote_access_over_internet", newer.ControlRemoteAccessOverInternet);
command.Parameters.AddWithValue("@do_not_apply_revocation", newer.DoNotApplyRevocation);
command.Parameters.AddWithValue("@do_not_scramble", newer.DoNotScramble);
command.ExecuteNonQuery();
result = true;
}
connection.Close();
return result;
}
}
public void StoreBatBouquet(BatBouquet batBouquet)
{
bool hasLinkages = HasLinkages(batBouquet.Linkages);
Guid uuid = hasLinkages ? Guid.NewGuid() : Guid.Empty;
using (MySqlConnection connection = new MySqlConnection(_mcsb.ToString()))
{
connection.Open();
MySqlTransaction transaction = connection.BeginTransaction();
MySqlCommand command = connection.CreateCommand();
command.Transaction = transaction;
command.CommandText =
"INSERT INTO dvb_bat (id, name, uuid, private_dat_specifier, uri_linkage_type, url, min_polling_interval, control_remote_access_over_internet, do_not_apply_revocation, do_not_scramble) " +
"VALUES " +
"(@id, @name, @uuid, @private_dat_specifier, @uri_linkage_type, @url, @min_polling_interval, @control_remote_access_over_internet, @do_not_apply_revocation, @do_not_scramble)";
command.Parameters.AddWithValue("@id", batBouquet.BouquetId);
command.Parameters.AddWithValue("@name", batBouquet.BouquetName);
if (hasLinkages)
command.Parameters.AddWithValue("@uuid", uuid.ToString());
else
command.Parameters.AddWithValue("@uuid", DBNull.Value);
command.Parameters.AddWithValue("@private_dat_specifier", batBouquet.PrivateDataSpecifier);
command.Parameters.AddWithValue("@uri_linkage_type", batBouquet.UriLinkageType);
command.Parameters.AddWithValue("@url", batBouquet.Uri);
command.Parameters.AddWithValue("@min_polling_interval", batBouquet.MinPollingInterval);
command.Parameters.AddWithValue("@control_remote_access_over_internet", batBouquet.ControlRemoteAccessOverInternet);
command.Parameters.AddWithValue("@do_not_apply_revocation", batBouquet.DoNotApplyRevocation);
command.Parameters.AddWithValue("@do_not_scramble", batBouquet.DoNotScramble);
command.ExecuteNonQuery();
if (hasLinkages)
InsertSdtLinkages(connection, uuid, batBouquet.Linkages, transaction);
InsertBatCountryAvailability(connection, transaction, batBouquet);
InsertBatMultilingualName(connection, transaction, batBouquet);
transaction.Commit();
connection.Close();
}
}
public bool TestForBatTransportStream(ushort batBouquetBouquetId, BatTransportStream child)
{
if (_batTransportStreamCoordinates == null)
_batTransportStreamCoordinates = new HashSet<BatTransportStreamCoordinate>();
BatTransportStreamCoordinate coordinate = new BatTransportStreamCoordinate(batBouquetBouquetId, child.OriginalNetworkId, child.TransportStreamId);
if (_batTransportStreamCoordinates.Contains(coordinate))
return true;
using (MySqlConnection connection = new MySqlConnection(_mcsb.ToString()))
{
connection.Open();
MySqlCommand command = connection.CreateCommand();
command.CommandText =
"SELECT dateadded FROM dvb_bat_transport_stream WHERE bouquet_id = @bouquet_id AND original_network_id = @original_network_id AND transport_stream_id = @transport_stream_id";
command.Parameters.AddWithValue("@bouquet_id", batBouquetBouquetId);
command.Parameters.AddWithValue("@original_network_id", child.OriginalNetworkId);
command.Parameters.AddWithValue("@transport_stream_id", child.TransportStreamId);
MySqlDataReader dataReader = command.ExecuteReader();
bool result = dataReader.Read();
if (result)
_batTransportStreamCoordinates.Add(coordinate);
dataReader.Close();
return result;
}
}
public bool UpdateBatTransportStream(ushort batBouquetBouquetId, BatTransportStream child)
{
//It's very unlikely that we'll need to Update BAT TS Info, as these don't contain much.
return false;
}
public void StoreBatTransportStream(ushort batBouquetBouquetId, BatTransportStream child)
{
BatTransportStreamCoordinate coordinate = new BatTransportStreamCoordinate(batBouquetBouquetId, child.OriginalNetworkId, child.TransportStreamId);
_batTransportStreamCoordinates.Add(coordinate);
EnqueueSpeedhack(SpeedhackType.InsertBatTs, batBouquetBouquetId, child);
}
}
}

View File

@ -0,0 +1,83 @@
using MySqlConnector;
using skyscraper5.Mpeg2.Descriptors;
using skyscraper5.Skyscraper.Scraper.Storage.Split;
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 struct CatCoordinate
{
public int Nid { get; }
public int Tsid { get; }
public int Pid { get; }
public CatCoordinate(int nid, int tsid, int pid)
{
Nid = nid;
Tsid = tsid;
Pid = pid;
}
public bool Equals(CatCoordinate other)
{
return Nid == other.Nid && Tsid == other.Tsid && Pid == other.Pid;
}
public override bool Equals(object obj)
{
return obj is CatCoordinate other && Equals(other);
}
public override int GetHashCode()
{
return HashCode.Combine(Nid, Tsid, Pid);
}
}
private HashSet<CatCoordinate> _catCoordinates;
public bool TestForCaSystem(int currentNetworkId, int currentTransportStreamId, int caDescriptorCaPid)
{
CatCoordinate coordinate = new CatCoordinate(currentNetworkId, currentTransportStreamId, caDescriptorCaPid);
if (_catCoordinates == null)
_catCoordinates = new HashSet<CatCoordinate>();
if (_catCoordinates.Contains(coordinate))
return true;
using (MySqlConnection connection = new MySqlConnection(_mcsb.ToString()))
{
connection.Open();
MySqlCommand mySqlCommand = connection.CreateCommand();
mySqlCommand.CommandText =
"SELECT dateadded FROM dvb_cat WHERE nid = @nid AND tsid = @tsid AND ca_pid = @ca_pid";
mySqlCommand.Parameters.Add("@nid", MySqlDbType.Int32);
mySqlCommand.Parameters.Add("@tsid", MySqlDbType.Int32);
mySqlCommand.Parameters.Add("@ca_pid", MySqlDbType.Int32);
mySqlCommand.Parameters["@nid"].Value = currentNetworkId;
mySqlCommand.Parameters["@tsid"].Value = currentTransportStreamId;
mySqlCommand.Parameters["@ca_pid"].Value = caDescriptorCaPid;
MySqlDataReader dataReader = mySqlCommand.ExecuteReader();
bool result = dataReader.Read();
if (result)
_catCoordinates.Add(coordinate);
dataReader.Close();
connection.Close();
return result;
}
}
public void StoreCaSystem(int currentNetworkId, int currentTransportStreamId, CaDescriptor caDescriptor)
{
CatCoordinate coordinate = new CatCoordinate(currentNetworkId, currentTransportStreamId, caDescriptor.CaPid);
_catCoordinates.Add(coordinate);
EnqueueSpeedhack(SpeedhackType.InsertCat, currentNetworkId, currentTransportStreamId, caDescriptor);
}
}
}

View File

@ -0,0 +1,40 @@
using MySqlConnector;
using skyscraper5.Skyscraper.Scraper.Storage.Split;
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 bool _askedForLocation;
private int? _cachedLocation;
public int? GetCurrentLocationId()
{
if (_askedForLocation)
return _cachedLocation;
int? result = null;
using (MySqlConnection connection = new MySqlConnection(_mcsb.ToString()))
{
connection.Open();
MySqlCommand command = connection.CreateCommand();
command.CommandText = "SELECT id FROM skyscraper_locations WHERE current = TRUE";
MySqlDataReader dataReader = command.ExecuteReader();
if (dataReader.Read())
result = dataReader.GetInt32(0);
dataReader.Close();
connection.Close();
}
_askedForLocation = true;
_cachedLocation = result;
return result;
}
}
}

View File

@ -0,0 +1,40 @@
using MySqlConnector;
using skyscraper5.Skyscraper.Scraper.Storage.Split;
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
{
public void DataCarouselModuleMarkComplete(int currentNetworkId, int currentTransportStreamId, int elementaryPid, ushort moduleModuleId, byte moduleModuleVersion)
{
}
public bool IsDsmCcModuleBlacklisted(int currentNetworkId, int currentTransportStreamId, int elementaryPid, ushort moduleId, byte moduleVersion)
{
using (MySqlConnection connection = new MySqlConnection(_mcsb.ToString()))
{
connection.Open();
MySqlCommand command = connection.CreateCommand();
command.CommandText =
"SELECT dateadded FROM dsmcc_blacklist WHERE network_id = @network_id AND transport_stream_id = @transport_stream_id AND pid = @pid AND module_id = @module_id " +
"AND module_version = @module_version";
command.Parameters.AddWithValue("@network_id", currentNetworkId);
command.Parameters.AddWithValue("@transport_stream_id", currentTransportStreamId);
command.Parameters.AddWithValue("@pid", elementaryPid);
command.Parameters.AddWithValue("@module_id", moduleId);
command.Parameters.AddWithValue("@module_version", moduleVersion);
MySqlDataReader dataReader = command.ExecuteReader();
bool result = dataReader.Read();
dataReader.Close();
connection.Close();
return result;
}
}
}
}

View File

@ -0,0 +1,57 @@
using skyscraper5.Skyscraper.Scraper.Storage.Split;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using MySqlConnector;
using skyscraper5.DsmCc.Descriptors;
namespace skyscraper5.Data.MySql
{
public partial class MySqlDataStorage : DataStorage
{
private bool TestForDsmCcEvent(DateTime timestamp, int cnid, int ctsid, int pid, MySqlConnection connection)
{
MySqlCommand command = connection.CreateCommand();
command.CommandText =
"SELECT dateadded FROM dsmcc_events WHERE timestamp = @timestamp AND cnid = @cnid AND ctsid = @ctsid AND pid = @pid";
command.Parameters.AddWithValue("@timestamp", timestamp);
command.Parameters.AddWithValue("@cnid", cnid);
command.Parameters.AddWithValue("@ctsid", ctsid);
command.Parameters.AddWithValue("@pid", pid);
MySqlDataReader dataReader = command.ExecuteReader();
bool result = dataReader.Read();
dataReader.Close();
return result;
}
public void StoreDsmCcDoItNowEvent(DateTime value, int currentNetworkId, int currentTransportStreamId, int programNumber, StreamEventDescriptor descriptorListStreamEventDescriptor, int pid)
{
using (MySqlConnection connection = new MySqlConnection(_mcsb.ToString()))
{
connection.Open();
if (!TestForDsmCcEvent(value, currentNetworkId, currentTransportStreamId, pid, connection))
{
MySqlCommand command = connection.CreateCommand();
command.CommandText =
"INSERT INTO dsmcc_events (timestamp, cnid, ctsid, progno, pid, event_id, npt_event_seconds, npt_event_microseconds, private_data) " +
"VALUES (@timestamp, @cnid, @ctsid, @progno, @pid, @event_id, @npt_event_seconds, @npt_event_microseconds, @private_data)";
command.Parameters.AddWithValue("@timestamp", value);
command.Parameters.AddWithValue("@cnid", currentNetworkId);
command.Parameters.AddWithValue("@ctsid", currentTransportStreamId);
command.Parameters.AddWithValue("@progno", programNumber);
command.Parameters.AddWithValue("@pid", pid);
command.Parameters.AddWithValue("@event_id", descriptorListStreamEventDescriptor.EventId);
command.Parameters.AddWithValue("@npt_event_seconds", descriptorListStreamEventDescriptor.NptEventSeconds);
command.Parameters.AddWithValue("@npt_event_microseconds", descriptorListStreamEventDescriptor.NptEventMicroseconds);
command.Parameters.Add("@private_data", MySqlDbType.TinyBlob);
command.Parameters["@private_data"].Value = descriptorListStreamEventDescriptor.PrivateData;
command.ExecuteNonQuery();
}
connection.Close();
}
}
}
}

View File

@ -0,0 +1,434 @@
using skyscraper5.Skyscraper.Scraper.Storage.Split;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using MySqlConnector;
using skyscraper5.Dvb.Descriptors;
using skyscraper5.Dvb.Psi.Model;
namespace skyscraper5.Data.MySql
{
public partial class MySqlDataStorage : DataStorage
{
private bool TestForEitEvent(MySqlConnection connector, EitEvent eitEvent, MySqlTransaction transaction)
{
MySqlCommand command = connector.CreateCommand();
if (transaction != null)
command.Transaction = transaction;
command.CommandText =
"SELECT dateadded FROM dvb_eit WHERE onid = @onid AND tsid = @tsid AND service_id = @service_id AND start_time = @start_time";
command.Parameters.AddWithValue("@onid", eitEvent.OriginalNetworkId);
command.Parameters.AddWithValue("@tsid", eitEvent.TransportStreamId);
command.Parameters.AddWithValue("@service_id", eitEvent.ServiceId);
command.Parameters.AddWithValue("@start_time", eitEvent.StartTime);
MySqlDataReader dataReader = command.ExecuteReader();
bool result = dataReader.Read();
dataReader.Close();
return result;
}
private void InsertEitCaSystem(MySqlConnection connection, MySqlTransaction transaction, EitEvent eitEvent)
{
if (eitEvent.CaSystems == null)
return;
if (eitEvent.CaSystems.Length == 0)
return;
MySqlCommand command = connection.CreateCommand();
command.Transaction = transaction;
command.CommandText =
"INSERT INTO dvb_eit_ca_systems (onid, tsid, service_id, start_time, ca_system) VALUES (@onid, @tsid, @service_id, @start_time, @ca_system)";
command.Parameters.AddWithValue("@onid", eitEvent.OriginalNetworkId);
command.Parameters.AddWithValue("@tsid", eitEvent.TransportStreamId);
command.Parameters.AddWithValue("@service_id", eitEvent.ServiceId);
command.Parameters.AddWithValue("@start_time", eitEvent.StartTime);
command.Parameters.Add("@ca_system", MySqlDbType.Int32);
foreach (ushort caSystem in eitEvent.CaSystems)
{
command.Parameters["@ca_system"].Value = caSystem;
command.ExecuteNonQuery();
}
}
private void InsertEitComponent(MySqlConnection connection, MySqlTransaction transaction, EitEvent eitEvent)
{
if (eitEvent.Components == null)
return;
if (eitEvent.Components.Count == 0)
return;
MySqlCommand command = connection.CreateCommand();
command.Transaction = transaction;
command.CommandText =
"INSERT INTO dvb_eit_component (onid, tsid, service_id, start_time, text, iso_639_langauge_code, component_tag, component_type, stream_content, stream_content_ext) " +
"VALUES (@onid, @tsid, @service_id, @start_time, @text, @iso_639_langauge_code, @component_tag, @component_type, @stream_content, @stream_content_ext)";
command.Parameters.AddWithValue("@onid", eitEvent.OriginalNetworkId);
command.Parameters.AddWithValue("@tsid", eitEvent.TransportStreamId);
command.Parameters.AddWithValue("@service_id", eitEvent.ServiceId);
command.Parameters.AddWithValue("@start_time", eitEvent.StartTime);
command.Parameters.Add("@text", MySqlDbType.VarChar);
command.Parameters.Add("@iso_639_langauge_code", MySqlDbType.VarChar);
command.Parameters.Add("@component_tag", MySqlDbType.Int16);
command.Parameters.Add("@component_type", MySqlDbType.Int16);
command.Parameters.Add("@stream_content", MySqlDbType.Int32);
command.Parameters.Add("@stream_content_ext", MySqlDbType.Int32);
bool[] usedComponentTags = new bool[256];
foreach (ComponentDescriptor component in eitEvent.Components)
{
if (usedComponentTags[component.ComponentTag])
continue;
usedComponentTags[component.ComponentTag] = true;
command.Parameters["@text"].Value = component.Text;
command.Parameters["@iso_639_langauge_code"].Value = component.Iso639LanguageCode;
command.Parameters["@component_tag"].Value = component.ComponentTag;
command.Parameters["@component_type"].Value = component.ComponentType;
command.Parameters["@stream_content"].Value = component.StreamContent;
command.Parameters["@stream_content_ext"].Value = component.StreamContentExt;
command.ExecuteNonQuery();
}
}
private void InsertEitContent(MySqlConnection connection, MySqlTransaction transaction, EitEvent eitEvent)
{
if (eitEvent.Content == null)
return;
if (eitEvent.Content.Length == 0)
return;
MySqlCommand command = connection.CreateCommand();
command.Transaction = transaction;
command.CommandText =
"INSERT INTO dvb_eit_content (onid, tsid, service_id, start_time, l, m, r) VALUES (@onid, @tsid, @service_id, @start_time, @l, @m, @r)";
command.Parameters.AddWithValue("@onid", eitEvent.OriginalNetworkId);
command.Parameters.AddWithValue("@tsid", eitEvent.TransportStreamId);
command.Parameters.AddWithValue("@service_id", eitEvent.ServiceId);
command.Parameters.AddWithValue("@start_time", eitEvent.StartTime);
command.Parameters.Add("@l", MySqlDbType.Int32);
command.Parameters.Add("@m", MySqlDbType.Int32);
command.Parameters.Add("@r", MySqlDbType.Int32);
foreach (Tuple<int, int, byte> tuple in eitEvent.Content)
{
command.Parameters["@l"].Value = tuple.Item1;
command.Parameters["@m"].Value = tuple.Item2;
command.Parameters["@r"].Value = tuple.Item3;
command.ExecuteNonQuery();
}
}
private void InsertEitCrids(MySqlConnection connection, MySqlTransaction transaction, EitEvent eitEvent)
{
if (eitEvent.Crids == null)
return;
if (eitEvent.Crids.Count == 0)
return;
MySqlCommand command = connection.CreateCommand();
command.Transaction = transaction;
command.CommandText =
"INSERT INTO dvb_eit_crids (onid, tsid, service_id, start_time, ordinal, crid_type, crid_location, crid_bytes) " +
"VALUES (@onid, @tsid, @service_id, @start_time, @ordinal, @crid_type, @crid_location, @crid_bytes)";
command.Parameters.AddWithValue("@onid", eitEvent.OriginalNetworkId);
command.Parameters.AddWithValue("@tsid", eitEvent.TransportStreamId);
command.Parameters.AddWithValue("@service_id", eitEvent.ServiceId);
command.Parameters.AddWithValue("@start_time", eitEvent.StartTime);
command.Parameters.Add("@ordinal", MySqlDbType.Int32);
command.Parameters.Add("@crid_type", MySqlDbType.Int32);
command.Parameters.Add("@crid_location", MySqlDbType.Int32);
command.Parameters.Add("@crid_bytes", MySqlDbType.TinyBlob);
for (int i = 0; i < eitEvent.Crids.Count; i++)
{
command.Parameters["@ordinal"].Value = i;
command.Parameters["@crid_type"].Value = (int)eitEvent.Crids[i].CridType;
command.Parameters["@crid_location"].Value = (int)eitEvent.Crids[i].CridLocation;
command.Parameters["@crid_bytes"].Value = eitEvent.Crids[i].CridBytes;
command.ExecuteNonQuery();
}
}
private void InsertEitEventItems(MySqlConnection connection, MySqlTransaction transaction, EitEvent eitEvent)
{
if (eitEvent.Items == null)
return;
if (eitEvent.Items.Count == 0)
return;
MySqlCommand command = connection.CreateCommand();
command.Transaction = transaction;
command.CommandText =
"INSERT INTO dvb_eit_event_items (onid, tsid, service_id, start_time, ordinal, description, item) " +
"VALUES (@onid, @tsid, @service_id, @start_time, @ordinal, @description, @item)";
command.Parameters.AddWithValue("@onid", eitEvent.OriginalNetworkId);
command.Parameters.AddWithValue("@tsid", eitEvent.TransportStreamId);
command.Parameters.AddWithValue("@service_id", eitEvent.ServiceId);
command.Parameters.AddWithValue("@start_time", eitEvent.StartTime);
command.Parameters.Add("@ordinal", MySqlDbType.Int32);
command.Parameters.Add("@description", MySqlDbType.VarChar);
command.Parameters.Add("@item", MySqlDbType.MediumText);
for (int i = 0; i < eitEvent.Items.Count; i++)
{
command.Parameters["@ordinal"].Value = i;
command.Parameters["@description"].Value = eitEvent.Items[i].Description;
if (eitEvent.Items[i].Description == null)
continue;
command.Parameters["@item"].Value = eitEvent.Items[i].Item;
if (eitEvent.Items[i].Item == null)
continue;
SetNulls(command);
command.ExecuteNonQuery();
}
}
private void InsertEitParentalRatings(MySqlConnection connection, MySqlTransaction transaction, EitEvent eitEvent)
{
if (eitEvent.ParentalRatings == null)
return;
if (eitEvent.ParentalRatings.Length == 0)
return;
MySqlCommand command = connection.CreateCommand();
command.Transaction = transaction;
command.CommandText =
"INSERT INTO dvb_eit_parental_ratings (onid, tsid, service_id, start_time, country, age) " +
"VALUES (@onid, @tsid, @service_id, @start_time, @country, @age)";
command.Parameters.AddWithValue("@onid", eitEvent.OriginalNetworkId);
command.Parameters.AddWithValue("@tsid", eitEvent.TransportStreamId);
command.Parameters.AddWithValue("@service_id", eitEvent.ServiceId);
command.Parameters.AddWithValue("@start_time", eitEvent.StartTime);
command.Parameters.Add("@country", MySqlDbType.VarChar);
command.Parameters.Add("@age", MySqlDbType.Int32);
foreach (Tuple<string, int> parentalRating in eitEvent.ParentalRatings)
{
if (parentalRating == null)
continue;
command.Parameters["@country"].Value = parentalRating.Item1;
command.Parameters["@age"].Value = parentalRating.Item2;
command.ExecuteNonQuery();
}
}
private Queue<EitEvent> queuedEitEvents;
private HashSet<EitCoordinates> eitCoordinatesCacheIndex;
private HashSet<EitCoordinates> eitCoordinatesCache;
private Thread eitWriterThread;
private bool IsEitWriterThreadRunning()
{
if (eitWriterThread == null)
return false;
if (!eitWriterThread.IsAlive)
return false;
return true;
}
private void EitWriterThreadFunction()
{
using (MySqlConnection connection = new MySqlConnection(_mcsb.ToString()))
{
connection.Open();
MySqlTransaction transaction = connection.BeginTransaction();
while (true)
{
EitEvent eitEvent = null;
lock (queuedEitEvents)
{
if (queuedEitEvents.Count == 0)
break;
eitEvent = queuedEitEvents.Dequeue();
if (queuedEitEvents.Count % 100 == 0)
{
//Console.WriteLine("{0} EIT events left to write...", queuedEitEvents.Count);
}
}
if (!TestForEitEvent(connection, eitEvent, transaction))
{
bool hasLinkages = HasLinkages(eitEvent.Linkages);
Guid guid = hasLinkages ? Guid.NewGuid() : Guid.Empty;
MySqlCommand command = connection.CreateCommand();
command.Transaction = transaction;
command.CommandText =
"INSERT INTO dvb_eit " +
" (onid, tsid, service_id, event_id, start_time, duration, running_status, free_ca, iso_639_language_code, event_name, text, extended_text, pdc, private_data_specifier, vps, uuid, reference_service_id, reference_event_id, control_remove_access_over_internet, do_not_apply_revocation, do_not_scramble)" +
"VALUES" +
" (@onid, @tsid, @service_id, @event_id, @start_time, @duration, @running_status, @free_ca, @iso_639_language_code, @event_name, @text, @extended_text, @pdc, @private_data_specifier, " +
" @vps, @uuid, @reference_service_id, @reference_event_id, @control_remove_access_over_internet, @do_not_apply_revocation, @do_not_scramble)";
command.Parameters.AddWithValue("@onid", eitEvent.OriginalNetworkId);
command.Parameters.AddWithValue("@tsid", eitEvent.TransportStreamId);
command.Parameters.AddWithValue("@service_id", eitEvent.ServiceId);
command.Parameters.AddWithValue("@event_id", eitEvent.EventId);
command.Parameters.AddWithValue("@start_time", eitEvent.StartTime);
command.Parameters.AddWithValue("@duration", (int)eitEvent.Duration.TotalSeconds);
command.Parameters.AddWithValue("@running_status", (int)eitEvent.RunningStatus);
command.Parameters.AddWithValue("@free_ca", eitEvent.FreeCa);
command.Parameters.AddWithValue("@iso_639_language_code", eitEvent.Iso639LanguageCode);
command.Parameters.AddWithValue("@event_name", eitEvent.EventName);
command.Parameters.AddWithValue("@text", eitEvent.Text);
if (eitEvent.ExtendedText != null)
command.Parameters.AddWithValue("@extended_text", string.Join("", eitEvent.ExtendedText));
else
command.Parameters.AddWithValue("@extended_text", DBNull.Value);
command.Parameters.AddWithValue("@pdc", eitEvent.Pdc);
command.Parameters.AddWithValue("@private_data_specifier", eitEvent.PrivateDataSpecifier);
command.Parameters.AddWithValue("@vps", eitEvent.VpsString);
if (hasLinkages)
command.Parameters.AddWithValue("@uuid", guid);
else
command.Parameters.AddWithValue("@uuid", DBNull.Value);
command.Parameters.AddWithValue("@reference_service_id", eitEvent.ReferenceServiceId);
command.Parameters.AddWithValue("@reference_event_id", eitEvent.ReferenceEventId);
command.Parameters.AddWithValue("@control_remove_access_over_internet",
eitEvent.ControlRemoteAccessOverInternet);
command.Parameters.AddWithValue("@do_not_apply_revocation", eitEvent.DoNotApplyRevocation);
command.Parameters.AddWithValue("@do_not_scramble", eitEvent.DoNotScramble);
SetNulls(command);
command.ExecuteNonQuery();
InsertEitCaSystem(connection, transaction, eitEvent);
InsertEitComponent(connection, transaction, eitEvent);
InsertEitContent(connection, transaction, eitEvent);
InsertEitCrids(connection, transaction, eitEvent);
InsertEitEventItems(connection, transaction, eitEvent);
InsertEitParentalRatings(connection, transaction, eitEvent);
if (hasLinkages)
InsertSdtLinkages(connection, guid, eitEvent.Linkages, transaction);
}
}
transaction.Commit();
connection.Close();
}
}
private struct EitCoordinates
{
public ushort onid, tsid, sid;
public DateTime starttime;
private EitCoordinates(ushort onid1, ushort tsid1, ushort sid1, int starttimeYear, int starttimeMonth)
{
onid = onid1;
tsid = tsid1;
sid = sid1;
starttime = new DateTime(starttimeYear, starttimeMonth, 1, 0, 0, 0);
}
public EitCoordinates(ushort onid, ushort tsid, ushort sid, DateTime starttime)
{
this.onid = onid;
this.tsid = tsid;
this.sid = sid;
this.starttime = starttime;
}
public EitCoordinates(EitEvent eitEvent)
{
onid = eitEvent.OriginalNetworkId;
tsid = eitEvent.TransportStreamId;
sid = eitEvent.ServiceId;
starttime = eitEvent.StartTime;
}
public EitCoordinates(EitCoordinates coordinatesRounded, DateTime getDateTime)
{
onid = coordinatesRounded.onid;
tsid = coordinatesRounded.tsid;
sid = coordinatesRounded.sid;
starttime = getDateTime;
}
public bool Equals(EitCoordinates other)
{
return onid == other.onid && tsid == other.tsid && sid == other.sid && starttime.Equals(other.starttime);
}
public override bool Equals(object obj)
{
return obj is EitCoordinates other && Equals(other);
}
public override int GetHashCode()
{
return HashCode.Combine(onid, tsid, sid, starttime);
}
public EitCoordinates Round()
{
return new EitCoordinates(onid, tsid, sid, starttime.Year, starttime.Month);
}
}
private void PrecacheEitEntries(EitCoordinates coordinatesRounded)
{
if (eitCoordinatesCache == null)
eitCoordinatesCache = new HashSet<EitCoordinates>();
using (MySqlConnection connection = new MySqlConnection(_mcsb.ToString()))
{
connection.Open();
MySqlCommand command = connection.CreateCommand();
command.CommandText =
"SELECT start_time FROM dvb_eit WHERE onid = @onid AND tsid = @tsid AND service_id = @service_id AND YEAR(start_time) = @year AND MONTH(start_time) = @month";
command.Parameters.AddWithValue("@onid", coordinatesRounded.onid);
command.Parameters.AddWithValue("@tsid", coordinatesRounded.tsid);
command.Parameters.AddWithValue("@service_id", coordinatesRounded.sid);
command.Parameters.AddWithValue("@year", coordinatesRounded.starttime.Year);
command.Parameters.AddWithValue("@month", coordinatesRounded.starttime.Month);
MySqlDataReader dataReader = command.ExecuteReader();
while (dataReader.Read())
{
eitCoordinatesCache.Add(new EitCoordinates(coordinatesRounded, dataReader.GetDateTime(0)));
}
dataReader.Close();
connection.Close();
}
eitCoordinatesCacheIndex.Add(coordinatesRounded);
}
public bool StoreEitEvent(EitEvent eitEvent)
{
EitCoordinates coordinates = new EitCoordinates(eitEvent);
EitCoordinates coordinatesRounded = coordinates.Round();
if (eitCoordinatesCacheIndex == null)
eitCoordinatesCacheIndex = new HashSet<EitCoordinates>();
if (!eitCoordinatesCacheIndex.Contains(coordinatesRounded))
{
PrecacheEitEntries(coordinatesRounded);
}
if (eitCoordinatesCache.Contains(coordinates))
return false;
if (queuedEitEvents == null)
queuedEitEvents = new Queue<EitEvent>();
lock (queuedEitEvents)
{
queuedEitEvents.Enqueue(eitEvent);
}
eitCoordinatesCache.Add(coordinates);
if (!IsEitWriterThreadRunning())
{
eitWriterThread = new Thread(EitWriterThreadFunction);
eitWriterThread.Name = "EIT Writer";
eitWriterThread.Priority = ThreadPriority.Lowest;
eitWriterThread.Start();
}
return true;
}
}
}

View File

@ -0,0 +1,24 @@
using skyscraper5.Dvb.DataBroadcasting.IntModel;
using skyscraper5.Skyscraper.Scraper.Storage.Split;
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
{
public bool TestForIpMacNotification(IpMacNotification notification)
{
throw new NotImplementedException();
}
public void StoreIpMacNotification(IpMacNotification notification)
{
throw new NotImplementedException();
}
}
}

View File

@ -0,0 +1,232 @@
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;
}
}
}

View File

@ -0,0 +1,518 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Net.NetworkInformation;
using MySqlConnector;
using skyscraper5.Docsis.MacManagement;
using skyscraper5.Dvb.DataBroadcasting.IntModel;
using skyscraper5.Dvb.Psi.Model;
using skyscraper5.Dvb.TvAnytime;
using skyscraper5.Mpeg2.Psi.Model;
using skyscraper5.Rds.Messages;
using skyscraper5.Skyscraper;
using skyscraper5.Skyscraper.Equipment;
using skyscraper5.Skyscraper.Gps;
using skyscraper5.Skyscraper.Headless;
using skyscraper5.Skyscraper.IO.CrazycatStreamReader;
using skyscraper5.Skyscraper.Scraper.Storage.Split;
using skyscraper5.Skyscraper.Scraper.Storage.Utilities;
using skyscraper5.src.InteractionChannel.Model.Descriptors;
using skyscraper5.src.InteractionChannel.Model;
using skyscraper5.src.Skyscraper.FrequencyListGenerator;
using skyscraper5.src.Skyscraper.Scraper.Dns;
using skyscraper5.Teletext;
namespace skyscraper5.Data.MySql
{
public partial class MySqlDataStorage : DataStorage
{
private readonly MySqlConnectionStringBuilder _mcsb;
public MySqlDataStorage(MySqlConnectionStringBuilder mcsb)
{
_mcsb = mcsb;
}
public bool TestForKnownRdsData(int currentNetworkId, int currentTransportStreamId, int programNumber)
{
throw new NotImplementedException();
}
public void EnableRdsCollection(int currentNetworkId, int currentTransportStreamId, int programNumber)
{
throw new NotImplementedException();
}
public bool UpdateRdsProgrammeServiceName(int currentNetworkId, int currentTransportStreamId, int programNumber,
string programmeService2)
{
throw new NotImplementedException();
}
public bool UpdateRdsRadioText(int currentNetworkId, int currentTransportStreamId, int programNumber, string text)
{
throw new NotImplementedException();
}
public bool UpdateRdsPty(int currentNetworkId, int currentTransportStreamId, int programNumber, PTY.ProgrammeTypeCodes pty)
{
throw new NotImplementedException();
}
public bool MarkAsRdsTrafficInformationProgramme(int currentNetworkId, int currentTransportStreamId, int programNumber)
{
throw new NotImplementedException();
}
public bool StoreRunningStatus(uint transportStreamId, uint originalNetworkId, uint serviceId, uint eventId,
RunningStatus runningStatus, DateTime currentTime)
{
throw new NotImplementedException();
}
public bool AprsGpsSentence(DateTime currentTime, string packetSender, double? course, double? magneticVariation,
double? speed)
{
throw new NotImplementedException();
}
public DateTime T2MiGetTimestamp(int currentNetworkId, int currentTransportStreamId, int pid)
{
throw new NotImplementedException();
}
public void T2MiSetTimestamp(int currentNetworkId, int currentTransportStreamId, int pid, DateTime resolveTime)
{
throw new NotImplementedException();
}
public bool TestForRelatedContent(EitEvent lEvent, RctLinkInfo rctLinkInfo)
{
throw new NotImplementedException();
}
public void SetRelatedContent(EitEvent lEvent, RctLinkInfo rctLinkInfo)
{
throw new NotImplementedException();
}
public void UiSatellitesAdd(SatellitePosition newPosition)
{
throw new NotImplementedException();
}
public void UiSatellitesDelete(SatellitePosition satellitePosition)
{
throw new NotImplementedException();
}
public bool UiTunerTestFor(TunerMetadata tuner)
{
throw new NotImplementedException();
}
public void UiTunerUpdate(TunerMetadata tuner)
{
throw new NotImplementedException();
}
public void UiTunerInsert(TunerMetadata tuner)
{
throw new NotImplementedException();
}
public void UiTunerGetConfiguration(TunerMetadata foundTuner)
{
throw new NotImplementedException();
}
public bool TestForDocsisUpstreamChannel(PhysicalAddress mmmSource, uint mmmFrequency, int currentLocation)
{
throw new NotImplementedException();
}
public void StoreDocsisUpstreamChannel(UpstreamChannelDescriptor mmm, int currentLocation)
{
throw new NotImplementedException();
}
public bool TestForDocsisDownstreamChannel(PhysicalAddress physicalAddress, MacDomainDescriptor.DownstreamActiveChannel downstreamActiveChannel,
int currentLocation)
{
throw new NotImplementedException();
}
public void StoreDocsisDownstreamChannel(PhysicalAddress physicalAddress, MacDomainDescriptor.DownstreamActiveChannel downstreamActiveChannel,
int currentLocation)
{
throw new NotImplementedException();
}
public bool SetCmtsIp(PhysicalAddress arpHeaderSenderHardwareAddress, IPAddress arpHeaderSenderProtocolAddress)
{
throw new NotImplementedException();
}
public void StoreDocsisParticipant(PhysicalAddress pa, int currentLocation)
{
throw new NotImplementedException();
}
public void WaitForCompletion()
{
if (IsEitWriterThreadRunning())
{
eitWriterThread.Join();
}
eitCoordinatesCache?.Clear();
eitCoordinatesCacheIndex?.Clear();
knownPmts?.Clear();
knownPats?.Clear();
_catCoordinates?.Clear();
_untGroupCoordinates?.Clear();
_compatibilityCoordinates?.Clear();
_platformCoordinates?.Clear();
_batTransportStreamCoordinates?.Clear();
_sdtCoordinates?.Clear();
_tdtCoordinates?.Clear();
_totCoordinates?.Clear();
_tsdtCoordinates?.Clear();
if (IsSpeedhackThreadAlive())
{
_waitingForSpeedhacksToComplete = true;
_speedhackThread.Join();
_speedhackQueue.Clear();
_waitingForSpeedhacksToComplete = false;
}
_sdtUpdateCoordinates?.Clear();
}
public void UiSetVersion(int version)
{
throw new NotImplementedException();
}
public bool StoreTeletextPage(int networkId, int transportStreamId, ushort programNumber, TeletextMagazine magazine, DateTime timestamp)
{
throw new NotImplementedException();
}
public void ImportMarkFileAsKnown(FileInfo fi, TimeSpan duration, int tstype)
{
throw new NotImplementedException();
}
public bool T2MiTestForTransmitter(int? currentNetworkId, int? currentTransportStreamId, int relatedPid, ushort txIdentifier)
{
throw new NotImplementedException();
}
public void T2MiRememberTransmitter(int? currentNetworkId, int? currentTransportStreamId, int relatedPid, ushort txIdentifier)
{
throw new NotImplementedException();
}
public void T2MiSetTransmitterTimeOffset(int? currentNetworkId, int? currentTransportStreamId, int relatedPid, ushort txIdentifier, ushort timeOffset)
{
throw new NotImplementedException();
}
public List<LnbType> UiLnbTypesListAll()
{
throw new NotImplementedException();
}
public void UiLnbTypesAdd(LnbType defaultLnbType)
{
throw new NotImplementedException();
}
public List<DishType> UiDishTypesListAll()
{
throw new NotImplementedException();
}
public void UiDishTypesAdd(DishType defaultDishType)
{
throw new NotImplementedException();
}
public object[] GetPluginConnector()
{
throw new NotImplementedException();
}
public void Ping()
{
throw new NotImplementedException();
}
public IEnumerable<Tuple<int, int, ProgramMapping>> SelectAllPmt()
{
throw new NotImplementedException();
}
public SdtService SelectSdtById(int networkId, int tsId, ushort programMappingProgramNumber)
{
throw new NotImplementedException();
}
public IEnumerable<Tuple<int, int, SdtService>> SelectAllSdt()
{
throw new NotImplementedException();
}
public void BeamsDisableAll()
{
throw new NotImplementedException();
}
public void BeamsEnable(int id, float satpos, string name, DateTime processTimestamp)
{
throw new NotImplementedException();
}
public void BeamFootprintStore(int databasePointerId, DateTime databasePointerBeamsProcessTimestamp, string name, string getPolygonString, string id)
{
throw new NotImplementedException();
}
public bool TestForBeamFootprint(int databasePointerId, DateTime databasePointerBeamsProcessTimestamp, string name, string id)
{
throw new NotImplementedException();
}
public void BeamsDisableSpecific(int databasePointerId, float databasePointerSatpos, string databasePointerName, DateTime databasePointerBeamsProcessTimestamp)
{
throw new NotImplementedException();
}
public IEnumerable<SatelliteBeam> BeamsSelectEnabled()
{
throw new NotImplementedException();
}
public List<SatelliteBeamFootprint> BeamsSelectFootprints(int satelliteBeamId, DateTime satelliteBeamProcessTimestamp)
{
throw new NotImplementedException();
}
public void InsertBlindscanJob(DbBlindscanJob jobInDb)
{
throw new NotImplementedException();
}
public void UpdateJobState(DbBlindscanJob jobInDb)
{
throw new NotImplementedException();
}
public void InsertSearchResult(DbBlindscanJob jobInDb, bool satellite, SearchResult searchResult, int polarityIndex, SearchResult2 searchResult2)
{
throw new NotImplementedException();
}
public void UpdateTransponderState(DbBlindscanJob jobInDb, bool satellite, SearchResult searchResult, BlindscanResultState blindscanResultState, SearchResult2 searchResult2)
{
throw new NotImplementedException();
}
public void InsertTransponderService(DbBlindscanJob jobInDb, bool resultSatellite, SearchResult resultSr1, SearchResult2 resultSr2, HumanReadableService humanReadableService)
{
throw new NotImplementedException();
}
public bool TestForIncompleteJob()
{
throw new NotImplementedException();
}
public DbBlindscanJob GetPastBlindscanJob(long offset)
{
throw new NotImplementedException();
}
public void FailDsmCcDownload(DatabaseKeyDsmCcModule key, double value)
{
throw new NotImplementedException();
}
public IReadOnlyList<string> ListImportFileByTag1(int tag1)
{
throw new NotImplementedException();
}
public bool TestForTerminalBurstTimePlan(ushort interactiveNetworkId, uint groupId, uint logonId)
{
throw new NotImplementedException();
}
public void StoreTerminalBurstTimePlan(ushort interactiveNetworkId, uint gtoupId, uint superframeCount, uint frameNumber, Tbtp.TbtpFrame.BtpEntity btp)
{
throw new NotImplementedException();
}
public bool TestForCmtEntry(ushort interactiveNetworkId, Cmt.CmtEntry entry)
{
throw new NotImplementedException();
}
public void InsertCmtEntry(ushort interactiveNetworkId, Cmt.CmtEntry entry)
{
throw new NotImplementedException();
}
public int GetRmtTransmissionStandard(ushort networkId)
{
throw new NotImplementedException();
}
public byte[] GetTmst(ushort interactiveNetworkId)
{
throw new NotImplementedException();
}
public void InsertTmst(ushort interactiveNetworkId, byte[] modes)
{
throw new NotImplementedException();
}
public void UpdateTmst(ushort interactiveNetworkId, byte[] modes)
{
throw new NotImplementedException();
}
public bool TestForRmtLinkage(_0x4a_LinkageDescriptor linkage)
{
throw new NotImplementedException();
}
public void InsertRmtLinkage(_0x4a_LinkageDescriptor linkage)
{
throw new NotImplementedException();
}
public bool TestForRmtTransportStream(ushort networkId, Rmt.TransportStream transportStream)
{
throw new NotImplementedException();
}
public void InsertRmtTransportStream(ushort networkId, Rmt.TransportStream transportStream)
{
throw new NotImplementedException();
}
public bool TestForSuperframeComposition(ushort interactiveNetworkId, Sct.Superframe superframe)
{
throw new NotImplementedException();
}
public void StoreSuperframeComposition(ushort interactiveNetworkId, Sct.Superframe superframe)
{
throw new NotImplementedException();
}
public bool TestForFrameComposition(ushort interactiveNetworkId, Fct.Frame frame)
{
throw new NotImplementedException();
}
public void InsertFctFrame(ushort interactiveNetworkId, Fct.Frame frame)
{
throw new NotImplementedException();
}
public bool TestForSatellitePosition(ushort interactiveNetworkId, Spt.Satellite satellite)
{
throw new NotImplementedException();
}
public void StoreSatellitePosition(ushort interactiveNetworkId, Spt.Satellite satellite)
{
throw new NotImplementedException();
}
public void CreateTim(PhysicalAddress mac)
{
throw new NotImplementedException();
}
public bool TestForTim(PhysicalAddress mac)
{
throw new NotImplementedException();
}
public bool CorrectTim(PhysicalAddress mac, _0xa1_CorrectionMessageDescriptor cmd)
{
throw new NotImplementedException();
}
public bool ContentionTim(PhysicalAddress mac, _0xab_ContentionControlDescriptor ccdNew)
{
throw new NotImplementedException();
}
public bool CorrectionControlTim(PhysicalAddress mac, _0xac_CorrectionControlDescriptor descriptor)
{
throw new NotImplementedException();
}
public bool NetworkLayerInfoTim(PhysicalAddress mac, _0xa0_NetworkLayerInfoDescriptor nlid, DateTime timestamp)
{
throw new NotImplementedException();
}
public IEnumerable<DbBlindscanJob> GetDbBlindscanJobs()
{
throw new NotImplementedException();
}
public void DeleteBlindscanJob(Guid guid)
{
throw new NotImplementedException();
}
public void DeleteBlindscanResults(Guid jobGuid, int i)
{
throw new NotImplementedException();
}
public void MoveBlScanResultsToAnotherJob(Guid jobGuid1, Guid jobGuid2, int j)
{
throw new NotImplementedException();
}
public long DnsCountA()
{
throw new NotImplementedException();
}
public string DnsIpToName(IPAddress source)
{
throw new NotImplementedException();
}
public void RememberDnsRecord(DnsRecord record)
{
throw new NotImplementedException();
}
public bool TestForIp(IPAddress iP)
{
throw new NotImplementedException();
}
}
}

View File

@ -0,0 +1,999 @@
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<string, string> 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<NitTransportStreamCoordinate> _nitTransportStreamCoordinates;
private HashSet<NitTransportStreamCoordinate> _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>();
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>();
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<NitTransportStream> 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();
}
}
}
}

View File

@ -0,0 +1,58 @@
using skyscraper5.Skyscraper.Scraper.Storage.Split;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using MySqlConnector;
namespace skyscraper5.Data.MySql
{
public partial class MySqlDataStorage : DataStorage
{
private bool TestForPatEntry(int currentNetworkId, int currentTransportStreamId, ushort programId, MySqlConnection connection)
{
PmtCoordinate coordinate = new PmtCoordinate(currentNetworkId, currentTransportStreamId, programId);
MySqlCommand command = connection.CreateCommand();
command.CommandText =
"SELECT dateadded FROM dvb_pat WHERE cnid = @cnid AND ctsid = @ctsid AND program_id = @program_id";
command.Parameters.AddWithValue("@cnid", currentNetworkId);
command.Parameters.AddWithValue("@ctsid", currentTransportStreamId);
command.Parameters.AddWithValue("@program_id", programId);
MySqlDataReader dataReader = command.ExecuteReader();
bool result = dataReader.Read();
if (result)
{
knownPats.Add(coordinate);
}
dataReader.Close();
return result;
}
private HashSet<PmtCoordinate> knownPats;
public bool StorePatEntry(int currentNetworkId, int currentTransportStreamId, int pmtPid, ushort programId)
{
if (knownPats == null)
knownPats = new HashSet<PmtCoordinate>();
PmtCoordinate coordinate = new PmtCoordinate(currentNetworkId, currentTransportStreamId, programId);
if (knownPats.Contains(coordinate))
return false;
using (MySqlConnection connection = new MySqlConnection(_mcsb.ToString()))
{
connection.Open();
int result = 0;
if (!TestForPatEntry(currentNetworkId, currentTransportStreamId, programId, connection))
{
EnqueueSpeedhack(SpeedhackType.StorePat, currentNetworkId, currentTransportStreamId, pmtPid, programId);
knownPats.Add(coordinate);
}
connection.Close();
return result > 0;
}
}
}
}

View File

@ -0,0 +1,557 @@
using skyscraper5.Skyscraper.Scraper.Storage.Split;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using MySqlConnector;
using skyscraper5.Dvb.Descriptors;
using skyscraper5.Dvb.Descriptors.Extension;
using skyscraper5.Mpeg2.Descriptors;
using skyscraper5.Mpeg2.Psi.Model;
using System.IO;
using static skyscraper5.Dvb.Descriptors.ApplicationSignallingDescriptor;
namespace skyscraper5.Data.MySql
{
public partial class MySqlDataStorage : DataStorage
{
private bool TestForPmtStream(MySqlTransaction transaction, int onid, int tsid, int progno, int pid)
{
MySqlCommand command = transaction.Connection.CreateCommand();
command.Transaction = transaction;
command.CommandText =
"SELECT dateadded FROM dvb_pmt_streams WHERE onid = @onid AND tsid = @tsid AND program_number = @program_number AND elementary_pid = @elementary_pid";
command.Parameters.AddWithValue("@onid", onid);
command.Parameters.AddWithValue("@tsid", tsid);
command.Parameters.AddWithValue("@program_number", progno);
command.Parameters.AddOrSet("@elementary_pid", pid);
MySqlDataReader dataReader = command.ExecuteReader();
bool result = dataReader.Read();
dataReader.Close();
return result;
}
private void InsertPmtStreams(MySqlConnection connection, ProgramMapping mapping, int onid, int tsid,
MySqlTransaction mySqlTransaction)
{
if (mapping.Streams == null)
return;
if (mapping.Streams.Count == 0)
return;
MySqlCommand command = connection.CreateCommand();
command.CommandText =
"INSERT INTO dvb_pmt_streams (onid, tsid, program_number, stream_type, elementary_pid, component_tag, audio_type, iso_639_language_code, carousel_format_id, carousel_id, data_broadcast_id, data_broadcast_selector, supplementary_independant_stream, editorial_classification, supplementary_language_code, asvc, bsid, component_type, main_id, frame_rate, mpeg1_only_flag, chroma_format, constrained_parameter_flag, frame_rate_extension_flag, multiple_framerate_flag, profile_and_level_indicator, still_picture_flag, alignment_type, maximum_bitrate, audio_stream_id, free_format, layer, variable_rate_audio, constraint_set0_flag, avc_24hour_picture_flag, avc_compatible_flags, avc_still_present, constraint_set1_flag, constraint_set2_flag, constraint_set3_flag, constraint_set4_flag, constraint_set5_flag, frame_packing_sei_not_present, level_idc, profile_rdc, ca_pid, ca_system_id, ca_private_data, private_data_specifier, format_identifier, additional_identification_info, association_tag_selector, association_tag_transaction_id, association_tag_use, association_tag_private_data, association_tag_timeout, aac_type, aac_additional_info, aac_profile_and_level, saoc_de_flag, ancillary_data_identifier, mix_info_exists, substream1, substream2, substream3, copied_44bits, frame_only_constraint_flag, hdr_wcg_idc, hevc_24hr_picture_present_flag, hevc_still_present_flag, interlaced_source_flag, non_packed_constraint_flag, profile_compatibility_indication, profile_idc, profile_space, progressive_source_flag, sub_pic_hrd_params_not_present_flag, temporal_id_max, tier_flag, temporal_id_min, ac4_channel_mode, ac4_dialog_enhancement, ac4_dsi, leak_valid_flag, sb_leak_rate, sb_size, private_data_indicator, _90khz_flag, picture_and_timing_info_present_flag, hdr_management_valid_flag, k, n, num_units_in_tick, target_schedule_idx, target_schedule_idx_not_present_flag, adaption_field_data_identifier, fixed_frame_rate_flag, picture_to_display_conversion_flag, temporal_poc_flag, mpeg4_audio_profile_and_level, aac_channel_configuration, aac_profile, aac_additional_information, scrambling_mode, related_content_descriptor_present, num_t2mi_streams, t2mi_stream_id, pcr_iscr_common_clock_flag) " +
"VALUES " +
"(@onid, @tsid, @program_number, " +
"@stream_type, @elementary_pid, @component_tag, @audio_type, @iso_639_language_code, @carousel_format_id, @carousel_id, @data_broadcast_id, @data_broadcast_selector, " +
"@supplementary_independant_stream, @editorial_classification, @supplementary_language_code, @asvc, @bsid, @component_type, @main_id, @frame_rate, @mpeg1_only_flag, " +
"@chroma_format, @constrained_parameter_flag, @frame_rate_extension_flag, @multiple_framerate_flag, @profile_and_level_indicator, @still_picture_flag, @alignment_type, " +
"@maximum_bitrate, @audio_stream_id, @free_format, @layer, @variable_rate_audio, @constraint_set0_flag, @avc_24hour_picture_flag, @avc_compatible_flags, @avc_still_present, @constraint_set1_flag, @constraint_set2_flag, @constraint_set3_flag, @constraint_set4_flag, @constraint_set5_flag, @frame_packing_sei_not_present, @level_idc, @profile_rdc, @ca_pid, @ca_system_id, @ca_private_data, @private_data_specifier, @format_identifier, @additional_identification_info, @association_tag_selector, @association_tag_transaction_id, @association_tag_use, @association_tag_private_data, @association_tag_timeout, @aac_type, @aac_additional_info, @aac_profile_and_level, @saoc_de_flag, @ancillary_data_identifier, @mix_info_exists, @substream1, @substream2, @substream3, @copied_44bits, @frame_only_constraint_flag, @hdr_wcg_idc, @hevc_24hr_picture_present_flag, @hevc_still_present_flag, @interlaced_source_flag, @non_packed_constraint_flag, @profile_compatibility_indication, @profile_idc, @profile_space, @progressive_source_flag, @sub_pic_hrd_params_not_present_flag, @temporal_id_max, @tier_flag, @temporal_id_min, @ac4_channel_mode, @ac4_dialog_enhancement, @ac4_dsi, @leak_valid_flag, @sb_leak_rate, @sb_size, @private_data_indicator, @_90khz_flag, @picture_and_timing_info_present_flag, @hdr_management_valid_flag, @k, @n, @num_units_in_tick, @target_schedule_idx, @target_schedule_idx_not_present_flag, @adaption_field_data_identifier, @fixed_frame_rate_flag, @picture_to_display_conversion_flag, @temporal_poc_flag, @mpeg4_audio_profile_and_level, @aac_channel_configuration, @aac_profile, @aac_additional_information, @scrambling_mode, @related_content_descriptor_present, @num_t2mi_streams, @t2mi_stream_id, @pcr_iscr_common_clock_flag)";
command.Parameters.AddWithValue("@onid", onid);
command.Parameters.AddWithValue("@tsid", tsid);
command.Parameters.AddWithValue("@program_number", mapping.ProgramNumber);
foreach (ProgramMappingStream stream in mapping.Streams)
{
if (TestForPmtStream(mySqlTransaction, onid, tsid, mapping.ProgramNumber, stream.ElementaryPid))
continue;
command.Parameters.AddOrSet("@stream_type",(int)stream.StreamType);
command.Parameters.AddOrSet("@elementary_pid", stream.ElementaryPid);
command.Parameters.AddOrSet("@component_tag", stream.ComponentTag);
command.Parameters.AddOrSet("@audio_type", stream.AudioType);
command.Parameters.AddOrSet("@iso_639_language_code", stream.Iso639LanguageCode);
command.Parameters.AddOrSet("@carousel_format_id", stream.CarouselFormatId);
command.Parameters.AddOrSet("@carousel_id", stream.CarouselId);
command.Parameters.AddOrSet("@data_broadcast_id", stream.DataBroadcastId);
command.Parameters.AddOrSet("@data_broadcast_selector", stream.DataBroadcastSelector);
command.Parameters.AddOrSet("@supplementary_independant_stream", stream.SupplementaryIndependantStream);
command.Parameters.AddOrSet("@editorial_classification", stream.EditorialClassification);
command.Parameters.AddOrSet("@supplementary_language_code", stream.SupplementaryLanguageCode);
command.Parameters.AddOrSet("@asvc", stream.Asvc);
command.Parameters.AddOrSet("@bsid", stream.BSID);
command.Parameters.AddOrSet("@component_type", stream.ComponentType);
command.Parameters.AddOrSet("@main_id", stream.MainId);
command.Parameters.AddOrSet("@frame_rate", stream.FrameRate);
command.Parameters.AddOrSet("@mpeg1_only_flag", stream.Mpeg1OnlyFlag);
command.Parameters.AddOrSet("@chroma_format", stream.ChromaFormat);
command.Parameters.AddOrSet("@constrained_parameter_flag", stream.ConstrainedParameterFlag);
command.Parameters.AddOrSet("@frame_rate_extension_flag", stream.FrameRateExtensionFlag);
command.Parameters.AddOrSet("@multiple_framerate_flag", stream.MultipleFramerateFlag);
command.Parameters.AddOrSet("@profile_and_level_indicator", stream.ProfileAndLevelIndication);
command.Parameters.AddOrSet("@still_picture_flag", stream.StillPictureFlag);
command.Parameters.AddOrSet("@alignment_type", stream.AlignmentType);
command.Parameters.AddOrSet("@maximum_bitrate", stream.MaximumBitrate);
command.Parameters.AddOrSet("@audio_stream_id", stream.AudioStreamId);
command.Parameters.AddOrSet("@free_format", stream.FreeFormat);
command.Parameters.AddOrSet("@layer", stream.Layer);
command.Parameters.AddOrSet("@variable_rate_audio", stream.VariableRateAudio);
command.Parameters.AddOrSet("@constraint_set0_flag", stream.ConstraintSet0Flag);
command.Parameters.AddOrSet("@avc_24hour_picture_flag", stream.Avc24HourPictureFlag);
//@avc_compatible_flags, @avc_still_present, @constraint_set1_flag, @constraint_set2_flag, @constraint_set3_flag, @constraint_set4_flag, @constraint_set5_flag,
//@frame_packing_sei_not_present, @level_idc, @profile_rdc, @ca_pid, @ca_system_id, @ca_private_data, @private_data_specifier, @format_identifier, @additional_identification_info,
//@association_tag_selector, @association_tag_transaction_id, @association_tag_use, @association_tag_private_data, @association_tag_timeout, @aac_type, @aac_additional_info,
//@aac_profile_and_level, @saoc_de_flag, @ancillary_data_identifier, @mix_info_exists, @substream1, @substream2,
command.Parameters.AddOrSet("@avc_compatible_flags", stream.AvcCompatibleFlags);
command.Parameters.AddOrSet("@avc_still_present", stream.AvcStillPresent);
command.Parameters.AddOrSet("@constraint_set1_flag", stream.ConstraintSet1Flag);
command.Parameters.AddOrSet("@constraint_set2_flag", stream.ConstraintSet2Flag);
command.Parameters.AddOrSet("@constraint_set3_flag", stream.ConstraintSet3Flag);
command.Parameters.AddOrSet("@constraint_set4_flag", stream.ConstraintSet4Flag);
command.Parameters.AddOrSet("@constraint_set5_flag", stream.ConstraintSet5Flag);
command.Parameters.AddOrSet("@frame_packing_sei_not_present", stream.FramePackingSeiNotPresent);
command.Parameters.AddOrSet("@level_idc", stream.LevelIdc);
command.Parameters.AddOrSet("@profile_rdc", stream.ProfileIdc);
command.Parameters.AddOrSet("@ca_pid", stream.CaPid);
command.Parameters.AddOrSet("@ca_system_id", stream.CaSystemId);
command.Parameters.AddOrSet("@ca_private_data", stream.CaPrivateData);
command.Parameters.AddOrSet("@private_data_specifier", stream.PrivateDataSpecifier);
command.Parameters.AddOrSet("@format_identifier", stream.FormatIdentifier);
command.Parameters.AddOrSet("@additional_identification_info", stream.AdditionalIdentificationInfo);
command.Parameters.AddOrSet("@association_tag_selector", stream.AssociationTagSelector);
command.Parameters.AddOrSet("@association_tag_transaction_id", stream.AssociationTagTransactionId);
command.Parameters.AddOrSet("@association_tag_use", stream.AssociationTagUse);
command.Parameters.AddOrSet("@association_tag_private_data", stream.AssociationTagPrivateData);
command.Parameters.AddOrSet("@association_tag_timeout", stream.AssociationTagTimeOut);
command.Parameters.AddOrSet("@aac_type", stream.AacType);
command.Parameters.AddOrSet("@aac_additional_info", stream.AacAdditionalInfo);
command.Parameters.AddOrSet("@aac_profile_and_level", stream.AacProfileAndLevel);
command.Parameters.AddOrSet("@saoc_de_flag", stream.SaocDeFlag);
if (stream.AncillaryDataDescriptor != null)
{
command.Parameters.AddOrSet("@ancillary_data_identifier", stream.AncillaryDataDescriptor.AncillaryDataIdentifier);
}
else
{
command.Parameters.AddOrSet("@ancillary_data_identifier",(byte)0);
command.Parameters.AddOrSet("@ancillary_data_identifier",DBNull.Value);
}
command.Parameters.AddOrSet("@mix_info_exists", stream.MixInfoExists);
command.Parameters.AddOrSet("@substream1", stream.Substream1);
command.Parameters.AddOrSet("@substream2", stream.Substream2);
//@substream3, @copied_44bits, @frame_only_constraint_flag, @hdr_wcg_idc, @hevc_24hr_picture_present_flag, @hevc_still_present_flag, @interlaced_source_flag,
//@non_packed_constraint_flag, @profile_compatibility_indication, @profile_idc, @profile_space, @progressive_source_flag, @sub_pic_hrd_params_not_present_flag,
//@temporal_id_max, @tier_flag, @temporal_id_min, @ac4_channel_mode, @ac4_dialog_enhancement, @ac4_dsi, @leak_valid_flag, @sb_leak_rate, @sb_size, @private_data_indicator,
//@_90khz_flag, @picture_and_timing_info_present_flag, @hdr_management_valid_flag, @k, @n, @num_units_in_tick, @target_schedule_idx, @target_schedule_idx_not_present_flag,
//@adaption_field_data_identifier, @fixed_frame_rate_flag, @picture_to_display_conversion_flag, @temporal_poc_flag, @mpeg4_audio_profile_and_level
command.Parameters.AddOrSet("@substream3", stream.Substream3);
command.Parameters.AddOrSet("@copied_44bits", stream.Copied44bits);
command.Parameters.AddOrSet("@frame_only_constraint_flag", stream.FrameOnlyConstraintFlag);
command.Parameters.AddOrSet("@hdr_wcg_idc", stream.HdrWcgIdc);
command.Parameters.AddOrSet("@hevc_24hr_picture_present_flag", stream.Hevc24hrPicturePresentFlag);
command.Parameters.AddOrSet("@hevc_still_present_flag", stream.HevcStillPresentFlag);
command.Parameters.AddOrSet("@interlaced_source_flag", stream.InterlacedSourceFlag);
command.Parameters.AddOrSet("@non_packed_constraint_flag", stream.NonPackedConstraintFlag);
command.Parameters.AddOrSet("@profile_compatibility_indication", stream.ProfileCompatibilityIndication);
command.Parameters.AddOrSet("@profile_idc", stream.ProfileIdc);
command.Parameters.AddOrSet("@profile_space", stream.ProfileSpace);
command.Parameters.AddOrSet("@progressive_source_flag", stream.ProgressiveSourceFlag);
command.Parameters.AddOrSet("@sub_pic_hrd_params_not_present_flag", stream.SubPicHrdParamsNotPresentFlag);
command.Parameters.AddOrSet("@temporal_id_max", stream.TemporalIdMax);
command.Parameters.AddOrSet("@tier_flag", stream.TierFlag);
command.Parameters.AddOrSet("@temporal_id_min", stream.TemporalIdMin);
command.Parameters.AddOrSet("@ac4_channel_mode", stream.Ac4ChannelMode);
command.Parameters.AddOrSet("@ac4_dialog_enhancement", stream.Ac4DialogEnhancement);
command.Parameters.AddOrSet("@ac4_dsi", stream.Ac4Dsi);
command.Parameters.AddOrSet("@leak_valid_flag", stream.LeakValidFlag);
command.Parameters.AddOrSet("@sb_leak_rate", stream.SbLeakRate);
command.Parameters.AddOrSet("@sb_size", stream.SbSize);
command.Parameters.AddOrSet("@private_data_indicator", stream.PrivateDataIndicator);
command.Parameters.AddOrSet("@_90khz_flag", stream._90khzFlag);
command.Parameters.AddOrSet("@picture_and_timing_info_present_flag", stream.PictureAndTimingInfoPresentFlag);
command.Parameters.AddOrSet("@hdr_management_valid_flag", stream.HdrManagementValidFlag);
command.Parameters.AddOrSet("@k", stream.K);
command.Parameters.AddOrSet("@n", stream.N);
command.Parameters.AddOrSet("@num_units_in_tick", stream.NumUnitsInTick);
command.Parameters.AddOrSet("@target_schedule_idx", stream.TargetScheduleIdx);
command.Parameters.AddOrSet("@target_schedule_idx_not_present_flag", stream.TargetScheduleIdxNotPresentFlag);
command.Parameters.AddOrSet("@adaption_field_data_identifier", stream.AdaptionFieldDataIdentifier);
command.Parameters.AddOrSet("@fixed_frame_rate_flag", stream.FixedFrameRateFlag);
command.Parameters.AddOrSet("@picture_to_display_conversion_flag", stream.PictureToDisplayConversionFlag);
command.Parameters.AddOrSet("@temporal_poc_flag", stream.TemporalPocFlag);
command.Parameters.AddOrSet("@mpeg4_audio_profile_and_level", stream.Mpeg4AudioProfileAndLevel);
//@, @, @, @, @, @, @, @pcr_iscr_common_clock_flag)";
command.Parameters.AddOrSet("@aac_channel_configuration", stream.AacChannelConfiguration);
command.Parameters.AddOrSet("@aac_profile", stream.AacProfile);
command.Parameters.AddOrSet("@aac_additional_information", stream.AacAdditionalInformation);
command.Parameters.AddOrSet("@scrambling_mode", stream.ScramblingMode);
command.Parameters.AddOrSet("@related_content_descriptor_present", stream.RelatedContentDescriptorPresent);
command.Parameters.AddOrSet("@num_t2mi_streams", stream.NumT2MiStreams);
command.Parameters.AddOrSet("@t2mi_stream_id", stream.T2MiStreamId);
command.Parameters.AddOrSet("@pcr_iscr_common_clock_flag", stream.PcrIscrCommonClockFlag);
command.Transaction = mySqlTransaction;
SetNulls(command);
command.ExecuteNonQuery();
InsertPmtStreamsApplications(onid, tsid, stream, connection, mySqlTransaction);
InsertPmtStreamsAudioPreselection(onid, tsid, stream, mySqlTransaction);
InsertPmtStreamsFlexmux(onid, tsid, stream, connection);
InsertPmtStreamsIp(onid, tsid, stream, connection);
InsertPmtStreamsSubtitle(onid, tsid, stream, connection, mySqlTransaction);
InsertPmtStreamsTeletext(onid, tsid, stream, connection, false, mySqlTransaction);
InsertPmtStreamsTeletext(onid, tsid, stream, connection, true, mySqlTransaction);
InsertPmtStreamsVbi(onid, tsid, stream, mySqlTransaction);
}
}
private void InsertPmtStreamsVbi(int onid, int tsid, ProgramMappingStream stream, MySqlTransaction transaction)
{
if (stream.VbiData == null)
return;
if (stream.VbiData.Count == 0)
return;
MySqlCommand command = transaction.Connection.CreateCommand();
command.Transaction = transaction;
command.CommandText =
"INSERT INTO dvb_pmt_streams_vbi (onid, tsid, elementary_pid, field_parity, line_offset, data_service_id) " +
"VALUES (@onid, @tsid, @elementary_pid, @field_parity, @line_offset, @data_service_id)";
command.Parameters.AddWithValue("@onid", onid);
command.Parameters.AddWithValue("@tsid", tsid);
command.Parameters.AddWithValue("@elementary_pid", stream.ElementaryPid);
command.Parameters.Add("@field_parity", MySqlDbType.Bool);
command.Parameters.Add("@line_offset", MySqlDbType.Int32);
command.Parameters.Add("@data_service_id", MySqlDbType.Int16);
foreach (VbiDataDescriptor.DataService dataService in stream.VbiData)
{
command.Parameters["@data_service_id"].Value = dataService.DataServiceId;
for (int i = 0; i < dataService.FieldParity.Length; i++)
{
if (!TestPmtStreamVbi(transaction, onid, tsid, stream.ElementaryPid, dataService.FieldParity[i], dataService.LineOffset[i]))
{
command.Parameters["@field_parity"].Value = dataService.FieldParity[i];
command.Parameters["@line_offset"].Value = dataService.LineOffset[i];
command.ExecuteNonQuery();
}
}
}
}
private bool TestPmtStreamVbi(MySqlTransaction transaction, int onid, int tsid, int streamElementaryPid, bool fieldParity, int lineOffset)
{
MySqlCommand command = transaction.Connection.CreateCommand();
command.Transaction = transaction;
command.CommandText =
"SELECT dateadded FROM dvb_pmt_streams_vbi WHERE onid = @onid AND tsid = @tsid AND elementary_pid = @elementary_pid AND field_parity = @field_parity AND line_offset = @line_offset";
command.Parameters.AddWithValue("@onid", onid);
command.Parameters.AddWithValue("@tsid", tsid);
command.Parameters.AddWithValue("@elementary_pid", streamElementaryPid);
command.Parameters.AddWithValue("@field_parity", fieldParity);
command.Parameters.AddWithValue("@line_offset", lineOffset);
MySqlDataReader dataReader = command.ExecuteReader();
bool result = dataReader.Read();
dataReader.Close();
return result;
}
private void InsertPmtStreamsTeletext(int onid, int tsid, ProgramMappingStream stream, MySqlConnection connection, bool vbi, MySqlTransaction transaction)
{
TeletextDescriptor.TeletextDescriptorTeletext[] teletexts = vbi ? stream.VbiTeletexts : stream.Teletexts;
if (teletexts == null)
return;
if (teletexts.Length == 0)
return;
MySqlCommand command = connection.CreateCommand();
command.Transaction = transaction;
command.CommandText =
"INSERT INTO dvb_pmt_streams_teletext (onid, tsid, elementary_pid, ordinal, iso_639_language_code, teletext_type, teletext_magazine_number, teletext_page_number, vbi) " +
"VALUES " +
"(@onid, @tsid, @elementary_pid, @ordinal, @iso_639_language_code, @teletext_type, @teletext_magazine_number, @teletext_page_number, @vbi)";
command.Parameters.AddWithValue("@onid", onid);
command.Parameters.AddWithValue("@tsid", tsid);
command.Parameters.AddWithValue("@elementary_pid", stream.ElementaryPid);
command.Parameters.AddWithValue("@vbi", vbi);
command.Parameters.Add("@ordinal", MySqlDbType.Int32);
command.Parameters.Add("@iso_639_language_code", MySqlDbType.VarChar);
command.Parameters.Add("@teletext_type", MySqlDbType.Int32);
command.Parameters.Add("@teletext_magazine_number", MySqlDbType.Int32);
command.Parameters.Add("@teletext_page_number", MySqlDbType.Int32);
for (int i = 0; i < teletexts.Length; i++)
{
if (TestForPmtTeletext(onid, tsid, stream.ElementaryPid, i, transaction))
{
continue;
}
else
{
TeletextDescriptor.TeletextDescriptorTeletext teletext = teletexts[i];
command.Parameters["@ordinal"].Value = i;
command.Parameters["@iso_639_language_code"].Value = teletext.Iso639LanguageCode;
command.Parameters["@teletext_type"].Value = (int)teletext.TeletextType;
command.Parameters["@teletext_magazine_number"].Value = teletext.TeletextMagazineNumber;
command.Parameters["@teletext_page_number"].Value = teletext.TeletextPageNumber;
command.ExecuteNonQuery();
}
}
}
private bool TestForPmtTeletext(int onid, int tsid, int streamElementaryPid, int i, MySqlTransaction transaction)
{
MySqlCommand command = transaction.Connection.CreateCommand();
command.Transaction = transaction;
command.CommandText =
"SELECT dateadded FROM dvb_pmt_streams_teletext WHERE onid = @onid AND tsid = @tsid AND elementary_pid = @elementary_pid AND ordinal = @ordinal";
command.Parameters.AddWithValue("@onid", onid);
command.Parameters.AddWithValue("@tsid", tsid);
command.Parameters.AddWithValue("@elementary_pid", streamElementaryPid);
command.Parameters.AddWithValue("@ordinal", i);
MySqlDataReader dataReader = command.ExecuteReader();
bool result = dataReader.Read();
dataReader.Close();
return result;
}
private void InsertPmtStreamsSubtitle(int onid, int tsid, ProgramMappingStream stream, MySqlConnection connection, MySqlTransaction mySqlTransaction)
{
if (stream.Subtitlings == null)
return;
if (stream.Subtitlings.Length == 0)
return;
MySqlCommand command = connection.CreateCommand();
command.Transaction = mySqlTransaction;
command.CommandText = "INSERT INTO dvb_pmt_streams_subtitle (onid, tsid, elementary_pid, ordinal, iso_639_language_type, subtitling_type, composition_page_id, ancillary_page_id) " +
"VALUES " +
"(@onid, @tsid, @elementary_pid, @ordinal, @iso_639_language_type, @subtitling_type, @composition_page_id, @ancillary_page_id)";
command.Parameters.AddWithValue("@onid", onid);
command.Parameters.AddWithValue("@tsid", tsid);
command.Parameters.AddWithValue("@elementary_pid", stream.ElementaryPid);
for (int i = 0; i < stream.Subtitlings.Length; i++)
{
if (TestForPmtStreamSubtitle(onid, tsid, stream.ElementaryPid, i, mySqlTransaction))
continue;
command.Parameters.AddOrSet("@ordinal", i);
command.Parameters.AddOrSet("@iso_639_language_type", stream.Subtitlings[i].Iso639LanguageCode);
command.Parameters.AddOrSet("@subtitling_type", stream.Subtitlings[i].SubtitlingType);
command.Parameters.AddOrSet("@composition_page_id", stream.Subtitlings[i].CompositionPageId);
command.Parameters.AddOrSet("@ancillary_page_id", stream.Subtitlings[i].AncillaryPageId);
command.ExecuteNonQuery();
}
}
private bool TestForPmtStreamSubtitle(int onid, int tsid, int pid, int ordinal, MySqlTransaction transaction)
{
MySqlCommand command = transaction.Connection.CreateCommand();
command.Transaction = transaction;
command.CommandText =
"SELECT dateadded FROM dvb_pmt_streams_subtitle WHERE onid = @onid AND tsid = @tsid AND elementary_pid = @elementary_pid AND ordinal = @ordinal";
command.Parameters.AddWithValue("@onid", onid);
command.Parameters.AddWithValue("@tsid", tsid);
command.Parameters.AddWithValue("@elementary_pid", pid);
command.Parameters.AddOrSet("@ordinal", ordinal);
MySqlDataReader dataReader = command.ExecuteReader();
bool result = dataReader.Read();
dataReader.Close();
return result;
}
private void InsertPmtStreamsIp(int onid, int tsid, ProgramMappingStream stream, MySqlConnection connection)
{
if (stream.IpMacNotificationInfo == null)
return;
if (stream.IpMacNotificationInfo.Length == 0)
return;
MySqlCommand command = connection.CreateCommand();
command.CommandText =
"INSERT INTO dvb_pmt_streams_ip (onid, tsid, elementary_pid, platform_id, action_type, int_versioning_flag, int_version) " +
"VALUES " +
"(@onid, @tsid, @elementary_pid, @platform_id, @action_type, @int_versioning_flag, @int_version)";
command.Parameters.AddWithValue("@onid", onid);
command.Parameters.AddWithValue("@tsid", tsid);
command.Parameters.AddWithValue("@elementary_pid", stream.ElementaryPid);
foreach (DataBroadcastIdDescriptor.IpMacPlatform platform in stream.IpMacNotificationInfo)
{
command.Parameters.AddWithValue("@platform_id", platform.PlatformId);
command.Parameters.AddWithValue("@action_type", platform.ActionType);
command.Parameters.AddWithValue("@int_versioning_flag", platform.IntVersioningFlag);
command.Parameters.AddWithValue("@int_version", platform.IntVersion);
command.ExecuteNonQuery();
}
}
private void InsertPmtStreamsFlexmux(int onid, int tsid, ProgramMappingStream stream, MySqlConnection connection)
{
if (stream.FlexMuxChannels == null)
return;
if (stream.FlexMuxChannels.Length == 0)
return;
MySqlCommand command = connection.CreateCommand();
command.CommandText =
"INSERT INTO dvb_pmt_streams_flexmux (nid, tsid, elementary_pid, es_id, flexmux_channel) VALUES (@nid,@tsid,@elementary_pid,@es_id,@flexmux_channel)";
command.Parameters.AddWithValue("@onid", onid);
command.Parameters.AddWithValue("@tsid", tsid);
command.Parameters.AddWithValue("@elementary_pid", stream.ElementaryPid);
command.Parameters.Add("@es_id", MySqlDbType.Int32);
command.Parameters.Add("@flexmux_channel", MySqlDbType.Int16);
foreach (FmcDescriptor.Fmc flexMuxChannel in stream.FlexMuxChannels)
{
command.Parameters["@es_id"].Value = flexMuxChannel.EsId;
command.Parameters["@flexmux_channel"].Value = flexMuxChannel.FlexMuxChannel;
command.ExecuteNonQuery();
}
}
private void InsertPmtStreamsAudioPreselection(int onid, int tsid, ProgramMappingStream stream, MySqlTransaction transaction)
{
if (stream.AudioPreselection == null)
return;
if (stream.AudioPreselection.Length == 0)
return;
MySqlCommand command = transaction.Connection.CreateCommand();
command.Transaction = transaction;
command.CommandText =
"INSERT INTO dvb_pmt_streams_audio_preselection (onid, tsid, elementary_pid, preselection_id, audio_rendering_indication, audio_description, spoken_subtitles, dialogue_enhancement, interactivity_enabled, iso_639_language_code, message_id, component_tags, future_extension) " +
"VALUES " +
"(@onid, @tsid, @elementary_pid, @preselection_id, @audio_rendering_indication, @audio_description, @spoken_subtitles, @dialogue_enhancement, @interactivity_enabled, " +
"@iso_639_language_code, @message_id, @component_tags, @future_extension)";
command.Parameters.AddWithValue("@onid", onid);
command.Parameters.AddWithValue("@tsid", tsid);
command.Parameters.AddWithValue("@elementary_pid", stream.ElementaryPid);
foreach (AudioPreselectionDescriptor.AudioPreselection audioPreselection in stream.AudioPreselection)
{
command.Parameters.AddOrSet("@preselection_id", audioPreselection.PreselectionId);
command.Parameters.AddOrSet("@audio_rendering_indication", audioPreselection.AudioRenderingIndication);
command.Parameters.AddOrSet("@audio_description", audioPreselection.AudioDescription);
command.Parameters.AddOrSet("@spoken_subtitles", audioPreselection.SpokenSubtitles);
command.Parameters.AddOrSet("@dialogue_enhancement", audioPreselection.DialogueEnhancement);
command.Parameters.AddOrSet("@interactivity_enabled", audioPreselection.InteractivityEnabled);
command.Parameters.AddOrSet("@iso_639_language_code", audioPreselection.Iso639LangaugeCode);
command.Parameters.AddOrSet("@message_id", audioPreselection.MessageId);
command.Parameters.AddOrSet("@component_tags", audioPreselection.ComponentTags);
command.Parameters.AddOrSet("@future_extension", audioPreselection.FutureExtension);
command.ExecuteNonQuery();
}
}
private void InsertPmtStreamsApplications(int onid, int tsid, ProgramMappingStream stream, MySqlConnection connection, MySqlTransaction transaction)
{
if (stream.Applications == null)
return;
if (stream.Applications.Count == 0)
return;
MySqlCommand command = connection.CreateCommand();
command.Transaction = transaction;
command.CommandText =
"INSERT INTO dvb_pmt_streams_applications (onid, tsid, elementary_pid, application_type, ait_version_number) " +
"VALUES (@onid,@tsid,@elementary_pid,@application_type,@ait_version_number)";
command.Parameters.AddWithValue("@onid", onid);
command.Parameters.AddWithValue("@tsid", tsid);
command.Parameters.AddWithValue("@elementary_pid", stream.ElementaryPid);
foreach (ApplicationSignallingDescriptor.ApplicationSignal applicationSignal in stream.Applications)
{
if (TestForPmtStreamApplication(onid, tsid, stream.ElementaryPid, transaction, applicationSignal))
continue;
command.Parameters.AddOrSet("@application_type", applicationSignal.ApplicationType);
command.Parameters.AddOrSet("@ait_version_number", applicationSignal.AitVersionNumber);
command.ExecuteNonQuery();
}
}
private bool TestForPmtStreamApplication(int onid, int tsid, int pid, MySqlTransaction transaction, ApplicationSignallingDescriptor.ApplicationSignal signal)
{
MySqlCommand command = transaction.Connection.CreateCommand();
command.Transaction = transaction;
command.CommandText =
"SELECT dateadded FROM dvb_pmt_streams_applications WHERE onid = @onid AND tsid = @tsid AND elementary_pid = @elementary_pid " +
"AND application_type = @application_type AND ait_version_number = @ait_version_number";
command.Parameters.AddWithValue("@onid", onid);
command.Parameters.AddWithValue("@tsid", tsid);
command.Parameters.AddWithValue("@elementary_pid", pid);
command.Parameters.AddOrSet("@application_type", signal.ApplicationType);
command.Parameters.AddOrSet("@ait_version_number", signal.AitVersionNumber);
MySqlDataReader dataReader = command.ExecuteReader();
bool result = dataReader.Read();
dataReader.Close();
return result;
}
private struct PmtCoordinate
{
public int nid, tsid;
public ushort programNumber;
public PmtCoordinate(int nid, int tsid, ushort programNumber)
{
this.nid = nid;
this.tsid = tsid;
this.programNumber = programNumber;
}
public bool Equals(PmtCoordinate other)
{
return nid == other.nid && tsid == other.tsid && programNumber == other.programNumber;
}
public override bool Equals(object obj)
{
return obj is PmtCoordinate other && Equals(other);
}
public override int GetHashCode()
{
return HashCode.Combine(nid, tsid, programNumber);
}
}
private HashSet<PmtCoordinate> knownPmts;
public bool TestForPmtEvent(int currentNetworkId, int currentTransportStreamId, ProgramMapping mapping)
{
if (knownPmts == null)
knownPmts = new HashSet<PmtCoordinate>();
PmtCoordinate coordinate = new PmtCoordinate(currentNetworkId, currentTransportStreamId, mapping.ProgramNumber);
if (knownPmts.Contains(coordinate))
return true;
using (MySqlConnection connection = new MySqlConnection(_mcsb.ToString()))
{
connection.Open();
MySqlCommand mySqlCommand = connection.CreateCommand();
mySqlCommand.CommandText =
"SELECT dateadded FROM dvb_pmt WHERE nid = @nid AND tsid = @tsid AND program_number = @program_number";
mySqlCommand.Parameters.Add("@nid", MySqlDbType.Int32);
mySqlCommand.Parameters.Add("@tsid", MySqlDbType.Int32);
mySqlCommand.Parameters.Add("@program_number", MySqlDbType.Int32);
mySqlCommand.Parameters["@nid"].Value = currentNetworkId;
mySqlCommand.Parameters["@tsid"].Value = currentTransportStreamId;
mySqlCommand.Parameters["@program_number"].Value = mapping.ProgramNumber;
MySqlDataReader dataReader = mySqlCommand.ExecuteReader();
bool result = dataReader.Read();
dataReader.Close();
connection.Close();
if (result)
{
knownPmts.Add(coordinate);
}
return result;
}
}
public bool StorePmtEvent(int currentNetworkId, int currentTransportStreamId, ProgramMapping mapping)
{
if (knownPmts == null)
knownPmts = new HashSet<PmtCoordinate>();
knownPmts.Add(new PmtCoordinate(currentNetworkId, currentTransportStreamId, mapping.ProgramNumber));
EnqueueSpeedhack(SpeedhackType.InsertPmt, currentNetworkId, currentTransportStreamId, mapping);
return true;
}
}
}

View File

@ -0,0 +1,365 @@
using skyscraper5.Skyscraper.Scraper.Storage.Split;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using MySqlConnector;
using skyscraper5.Scte35;
using skyscraper5.Scte35.Descriptors;
namespace skyscraper5.Data.MySql
{
public partial class MySqlDataStorage : DataStorage
{
private void InsertScte35SpliceComponents(MySqlTransaction transaction, int currentNetworkId, int currentTransportStreamId, ushort programNumber, SpliceInsert spliceInsert)
{
if (spliceInsert.Components == null)
return;
if (spliceInsert.Components.Length == 0)
return;
MySqlCommand command = transaction.Connection.CreateCommand();
command.Transaction = transaction;
command.CommandText =
"INSERT INTO scte35_splice_components (cnid, ctsid, progno, splice_event_id, k, v) VALUES (@cnid, @ctsid, @progno, @splice_event_id, @k, @v)";
command.Parameters.AddWithValue("@cnid", currentNetworkId);
command.Parameters.AddWithValue("@ctsid", currentTransportStreamId);
command.Parameters.AddWithValue("@progno", programNumber);
command.Parameters.AddWithValue("@splice_event_id", spliceInsert.SpliceEventId);
command.Parameters.Add("@k", MySqlDbType.Int16);
command.Parameters.Add("@v", MySqlDbType.Int64);
foreach (Tuple<byte, ulong?> component in spliceInsert.Components)
{
command.Parameters["@k"].Value = component.Item1;
command.Parameters["@v"].Value = component.Item2;
command.ExecuteNonQuery();
}
}
private void InsertScte35SpliceSegmentationComponents(MySqlTransaction transaction, int currentNetworkId, int currentTransportStreamId, ushort programNumber, SpliceInsert spliceInsert)
{
if (spliceInsert.Descriptors == null)
return;
if (spliceInsert.Descriptors.segmentationDescriptor == null)
return;
SegmentationDescriptor.Component[] components = spliceInsert.Descriptors.segmentationDescriptor.Components;
if (components == null)
return;
if (components.Length == 0)
return;
MySqlCommand command = transaction.Connection.CreateCommand();
command.Transaction = transaction;
command.CommandText =
"INSERT INTO scte35_splice_segmentation_components (cnid, ctsid, progno, splice_event_id, component_tag, pts_offset) " +
"VALUES (@cnid, @ctsid, @progno, @splice_event_id, @component_tag, @pts_offset)";
command.Parameters.AddWithValue("@cnid", currentNetworkId);
command.Parameters.AddWithValue("@ctsid", currentTransportStreamId);
command.Parameters.AddWithValue("@progno", programNumber);
command.Parameters.AddWithValue("@splice_event_id", spliceInsert.SpliceEventId);
command.Parameters.Add("@component_tag", MySqlDbType.Int16);
command.Parameters.Add("@pts_offset", MySqlDbType.Int64);
foreach (SegmentationDescriptor.Component component in components)
{
command.Parameters["@component_tag"].Value = component.ComponentTag;
command.Parameters["@pts_offset"].Value = component.PtsOffset;
command.ExecuteNonQuery();
}
}
private DateTime? QueryScte35TimeSignal(MySqlConnection connection, int currentNetworkId, int currentTransportStreamId, ushort programNumber)
{
MySqlCommand command = connection.CreateCommand();
command.CommandText = "SELECT dateadded FROM scte35_time_signal WHERE cnid = @cnid AND ctsid = @ctsid AND progno = @progno";
command.Parameters.AddWithValue("@cnid", currentNetworkId);
command.Parameters.AddWithValue("@ctsid", currentTransportStreamId);
command.Parameters.AddWithValue("@progno", programNumber);
MySqlDataReader dataReader = command.ExecuteReader();
DateTime? result = null;
if (dataReader.Read())
result = dataReader.GetDateTime(0);
dataReader.Close();
return result;
}
public bool TestForScte35SpliceInsert(int currentNetworkId, int currentTransportStreamId, ushort programNumber,
SpliceInsert spliceInsert)
{
using (MySqlConnection connection = new MySqlConnection(_mcsb.ToString()))
{
connection.Open();
MySqlCommand command = connection.CreateCommand();
command.CommandText =
"SELECT dateadded FROM scte35_splice WHERE cnid = @cnid AND ctsid = @ctsid AND progno = @progno AND splice_event_id = @splice_event_id";
command.Parameters.AddWithValue("@cnid", currentNetworkId);
command.Parameters.AddWithValue("@ctsid", currentTransportStreamId);
command.Parameters.AddWithValue("@progno", programNumber);
command.Parameters.AddWithValue("@splice_event_id", spliceInsert.SpliceEventId);
MySqlDataReader dataReader = command.ExecuteReader();
bool result = dataReader.Read();
dataReader.Close();
connection.Close();
return result;
}
}
public void StoreScte35SpliceInsert(int currentNetworkId, int currentTransportStreamId, ushort programNumber,
SpliceInsert spliceInsert)
{
using (MySqlConnection connection = new MySqlConnection(_mcsb.ToString()))
{
connection.Open();
MySqlTransaction transaction = connection.BeginTransaction();
MySqlCommand command = connection.CreateCommand();
command.Transaction = transaction;
command.CommandText =
"INSERT INTO scte35_splice (cnid, ctsid, progno, splice_event_id, splice_time, splice_event_cancel_indicator, avails_expected, avail_num, unique_program_id, duration, duration_auto_return, splice_immediate_flag, duration_flag, program_splice_flag, out_of_network_indicator, provider_avail_id, identifier, sub_segments_expected, sub_segment_num, segments_expected, segment_num, segmentation_type_id, segmentation_upid, segmentation_upid_type, segmentation_duration, program_segmentation_flag, segmentation_event_cancel_indicator, device_restrictions, archive_allowed_flag, no_regional_blackout_flag, web_delivery_flag, segmentation_duration_flag, segmentation_event_id, segmentation_identifier, utc_offset, tai_ns, tai_seconds, tai_identififer) " +
"VALUES (@cnid, @ctsid, @progno, @splice_event_id, @splice_time, @splice_event_cancel_indicator, @avails_expected, @avail_num, @unique_program_id, @duration, @duration_auto_return, @splice_immediate_flag, " +
"@duration_flag, @program_splice_flag, @out_of_network_indicator, @provider_avail_id, @identifier, @sub_segments_expected, @sub_segment_num, @segments_expected, @segment_num," +
"@segmentation_type_id, @segmentation_upid, @segmentation_upid_type, @segmentation_duration, @program_segmentation_flag, @segmentation_event_cancel_indicator, @device_restrictions, " +
"@archive_allowed_flag, @no_regional_blackout_flag, @web_delivery_flag, @segmentation_duration_flag, @segmentation_event_id, @segmentation_identifier, @utc_offset, @tai_ns, @tai_seconds, @tai_identififer)";
command.Parameters.AddWithValue("@cnid", currentNetworkId);
command.Parameters.AddWithValue("@ctsid", currentTransportStreamId);
command.Parameters.AddWithValue("@progno", programNumber);
command.Parameters.AddWithValue("@splice_event_id", spliceInsert.SpliceEventId);
command.Parameters.AddWithValue("@splice_time", spliceInsert.SpliceTime);
command.Parameters.AddWithValue("@splice_event_cancel_indicator", spliceInsert.SpliceEventCancelIndicator);
command.Parameters.AddWithValue("@avails_expected", spliceInsert.AvailsExpected);
command.Parameters.AddWithValue("@avail_num", spliceInsert.AvailNum);
command.Parameters.AddWithValue("@unique_program_id", spliceInsert.UniqueProgramId);
command.Parameters.AddWithValue("@duration", spliceInsert.Duration);
command.Parameters.AddWithValue("@duration_auto_return", spliceInsert.DurationAutoReturn);
command.Parameters.AddWithValue("@splice_immediate_flag", spliceInsert.SpliceImmediateFlag);
command.Parameters.AddWithValue("@duration_flag", spliceInsert.DurationFlag);
command.Parameters.AddWithValue("@program_splice_flag", spliceInsert.ProgramSpliceFlag);
command.Parameters.AddWithValue("@out_of_network_indicator", spliceInsert.OutOfNetworkIndicator);
if (spliceInsert.Descriptors != null)
{
if (spliceInsert.Descriptors.availDescriptor != null)
{
command.Parameters.AddWithValue("@provider_avail_id", spliceInsert.Descriptors.availDescriptor.ProviderAvailId);
command.Parameters.AddWithValue("@identifier", spliceInsert.Descriptors.availDescriptor.Identifier);
}
else
{
command.Parameters.AddWithValue("@provider_avail_id", DBNull.Value);
command.Parameters.AddWithValue("@identifier", DBNull.Value);
}
if (spliceInsert.Descriptors.segmentationDescriptor != null)
{
command.Parameters.AddWithValue("@sub_segments_expected", spliceInsert.Descriptors.segmentationDescriptor.SubSegmentsExpected);
command.Parameters.AddWithValue("@sub_segment_num", spliceInsert.Descriptors.segmentationDescriptor.SubSegmentNum);
command.Parameters.AddWithValue("@segments_expected", spliceInsert.Descriptors.segmentationDescriptor.SegmentsExpected);
command.Parameters.AddWithValue("@segment_num", spliceInsert.Descriptors.segmentationDescriptor.SegmentNum);
command.Parameters.AddWithValue("@segmentation_type_id", spliceInsert.Descriptors.segmentationDescriptor.SegmentationTypeId);
command.Parameters.AddWithValue("@segmentation_upid", spliceInsert.Descriptors.segmentationDescriptor.SegmentationUpid);
command.Parameters.AddWithValue("@segmentation_upid_type", spliceInsert.Descriptors.segmentationDescriptor.SegmentationUpidType);
command.Parameters.AddWithValue("@segmentation_duration", spliceInsert.Descriptors.segmentationDescriptor.SegmentationDuration);
command.Parameters.AddWithValue("@program_segmentation_flag", spliceInsert.Descriptors.segmentationDescriptor.ProgramSegmentationFlag);
command.Parameters.AddWithValue("@segmentation_event_cancel_indicator", spliceInsert.Descriptors.segmentationDescriptor.SegmentationEventCancelIndicator);
command.Parameters.AddWithValue("@device_restrictions", spliceInsert.Descriptors.segmentationDescriptor.DeviceRestrictions);
command.Parameters.AddWithValue("@archive_allowed_flag", spliceInsert.Descriptors.segmentationDescriptor.ArchiveAllowedFlag);
command.Parameters.AddWithValue("@no_regional_blackout_flag", spliceInsert.Descriptors.segmentationDescriptor.NoRegionalBlackoutFlag);
command.Parameters.AddWithValue("@web_delivery_flag", spliceInsert.Descriptors.segmentationDescriptor.WebDeliveryFlag);
command.Parameters.AddWithValue("@segmentation_duration_flag", spliceInsert.Descriptors.segmentationDescriptor.SegmentationDurationFlag);
command.Parameters.AddWithValue("@segmentation_event_id", spliceInsert.Descriptors.segmentationDescriptor.SegmentationEventId);
command.Parameters.AddWithValue("@segmentation_identifier", spliceInsert.Descriptors.segmentationDescriptor.Identifier);
}
else
{
command.Parameters.AddWithValue("@sub_segments_expected", DBNull.Value);
command.Parameters.AddWithValue("@sub_segment_num", DBNull.Value);
command.Parameters.AddWithValue("@segments_expected", DBNull.Value);
command.Parameters.AddWithValue("@segment_num", DBNull.Value);
command.Parameters.AddWithValue("@segmentation_type_id", DBNull.Value);
command.Parameters.AddWithValue("@segmentation_upid", DBNull.Value);
command.Parameters.AddWithValue("@segmentation_upid_type", DBNull.Value);
command.Parameters.AddWithValue("@segmentation_duration", DBNull.Value);
command.Parameters.AddWithValue("@program_segmentation_flag", DBNull.Value);
command.Parameters.AddWithValue("@segmentation_event_cancel_indicator", DBNull.Value);
command.Parameters.AddWithValue("@device_restrictions", DBNull.Value);
command.Parameters.AddWithValue("@archive_allowed_flag", DBNull.Value);
command.Parameters.AddWithValue("@no_regional_blackout_flag", DBNull.Value);
command.Parameters.AddWithValue("@web_delivery_flag", DBNull.Value);
command.Parameters.AddWithValue("@segmentation_duration_flag", DBNull.Value);
command.Parameters.AddWithValue("@segmentation_event_id", DBNull.Value);
command.Parameters.AddWithValue("@segmentation_identifier", DBNull.Value);
}
if (spliceInsert.Descriptors.timeDescriptor != null)
{
command.Parameters.AddWithValue("@segmentation_identifier", spliceInsert.Descriptors.timeDescriptor.UtcOffset);
command.Parameters.AddWithValue("@tai_ns", spliceInsert.Descriptors.timeDescriptor.TaiNs);
command.Parameters.AddWithValue("@tai_seconds", spliceInsert.Descriptors.timeDescriptor.TaiSeconds);
command.Parameters.AddWithValue("@tai_identififer", spliceInsert.Descriptors.timeDescriptor.Identifier);
}
else
{
command.Parameters.AddWithValue("@utc_offset", DBNull.Value);
command.Parameters.AddWithValue("@tai_ns", DBNull.Value);
command.Parameters.AddWithValue("@tai_seconds", DBNull.Value);
command.Parameters.AddWithValue("@tai_identififer", DBNull.Value);
}
}
else
{
command.Parameters.AddWithValue("@provider_avail_id", DBNull.Value);
command.Parameters.AddWithValue("@identifier", DBNull.Value);
command.Parameters.AddWithValue("@sub_segments_expected", DBNull.Value);
command.Parameters.AddWithValue("@sub_segment_num", DBNull.Value);
command.Parameters.AddWithValue("@segments_expected", DBNull.Value);
command.Parameters.AddWithValue("@segment_num", DBNull.Value);
command.Parameters.AddWithValue("@segmentation_type_id", DBNull.Value);
command.Parameters.AddWithValue("@segmentation_upid", DBNull.Value);
command.Parameters.AddWithValue("@segmentation_upid_type", DBNull.Value);
command.Parameters.AddWithValue("@segmentation_duration", DBNull.Value);
command.Parameters.AddWithValue("@program_segmentation_flag", DBNull.Value);
command.Parameters.AddWithValue("@segmentation_event_cancel_indicator", DBNull.Value);
command.Parameters.AddWithValue("@device_restrictions", DBNull.Value);
command.Parameters.AddWithValue("@archive_allowed_flag", DBNull.Value);
command.Parameters.AddWithValue("@no_regional_blackout_flag", DBNull.Value);
command.Parameters.AddWithValue("@web_delivery_flag", DBNull.Value);
command.Parameters.AddWithValue("@segmentation_duration_flag", DBNull.Value);
command.Parameters.AddWithValue("@segmentation_event_id", DBNull.Value);
command.Parameters.AddWithValue("@segmentation_identifier", DBNull.Value);
command.Parameters.AddWithValue("@utc_offset", DBNull.Value);
command.Parameters.AddWithValue("@tai_ns", DBNull.Value);
command.Parameters.AddWithValue("@tai_seconds", DBNull.Value);
command.Parameters.AddWithValue("@tai_identififer", DBNull.Value);
}
command.ExecuteNonQuery();
InsertScte35SpliceComponents(transaction, currentNetworkId, currentTransportStreamId, programNumber, spliceInsert);
InsertScte35SpliceSegmentationComponents(transaction, currentNetworkId, currentTransportStreamId, programNumber, spliceInsert);
transaction.Commit();
connection.Close();
}
}
public void SetScte35TimeSignal(int currentNetworkId, int currentTransportStreamId, DateTime currentTime, ushort programNumber, TimeSignal spliceInsert)
{
using (MySqlConnection connection = new MySqlConnection(_mcsb.ToString()))
{
connection.Open();
MySqlCommand command = connection.CreateCommand();
command.CommandText =
"INSERT INTO scte35_time_signal (cnid, ctsid, progno, current, value, provider_avail_id, identifier, sub_segments_expected, sub_segment_num, segments_expected, segment_num, segmentation_type_id, segmentation_upid, segmentation_upid_type, segmentation_duration, program_segmentation_flag, segmentation_event_cancel_indicator, device_restrictions, archive_allowed_flag, no_regional_blackout_flag, web_delivery_flag, segmentation_duration_flag, segmentation_event_id, segmentation_identifier, utc_offset, tai_ns, tai_seconds, tai_identififer) " +
"VALUES (@cnid, @ctsid, @progno, @current, @value, @provider_avail_id, @identifier, @sub_segments_expected, @sub_segment_num, @segments_expected, @segment_num, @segmentation_type_id, @segmentation_upid, @segmentation_upid_type, @segmentation_duration, @program_segmentation_flag, @segmentation_event_cancel_indicator, @device_restrictions, @archive_allowed_flag, @no_regional_blackout_flag, @web_delivery_flag, @segmentation_duration_flag, @segmentation_event_id, @segmentation_identifier, @utc_offset, @tai_ns, @tai_seconds, @tai_identififer)";
command.Parameters.AddWithValue("@cnid", currentNetworkId);
command.Parameters.AddWithValue("@ctsid", currentTransportStreamId);
command.Parameters.AddWithValue("@progno", programNumber);
command.Parameters.AddWithValue("@current", currentTime);
if (spliceInsert.Descriptors != null)
{
if (spliceInsert.Descriptors.availDescriptor != null)
{
command.Parameters.AddWithValue("@provider_avail_id", spliceInsert.Descriptors.availDescriptor.ProviderAvailId);
command.Parameters.AddWithValue("@identifier", spliceInsert.Descriptors.availDescriptor.Identifier);
}
else
{
command.Parameters.AddWithValue("@provider_avail_id", DBNull.Value);
command.Parameters.AddWithValue("@identifier", DBNull.Value);
}
if (spliceInsert.Descriptors.segmentationDescriptor != null)
{
command.Parameters.AddWithValue("@sub_segments_expected", spliceInsert.Descriptors.segmentationDescriptor.SubSegmentsExpected);
command.Parameters.AddWithValue("@sub_segment_num", spliceInsert.Descriptors.segmentationDescriptor.SubSegmentNum);
command.Parameters.AddWithValue("@segments_expected", spliceInsert.Descriptors.segmentationDescriptor.SegmentsExpected);
command.Parameters.AddWithValue("@segment_num", spliceInsert.Descriptors.segmentationDescriptor.SegmentNum);
command.Parameters.AddWithValue("@segmentation_type_id", spliceInsert.Descriptors.segmentationDescriptor.SegmentationTypeId);
command.Parameters.AddWithValue("@segmentation_upid", spliceInsert.Descriptors.segmentationDescriptor.SegmentationUpid);
command.Parameters.AddWithValue("@segmentation_upid_type", spliceInsert.Descriptors.segmentationDescriptor.SegmentationUpidType);
command.Parameters.AddWithValue("@segmentation_duration", spliceInsert.Descriptors.segmentationDescriptor.SegmentationDuration);
command.Parameters.AddWithValue("@program_segmentation_flag", spliceInsert.Descriptors.segmentationDescriptor.ProgramSegmentationFlag);
command.Parameters.AddWithValue("@segmentation_event_cancel_indicator", spliceInsert.Descriptors.segmentationDescriptor.SegmentationEventCancelIndicator);
command.Parameters.AddWithValue("@device_restrictions", spliceInsert.Descriptors.segmentationDescriptor.DeviceRestrictions);
command.Parameters.AddWithValue("@archive_allowed_flag", spliceInsert.Descriptors.segmentationDescriptor.ArchiveAllowedFlag);
command.Parameters.AddWithValue("@no_regional_blackout_flag", spliceInsert.Descriptors.segmentationDescriptor.NoRegionalBlackoutFlag);
command.Parameters.AddWithValue("@web_delivery_flag", spliceInsert.Descriptors.segmentationDescriptor.WebDeliveryFlag);
command.Parameters.AddWithValue("@segmentation_duration_flag", spliceInsert.Descriptors.segmentationDescriptor.SegmentationDurationFlag);
command.Parameters.AddWithValue("@segmentation_event_id", spliceInsert.Descriptors.segmentationDescriptor.SegmentationEventId);
command.Parameters.AddWithValue("@segmentation_identifier", spliceInsert.Descriptors.segmentationDescriptor.Identifier);
}
else
{
command.Parameters.AddWithValue("@sub_segments_expected", DBNull.Value);
command.Parameters.AddWithValue("@sub_segment_num", DBNull.Value);
command.Parameters.AddWithValue("@segments_expected", DBNull.Value);
command.Parameters.AddWithValue("@segment_num", DBNull.Value);
command.Parameters.AddWithValue("@segmentation_type_id", DBNull.Value);
command.Parameters.AddWithValue("@segmentation_upid", DBNull.Value);
command.Parameters.AddWithValue("@segmentation_upid_type", DBNull.Value);
command.Parameters.AddWithValue("@segmentation_duration", DBNull.Value);
command.Parameters.AddWithValue("@program_segmentation_flag", DBNull.Value);
command.Parameters.AddWithValue("@segmentation_event_cancel_indicator", DBNull.Value);
command.Parameters.AddWithValue("@device_restrictions", DBNull.Value);
command.Parameters.AddWithValue("@archive_allowed_flag", DBNull.Value);
command.Parameters.AddWithValue("@no_regional_blackout_flag", DBNull.Value);
command.Parameters.AddWithValue("@web_delivery_flag", DBNull.Value);
command.Parameters.AddWithValue("@segmentation_duration_flag", DBNull.Value);
command.Parameters.AddWithValue("@segmentation_event_id", DBNull.Value);
command.Parameters.AddWithValue("@segmentation_identifier", DBNull.Value);
}
if (spliceInsert.Descriptors.timeDescriptor != null)
{
command.Parameters.AddWithValue("@utc_offset", spliceInsert.Descriptors.timeDescriptor.UtcOffset);
command.Parameters.AddWithValue("@tai_ns", spliceInsert.Descriptors.timeDescriptor.TaiNs);
command.Parameters.AddWithValue("@tai_seconds", spliceInsert.Descriptors.timeDescriptor.TaiSeconds);
command.Parameters.AddWithValue("@tai_identififer", spliceInsert.Descriptors.timeDescriptor.Identifier);
}
else
{
command.Parameters.AddWithValue("@utc_offset", DBNull.Value);
command.Parameters.AddWithValue("@tai_ns", DBNull.Value);
command.Parameters.AddWithValue("@tai_seconds", DBNull.Value);
command.Parameters.AddWithValue("@tai_identififer", DBNull.Value);
}
}
else
{
command.Parameters.AddWithValue("@provider_avail_id", DBNull.Value);
command.Parameters.AddWithValue("@identifier", DBNull.Value);
command.Parameters.AddWithValue("@sub_segments_expected", DBNull.Value);
command.Parameters.AddWithValue("@sub_segment_num", DBNull.Value);
command.Parameters.AddWithValue("@segments_expected", DBNull.Value);
command.Parameters.AddWithValue("@segment_num", DBNull.Value);
command.Parameters.AddWithValue("@segmentation_type_id", DBNull.Value);
command.Parameters.AddWithValue("@segmentation_upid", DBNull.Value);
command.Parameters.AddWithValue("@segmentation_upid_type", DBNull.Value);
command.Parameters.AddWithValue("@segmentation_duration", DBNull.Value);
command.Parameters.AddWithValue("@program_segmentation_flag", DBNull.Value);
command.Parameters.AddWithValue("@segmentation_event_cancel_indicator", DBNull.Value);
command.Parameters.AddWithValue("@device_restrictions", DBNull.Value);
command.Parameters.AddWithValue("@archive_allowed_flag", DBNull.Value);
command.Parameters.AddWithValue("@no_regional_blackout_flag", DBNull.Value);
command.Parameters.AddWithValue("@web_delivery_flag", DBNull.Value);
command.Parameters.AddWithValue("@segmentation_duration_flag", DBNull.Value);
command.Parameters.AddWithValue("@segmentation_event_id", DBNull.Value);
command.Parameters.AddWithValue("@segmentation_identifier", DBNull.Value);
command.Parameters.AddWithValue("@utc_offset", DBNull.Value);
command.Parameters.AddWithValue("@tai_ns", DBNull.Value);
command.Parameters.AddWithValue("@tai_seconds", DBNull.Value);
command.Parameters.AddWithValue("@tai_identififer", DBNull.Value);
}
command.ExecuteNonQueryAsync().ContinueWith(
x =>
{
connection.Close();
}
);
}
}
}
}

View File

@ -0,0 +1,362 @@
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<string, bool> 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<SdtCoordinate> _sdtCoordinates;
private HashSet<SdtCoordinate> _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>();
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 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);
}
}
}

View File

@ -0,0 +1,122 @@
using MySqlConnector;
using skyscraper5.Skyscraper;
using skyscraper5.Skyscraper.Headless;
using skyscraper5.Skyscraper.Scraper.Storage.Split;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace skyscraper5.Data.MySql
{
public partial class MySqlDataStorage : DataStorage
{
public bool ImportFileKnown(FileInfo fi)
{
using (MySqlConnection connection = new MySqlConnection(_mcsb.ToString()))
{
connection.Open();
using (MySqlCommand mySqlCommand = connection.CreateCommand())
{
mySqlCommand.CommandText = "SELECT dateadded FROM skyscraper_imported_streams WHERE filename = @filename";
mySqlCommand.Parameters.Add("filename", MySqlDbType.VarChar);
mySqlCommand.Parameters["filename"].Value = fi.Name.ToLowerInvariant();
MySqlDataReader dataReader = mySqlCommand.ExecuteReader();
bool result = dataReader.Read();
dataReader.Close();
connection.Close();
return result;
}
}
}
public void ImportMarkFileAsKnown(FileInfo fi, TimeSpan duration)
{
using (MySqlConnection connection = new MySqlConnection(_mcsb.ToString()))
{
connection.Open();
MySqlCommand command = connection.CreateCommand();
command.CommandText = "INSERT INTO skyscraper_imported_streams (filename, debugger, time_taken) VALUES (@filename, @debugger, @time_taken)";
command.Parameters.AddWithValue("@filename", fi.Name.ToLowerInvariant());
command.Parameters.AddWithValue("@debugger", Debugger.IsAttached);
command.Parameters.AddWithValue("@time_taken", (int)duration.TotalSeconds);
command.ExecuteNonQuery();
connection.Close();
}
}
public List<SatellitePosition> UiSatellitesListAll()
{
List<SatellitePosition> result = new List<SatellitePosition>();
using (MySqlConnection connection = new MySqlConnection(_mcsb.ToString()))
{
connection.Open();
using (MySqlCommand command = connection.CreateCommand())
{
command.CommandText = "SELECT * FROM skyscraper_satellites";
MySqlDataReader dataReader = command.ExecuteReader();
while (dataReader.Read())
{
SatellitePosition satellitePosition = new SatellitePosition();
satellitePosition.angle = dataReader.GetFloat(2);
satellitePosition.cardinalDirection = dataReader.GetBoolean(3) ? 0 : 1;
satellitePosition.name = dataReader.GetString(4);
result.Add(satellitePosition);
}
}
connection.Close();
}
return result;
}
public HeadlessJob GetQueuedJob()
{
using (MySqlConnection connection = new MySqlConnection(_mcsb.ToString()))
{
connection.Open();
using (MySqlCommand command = connection.CreateCommand())
{
command.CommandText = "SELECT * FROM skyscraper_queued_jobs WHERE done = FALSE";
MySqlDataReader mySqlDataReader = command.ExecuteReader();
HeadlessJob result = null;
if (mySqlDataReader.Read())
{
result = new HeadlessJob();
result.uuid = Guid.Parse(mySqlDataReader.GetString(0));
result.jobType = (HeadlessJobType)mySqlDataReader.GetInt32(2);
if (!mySqlDataReader.IsDBNull(3))
result.iArg1 = mySqlDataReader.GetInt32(3);
if (!mySqlDataReader.IsDBNull(4))
result.sArg1 = mySqlDataReader.GetString(4);
result.isSynthetic = false;
}
connection.Close();
return result;
}
}
}
public void SetQueuedJobComplete(HeadlessJob headlessJob)
{
using (MySqlConnection connection = new MySqlConnection(_mcsb.ToString()))
{
connection.Open();
using (MySqlCommand command = connection.CreateCommand())
{
command.CommandText = "UPDATE skyscraper_queued_jobs SET done = TRUE WHERE uuid = @uuid";
command.Parameters.Add("uuid", MySqlDbType.VarChar);
command.Parameters["@uuid"].Value = headlessJob.uuid.ToString();
command.ExecuteNonQuery();
connection.Close();
}
}
}
}
}

View File

@ -0,0 +1,693 @@
using skyscraper5.Skyscraper.Scraper.Storage.Split;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using MySqlConnector;
using skyscraper5.Dvb.Descriptors;
using skyscraper5.Dvb.Psi.Model;
using skyscraper5.Mpeg2.Descriptors;
using skyscraper5.Mpeg2.Psi.Model;
using static skyscraper5.Dvb.Descriptors.ContentIdentifierDescriptor;
using System.Diagnostics.Metrics;
namespace skyscraper5.Data.MySql
{
public partial class MySqlDataStorage : DataStorage
{
private enum SpeedhackType
{
UpdateTdt,
InsertTdt,
UpdateTimeOffset,
InsertTimeOffset,
StorePat,
InsertPmt,
InsertTsdt,
UpdateTsdtStationIdentification,
InsertSdt,
InsertCat,
InsertBatTs,
InsertNitTransportStream,
UpdateSdt,
UpdateNitTransportStream
}
private Queue<KeyValuePair<SpeedhackType, object[]>> _speedhackQueue;
private Thread _speedhackThread;
private bool _waitingForSpeedhacksToComplete;
private bool IsSpeedhackThreadAlive()
{
if (_speedhackThread == null)
return false;
if (!_speedhackThread.IsAlive)
return false;
return true;
}
private void EnqueueSpeedhack(SpeedhackType hackType, params object[] args)
{
if (_speedhackQueue == null)
_speedhackQueue = new Queue<KeyValuePair<SpeedhackType, object[]>>();
lock (_speedhackQueue)
{
_speedhackQueue.Enqueue(new KeyValuePair<SpeedhackType, object[]>(hackType, args));
}
if (!IsSpeedhackThreadAlive())
{
_speedhackThread = new Thread(RunSpeedhackThread);
_speedhackThread.Name = "PSI Writer";
_speedhackThread.Priority = ThreadPriority.Lowest;
_speedhackThread.Start();
}
}
private void RunSpeedhackThread()
{
using (MySqlConnection connection = new MySqlConnection(_mcsb.ToString()))
{
connection.Open();
while (_speedhackQueue.Count > 0)
{
KeyValuePair<SpeedhackType, object[]> speedhackJob;
lock (_speedhackQueue)
{
if (_waitingForSpeedhacksToComplete)
{
if (_speedhackQueue.Count > 0 && _speedhackQueue.Count % 100 == 0)
{
Console.WriteLine("{0} SQLs in queue...", _speedhackQueue.Count);
}
}
speedhackJob = _speedhackQueue.Dequeue();
}
object[] args = speedhackJob.Value;
MySqlTransaction transaction;
switch (speedhackJob.Key)
{
case SpeedhackType.UpdateTdt:
UpdateTdt(connection, (int)args[0], (int)args[1], (DateTime)args[2]);
break;
case SpeedhackType.UpdateTimeOffset:
transaction = connection.BeginTransaction();
UpdateTimeOffset(transaction, (int)args[0], (int)args[1], (DateTime)args[2], (LocalTimeOffsetDescriptor.LocalTime)args[3]);
transaction.Commit();
break;
case SpeedhackType.InsertTdt:
InsertTdt(connection, (int)args[0], (int)args[1], (DateTime)args[2]);
break;
case SpeedhackType.InsertTimeOffset:
transaction = connection.BeginTransaction();
UpdateTimeOffset(transaction, (int)args[0], (int)args[1], (DateTime)args[2], (LocalTimeOffsetDescriptor.LocalTime)args[3]);
transaction.Commit();
break;
case SpeedhackType.StorePat:
MySqlCommand command = connection.CreateCommand();
command.CommandText = "INSERT INTO dvb_pat (cnid, ctsid, pmt_pid, program_id) VALUES (@cnid, @ctsid, @pmt_pid, @program_id)";
command.Parameters.AddWithValue("@cnid", (int)args[0]);
command.Parameters.AddWithValue("@ctsid", (int)args[1]);
command.Parameters.AddWithValue("@pmt_pid", (int)args[2]);
command.Parameters.AddWithValue("@program_id", (ushort)args[3]);
command.ExecuteNonQuery();
break;
case SpeedhackType.InsertPmt:
InsertPmt(connection, (int)args[0], (int)args[1], (ProgramMapping)args[2]);
break;
case SpeedhackType.InsertTsdt:
InsertTsdt(connection, (TsdtCoordinate)args[0]);
break;
case SpeedhackType.UpdateTsdtStationIdentification:
UpdateTsdtStationIdentification(connection, (int)args[0], (int)args[1], (string)args[2]);
break;
case SpeedhackType.InsertSdt:
InsertSdt(connection, (ushort)args[0], (ushort)args[1], (SdtService)args[2]);
break;
case SpeedhackType.InsertCat:
InsertCat(connection, (int)args[0], (int)args[1], (CaDescriptor)args[2]);
break;
case SpeedhackType.InsertBatTs:
InsertBatTs(connection, (ushort)args[0], (BatTransportStream)args[1]);
break;
case SpeedhackType.InsertNitTransportStream:
InsertNitTransportStream(connection, (ushort)args[0], (NitTransportStream)args[1]);
break;
case SpeedhackType.UpdateSdt:
UpdateSdt(connection, (ushort)args[0], (ushort)args[1], (SdtService)args[2]);
break;
case SpeedhackType.UpdateNitTransportStream:
SqlUpdateNitTransportStream(connection, (ushort)args[0], (NitTransportStream)args[1]);
break;
default:
throw new NotImplementedException(speedhackJob.Key.ToString());
}
}
connection.Close();
}
}
private void SqlUpdateNitTransportStream(MySqlConnection connection, ushort networkId, NitTransportStream newer)
{
MySqlCommand mySqlCommand = connection.CreateCommand();
mySqlCommand.CommandText =
"UPDATE dvb_nit_transport_stream " +
"SET onid = @onid, delivery_method = @delivery_method, east = @east, fec_inner = @fec_inner, frequency = @frequency, orbital_position = @orbital_position, polarization = @polarization, roll_off = @roll_off, s2 = @s2, symbol_rate = @symbol_rate, scrambling_sequence_index = @scrambling_sequence_index, input_stream_identifier = @input_stream_identifier, timeslice_number = @timeslice_number, ts_gs_mode = @ts_gs_mode, private_data_specifier_id = @private_data_specifier_id, tfs_flag = @tfs_flag, bandwidth = @bandwidth, guard_interval = @guard_interval, other_frequency_flag = @other_frequency_flag, plp_id = @plp_id, siso_miso = @siso_miso, t2_system_id = @t2_system_id, transmission_mode = @transmission_mode, coding_type = @coding_type, modulation_type = @modulation_type, fec_outer = @fec_outer, code_rate_hp_stream = @code_rate_hp_stream, code_rate_lp_stream = @code_rate_lp_stream, hierarchy_information = @hierarchy_information, mpe_fec_indicator = @mpe_fec_indicator, priority = @priority, time_slicing_indicator = @time_slicing_indicator, network_name = @network_name, target_region_country_code = @target_region_country_code, numupdates = numupdates + 1, dateupdated = CURRENT_TIMESTAMP " +
"WHERE nid = @nid " +
"AND tsid = @tsid";
mySqlCommand.Parameters.Add("@nid", MySqlDbType.Int32);
mySqlCommand.Parameters.Add("@tsid", MySqlDbType.Int32);
mySqlCommand.Parameters.Add("@onid", MySqlDbType.Int32);
mySqlCommand.Parameters.Add("@delivery_method", MySqlDbType.Int32);
mySqlCommand.Parameters.Add("@east", MySqlDbType.Bool);
mySqlCommand.Parameters.Add("@fec_inner", MySqlDbType.Int32);
mySqlCommand.Parameters.Add("@frequency", MySqlDbType.Int64);
mySqlCommand.Parameters.Add("@orbital_position", MySqlDbType.Float);
mySqlCommand.Parameters.Add("@polarization", MySqlDbType.Int32);
mySqlCommand.Parameters.Add("@roll_off", MySqlDbType.Int32);
mySqlCommand.Parameters.Add("@s2", MySqlDbType.Bool);
mySqlCommand.Parameters.Add("@symbol_rate", MySqlDbType.Int64);
mySqlCommand.Parameters.Add("@scrambling_sequence_index", MySqlDbType.Int32);
mySqlCommand.Parameters.Add("@input_stream_identifier", MySqlDbType.Int16);
mySqlCommand.Parameters.Add("@timeslice_number", MySqlDbType.Int16);
mySqlCommand.Parameters.Add("@ts_gs_mode", MySqlDbType.Int32);
mySqlCommand.Parameters.Add("@private_data_specifier_id", MySqlDbType.Int64);
mySqlCommand.Parameters.Add("@tfs_flag", MySqlDbType.Bool);
mySqlCommand.Parameters.Add("@bandwidth", MySqlDbType.Int32);
mySqlCommand.Parameters.Add("@guard_interval", MySqlDbType.Int32);
mySqlCommand.Parameters.Add("@other_frequency_flag", MySqlDbType.Bool);
mySqlCommand.Parameters.Add("@plp_id", MySqlDbType.Int16);
mySqlCommand.Parameters.Add("@siso_miso", MySqlDbType.Int32);
mySqlCommand.Parameters.Add("@t2_system_id", MySqlDbType.Int32);
mySqlCommand.Parameters.Add("@transmission_mode", MySqlDbType.Int32);
mySqlCommand.Parameters.Add("@coding_type", MySqlDbType.Int32);
mySqlCommand.Parameters.Add("@modulation_type", MySqlDbType.Int32);
mySqlCommand.Parameters.Add("@fec_outer", MySqlDbType.Int32);
mySqlCommand.Parameters.Add("@code_rate_hp_stream", MySqlDbType.Int32);
mySqlCommand.Parameters.Add("@code_rate_lp_stream", MySqlDbType.Int32);
mySqlCommand.Parameters.Add("@hierarchy_information", MySqlDbType.Int32);
mySqlCommand.Parameters.Add("@mpe_fec_indicator", MySqlDbType.Bool);
mySqlCommand.Parameters.Add("@priority", MySqlDbType.Bool);
mySqlCommand.Parameters.Add("@time_slicing_indicator", MySqlDbType.Bool);
mySqlCommand.Parameters.Add("@network_name", MySqlDbType.VarChar);
mySqlCommand.Parameters.Add("@target_region_country_code", MySqlDbType.VarChar);
mySqlCommand.Parameters["@nid"].Value = networkId;
mySqlCommand.Parameters["@tsid"].Value = newer.TransportStreamId;
mySqlCommand.Parameters["@onid"].Value = newer.OriginalNetworkId;
mySqlCommand.Parameters["@delivery_method"].Value = (int?)newer.DeliveryMethod;
mySqlCommand.Parameters["@east"].Value = newer.East;
mySqlCommand.Parameters["@fec_inner"].Value = (int?)newer.FecInner;
mySqlCommand.Parameters["@frequency"].Value = newer.Frequency;
mySqlCommand.Parameters["@orbital_position"].Value = newer.OrbitalPosition;
mySqlCommand.Parameters["@polarization"].Value = (int?)newer.Polarization;
mySqlCommand.Parameters["@roll_off"].Value = newer.RollOff;
mySqlCommand.Parameters["@s2"].Value = newer.S2;
mySqlCommand.Parameters["@symbol_rate"].Value = newer.SymbolRate;
mySqlCommand.Parameters["@scrambling_sequence_index"].Value = newer.ScramblingSequenceIndex;
mySqlCommand.Parameters["@input_stream_identifier"].Value = newer.InputStreamIdentifier;
mySqlCommand.Parameters["@timeslice_number"].Value = newer.TimesliceNumber;
mySqlCommand.Parameters["@ts_gs_mode"].Value = (int?)newer.TsGsMode;
mySqlCommand.Parameters["@private_data_specifier_id"].Value = newer.PrivateDataSpecifierId;
mySqlCommand.Parameters["@tfs_flag"].Value = newer.TfsFlag;
mySqlCommand.Parameters["@bandwidth"].Value = newer.Bandwidth;
mySqlCommand.Parameters["@guard_interval"].Value = newer.GuardInterval;
mySqlCommand.Parameters["@other_frequency_flag"].Value = newer.OtherFrequencyFlag;
mySqlCommand.Parameters["@plp_id"].Value = newer.PlpId;
mySqlCommand.Parameters["@siso_miso"].Value = newer.SisoMiso;
mySqlCommand.Parameters["@t2_system_id"].Value = newer.T2SystemId;
mySqlCommand.Parameters["@transmission_mode"].Value = newer.TransmissionMode;
mySqlCommand.Parameters["@coding_type"].Value = (int?)newer.CodingType;
mySqlCommand.Parameters["@modulation_type"].Value = newer.ModulationType;
mySqlCommand.Parameters["@fec_outer"].Value = (int?)newer.FecOuter;
mySqlCommand.Parameters["@code_rate_hp_stream"].Value = (int?)newer.CodeRateHpStream;
mySqlCommand.Parameters["@code_rate_lp_stream"].Value = (int?)newer.CodeRateLpStream;
mySqlCommand.Parameters["@hierarchy_information"].Value = (int?)newer.HierarchyInformation;
mySqlCommand.Parameters["@mpe_fec_indicator"].Value = newer.MpeFecIndicator;
mySqlCommand.Parameters["@priority"].Value = newer.Priority;
mySqlCommand.Parameters["@time_slicing_indicator"].Value = newer.TimeSlicingIndicator;
mySqlCommand.Parameters["@network_name"].Value = newer.NetworkName;
mySqlCommand.Parameters["@target_region_country_code"].Value = newer.TargetRegionCountryCode;
SetNulls(mySqlCommand);
mySqlCommand.ExecuteNonQuery();
}
private void UpdateSdt(MySqlConnection connection, ushort transportStreamId, ushort originalNetworkId, SdtService newer)
{
MySqlCommand mySqlCommand = connection.CreateCommand();
mySqlCommand.CommandText = "UPDATE dvb_sdt " +
"SET eit_schedule = @eit_schedule, eit_schedule_following = @eit_schedule_following, running_status = @running_status, free_ca_mode = @free_ca_mode, service_name = @service_name, service_provider_name = @service_provider_name, service_type = @service_type, private_data_specifier = @private_data_specifier, component_tag = @component_tag, iso_639_language_code = @iso_639_language_code, text = @text, data_broadcast_id = @data_broadcast_id, selector = @selector, reference_service_id = @reference_service_id, default_authority = @default_authority, control_remote_access_over_internet = @control_remote_access_over_internet, do_not_apply_revocation = @do_not_apply_revocation, do_not_scramble = @do_not_scramble, old_onid = @old_onid, old_service_id = @old_service_id, old_tsid = @old_tsid, num_updates = num_updates + 1, dateupdated = CURRENT_TIMESTAMP " +
"WHERE tsid = @tsid " +
"AND onid = @onid " +
"AND service_id = @service_id";
mySqlCommand.Parameters.Add("@tsid", MySqlDbType.Int32);
mySqlCommand.Parameters.Add("@onid", MySqlDbType.Int32);
mySqlCommand.Parameters.Add("@service_id", MySqlDbType.Int32);
mySqlCommand.Parameters.Add("@eit_schedule", MySqlDbType.Bool);
mySqlCommand.Parameters.Add("@eit_schedule_following", MySqlDbType.Bool);
mySqlCommand.Parameters.Add("@running_status", MySqlDbType.Int32);
mySqlCommand.Parameters.Add("@free_ca_mode", MySqlDbType.Bool);
mySqlCommand.Parameters.Add("@service_name", MySqlDbType.VarChar);
mySqlCommand.Parameters.Add("@service_provider_name", MySqlDbType.VarChar);
mySqlCommand.Parameters.Add("@service_type", MySqlDbType.Int32);
mySqlCommand.Parameters.Add("@private_data_specifier", MySqlDbType.Int64);
mySqlCommand.Parameters.Add("@component_tag", MySqlDbType.Int32);
mySqlCommand.Parameters.Add("@iso_639_language_code", MySqlDbType.VarChar);
mySqlCommand.Parameters.Add("@text", MySqlDbType.VarChar);
mySqlCommand.Parameters.Add("@data_broadcast_id", MySqlDbType.Int32);
mySqlCommand.Parameters.Add("@selector", MySqlDbType.TinyBlob);
mySqlCommand.Parameters.Add("@reference_service_id", MySqlDbType.Int32);
mySqlCommand.Parameters.Add("@control_remote_access_over_internet", MySqlDbType.Int32);
mySqlCommand.Parameters.Add("@do_not_apply_revocation", MySqlDbType.Bool);
mySqlCommand.Parameters.Add("@do_not_scramble", MySqlDbType.Bool);
mySqlCommand.Parameters.Add("@old_onid", MySqlDbType.Int32);
mySqlCommand.Parameters.Add("@old_service_id", MySqlDbType.Int32);
mySqlCommand.Parameters.Add("@old_tsid", MySqlDbType.Int32);
mySqlCommand.Parameters.Add("@default_authority", MySqlDbType.VarChar);
mySqlCommand.Parameters["@tsid"].Value = transportStreamId;
mySqlCommand.Parameters["@onid"].Value = originalNetworkId;
mySqlCommand.Parameters["@service_id"].Value = newer.ServiceId;
mySqlCommand.Parameters["@eit_schedule"].Value = newer.EitScheduleFlag;
mySqlCommand.Parameters["@eit_schedule_following"].Value = newer.EitPresentFollowingFlag;
mySqlCommand.Parameters["@running_status"].Value = (int)newer.RunningStatus;
mySqlCommand.Parameters["@free_ca_mode"].Value = newer.FreeCaMode;
mySqlCommand.Parameters["@service_name"].Value = newer.ServiceName;
mySqlCommand.Parameters["@service_provider_name"].Value = newer.ServiceProviderName;
mySqlCommand.Parameters["@service_type"].Value = (int?)newer.ServiceType;
mySqlCommand.Parameters["@private_data_specifier"].Value = newer.PrivateDataSpecifier;
mySqlCommand.Parameters["@component_tag"].Value = newer.ComponentTag;
mySqlCommand.Parameters["@iso_639_language_code"].Value = newer.Iso639LanguageCode;
mySqlCommand.Parameters["@text"].Value = newer.Text;
mySqlCommand.Parameters["@data_broadcast_id"].Value = newer.DataBroadcastId;
mySqlCommand.Parameters["@selector"].Value = newer.Selector;
mySqlCommand.Parameters["@reference_service_id"].Value = newer.ReferenceServiceId;
mySqlCommand.Parameters["@control_remote_access_over_internet"].Value = newer.ControlRemoteAccessOverInternet;
mySqlCommand.Parameters["@do_not_apply_revocation"].Value = newer.DoNotApplyRevocation;
mySqlCommand.Parameters["@do_not_scramble"].Value = newer.DoNotScramble;
mySqlCommand.Parameters["@old_onid"].Value = newer.OldOriginalNetworkId;
mySqlCommand.Parameters["@old_service_id"].Value = newer.OldServiceId;
mySqlCommand.Parameters["@old_tsid"].Value = newer.OldTransportStreamId;
mySqlCommand.Parameters["@default_authority"].Value = newer.DefaultAuthority;
SetNulls(mySqlCommand);
mySqlCommand.ExecuteNonQuery();
}
private void InsertNitTransportStream(MySqlConnection connection, ushort networkId, NitTransportStream transportStream)
{
Guid uuid = Guid.Empty;
bool hasLinkages = HasLinkages(transportStream.Linkages);
if (hasLinkages)
uuid = Guid.NewGuid();
{
MySqlTransaction transaction = connection.BeginTransaction();
MySqlCommand mySqlCommand = connection.CreateCommand();
mySqlCommand.Transaction = transaction;
mySqlCommand.CommandText =
"INSERT INTO dvb_nit_transport_stream " +
" (nid, tsid, onid, delivery_method, east, fec_inner, frequency, orbital_position, polarization, roll_off, s2, symbol_rate, scrambling_sequence_index, input_stream_identifier, timeslice_number, ts_gs_mode, private_data_specifier_id, tfs_flag, bandwidth, guard_interval, other_frequency_flag, plp_id, siso_miso, t2_system_id, transmission_mode, coding_type, modulation_type, fec_outer, code_rate_hp_stream, code_rate_lp_stream, hierarchy_information, mpe_fec_indicator, priority, time_slicing_indicator, network_name, target_region_country_code, uuid) " +
"VALUES" +
" (@nid, @tsid, @onid, @delivery_method, @east, @fec_inner, @frequency, @orbital_position, @polarization, @roll_off, @s2, @symbol_rate, " +
" @scrambling_sequence_index, @input_stream_identifier, @timeslice_number, @ts_gs_mode, @private_data_specifier_id, @tfs_flag, @bandwidth, " +
" @guard_interval, @other_frequency_flag, @plp_id, @siso_miso, @t2_system_id, @transmission_mode, @coding_type, @modulation_type, @fec_outer, " +
" @code_rate_hp_stream, @code_rate_lp_stream, @hierarchy_information, @mpe_fec_indicator, @priority, @time_slicing_indicator, @network_name, " +
" @target_region_country_code, @uuid)";
mySqlCommand.Parameters.Add("@nid", MySqlDbType.Int32);
mySqlCommand.Parameters.Add("@tsid", MySqlDbType.Int32);
mySqlCommand.Parameters.Add("@onid", MySqlDbType.Int32);
mySqlCommand.Parameters.Add("@delivery_method", MySqlDbType.Int32);
mySqlCommand.Parameters.Add("@east", MySqlDbType.Bool);
mySqlCommand.Parameters.Add("@fec_inner", MySqlDbType.Int32);
mySqlCommand.Parameters.Add("@frequency", MySqlDbType.Int64);
mySqlCommand.Parameters.Add("@orbital_position", MySqlDbType.Float);
mySqlCommand.Parameters.Add("@polarization", MySqlDbType.Int32);
mySqlCommand.Parameters.Add("@roll_off", MySqlDbType.Int32);
mySqlCommand.Parameters.Add("@s2", MySqlDbType.Bool);
mySqlCommand.Parameters.Add("@symbol_rate", MySqlDbType.Int64);
mySqlCommand.Parameters.Add("@scrambling_sequence_index", MySqlDbType.Int32);
mySqlCommand.Parameters.Add("@input_stream_identifier", MySqlDbType.Int16);
mySqlCommand.Parameters.Add("@timeslice_number", MySqlDbType.Int16);
mySqlCommand.Parameters.Add("@ts_gs_mode", MySqlDbType.Int32);
mySqlCommand.Parameters.Add("@private_data_specifier_id", MySqlDbType.Int64);
mySqlCommand.Parameters.Add("@tfs_flag", MySqlDbType.Bool);
mySqlCommand.Parameters.Add("@bandwidth", MySqlDbType.Int32);
mySqlCommand.Parameters.Add("@guard_interval", MySqlDbType.Int32);
mySqlCommand.Parameters.Add("@other_frequency_flag", MySqlDbType.Bool);
mySqlCommand.Parameters.Add("@plp_id", MySqlDbType.Int16);
mySqlCommand.Parameters.Add("@siso_miso", MySqlDbType.Int32);
mySqlCommand.Parameters.Add("@t2_system_id", MySqlDbType.Int32);
mySqlCommand.Parameters.Add("@transmission_mode", MySqlDbType.Int32);
mySqlCommand.Parameters.Add("@coding_type", MySqlDbType.Int32);
mySqlCommand.Parameters.Add("@modulation_type", MySqlDbType.Int32);
mySqlCommand.Parameters.Add("@fec_outer", MySqlDbType.Int32);
mySqlCommand.Parameters.Add("@code_rate_hp_stream", MySqlDbType.Int32);
mySqlCommand.Parameters.Add("@code_rate_lp_stream", MySqlDbType.Int32);
mySqlCommand.Parameters.Add("@hierarchy_information", MySqlDbType.Int32);
mySqlCommand.Parameters.Add("@mpe_fec_indicator", MySqlDbType.Bool);
mySqlCommand.Parameters.Add("@priority", MySqlDbType.Bool);
mySqlCommand.Parameters.Add("@time_slicing_indicator", MySqlDbType.Bool);
mySqlCommand.Parameters.Add("@network_name", MySqlDbType.VarChar);
mySqlCommand.Parameters.Add("@target_region_country_code", MySqlDbType.VarChar);
mySqlCommand.Parameters.Add("@uuid", MySqlDbType.VarChar);
mySqlCommand.Parameters["@nid"].Value = networkId;
mySqlCommand.Parameters["@tsid"].Value = transportStream.TransportStreamId;
mySqlCommand.Parameters["@onid"].Value = transportStream.OriginalNetworkId;
mySqlCommand.Parameters["@delivery_method"].Value = (int?)transportStream.DeliveryMethod;
mySqlCommand.Parameters["@east"].Value = transportStream.East;
mySqlCommand.Parameters["@fec_inner"].Value = (int?)transportStream.FecInner;
mySqlCommand.Parameters["@frequency"].Value = transportStream.Frequency;
mySqlCommand.Parameters["@orbital_position"].Value = transportStream.OrbitalPosition;
mySqlCommand.Parameters["@polarization"].Value = (int?)transportStream.Polarization;
mySqlCommand.Parameters["@roll_off"].Value = transportStream.RollOff;
mySqlCommand.Parameters["@s2"].Value = transportStream.S2;
mySqlCommand.Parameters["@symbol_rate"].Value = transportStream.SymbolRate;
mySqlCommand.Parameters["@scrambling_sequence_index"].Value = transportStream.ScramblingSequenceIndex;
mySqlCommand.Parameters["@input_stream_identifier"].Value = transportStream.InputStreamIdentifier;
mySqlCommand.Parameters["@timeslice_number"].Value = transportStream.TimesliceNumber;
mySqlCommand.Parameters["@ts_gs_mode"].Value = (int?)transportStream.TsGsMode;
mySqlCommand.Parameters["@private_data_specifier_id"].Value = transportStream.PrivateDataSpecifierId;
mySqlCommand.Parameters["@tfs_flag"].Value = transportStream.TfsFlag;
mySqlCommand.Parameters["@bandwidth"].Value = transportStream.Bandwidth;
mySqlCommand.Parameters["@guard_interval"].Value = transportStream.GuardInterval;
mySqlCommand.Parameters["@other_frequency_flag"].Value = transportStream.OtherFrequencyFlag;
mySqlCommand.Parameters["@plp_id"].Value = transportStream.PlpId;
mySqlCommand.Parameters["@siso_miso"].Value = transportStream.SisoMiso;
mySqlCommand.Parameters["@t2_system_id"].Value = transportStream.T2SystemId;
mySqlCommand.Parameters["@transmission_mode"].Value = transportStream.TransmissionMode;
mySqlCommand.Parameters["@coding_type"].Value = (int?)transportStream.CodingType;
mySqlCommand.Parameters["@modulation_type"].Value = transportStream.ModulationType;
mySqlCommand.Parameters["@fec_outer"].Value = (int?)transportStream.FecOuter;
mySqlCommand.Parameters["@code_rate_hp_stream"].Value = (int?)transportStream.CodeRateHpStream;
mySqlCommand.Parameters["@code_rate_lp_stream"].Value = (int?)transportStream.CodeRateLpStream;
mySqlCommand.Parameters["@hierarchy_information"].Value = (int?)transportStream.HierarchyInformation;
mySqlCommand.Parameters["@mpe_fec_indicator"].Value = transportStream.MpeFecIndicator;
mySqlCommand.Parameters["@priority"].Value = transportStream.Priority;
mySqlCommand.Parameters["@time_slicing_indicator"].Value = transportStream.TimeSlicingIndicator;
mySqlCommand.Parameters["@network_name"].Value = transportStream.NetworkName;
mySqlCommand.Parameters["@target_region_country_code"].Value = transportStream.TargetRegionCountryCode;
if (hasLinkages)
mySqlCommand.Parameters["@uuid"].Value = uuid.ToString();
else
mySqlCommand.Parameters["@uuid"].Value = DBNull.Value;
SetNulls(mySqlCommand);
mySqlCommand.ExecuteNonQuery();
InsertNitTransportStreamCellFrequencies(connection, networkId, transportStream);
InsertNitTransportStreamCellInfos(connection, networkId, transportStream);
InsertNitTransportStreamCells(connection, networkId, transportStream);
InsertNitTransportStreamCentreFrequencies(connection, networkId, transportStream);
InsertNitTransportStreamServices(connection, networkId, transportStream, transaction);
InsertNitTransportStreamTargetRegions(connection, networkId, transportStream);
transaction.Commit();
}
}
private void InsertBatTs(MySqlConnection connection, ushort batBouquetBouquetId, BatTransportStream child)
{
MySqlTransaction transaction = connection.BeginTransaction();
MySqlCommand command = connection.CreateCommand();
command.Transaction = transaction;
command.CommandText =
"INSERT INTO dvb_bat_transport_stream (bouquet_id, original_network_id, transport_stream_id, private_data_specifier, default_authority) " +
"VALUES (@bouquet_id, @original_network_id, @transport_stream_id, @private_data_specifier, @default_authority)";
command.Parameters.AddWithValue("@bouquet_id", batBouquetBouquetId);
command.Parameters.AddWithValue("@original_network_id", child.OriginalNetworkId);
command.Parameters.AddWithValue("@transport_stream_id", child.TransportStreamId);
command.Parameters.AddWithValue("@private_data_specifier", child.PrivateDataSpecifier);
command.Parameters.AddWithValue("@default_authority", child.DefaultAuthority);
command.ExecuteNonQuery();
InsertBatTransportStreamCountryAvailability(transaction, batBouquetBouquetId, child);
InsertBatTransportStreamServiceList(transaction, batBouquetBouquetId, child);
transaction.Commit();
}
private void InsertCat(MySqlConnection connection, int currentNetworkId, int currentTransportStreamId, CaDescriptor caDescriptor)
{
MySqlCommand mySqlCommand = connection.CreateCommand();
mySqlCommand.CommandText =
"INSERT INTO dvb_cat (nid, tsid, ca_pid, ca_system_id, private_data) VALUES (@nid,@tsid,@ca_pid,@ca_system_id,@private_data)";
mySqlCommand.Parameters.Add("@nid", MySqlDbType.Int32);
mySqlCommand.Parameters.Add("@tsid", MySqlDbType.Int32);
mySqlCommand.Parameters.Add("@ca_pid", MySqlDbType.Int32);
mySqlCommand.Parameters.Add("@ca_system_id", MySqlDbType.Int32);
mySqlCommand.Parameters.Add("@private_data", MySqlDbType.TinyBlob);
mySqlCommand.Parameters["@nid"].Value = currentNetworkId;
mySqlCommand.Parameters["@tsid"].Value = currentTransportStreamId;
mySqlCommand.Parameters["@ca_pid"].Value = caDescriptor.CaPid;
mySqlCommand.Parameters["@ca_system_id"].Value = caDescriptor.CaSystemId;
if (caDescriptor.PrivateData == null)
mySqlCommand.Parameters["@private_data"].Value = DBNull.Value;
else if (caDescriptor.PrivateData.Length == 0)
mySqlCommand.Parameters["@private_data"].Value = DBNull.Value;
else
mySqlCommand.Parameters["@private_data"].Value = caDescriptor.PrivateData;
SetNulls(mySqlCommand);
mySqlCommand.ExecuteNonQuery();
}
private void InsertSdt(MySqlConnection connection, ushort transportStreamId, ushort originalNetworkId, SdtService sdtService)
{
bool hasLinkages = HasLinkages(sdtService.Linkages);
Guid linkageGuid = Guid.Empty;
if (hasLinkages)
linkageGuid = Guid.NewGuid();
using (MySqlTransaction transaction = connection.BeginTransaction())
{
using (MySqlCommand mySqlCommand = connection.CreateCommand())
{
mySqlCommand.Transaction = transaction;
mySqlCommand.CommandText =
"INSERT INTO dvb_sdt" +
" (tsid, onid, service_id, eit_schedule, eit_schedule_following, running_status, free_ca_mode, service_name, service_provider_name, service_type, private_data_specifier, iso_639_language_code, text, data_broadcast_id, selector, reference_service_id, control_remote_access_over_internet, do_not_apply_revocation, do_not_scramble, uuid)" +
"VALUES" +
" (@tsid,@onid,@service_id,@eit_schedule,@eit_schedule_following, @running_status, @free_ca_mode,@service_name,@service_provider_name,@service_type,@private_data_specifier,@iso_639_language_code,@text,@data_broadcat_id,@selector, @reference_service_id, @control_remote_access_over_internet, @do_not_apply_revocation, @do_not_scramble, @uuid)";
mySqlCommand.Parameters.Add("@tsid", MySqlDbType.Int32);
mySqlCommand.Parameters.Add("@onid", MySqlDbType.Int32);
mySqlCommand.Parameters.Add("@service_id", MySqlDbType.Int32);
mySqlCommand.Parameters.Add("@eit_schedule", MySqlDbType.Bool);
mySqlCommand.Parameters.Add("@eit_schedule_following", MySqlDbType.Bool);
mySqlCommand.Parameters.Add("@running_status", MySqlDbType.Int32);
mySqlCommand.Parameters.Add("@free_ca_mode", MySqlDbType.Bool);
mySqlCommand.Parameters.Add("@service_name", MySqlDbType.VarChar);
mySqlCommand.Parameters.Add("@service_provider_name", MySqlDbType.VarChar);
mySqlCommand.Parameters.Add("@service_type", MySqlDbType.Int32);
mySqlCommand.Parameters.Add("@private_data_specifier", MySqlDbType.Int64);
mySqlCommand.Parameters.Add("@component_tag", MySqlDbType.Int32);
mySqlCommand.Parameters.Add("@iso_639_language_code", MySqlDbType.VarChar);
mySqlCommand.Parameters.Add("@text", MySqlDbType.VarChar);
mySqlCommand.Parameters.Add("@data_broadcat_id", MySqlDbType.Int32);
mySqlCommand.Parameters.Add("@selector", MySqlDbType.TinyBlob);
mySqlCommand.Parameters.Add("@reference_service_id", MySqlDbType.Int32);
mySqlCommand.Parameters.Add("@control_remote_access_over_internet", MySqlDbType.Int32);
mySqlCommand.Parameters.Add("@do_not_apply_revocation", MySqlDbType.Bool);
mySqlCommand.Parameters.Add("@do_not_scramble", MySqlDbType.Bool);
mySqlCommand.Parameters.Add("@old_onid", MySqlDbType.Int32);
mySqlCommand.Parameters.Add("@old_service_id", MySqlDbType.Int32);
mySqlCommand.Parameters.Add("@old_tsid", MySqlDbType.Int32);
mySqlCommand.Parameters.Add("@uuid", MySqlDbType.VarChar);
mySqlCommand.Parameters["@tsid"].Value = transportStreamId;
mySqlCommand.Parameters["@onid"].Value = originalNetworkId;
mySqlCommand.Parameters["@service_id"].Value = sdtService.ServiceId;
mySqlCommand.Parameters["@eit_schedule"].Value = sdtService.EitScheduleFlag;
mySqlCommand.Parameters["@eit_schedule_following"].Value = sdtService.EitPresentFollowingFlag;
mySqlCommand.Parameters["@running_status"].Value = (int)sdtService.RunningStatus;
mySqlCommand.Parameters["@free_ca_mode"].Value = sdtService.FreeCaMode;
mySqlCommand.Parameters["@service_name"].Value = sdtService.ServiceName;
mySqlCommand.Parameters["@service_provider_name"].Value = sdtService.ServiceProviderName;
mySqlCommand.Parameters["@service_type"].Value = (int?)sdtService.ServiceType;
mySqlCommand.Parameters["@private_data_specifier"].Value = sdtService.PrivateDataSpecifier;
mySqlCommand.Parameters["@component_tag"].Value = sdtService.ComponentTag;
mySqlCommand.Parameters["@iso_639_language_code"].Value = sdtService.Iso639LanguageCode;
mySqlCommand.Parameters["@text"].Value = sdtService.Text;
mySqlCommand.Parameters["@data_broadcat_id"].Value = sdtService.DataBroadcastId;
mySqlCommand.Parameters["@selector"].Value = sdtService.Selector;
mySqlCommand.Parameters["@reference_service_id"].Value = sdtService.ReferenceServiceId;
mySqlCommand.Parameters["@control_remote_access_over_internet"].Value = sdtService.ControlRemoteAccessOverInternet;
mySqlCommand.Parameters["@do_not_apply_revocation"].Value = sdtService.DoNotApplyRevocation;
mySqlCommand.Parameters["@do_not_scramble"].Value = sdtService.DoNotScramble;
mySqlCommand.Parameters["@old_onid"].Value = sdtService.OldOriginalNetworkId;
mySqlCommand.Parameters["@old_service_id"].Value = sdtService.OldServiceId;
mySqlCommand.Parameters["@old_tsid"].Value = sdtService.OldTransportStreamId;
mySqlCommand.Parameters["@uuid"].Value = hasLinkages ? linkageGuid : null;
SetNulls(mySqlCommand);
mySqlCommand.ExecuteNonQuery();
}
InsertSdtCaIdentifiers(transaction, transportStreamId, originalNetworkId, sdtService);
InsertSdtCountryAvailability(transaction, transportStreamId, originalNetworkId, sdtService);
if (hasLinkages)
InsertSdtLinkages(connection, linkageGuid, sdtService.Linkages, transaction);
InsertSdtMultilingualServiceName(connection, transportStreamId, originalNetworkId, sdtService);
InsertSdtNvodReferences(transaction, transportStreamId, originalNetworkId, sdtService);
InsertSdtComponents(transaction, transportStreamId, originalNetworkId, sdtService);
transaction.Commit();
}
}
private void UpdateTsdtStationIdentification(MySqlConnection connection, int cnid, int ctsid, string stationIdentification)
{
MySqlCommand command = connection.CreateCommand();
command.CommandText =
"UPDATE dvb_tsdt SET station_identification = @stationIdent WHERE cnid = @cnid AND @ctsid = @ctsid";
command.Parameters.AddWithValue("@stationIdent", stationIdentification);
command.Parameters.AddWithValue("@cnid", cnid);
command.Parameters.AddWithValue("@ctsid", ctsid);
command.ExecuteNonQuery();
}
private void InsertTsdt(MySqlConnection connection, TsdtCoordinate tsdtCoordinate)
{
MySqlCommand command = connection.CreateCommand();
command.CommandText = "INSERT INTO dvb_tsdt (cnid, ctsid, compliance) VALUES (@cnid,@ctsid,@compliance)";
command.Parameters.AddWithValue("@cnid", tsdtCoordinate.CurrentNetworkId);
command.Parameters.AddWithValue("@ctsid", tsdtCoordinate.CurrentTransportStreamId);
command.Parameters.AddWithValue("@compliance", tsdtCoordinate.Compliance);
command.ExecuteNonQuery();
}
private void InsertPmt(MySqlConnection connection, int currentNetworkId, int currentTransportStreamId, ProgramMapping mapping)
{
/*MySqlCommand mySqlCommand = connection.CreateCommand();
mySqlCommand.CommandText =
"SELECT dateadded FROM dvb_pmt WHERE nid = @nid AND tsid = @tsid AND program_number = @program_number";
mySqlCommand.Parameters.Add("@nid", MySqlDbType.Int32);
mySqlCommand.Parameters.Add("@tsid", MySqlDbType.Int32);
mySqlCommand.Parameters.Add("@program_number", MySqlDbType.Int32);
mySqlCommand.Parameters["@nid"].Value = currentNetworkId;
mySqlCommand.Parameters["@tsid"].Value = currentTransportStreamId;
mySqlCommand.Parameters["@program_number"].Value = mapping.ProgramNumber;
MySqlDataReader dataReader = mySqlCommand.ExecuteReader();
bool alreadyKnown = dataReader.Read();
dataReader.Close();
if (alreadyKnown)
return;*/
MySqlTransaction transaction = connection.BeginTransaction();
MySqlCommand mySqlCommand = connection.CreateCommand();
mySqlCommand.Transaction = transaction;
mySqlCommand.CommandText =
"INSERT INTO dvb_pmt " +
"(nid, tsid, program_number, pcr_pid, maximum_bitrate, multiplex_buffer_utilization_bound_valid_flag, multiplex_lfw_offset_lower_bound, multiplex_ltw_offset_upper_bound, clock_accuracy_exponent, clock_accuracy_integer, external_clock_reference_indicator, sb_leak_rate, sb_size, ca_pid, ca_system_id, ca_private_data, private_data_specifier, registration_additional_identification_info, registration_format_identifier, new_original_network_id, new_service_id, new_transport_stream_id, component_tag, metadata_input_leak_rate, metadata_buffer_size, metadata_output_leak_rate, scrambling_mode, es_id, audio_type, iso_639_language_code, iod_graphics_profile_level_indication, iod_visual_profile_level_indication, iod_audio_profile_level_indication, iod_scene_profile_level_indication, iod_od_profile_level_indication, iod_url_string, iod_include_inline_profile_level_flag, iod_url_flag, iod_object_descriptor_id, scope_of_iod_label, iod_label, private_data_indicator, frame_Rate, chroma_format, constrained_parameter_flag, frame_rate_extension_flag, mpeg1_only_flag, multiple_framerate_flag, profile_and_level_indication, still_picture_flag, metadata_program_number, metadata_application_format, metadata_application_format_identifier, metadata_format, metadata_format_identifier, metadata_locator_record, metadata_locator_record_flag, metadata_service_id, mpeg_carriage_flag, metadata_private_data, transport_stream_id, transport_stream_location, free_format, audio_stream_id, layer, variable_rate_audio, copy_control_private_data, alignment_type, hierarchy_type, hierarchy_layer_type, tref_present_flag, hierarchy_channel, no_view_scalability_flag, hierarchy_embedded_layer_index, no_quality_scalability_flag, no_spatial_scalability_flag, no_temporal_scalability_flag) " +
"VALUES " +
"(@nid, @tsid, @program_number, @pcr_pid, @maximum_bitrate, @multiplex_buffer_utilization_bound_valid_flag, @multiplex_lfw_offset_lower_bound, @multiplex_ltw_offset_upper_bound, " +
"@clock_accuracy_exponent, @clock_accuracy_integer, @external_clock_reference_indicator, @sb_leak_rate, @sb_size, @ca_pid, @ca_system_id, @ca_private_data, @private_data_specifier, " +
"@registration_additional_identification_info, @registration_format_identifier, @new_original_network_id, @new_service_id, @new_transport_stream_id, @component_tag, " +
"@metadata_input_leak_rate, @metadata_buffer_size, @metadata_output_leak_rate, @scrambling_mode, @es_id, @audio_type, @iso_639_language_code, @iod_graphics_profile_level_indication, " +
"@iod_visual_profile_level_indication, @iod_audio_profile_level_indication, @iod_scene_profile_level_indication, @iod_od_profile_level_indication, @iod_url_string, " +
"@iod_include_inline_profile_level_flag, @iod_url_flag, @iod_object_descriptor_id, @scope_of_iod_label, @iod_label, @private_data_indicator, @frame_Rate, @chroma_format, @constrained_parameter_flag, @frame_rate_extension_flag, @mpeg1_only_flag, @multiple_framerate_flag, @profile_and_level_indication, @still_picture_flag, @metadata_program_number, @metadata_application_format, @metadata_application_format_identifier, @metadata_format, @metadata_format_identifier, @metadata_locator_record, @metadata_locator_record_flag, @metadata_service_id, @mpeg_carriage_flag, @metadata_private_data, @transport_stream_id, @transport_stream_location, @free_format, @audio_stream_id, @layer, @variable_rate_audio, @copy_control_private_data, @alignment_type, @hierarchy_type, @hierarchy_layer_type, @tref_present_flag, @hierarchy_channel, @no_view_scalability_flag, @hierarchy_embedded_layer_index, @no_quality_scalability_flag, @no_spatial_scalability_flag, @no_temporal_scalability_flag)\r\n";
mySqlCommand.Parameters.AddWithValue("@nid", currentNetworkId);
mySqlCommand.Parameters.AddWithValue("@tsid", currentTransportStreamId);
mySqlCommand.Parameters.AddWithValue("@program_number", mapping.ProgramNumber);
mySqlCommand.Parameters.AddWithValue("@pcr_pid", mapping.PcrPid);
mySqlCommand.Parameters.AddWithValue("@maximum_bitrate", mapping.MaximumBitrate);
mySqlCommand.Parameters.AddWithValue("@multiplex_buffer_utilization_bound_valid_flag", mapping.MultiplexBufferUtilizationBoundValidFlag);
mySqlCommand.Parameters.AddWithValue("@multiplex_lfw_offset_lower_bound", mapping.MultiplexLtwOffsetLowerBound);
mySqlCommand.Parameters.AddWithValue("@multiplex_ltw_offset_upper_bound", mapping.MultiplexLtwOffsetUpperBound);
mySqlCommand.Parameters.AddWithValue("@clock_accuracy_exponent", mapping.ClockAccuracyExponent);
mySqlCommand.Parameters.AddWithValue("@clock_accuracy_integer", mapping.ClockAccuracyInteger);
mySqlCommand.Parameters.AddWithValue("@external_clock_reference_indicator", mapping.ExternalClockReferenceIndicator);
mySqlCommand.Parameters.AddWithValue("@sb_leak_rate", mapping.SbLeakRate);
mySqlCommand.Parameters.AddWithValue("@sb_size", mapping.SbSize);
mySqlCommand.Parameters.AddWithValue("@ca_pid", mapping.CaPid);
mySqlCommand.Parameters.AddWithValue("@ca_system_id", mapping.CaSystemId);
mySqlCommand.Parameters.AddWithValue("@ca_private_data", mapping.CaPrivateData);
mySqlCommand.Parameters.AddWithValue("@private_data_specifier", mapping.PrivateDataSpecifier);
mySqlCommand.Parameters.AddWithValue("@registration_additional_identification_info", mapping.RegistrationAdditionalIdentificationInfo);
mySqlCommand.Parameters.AddWithValue("@registration_format_identifier", mapping.RegistrationFormatIdentifier);
mySqlCommand.Parameters.AddWithValue("@new_original_network_id", mapping.NewOriginalNetworkId);
mySqlCommand.Parameters.AddWithValue("@new_service_id", mapping.NewServiceId);
mySqlCommand.Parameters.AddWithValue("@new_transport_stream_id", mapping.NewTransportStreamId);
mySqlCommand.Parameters.AddWithValue("@component_tag", mapping.ComponentTag);
mySqlCommand.Parameters.AddWithValue("@metadata_input_leak_rate", mapping.MetadataInputLeakRate);
mySqlCommand.Parameters.AddWithValue("@metadata_buffer_size", mapping.MetadataBufferSize);
mySqlCommand.Parameters.AddWithValue("@metadata_output_leak_rate", mapping.MetadataOutputLeakRate);
mySqlCommand.Parameters.AddWithValue("@scrambling_mode", mapping.ScramblingMode);
mySqlCommand.Parameters.AddWithValue("@es_id", mapping.EsId);
mySqlCommand.Parameters.AddWithValue("@audio_type", mapping.AudioType);
mySqlCommand.Parameters.AddWithValue("@iso_639_language_code", mapping.Iso639LanguageCode);
if (mapping.InitialObjectDescriptor != null)
{
mySqlCommand.Parameters.AddWithValue("@iod_graphics_profile_level_indication", mapping.InitialObjectDescriptor.GraphicsProfileLevelIndication);
mySqlCommand.Parameters.AddWithValue("@iod_visual_profile_level_indication", mapping.InitialObjectDescriptor.VisualProfileLevelIndication);
mySqlCommand.Parameters.AddWithValue("@iod_audio_profile_level_indication", mapping.InitialObjectDescriptor.AudioProfileLevelIndication);
mySqlCommand.Parameters.AddWithValue("@iod_scene_profile_level_indication", mapping.InitialObjectDescriptor.SceneProfileLevelIndication);
mySqlCommand.Parameters.AddWithValue("@iod_od_profile_level_indication", mapping.InitialObjectDescriptor.OdProfileLevelIndication);
mySqlCommand.Parameters.AddWithValue("@iod_url_string", mapping.InitialObjectDescriptor.UrlString);
mySqlCommand.Parameters.AddWithValue("@iod_include_inline_profile_level_flag", mapping.InitialObjectDescriptor.IncludeInlineProfileLevelFlag);
mySqlCommand.Parameters.AddWithValue("@iod_url_flag", mapping.InitialObjectDescriptor.UrlFlag);
mySqlCommand.Parameters.AddWithValue("@iod_object_descriptor_id", mapping.InitialObjectDescriptor.ObjectDescriptorId);
}
else
{
mySqlCommand.Parameters.AddWithValue("@iod_graphics_profile_level_indication", DBNull.Value);
mySqlCommand.Parameters.AddWithValue("@iod_visual_profile_level_indication", DBNull.Value);
mySqlCommand.Parameters.AddWithValue("@iod_audio_profile_level_indication", DBNull.Value);
mySqlCommand.Parameters.AddWithValue("@iod_scene_profile_level_indication", DBNull.Value);
mySqlCommand.Parameters.AddWithValue("@iod_od_profile_level_indication", DBNull.Value);
mySqlCommand.Parameters.AddWithValue("@iod_url_string", DBNull.Value);
mySqlCommand.Parameters.AddWithValue("@iod_include_inline_profile_level_flag", DBNull.Value);
mySqlCommand.Parameters.AddWithValue("@iod_url_flag", DBNull.Value);
mySqlCommand.Parameters.AddWithValue("@iod_object_descriptor_id", DBNull.Value);
}
//@, @, @, @, @)\r\n";
mySqlCommand.Parameters.AddWithValue("@scope_of_iod_label", mapping.ScopeOfIodLabel);
mySqlCommand.Parameters.AddWithValue("@iod_label", mapping.IodLabel);
mySqlCommand.Parameters.AddWithValue("@private_data_indicator", mapping.PrivateDataIndicator);
mySqlCommand.Parameters.AddWithValue("@frame_Rate", mapping.FrameRate);
mySqlCommand.Parameters.AddWithValue("@chroma_format", mapping.ChromaFormat);
mySqlCommand.Parameters.AddWithValue("@constrained_parameter_flag", mapping.ConstrainedParameterFlag);
mySqlCommand.Parameters.AddWithValue("@frame_rate_extension_flag", mapping.FrameRateExtensionFlag);
mySqlCommand.Parameters.AddWithValue("@mpeg1_only_flag", mapping.Mpeg1OnlyFlag);
mySqlCommand.Parameters.AddWithValue("@multiple_framerate_flag", mapping.MultipleFramerateFlag);
mySqlCommand.Parameters.AddWithValue("@profile_and_level_indication", mapping.ProfileAndLevelIndication);
mySqlCommand.Parameters.AddWithValue("@still_picture_flag", mapping.StillPictureFlag);
mySqlCommand.Parameters.AddWithValue("@metadata_program_number", mapping.MetadataProgramNumber);
mySqlCommand.Parameters.AddWithValue("@metadata_application_format", mapping.MetadataApplicationFormat);
mySqlCommand.Parameters.AddWithValue("@metadata_application_format_identifier", mapping.MetadataApplicationFormatIdentifier);
mySqlCommand.Parameters.AddWithValue("@metadata_format", mapping.MetadataFormat);
mySqlCommand.Parameters.AddWithValue("@metadata_format_identifier", mapping.MetadataFormatIdentifier);
mySqlCommand.Parameters.AddWithValue("@metadata_locator_record", mapping.MetadataLocatorRecord);
mySqlCommand.Parameters.AddWithValue("@metadata_locator_record_flag", mapping.MetadataLocatorRecordFlag);
mySqlCommand.Parameters.AddWithValue("@metadata_service_id", mapping.MetadataServiceId);
mySqlCommand.Parameters.AddWithValue("@mpeg_carriage_flag", mapping.MpegCarriageFlag);
mySqlCommand.Parameters.AddWithValue("@metadata_private_data", mapping.MetadataPrivateData);
mySqlCommand.Parameters.AddWithValue("@transport_stream_id", mapping.TransportStreamId);
mySqlCommand.Parameters.AddWithValue("@transport_stream_location", mapping.TransportStreamLocation);
mySqlCommand.Parameters.AddWithValue("@free_format", mapping.FreeFormat);
mySqlCommand.Parameters.AddWithValue("@audio_stream_id", mapping.AudioStreamId);
mySqlCommand.Parameters.AddWithValue("@layer", mapping.Layer);
mySqlCommand.Parameters.AddWithValue("@variable_rate_audio", mapping.VariableRateAudio);
mySqlCommand.Parameters.AddWithValue("@copy_control_private_data", mapping.CopyControlPrivateData);
mySqlCommand.Parameters.AddWithValue("@alignment_type", mapping.AlignmentType);
mySqlCommand.Parameters.AddWithValue("@hierarchy_type", mapping.HierarchyType);
mySqlCommand.Parameters.AddWithValue("@hierarchy_layer_type", mapping.HierarchyLayerType);
mySqlCommand.Parameters.AddWithValue("@tref_present_flag", mapping.TrefPresentFlag);
mySqlCommand.Parameters.AddWithValue("@hierarchy_channel", mapping.HierarchyChannel);
mySqlCommand.Parameters.AddWithValue("@no_view_scalability_flag", mapping.NoViewScalabilityFlag);
mySqlCommand.Parameters.AddWithValue("@hierarchy_embedded_layer_index", mapping.HierarchyEmbeddedLayerIndex);
mySqlCommand.Parameters.AddWithValue("@no_quality_scalability_flag", mapping.NoQualityScalabilityFlag);
mySqlCommand.Parameters.AddWithValue("@no_spatial_scalability_flag", mapping.NoSpatialScalabilityFlag);
mySqlCommand.Parameters.AddWithValue("@no_temporal_scalability_flag", mapping.NoTemporalScalabilityFlag);
SetNulls(mySqlCommand);
int executeNonQuery = mySqlCommand.ExecuteNonQuery();
if (executeNonQuery > 0)
{
InsertPmtStreams(connection, mapping, currentNetworkId, currentTransportStreamId, transaction);
}
transaction.Commit();
}
}
}

View File

@ -0,0 +1,124 @@
using skyscraper5.Skyscraper.Scraper.Storage.Split;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using MySqlConnector;
namespace skyscraper5.Data.MySql
{
public partial class MySqlDataStorage : DataStorage
{
private struct TdtCoordinate
{
public int CurrentNetworkId { get; }
public int CurrentTransportStreamId { get; }
public TdtCoordinate(int currentNetworkId, int currentTransportStreamId)
{
CurrentNetworkId = currentNetworkId;
CurrentTransportStreamId = currentTransportStreamId;
CoordinateTimestamp = DateTime.MinValue;
}
public bool Equals(TdtCoordinate other)
{
return CurrentNetworkId == other.CurrentNetworkId && CurrentTransportStreamId == other.CurrentTransportStreamId;
}
public override bool Equals(object obj)
{
return obj is TdtCoordinate other && Equals(other);
}
public override int GetHashCode()
{
return HashCode.Combine(CurrentNetworkId, CurrentTransportStreamId);
}
public DateTime CoordinateTimestamp { get; set; }
}
private HashSet<TdtCoordinate> _tdtCoordinates;
private DateTime? TestForTdt(MySqlConnection connection, int currentNetworkId, int currentTransportStreamId)
{
if (_tdtCoordinates == null)
_tdtCoordinates = new HashSet<TdtCoordinate>();
TdtCoordinate coordinate = new TdtCoordinate(currentNetworkId, currentTransportStreamId);
TdtCoordinate storedCoordinate;
bool hasStoredCoordinate = _tdtCoordinates.TryGetValue(coordinate, out storedCoordinate);
if (hasStoredCoordinate)
return storedCoordinate.CoordinateTimestamp;
MySqlCommand mySqlCommand = connection.CreateCommand();
mySqlCommand.CommandText = "SELECT utc FROM dvb_tdt WHERE cnid = @cnid AND ctid = @ctid";
mySqlCommand.Parameters.AddWithValue("@cnid", currentNetworkId);
mySqlCommand.Parameters.AddWithValue("@ctid", currentTransportStreamId);
MySqlDataReader mySqlDataReader = mySqlCommand.ExecuteReader();
DateTime? result = null;
if (mySqlDataReader.Read())
{
result = mySqlDataReader.GetDateTime(0);
coordinate.CoordinateTimestamp = result.Value;
_tdtCoordinates.Add(coordinate);
}
mySqlDataReader.Close();
return result;
}
private void UpdateTdt(MySqlConnection connection, int currentNetworkId, int currentTransportStreamId, DateTime utcTime)
{
if (_speedhackQueue.Any(x => x.Key == SpeedhackType.UpdateTdt && (int)x.Value[0] == currentNetworkId && (int)x.Value[1] == currentTransportStreamId && (DateTime)x.Value[2] > utcTime))
{
return;
}
MySqlCommand mySqlCommand = connection.CreateCommand();
mySqlCommand.CommandText =
"UPDATE dvb_tdt SET utc = @utc, dateupdated = CURRENT_TIMESTAMP, num_updates = num_updates + 1 WHERE cnid = @cnid AND ctid = @ctid";
mySqlCommand.Parameters.AddWithValue("@cnid", currentNetworkId);
mySqlCommand.Parameters.AddWithValue("@ctid", currentTransportStreamId);
mySqlCommand.Parameters.AddWithValue("@utc", utcTime);
mySqlCommand.ExecuteNonQuery();
}
private void InsertTdt(MySqlConnection connection, int currentNetworkId, int currentTransportStreamId, DateTime utcTime)
{
MySqlCommand mySqlCommand = connection.CreateCommand();
mySqlCommand.CommandText = "INSERT INTO dvb_tdt (cnid, ctid, utc) VALUES (@cnid, @ctid, @utc)";
mySqlCommand.Parameters.AddWithValue("@cnid", currentNetworkId);
mySqlCommand.Parameters.AddWithValue("@ctid", currentTransportStreamId);
mySqlCommand.Parameters.AddWithValue("@utc", utcTime);
mySqlCommand.ExecuteNonQuery();
}
public bool UpdateTimeAndDate(int currentNetworkId, int currentTransportStreamId, DateTime utcTime)
{
using (MySqlConnection connection = new MySqlConnection(_mcsb.ToString()))
{
bool result = false;
connection.Open();
DateTime? older = TestForTdt(connection, currentNetworkId, currentTransportStreamId);
connection.Close();
if (older.HasValue)
{
if (utcTime > older.Value)
{
//UpdateTdt(connection, currentNetworkId, currentTransportStreamId, utcTime);
EnqueueSpeedhack(SpeedhackType.UpdateTdt, currentNetworkId, currentTransportStreamId, utcTime);
result = true;
}
}
else
{
//InsertTdt(connection, currentNetworkId, currentTransportStreamId, utcTime);
EnqueueSpeedhack(SpeedhackType.InsertTdt, currentNetworkId, currentTransportStreamId, utcTime);
_tdtCoordinates.Add(new TdtCoordinate(currentNetworkId, currentTransportStreamId));
result = true;
}
return result;
}
}
}
}

View File

@ -0,0 +1,60 @@
using MySqlConnector;
using skyscraper5.Skyscraper.Scraper.Storage.Split;
using skyscraper5.Teletext;
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
{
public bool TestForTeletextPage(int networkId, int transportStreamId, ushort programNumber, TeletextMagazine magazine,
DateTime timestamp)
{
ushort pageNo = magazine.HumanReadablePageNumber;
if (pageNo > 999)
return false;
using (MySqlConnection connection = new MySqlConnection(_mcsb.ToString()))
{
connection.Open();
MySqlCommand command = connection.CreateCommand();
command.CommandText =
"SELECT dateadded FROM teletext_page_cache WHERE nid = @nid AND tsid = @tsid AND progno = @progno AND magazine = @magazine AND timestamp = @timestamp";
command.Parameters.AddWithValue("@nid", networkId);
command.Parameters.AddWithValue("@tsid", transportStreamId);
command.Parameters.AddWithValue("@progno", programNumber);
command.Parameters.AddWithValue("@magazine", magazine.HumanReadablePageNumber);
command.Parameters.AddWithValue("@timestamp", timestamp);
MySqlDataReader dataReader = command.ExecuteReader();
bool result = dataReader.Read();
dataReader.Close();
return result;
}
}
public void MarkTeletextPageAsKnown(int networkId, int transportStreamId, ushort programNumber, TeletextMagazine magazine,
DateTime timestamp)
{
using (MySqlConnection connection = new MySqlConnection(_mcsb.ToString()))
{
connection.Open();
MySqlCommand command = connection.CreateCommand();
command.CommandText =
"INSERT INTO teletext_page_cache (nid, tsid, progno, magazine, timestamp) VALUES (@nid, @tsid, @progno, @magazine, @timestamp)";
command.Parameters.AddWithValue("@nid", networkId);
command.Parameters.AddWithValue("@tsid", transportStreamId);
command.Parameters.AddWithValue("@progno", programNumber);
command.Parameters.AddWithValue("@magazine", magazine.HumanReadablePageNumber);
command.Parameters.AddWithValue("@timestamp", timestamp);
command.ExecuteNonQuery();
}
}
}
}

View File

@ -0,0 +1,157 @@
using skyscraper5.Skyscraper.Scraper.Storage.Split;
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;
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;
}
}
}
}

View File

@ -0,0 +1,102 @@
using MySqlConnector;
using skyscraper5.Skyscraper.Scraper.Storage.Split;
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;
}
}
}

View File

@ -0,0 +1,341 @@
using skyscraper5.Skyscraper.Scraper.Storage.Split;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using MySqlConnector;
using skyscraper5.Dvb.SystemSoftwareUpdate.Model;
namespace skyscraper5.Data.MySql
{
public partial class MySqlDataStorage : DataStorage
{
private struct GroupCoordinate
{
public byte CommonActionType { get; }
public byte CommonOuiHash { get; }
public string CommonOui { get; }
public byte CommonProcessingOrder { get; }
public GroupCoordinate(byte commonActionType, byte commonOuiHash, string commonOui, byte commonProcessingOrder)
{
CommonActionType = commonActionType;
CommonOuiHash = commonOuiHash;
CommonOui = commonOui;
CommonProcessingOrder = commonProcessingOrder;
}
public bool Equals(GroupCoordinate other)
{
return CommonActionType == other.CommonActionType && CommonOuiHash == other.CommonOuiHash && CommonOui == other.CommonOui && CommonProcessingOrder == other.CommonProcessingOrder;
}
public override bool Equals(object obj)
{
return obj is GroupCoordinate other && Equals(other);
}
public override int GetHashCode()
{
return HashCode.Combine(CommonActionType, CommonOuiHash, CommonOui, CommonProcessingOrder);
}
}
private HashSet<GroupCoordinate> _untGroupCoordinates;
private bool TestForUnt(MySqlTransaction transaction, UpdateNotificationGroup common)
{
GroupCoordinate groupCoordinate = new GroupCoordinate(common.ActionType, common.OuiHash, common.Oui, common.ProcessingOrder);
if (_untGroupCoordinates.Contains(groupCoordinate))
return true;
MySqlCommand command = transaction.Connection.CreateCommand();
command.Transaction = transaction;
command.CommandText =
"SELECT dateadded FROM dvb_unt WHERE action_type = @action_type AND oui_hash = @oui_hash AND oui = @oui AND processing_order = @processing_order";
command.Parameters.AddWithValue("@action_type", common.ActionType);
command.Parameters.AddWithValue("@oui_hash", common.OuiHash);
command.Parameters.AddWithValue("@oui", common.Oui);
command.Parameters.AddWithValue("@processing_order", common.ProcessingOrder);
MySqlDataReader mySqlDataReader = command.ExecuteReader();
bool read = mySqlDataReader.Read();
if (read)
_untGroupCoordinates.Add(groupCoordinate);
mySqlDataReader.Close();
return read;
}
private void InsertUnt(MySqlTransaction transaction, UpdateNotificationGroup common)
{
MySqlCommand command = transaction.Connection.CreateCommand();
command.Transaction = transaction;
command.CommandText =
"INSERT INTO dvb_unt (action_type, oui_hash, oui, processing_order, data_broadcast_id, association_tag, private_data, update_flag, update_method, update_priority) " +
"VALUES (@action_type, @oui_hash, @oui, @processing_order, @data_broadcast_id, @association_tag, @private_data, @update_flag, @update_method, @update_priority)";
command.Parameters.AddWithValue("@action_type", common.ActionType);
command.Parameters.AddWithValue("@oui_hash", common.OuiHash);
command.Parameters.AddWithValue("@oui", common.Oui);
command.Parameters.AddWithValue("@processing_order", common.ProcessingOrder);
command.Parameters.AddWithValue("@data_broadcast_id", common.DataBroadcastId);
command.Parameters.AddWithValue("@association_tag", common.AssociationTag);
command.Parameters.AddWithValue("@private_data", common.PrivateData);
command.Parameters.AddWithValue("@update_flag", common.UpdateFlag);
command.Parameters.AddWithValue("@update_method", common.UpdateMethod);
command.Parameters.AddWithValue("@update_priority", common.UpdatePriority);
command.ExecuteNonQuery();
GroupCoordinate groupCoordinate = new GroupCoordinate(common.ActionType, common.OuiHash, common.Oui, common.ProcessingOrder);
_untGroupCoordinates.Add(groupCoordinate);
}
private struct CompatibilityCoordinate
{
public byte CommonActionType { get; }
public byte CommonOuiHash { get; }
public string CommonOui { get; }
public byte CommonProcessingOrder { get; }
public byte CompatibilityDescriptorType { get; }
public CompatibilityCoordinate(byte commonActionType, byte commonOuiHash, string commonOui, byte commonProcessingOrder, byte compatibilityDescriptorType)
{
CommonActionType = commonActionType;
CommonOuiHash = commonOuiHash;
CommonOui = commonOui;
CommonProcessingOrder = commonProcessingOrder;
CompatibilityDescriptorType = compatibilityDescriptorType;
}
public bool Equals(CompatibilityCoordinate other)
{
return CommonActionType == other.CommonActionType && CommonOuiHash == other.CommonOuiHash && CommonOui == other.CommonOui && CommonProcessingOrder == other.CommonProcessingOrder && CompatibilityDescriptorType == other.CompatibilityDescriptorType;
}
public override bool Equals(object obj)
{
return obj is CompatibilityCoordinate other && Equals(other);
}
public override int GetHashCode()
{
return HashCode.Combine(CommonActionType, CommonOuiHash, CommonOui, CommonProcessingOrder, CompatibilityDescriptorType);
}
}
private HashSet<CompatibilityCoordinate> _compatibilityCoordinates;
private bool TestForUntCompat(MySqlTransaction transaction, UpdateNotificationGroup common, Compatibility compatibility)
{
CompatibilityCoordinate compatibilityCoordinate = new CompatibilityCoordinate(common.ActionType, common.OuiHash, common.Oui, common.ProcessingOrder, compatibility.DescriptorType);
if (_compatibilityCoordinates.Contains(compatibilityCoordinate))
return true;
MySqlCommand command = transaction.Connection.CreateCommand();
command.Transaction = transaction;
command.CommandText =
"SELECT dateadded FROM dvb_unt_compatibility WHERE " +
"action_type = @action_type AND oui_hash = @oui_hash AND oui = @oui AND processing_order = @processing_order AND descriptor_type = @descriptor_type";
command.Parameters.AddWithValue("@action_type", common.ActionType);
command.Parameters.AddWithValue("@oui_hash", common.OuiHash);
command.Parameters.AddWithValue("@oui", common.Oui);
command.Parameters.AddWithValue("@processing_order", common.ProcessingOrder);
command.Parameters.AddWithValue("@descriptor_type", compatibility.DescriptorType);
MySqlDataReader dataReader = command.ExecuteReader();
bool result = dataReader.Read();
if (result)
_compatibilityCoordinates.Add(compatibilityCoordinate);
dataReader.Close();
return result;
}
private void InsertUntCompat(MySqlTransaction transaction, UpdateNotificationGroup common, Compatibility compatibility)
{
MySqlCommand command = transaction.Connection.CreateCommand();
command.Transaction = transaction;
command.CommandText =
"INSERT INTO dvb_unt_compatibility (action_type, oui_hash, oui, processing_order, descriptor_type, private_data, specifier_type, specifier_data, model, version) " +
"VALUES (@action_type, @oui_hash, @oui, @processing_order, @descriptor_type, @private_data, @specifier_type, @specifier_data, @model, @version)";
command.Parameters.AddWithValue("@action_type", common.ActionType);
command.Parameters.AddWithValue("@oui_hash", common.OuiHash);
command.Parameters.AddWithValue("@oui", common.Oui);
command.Parameters.AddWithValue("@processing_order", common.ProcessingOrder);
command.Parameters.AddWithValue("@descriptor_type", compatibility.DescriptorType);
command.Parameters.AddWithValue("@private_data", compatibility.PrivateData);
command.Parameters.AddWithValue("@specifier_type", compatibility.SpecifierType);
command.Parameters.AddWithValue("@specifier_data", compatibility.SpecifierData);
command.Parameters.AddWithValue("@model", compatibility.Model);
command.Parameters.AddWithValue("@version", compatibility.Version);
command.ExecuteNonQuery();
_compatibilityCoordinates.Add(new CompatibilityCoordinate(common.ActionType, common.OuiHash, common.Oui, common.ProcessingOrder, compatibility.DescriptorType));
}
private int GetUntPlatformSqlKey(Platform platform)
{
int result = 0;
if (platform.UpdateFlag.HasValue)
result |= 0x02;
if (platform.DataBroadcastId.HasValue)
result |= 0x04;
if (platform.SuperCaSystemId.HasValue)
result |= 0x20;
if (platform.SerialData != null)
result |= 0x80;
if (platform.MacAddressMatches != null)
result |= 0x40;
if (platform.SubgroupTag != null)
result |= 0x400;
return result;
}
private struct GroupCompatabilityPlatformCoordinate
{
public byte CommonActionType { get; }
public byte CommonOuiHash { get; }
public string CommonOui { get; }
public byte CommonProcessingOrder { get; }
public byte CompatibilityDescriptorType { get; }
public int PlatformId { get; }
public GroupCompatabilityPlatformCoordinate(byte commonActionType, byte commonOuiHash, string commonOui, byte commonProcessingOrder, byte compatibilityDescriptorType, int platformId)
{
CommonActionType = commonActionType;
CommonOuiHash = commonOuiHash;
CommonOui = commonOui;
CommonProcessingOrder = commonProcessingOrder;
CompatibilityDescriptorType = compatibilityDescriptorType;
PlatformId = platformId;
}
}
private HashSet<GroupCompatabilityPlatformCoordinate> _platformCoordinates;
private bool TestForUntCompatPlatform(MySqlTransaction transaction, UpdateNotificationGroup common, Compatibility compatibility, Platform platform)
{
GroupCompatabilityPlatformCoordinate platformCoordinate = new GroupCompatabilityPlatformCoordinate(common.ActionType, common.OuiHash, common.Oui, common.ProcessingOrder, compatibility.DescriptorType, GetUntPlatformSqlKey(platform));
MySqlCommand command = transaction.Connection.CreateCommand();
command.Transaction = transaction;
command.CommandText =
"SELECT dateadded FROM dvb_unt_compatibility_platform WHERE action_type = @action_type AND oui_hash = @oui_hash AND oui = @oui AND processing_order = @processing_order " +
"AND descriptor_type = @descriptor_type AND platform_type_bitmask = @platform_type_bitmask";
command.Parameters.AddWithValue("@action_type", common.ActionType);
command.Parameters.AddWithValue("@oui_hash", common.OuiHash);
command.Parameters.AddWithValue("@oui", common.Oui);
command.Parameters.AddWithValue("@processing_order", common.ProcessingOrder);
command.Parameters.AddWithValue("@descriptor_type", compatibility.DescriptorType);
command.Parameters.AddWithValue("@platform_type_bitmask", platformCoordinate.PlatformId);
MySqlDataReader dataReader = command.ExecuteReader();
bool result = dataReader.Read();
if (result)
_platformCoordinates.Add(platformCoordinate);
dataReader.Close();
return result;
}
private void InsertUntCompatPlatform(MySqlTransaction transaction, UpdateNotificationGroup common, Compatibility compatibility, Platform platform)
{
GroupCompatabilityPlatformCoordinate platformCoordinate = new GroupCompatabilityPlatformCoordinate(common.ActionType, common.OuiHash, common.Oui, common.ProcessingOrder, compatibility.DescriptorType, GetUntPlatformSqlKey(platform));
MySqlCommand command = transaction.Connection.CreateCommand();
command.Transaction = transaction;
command.CommandText =
"INSERT INTO dvb_unt_compatibility_platform (action_type, oui_hash, oui, processing_order, descriptor_type, platform_type_bitmask, update_flag, update_method, update_priority, data_broadcast_id, association_tag, private_data, smart_card_number, super_ca_system_id, serial_data, mac_address_mask, subgroup_tag) " +
"VALUES (@action_type, @oui_hash, @oui, @processing_order, @descriptor_type, @platform_type_bitmask, @update_flag, @update_method, @update_priority, @data_broadcast_id, " +
" @association_tag, @private_data, @smart_card_number, @super_ca_system_id, @serial_data, @mac_address_mask, @subgroup_tag)";
command.Parameters.AddWithValue("@action_type", common.ActionType);
command.Parameters.AddWithValue("@oui_hash", common.OuiHash);
command.Parameters.AddWithValue("@oui", common.Oui);
command.Parameters.AddWithValue("@processing_order", common.ProcessingOrder);
command.Parameters.AddWithValue("@descriptor_type", compatibility.DescriptorType);
command.Parameters.AddWithValue("@platform_type_bitmask", platformCoordinate.PlatformId);
command.Parameters.AddWithValue("@update_flag", platform.UpdateFlag);
command.Parameters.AddWithValue("@update_method", platform.UpdateMethod);
command.Parameters.AddWithValue("@update_priority", platform.UpdatePriority);
command.Parameters.AddWithValue("@data_broadcast_id", platform.DataBroadcastId);
command.Parameters.AddWithValue("@association_tag", platform.AssociationTag);
command.Parameters.AddWithValue("@private_data", platform.PrivateData);
command.Parameters.AddWithValue("@smart_card_number", platform.SmartCardNumber);
command.Parameters.AddWithValue("@super_ca_system_id", platform.SuperCaSystemId);
command.Parameters.AddWithValue("@serial_data", platform.SerialData);
command.Parameters.AddWithValue("@mac_address_mask", platform.MacAddressMask);
command.Parameters.AddWithValue("@subgroup_tag", platform.SubgroupTag);
command.ExecuteNonQuery();
InsertUntCompatPlatformMacAddressMatches(transaction, platformCoordinate, platform);
_platformCoordinates.Add(platformCoordinate);
}
private void InsertUntCompatPlatformMacAddressMatches(MySqlTransaction transaction, GroupCompatabilityPlatformCoordinate platformCoordinate, Platform platform)
{
if (platform.MacAddressMatches == null)
return;
if (platform.MacAddressMatches.Length == 0)
return;
MySqlCommand command = transaction.Connection.CreateCommand();
command.Transaction = transaction;
command.CommandText =
"INSERT INTO dvb_unt_compatibility_platform_mac_address_matches (action_type, oui_hash, oui, processing_order, descriptor_type, platform_type_bitmask, mac_match) " +
"VALUES (@action_type, @oui_hash, @oui, @processing_order, @descriptor_type, @platform_type_bitmask, @mac_match) ";
command.Parameters.AddWithValue("@action_type", platformCoordinate.CommonActionType);
command.Parameters.AddWithValue("@oui_hash", platformCoordinate.CommonOuiHash);
command.Parameters.AddWithValue("@oui", platformCoordinate.CommonOui);
command.Parameters.AddWithValue("@processing_order", platformCoordinate.CommonProcessingOrder);
command.Parameters.AddWithValue("@descriptor_type", platformCoordinate.CompatibilityDescriptorType);
command.Parameters.AddWithValue("@platform_type_bitmask", platformCoordinate.PlatformId);
command.Parameters.Add("@mac_match", MySqlDbType.VarChar);
foreach (string match in platform.MacAddressMatches)
{
command.Parameters["@mac_match"].Value = match;
command.ExecuteNonQuery();
}
}
public bool TestForUpdateNotification(int hashCode, UpdateNotificationGroup common)
{
throw new NotImplementedException();
}
public void StoreUpdateNotification(int hashCode, UpdateNotificationGroup common, Compatibility compatibility, Platform platform)
{
if (_untGroupCoordinates == null)
_untGroupCoordinates = new HashSet<GroupCoordinate>();
if (_compatibilityCoordinates == null)
_compatibilityCoordinates = new HashSet<CompatibilityCoordinate>();
if (_platformCoordinates == null)
_platformCoordinates = new HashSet<GroupCompatabilityPlatformCoordinate>();
GroupCoordinate groupCoordinate = new GroupCoordinate(common.ActionType, common.OuiHash, common.Oui, common.ProcessingOrder);
if (_untGroupCoordinates.Contains(groupCoordinate))
{
CompatibilityCoordinate compatibilityCoordinate = new CompatibilityCoordinate(common.ActionType, common.OuiHash, common.Oui, common.ProcessingOrder, compatibility.DescriptorType);
if (_compatibilityCoordinates.Contains(compatibilityCoordinate))
{
GroupCompatabilityPlatformCoordinate platformCoordinate = new GroupCompatabilityPlatformCoordinate(common.ActionType, common.OuiHash, common.Oui, common.ProcessingOrder, compatibility.DescriptorType, GetUntPlatformSqlKey(platform));
if (_platformCoordinates.Contains(platformCoordinate))
{
return;
}
}
}
using (MySqlConnection connection = new MySqlConnection(_mcsb.ToString()))
{
connection.Open();
MySqlTransaction transaction = connection.BeginTransaction();
if (!TestForUnt(transaction, common))
InsertUnt(transaction, common);
if (!TestForUntCompat(transaction, common, compatibility))
InsertUntCompat(transaction, common, compatibility);
if (!TestForUntCompatPlatform(transaction, common, compatibility, platform))
InsertUntCompatPlatform(transaction, common, compatibility, platform);
transaction.Commit();
}
}
}
}

View File

@ -0,0 +1,51 @@
using skyscraper5.Skyscraper.Scraper.Storage.Split;
using System;
using System.Collections.Generic;
using System.Data.Common;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using MySqlConnector;
namespace skyscraper5.Data.MySql
{
public partial class MySqlDataStorage : DataStorage
{
public void SetNulls(DbCommand command)
{
foreach (DbParameter commandParameter in command.Parameters)
{
if (commandParameter.Value == null)
commandParameter.Value = DBNull.Value;
}
}
}
public static class MySqlDataReaderExtensions
{
public static byte[] GetByteArray(this MySqlDataReader reader, int column)
{
if (reader.IsDBNull(column))
return null;
Stream stream = reader.GetStream(column);
int len32 = (int)stream.Length;
byte[] buffer = new byte[len32];
stream.Read(buffer, 0, len32);
stream.Close();
return buffer;
}
}
public static class MySqlParameterCollectionExtensions
{
public static void AddOrSet<T>(this MySqlParameterCollection collection, string name, T value)
{
if (collection.Contains(name))
collection[name].Value = value;
else
collection.AddWithValue(name, value);
}
}
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,15 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="MySqlConnector" Version="2.4.0" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\skyscraper8\skyscraper8.csproj" />
</ItemGroup>
</Project>

View File

@ -0,0 +1,268 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Npgsql;
using NpgsqlTypes;
using skyscraper5.Mhp;
using skyscraper5.Mhp.Descriptors;
using skyscraper5.Mhp.Descriptors.InteractionTransportSelectors;
using skyscraper5.Mhp.Si;
using skyscraper5.Mhp.Si.Model;
namespace skyscraper5.Data.PostgreSql
{
public partial class PostgresqlDataStore
{
private HashSet<ApplicationIdentifier> _knownAitApplications;
public bool TestForAitApplication(ApplicationIdentifier aitApplicationApplicationIdentifier)
{
if (_knownAitApplications == null)
_knownAitApplications = new HashSet<ApplicationIdentifier>();
if (_knownAitApplications.Contains(aitApplicationApplicationIdentifier))
return true;
bool result;
using (NpgsqlConnection conn = new NpgsqlConnection(connectionStringBuilder.ToString()))
{
conn.Open();
NpgsqlCommand command = conn.CreateCommand();
command.CommandText = "SELECT dateadded FROM dvb_ait WHERE org_id = @org AND app_id = @app";
command.Parameters.AddWithValue("@org",NpgsqlDbType.Bigint, (long)aitApplicationApplicationIdentifier.OrganisationId);
command.Parameters.AddWithValue("@app",NpgsqlDbType.Integer,(int)aitApplicationApplicationIdentifier.ApplicationId);
NpgsqlDataReader dataReader = command.ExecuteReader();
result = dataReader.Read();
dataReader.Close();
command.Dispose();
conn.Close();
}
if (result)
_knownAitApplications.Add(aitApplicationApplicationIdentifier);
return result;
}
public void StoreAitApplication(AitApplication aitApplication)
{
EnqueueTask(x => WriteAitApplication(x, aitApplication));
_knownAitApplications.Add(aitApplication.ApplicationIdentifier);
}
private void WriteAitApplication(NpgsqlConnection connection, AitApplication aitApplication)
{
NpgsqlCommand command = connection.CreateCommand();
command.CommandText =
"insert into dvb_ait (org_id, app_id, app_control_code, app_priority, service_bound_flag,\r\n transport_protocol_label, visibility, initial_path, app_usage_code, jvm_arguments,\r\n jvm_base_directory, jvm_class_path_extension, jvm_initial_class, version,\r\n is_launchable_from_older_version, launchable_completely_from_cache, not_launchable_from_broadcast,\r\n application_storage_priority, storage_property, auto_select, service_id, service_name,\r\n version_number, launch_order, storage_priorityy, ip_connection_required)" +
"values " +
"(@org_id,@app_id,@app_control_code,@app_priority,@service_bound_flag,@transport_protocol_label,@visibility,@initial_path,@app_usage_code,@jvm_arguments,@jvm_base_directory,@jvm_class_path_extension,@jvm_initial_class, @version,\r\n @is_launchable_from_older_version, @launchable_completely_from_cache, @not_launchable_from_broadcast,\r\n @application_storage_priority, @storage_property, @auto_select, @service_id, @service_name,\r\n @version_number, @launch_order, @storage_priorityy, @ip_connection_required);";
command.Parameters.AddParameter("@org_id", NpgsqlDbType.Bigint, aitApplication.ApplicationIdentifier.OrganisationId);
command.Parameters.AddParameter("@app_id", NpgsqlDbType.Integer, aitApplication.ApplicationIdentifier.ApplicationId);
command.Parameters.AddParameter("@app_control_code", NpgsqlDbType.Integer, aitApplication.ApplicationControlCode);
command.Parameters.AddParameter("@app_priority", NpgsqlDbType.Integer, aitApplication.ApplicationPriority);
command.Parameters.AddParameter("@service_bound_flag", NpgsqlDbType.Boolean, aitApplication.ServiceBoundFlag);
command.Parameters.AddParameter("@transport_protocol_label", NpgsqlDbType.Bytea, aitApplication.TransportProtocolLabel);
command.Parameters.AddParameter("@visibility", NpgsqlDbType.Integer, aitApplication.Visibility);
command.Parameters.AddParameter("@initial_path", NpgsqlDbType.Text, aitApplication.InitialPath);
command.Parameters.AddParameter("@app_usage_code", NpgsqlDbType.Integer, aitApplication.ApplicationUsageCode);
command.Parameters.AddParameter("@jvm_arguments", NpgsqlDbType.Text, aitApplication.ConcatJvmArguments());
command.Parameters.AddParameter("@jvm_base_directory", NpgsqlDbType.Text, aitApplication.JvmBaseDirectory);
command.Parameters.AddParameter("@jvm_class_path_extension", NpgsqlDbType.Text, aitApplication.JvmClassPathExtension);
//@jvm_initial_class,@version,@is_launchable_from_older_version,@launchable_completely_from_cache,@not_launchable_from_broadcast,@application_storage_priority,@storage_property,@auto_select,@service_id,
command.Parameters.AddParameter("@jvm_initial_class", NpgsqlDbType.Text, aitApplication.JvmInitialClass);
command.Parameters.AddParameter("@version", NpgsqlDbType.Bigint, (long?)aitApplication.Version);
command.Parameters.AddParameter("@is_launchable_from_older_version", NpgsqlDbType.Boolean, aitApplication.IsLaunchableFromOlderVersion);
command.Parameters.AddParameter("@launchable_completely_from_cache", NpgsqlDbType.Boolean, aitApplication.LaunchableCompletelyFromCache);
command.Parameters.AddParameter("@not_launchable_from_broadcast", NpgsqlDbType.Boolean, aitApplication.NotLaunchableFromBroadcast);
command.Parameters.AddParameter("@application_storage_priority", NpgsqlDbType.Integer, (int?)aitApplication.ApplicationStoragePriority);
command.Parameters.AddParameter("@storage_property", NpgsqlDbType.Integer, (int?)aitApplication.StorageProperty);
command.Parameters.AddParameter("@auto_select", NpgsqlDbType.Boolean, aitApplication.AutoSelect);
command.Parameters.AddParameter("@service_id", NpgsqlDbType.Bigint, (long?)aitApplication.ServiceId);
//@service_name,@version_number,@launch_order,@storage_priorityy,@ip_connection_required);";
command.Parameters.AddParameter("@service_name", NpgsqlDbType.Text, aitApplication.ServiceName);
command.Parameters.AddParameter("@version_number", NpgsqlDbType.Bigint, (long?)aitApplication.VersionNumber);
command.Parameters.AddParameter("@launch_order", NpgsqlDbType.Integer, (int?)aitApplication.LaunchOrder);
command.Parameters.AddParameter("@storage_priorityy", NpgsqlDbType.Integer, (int?)aitApplication.StoragePriority);
command.Parameters.AddParameter("@ip_connection_required", NpgsqlDbType.Boolean, aitApplication.IpConnectionRequired);
command.ExecuteNonQuery();
WriteAitApplicationNames(connection, aitApplication);
WriteAitApplicationProfiles(connection, aitApplication);
WriteAitBoundaryExtension(connection, aitApplication);
WriteAitExtensionAuthorization(connection, aitApplication);
WriteAitTransportProtocols(connection, aitApplication);
}
private void WriteAitTransportProtocols(NpgsqlConnection connection, AitApplication aitApplication)
{
if (aitApplication.TransportProtocols == null)
return;
NpgsqlCommand command = connection.CreateCommand();
command.CommandText =
"insert into dvb_ait_transport_protocols (org_id, app_id, protocol_id, transport_protocol_label,\r\n oc_remote_connection, oc_onid, oc_tsid, oc_sid, oc_component_tag,\r\n inter_url_base) " +
"values (@org_id, @app_id, @protocol_id, @transport_protocol_label,@oc_remote_connection, @oc_onid, @oc_tsid, @oc_sid, @oc_component_tag,@inter_url_base)";
command.Parameters.AddWithValue("@org_id", NpgsqlDbType.Bigint, (long)aitApplication.ApplicationIdentifier.OrganisationId);
command.Parameters.AddWithValue("@app_id", NpgsqlDbType.Integer, (int)aitApplication.ApplicationIdentifier.ApplicationId);
command.Parameters.Add("@protocol_id", NpgsqlDbType.Integer);
command.Parameters.Add("@transport_protocol_label", NpgsqlDbType.Integer);
command.Parameters.Add("@oc_remote_connection", NpgsqlDbType.Boolean);
command.Parameters.Add("@oc_onid", NpgsqlDbType.Integer);
command.Parameters.Add("@oc_tsid", NpgsqlDbType.Integer);
command.Parameters.Add("@oc_sid", NpgsqlDbType.Integer);
command.Parameters.Add("@oc_component_tag", NpgsqlDbType.Integer);
command.Parameters.Add("@inter_url_base", NpgsqlDbType.Text);
foreach (TransportProtocolDescriptor protocol in aitApplication.TransportProtocols)
{
command.Parameters["@protocol_id"].Value = (int)protocol.ProtocolId;
command.Parameters["@transport_protocol_label"].Value = protocol.TransportProtocolLabel;
switch (protocol.ProtocolId)
{
case 1:
ObjectCarouselTransportSelector objectCarouselTransportSelector = (ObjectCarouselTransportSelector)protocol.Selector;
command.Parameters["@oc_remote_connection"].Value = objectCarouselTransportSelector.RemoteConnection;
command.Parameters["@oc_onid"].Value = (int?)objectCarouselTransportSelector.OriginalNetworkId;
command.Parameters["@oc_tsid"].Value = (int?)objectCarouselTransportSelector.TransportStreamId;
command.Parameters["@oc_sid"].Value = (int?)objectCarouselTransportSelector.ServiceId;
command.Parameters["@oc_component_tag"].Value = (int)objectCarouselTransportSelector.ComponentTag;
command.Parameters["@inter_url_base"].Value = DBNull.Value;
break;
case 3:
InteractionTransportSelector interactionTransportSelector = (InteractionTransportSelector)protocol.Selector;
command.Parameters["@oc_remote_connection"].Value = DBNull.Value;
command.Parameters["@oc_onid"].Value = DBNull.Value;
command.Parameters["@oc_tsid"].Value = DBNull.Value;
command.Parameters["@oc_sid"].Value = DBNull.Value;
command.Parameters["@oc_component_tag"].Value = DBNull.Value;
command.Parameters["@inter_url_base"].Value = interactionTransportSelector.UrlBase;
break;
default:
throw new NotImplementedException(String.Format("{0} {1}", nameof(protocol.ProtocolId), protocol.ProtocolId));
}
command.Parameters.CheckNulls();
command.ExecuteNonQuery();
if (protocol.ProtocolId == 3)
{
WriteAitTransportProtocolsUrlExtensions(connection, aitApplication, (InteractionTransportSelector)protocol.Selector);
}
}
}
private void WriteAitTransportProtocolsUrlExtensions(NpgsqlConnection connection, AitApplication aitApplication, InteractionTransportSelector protocolSelector)
{
if (protocolSelector.UrlExtensions == null)
return;
if (protocolSelector.UrlExtensions.Length == 0)
return;
NpgsqlCommand cmd = connection.CreateCommand();
cmd.CommandText = "insert into dvb_ait_transport_protocols_url_extensions (org_id, app_id, protocol_id, extension) values (@orgId,@appId,@protocolId,@extension)";
cmd.Parameters.AddWithValue("@orgId", NpgsqlDbType.Bigint, (long)aitApplication.ApplicationIdentifier.OrganisationId);
cmd.Parameters.AddWithValue("@appId", NpgsqlDbType.Integer, (int)aitApplication.ApplicationIdentifier.ApplicationId);
cmd.Parameters.AddWithValue("@protocolId", NpgsqlDbType.Integer, (int)protocolSelector.ProtocolId);
cmd.Parameters.Add("@extension", NpgsqlDbType.Text);
foreach (string extension in protocolSelector.UrlExtensions)
{
if (string.IsNullOrEmpty(extension))
continue;
cmd.Parameters["@extension"].Value = extension;
cmd.ExecuteNonQuery();
}
}
private void WriteAitExtensionAuthorization(NpgsqlConnection connection, AitApplication aitApplication)
{
if (aitApplication.ExternalAuthorizations == null)
return;
NpgsqlCommand cmd = connection.CreateCommand();
cmd.CommandText = "insert into dvb_ait_external_authorization (src_org_id, src_app_id, tgt_org_id, tgt_app_id, app_priority)\r\n" +
"values (@src_org_id, @src_app_id, @tgt_org_id, @tgt_app_id, @app_priority)";
cmd.Parameters.AddWithValue("@src_org_id", NpgsqlDbType.Bigint, (long)aitApplication.ApplicationIdentifier.OrganisationId);
cmd.Parameters.AddWithValue("@src_app_id", NpgsqlDbType.Integer, (int)aitApplication.ApplicationIdentifier.ApplicationId);
cmd.Parameters.Add("@tgt_org_id", NpgsqlDbType.Bigint);
cmd.Parameters.Add("@tgt_app_id", NpgsqlDbType.Integer);
cmd.Parameters.Add("@app_priority", NpgsqlDbType.Integer);
for (int i = 0; i < aitApplication.ExternalAuthorizations.Length; i++)
{
ExternalApplicationAuthorisationDescriptor.ExternalAuthorization externalAuthorization = aitApplication.ExternalAuthorizations[i];
cmd.Parameters["@tgt_org_id"].Value = (long)externalAuthorization.OrganisationId;
cmd.Parameters["@tgt_app_id"].Value = (int)externalAuthorization.ApplicationId;
cmd.Parameters["@app_priority"].Value = (int)externalAuthorization.ApplicationPriority;
cmd.ExecuteNonQuery();
}
}
private void WriteAitBoundaryExtension(NpgsqlConnection connection, AitApplication aitApplication)
{
if (aitApplication.BoundaryExtensions == null)
return;
NpgsqlCommand command = connection.CreateCommand();
command.CommandText = "insert into dvb_ait_boundary_extensions (org_id, app_id, extension)" +
"values (@org_id, @app_id, @extension)";
command.Parameters.AddWithValue("@org_id", NpgsqlDbType.Bigint, (long)aitApplication.ApplicationIdentifier.OrganisationId);
command.Parameters.AddWithValue("@app_id", NpgsqlDbType.Integer, (int)aitApplication.ApplicationIdentifier.ApplicationId);
command.Parameters.Add("@extension", NpgsqlDbType.Text);
for (int i = 0; i < aitApplication.BoundaryExtensions.Length; i++)
{
command.Parameters["@extension"].Value = aitApplication.BoundaryExtensions[i];
command.ExecuteNonQuery();
}
}
private void WriteAitApplicationProfiles(NpgsqlConnection connection, AitApplication aitApplication)
{
if (aitApplication.ApplicationProfiles == null)
return;
NpgsqlCommand command = connection.CreateCommand();
command.CommandText =
"insert into dvb_ait_application_profiles (org_id, app_id, ordinal, app_profile, major, minor, micro) " +
"values (@org_id, @app_id, @ordinal, @app_profile, @major, @minor, @micro)";
command.Parameters.AddWithValue("@org_id", NpgsqlDbType.Bigint, (long)aitApplication.ApplicationIdentifier.OrganisationId);
command.Parameters.AddWithValue("@app_id", NpgsqlDbType.Integer, (int)aitApplication.ApplicationIdentifier.ApplicationId);
command.Parameters.Add("@ordinal", NpgsqlDbType.Integer);
command.Parameters.Add("@app_profile", NpgsqlDbType.Integer);
command.Parameters.Add("@major", NpgsqlDbType.Integer);
command.Parameters.Add("@minor", NpgsqlDbType.Integer);
command.Parameters.Add("@micro", NpgsqlDbType.Integer);
for (int i = 0; i < aitApplication.ApplicationProfiles.Length; i++)
{
ApplicationDescriptor.ApplicationProfileEncoding applicationProfile = aitApplication.ApplicationProfiles[i];
command.Parameters["@ordinal"].Value = i;
command.Parameters["@app_profile"].Value = (int)applicationProfile.ApplicationProfile;
command.Parameters["@major"].Value = applicationProfile.Major;
command.Parameters["@minor"].Value = applicationProfile.Minor;
command.Parameters["@micro"].Value = applicationProfile.Micro;
command.ExecuteNonQuery();
}
}
private void WriteAitApplicationNames(NpgsqlConnection connection, AitApplication aitApplication)
{
if (aitApplication.ApplicationName == null)
return;
NpgsqlCommand command = connection.CreateCommand();
command.CommandText = "INSERT INTO dvb_ait_application_names (org_id, app_id, k, v)" +
"VALUES (@org_id, @app_id, @k, @v)";
command.Parameters.AddWithValue("@org_id", NpgsqlDbType.Bigint, (long)aitApplication.ApplicationIdentifier.OrganisationId);
command.Parameters.AddWithValue("@app_id", NpgsqlDbType.Integer, (int)aitApplication.ApplicationIdentifier.ApplicationId);
command.Parameters.Add("@k", NpgsqlDbType.Varchar);
command.Parameters.Add("@v", NpgsqlDbType.Text);
foreach (KeyValuePair<string, string> keyValuePair in aitApplication.ApplicationName)
{
command.Parameters["@k"].Value = keyValuePair.Key.Replace("\0", "");
command.Parameters["@v"].Value = keyValuePair.Value;
command.ExecuteNonQuery();
}
}
}
}

View File

@ -0,0 +1,454 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Threading.Tasks;
using Npgsql;
using NpgsqlTypes;
using skyscraper5.Dvb.Descriptors;
using skyscraper5.Dvb.Psi.Model;
using skyscraper5.Skyscraper.Scraper.Storage.Utilities;
using static skyscraper5.Dvb.Descriptors.ServiceListDescriptor;
using static skyscraper5.src.InteractionChannel.Model.Rmt;
namespace skyscraper5.Data.PostgreSql
{
public partial class PostgresqlDataStore
{
private HashSet<DatabaseKeyBatBouquet> _knownBatBouquets;
public bool TestForBatBouquet(BatBouquet batBouquet)
{
if (_knownBatBouquets == null)
_knownBatBouquets = new HashSet<DatabaseKeyBatBouquet>();
DatabaseKeyBatBouquet key = new DatabaseKeyBatBouquet(batBouquet.BouquetId);
if (_knownBatBouquets.Contains(key))
return true;
bool result = false;
using (NpgsqlConnection connection = new NpgsqlConnection(connectionStringBuilder.ToString()))
{
connection.Open();
NpgsqlCommand command = connection.CreateCommand();
command.CommandText = "SELECT dateadded FROM dvb_bat WHERE id = @id";
command.Parameters.AddWithValue("@id", NpgsqlDbType.Integer, (int)batBouquet.BouquetId);
NpgsqlDataReader dataReader = command.ExecuteReader();
result = dataReader.Read();
dataReader.Close();
command.Dispose();
connection.Close();
}
if (result)
_knownBatBouquets.Add(key);
return result;
}
public void StoreBatBouquet(BatBouquet batBouquet)
{
DatabaseKeyBatBouquet key = new DatabaseKeyBatBouquet(batBouquet.BouquetId);
EnqueueTask(x => WriteBatBouquet(x, batBouquet));
_knownBatBouquets.Add(key);
if (_updatedBats == null)
_updatedBats = new HashSet<DatabaseKeyBatBouquet>();
_updatedBats.Add(key);
}
private void WriteBatBouquet(NpgsqlConnection conn, BatBouquet bouquet)
{
NpgsqlCommand command = conn.CreateCommand();
command.CommandText =
"insert into dvb_bat (id, bouquet_name, private_data_specifier, uri_linkage_type, uri, min_polling_interval, control_remote_access_over_internet, do_not_apply_revocation, do_not_scramble) " +
"values " +
"(@id, @bouquet_name, @private_data_specifier, @uri_linkage_type, @uri, @min_polling_interval, @control_remote_access_over_internet, @do_not_apply_revocation, @do_not_scramble)";
command.Parameters.AddParameter("@id", NpgsqlDbType.Integer, (int)bouquet.BouquetId);
command.Parameters.AddParameter("@bouquet_name", NpgsqlDbType.Text, bouquet.BouquetName);
command.Parameters.AddParameter("@private_data_specifier", NpgsqlDbType.Bigint, bouquet.PrivateDataSpecifier);
command.Parameters.AddParameter("@uri_linkage_type", NpgsqlDbType.Integer, bouquet.UriLinkageType);
command.Parameters.AddParameter("@uri", NpgsqlDbType.Text, bouquet.Uri);
command.Parameters.AddParameter("@min_polling_interval", NpgsqlDbType.Integer, bouquet.MinPollingInterval);
command.Parameters.AddParameter("@control_remote_access_over_internet", NpgsqlDbType.Integer, bouquet.ControlRemoteAccessOverInternet);
command.Parameters.AddParameter("@do_not_apply_revocation", NpgsqlDbType.Boolean, bouquet.DoNotApplyRevocation);
command.Parameters.AddParameter("@do_not_scramble", NpgsqlDbType.Boolean, bouquet.DoNotScramble);
command.ExecuteNonQuery();
command.Dispose();
WriteBatCountryAvailability(conn, bouquet);
WriteBatLinkage(conn, bouquet);
WriteBatMultilingualBouquetNames(conn, bouquet);
}
private void WriteBatMultilingualBouquetNames(NpgsqlConnection conn, BatBouquet bouquet)
{
if (bouquet.MultilingualBouquetName == null)
return;
if (bouquet.MultilingualBouquetName.MultilingualBouquetName == null)
return;
NpgsqlCommand cmd = conn.CreateCommand();
cmd.CommandText = "insert into dvb_bat_multilingual_bouquet_names (id, k, v)\r\nvalues (@id,@k,@v)";
cmd.Parameters.AddWithValue("@id", NpgsqlDbType.Integer, (int)bouquet.BouquetId);
cmd.Parameters.Add("@k", NpgsqlDbType.Varchar);
cmd.Parameters.Add("@v", NpgsqlDbType.Text);
foreach (KeyValuePair<string, string> keyValuePair in bouquet.MultilingualBouquetName.MultilingualBouquetName)
{
cmd.Parameters["@k"].Value = keyValuePair.Key;
cmd.Parameters["@v"].Value = keyValuePair.Value;
cmd.ExecuteNonQuery();
}
}
private void WriteBatLinkage(NpgsqlConnection conn, BatBouquet bouquet)
{
if (bouquet.Linkages == null)
return;
NpgsqlCommand command = conn.CreateCommand();
command.CommandText =
"insert into dvb_bat_linkages (id, ordinal, l_tsid, l_onid, l_sid, 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) " +
"values " +
"(@id,@ordinal,@l_tsid,@l_onid,@l_sid,@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)";
command.Parameters.AddParameter("@id", NpgsqlDbType.Integer,bouquet.BouquetId);
command.Parameters.Add("@ordinal", NpgsqlDbType.Integer);
command.Parameters.Add("@l_tsid", NpgsqlDbType.Integer);
command.Parameters.Add("@l_onid", NpgsqlDbType.Integer);
command.Parameters.Add("@l_sid", NpgsqlDbType.Integer);
command.Parameters.Add("@linkage_type", NpgsqlDbType.Integer);
command.Parameters.Add("@handover_type", NpgsqlDbType.Integer);
command.Parameters.Add("@handover_origin_type", NpgsqlDbType.Boolean);
command.Parameters.Add("@handover_network_id", NpgsqlDbType.Integer);
command.Parameters.Add("@handover_initial_service_id", NpgsqlDbType.Integer);
command.Parameters.Add("@target_event_id", NpgsqlDbType.Integer);
command.Parameters.Add("@target_event_listed", NpgsqlDbType.Boolean);
command.Parameters.Add("@target_event_simulcasted", NpgsqlDbType.Boolean);
//@table_type,@private_data_bytes,@bouquet_id)";
command.Parameters.Add("@table_type", NpgsqlDbType.Integer);
command.Parameters.Add("@private_data_bytes", NpgsqlDbType.Bytea);
command.Parameters.Add("@bouquet_id", NpgsqlDbType.Integer);
for (int i = 0; i < bouquet.Linkages.Count; i++)
{
LinkageDescriptor linkage = bouquet.Linkages[i];
command.Parameters["@ordinal"].Value = i;
command.Parameters["@l_tsid"].Value = (int)linkage.TransportStreamId;
command.Parameters["@l_onid"].Value = (int)linkage.OriginalNetworkId;
command.Parameters["@l_sid"].Value = (int)linkage.ServiceId;
command.Parameters["@linkage_type"].Value = (int)linkage.LinkageType;
command.Parameters["@handover_type"].Value = linkage.HandoverType.HasValue ? linkage.HandoverType.Value : DBNull.Value;
command.Parameters["@handover_origin_type"].Value = linkage.HandoverOriginType.HasValue ? linkage.HandoverOriginType.Value : DBNull.Value;
command.Parameters["@handover_network_id"].Value = linkage.HandoverNetworkId.HasValue ? linkage.HandoverNetworkId.Value : DBNull.Value;
command.Parameters["@handover_initial_service_id"].Value = linkage.HandoverInitialServiceId.HasValue ? linkage.HandoverInitialServiceId.Value : DBNull.Value;
command.Parameters["@target_event_id"].Value = linkage.TargetEventId.HasValue ? linkage.TargetEventId.Value : DBNull.Value;
command.Parameters["@target_event_listed"].Value = linkage.TargetEventListed.HasValue ? linkage.TargetEventListed.Value : DBNull.Value;
command.Parameters["@target_event_simulcasted"].Value = linkage.TargetEventSimulcasted.HasValue ? linkage.TargetEventSimulcasted.Value : DBNull.Value;
command.Parameters["@table_type"].Value = linkage.TableType.HasValue ? (int)linkage.TableType.Value : DBNull.Value;
command.Parameters["@private_data_bytes"].Value = linkage.PrivateDataBytes != null ? linkage.PrivateDataBytes : DBNull.Value;
command.Parameters["@bouquet_id"].Value = linkage.BouquetId.HasValue ? linkage.BouquetId : DBNull.Value;
command.ExecuteNonQuery();
WriteBatLinkageExtendedLinkages(conn, bouquet, i);
WriteBatLinkageIpmacLinkage(conn, bouquet, i);
WriteBatLinkageSsuLinkStructure(conn, bouquet, i);
}
}
private void WriteBatLinkageSsuLinkStructure(NpgsqlConnection conn, BatBouquet bouquet, int ordinal)
{
if (bouquet.Linkages[ordinal].SystemSoftwareUpdateLinkStructure == null)
return;
NpgsqlCommand command = conn.CreateCommand();
command.CommandText =
"INSERT INTO dvb_bat_linkages_ssu_link_structure (id, ordinal, subordinal, oui, selector) " +
"VALUES (@id, @ordinal, @subordinal, @oui, @selector)";
command.Parameters.AddWithValue("@id", NpgsqlDbType.Integer, (int)bouquet.BouquetId);
command.Parameters.AddWithValue("@ordinal", NpgsqlDbType.Integer, ordinal);
command.Parameters.Add("@subordinal", NpgsqlDbType.Integer);
command.Parameters.Add("@oui", NpgsqlDbType.Varchar);
command.Parameters.AddWithValue("@selector", NpgsqlDbType.Bytea);
for (int i = 0; i < bouquet.Linkages[ordinal].SystemSoftwareUpdateLinkStructure.Count; i++)
{
command.Parameters["@subordinal"].Value = i;
command.Parameters["@oui"].Value = BitConverter.ToString(bouquet.Linkages[ordinal].SystemSoftwareUpdateLinkStructure[i].OUI);
command.Parameters["@selector"].Value = bouquet.Linkages[ordinal].SystemSoftwareUpdateLinkStructure[i].Selector;
command.ExecuteNonQuery();
}
}
private void WriteBatLinkageIpmacLinkage(NpgsqlConnection conn, BatBouquet bouquet, int ordinal)
{
if (bouquet.Linkages[ordinal].IpMacNotificationLinkages == null)
return;
for (int i = 0; i < bouquet.Linkages[ordinal].IpMacNotificationLinkages.Count; i++)
{
throw new NotImplementedException();
}
}
private void WriteBatLinkageExtendedLinkages(NpgsqlConnection conn, BatBouquet bouquet, int ordinal)
{
if (bouquet.Linkages[ordinal].ExtendedEventLinkages == null)
return;
for (int i = 0; i < bouquet.Linkages[ordinal].ExtendedEventLinkages.Length; i++)
{
throw new NotImplementedException();
}
}
private void WriteBatCountryAvailability(NpgsqlConnection conn, BatBouquet bouquet)
{
if (bouquet.CountryAvailabilityDictionary == null)
return;
NpgsqlCommand command = conn.CreateCommand();
command.CommandText = "INSERT INTO dvb_bat_country_availability (id,k,v) " +
"VALUES (@id,@k,@v)";
command.Parameters.AddWithValue("@id", (int)bouquet.BouquetId);
command.Parameters.Add("@k", NpgsqlDbType.Varchar);
command.Parameters.Add("@v", NpgsqlDbType.Boolean);
foreach (KeyValuePair<string, bool> keyValuePair in bouquet.CountryAvailabilityDictionary)
{
command.Parameters["@k"].Value = keyValuePair.Key;
command.Parameters["@v"].Value = keyValuePair.Value;
command.ExecuteNonQuery();
}
}
private HashSet<DatabaseKeyBatBouquet> _updatedBats;
public bool UpdateBatBouquet(BatBouquet batBouquet)
{
if (_updatedBats == null)
_updatedBats = new HashSet<DatabaseKeyBatBouquet>();
DatabaseKeyBatBouquet key = new DatabaseKeyBatBouquet(batBouquet.BouquetId);
if (_updatedBats.Contains(key))
return false;
EnqueueTask(x => WriteBatBouquetUpdate(x, batBouquet));
_updatedBats.Add(key);
return true;
}
private void WriteBatBouquetUpdate(NpgsqlConnection connection, BatBouquet newer)
{
BatBouquet older = SelectBat(connection, newer.BouquetId);
if (!older.NeedUpdate(newer))
return;
NpgsqlCommand command = connection.CreateCommand();
command.CommandText =
"UPDATE dvb_bat\r\nSET bouquet_name = @bouquet_name,\r\n private_data_specifier = @private_data_specifier,\r\n uri_linkage_type = @uri_linkage_type,\r\n uri = @uri,\r\n min_polling_interval = @min_polling_interval,\r\n control_remote_access_over_internet = @control_remote_access_over_internet,\r\n do_not_apply_revocation = @do_not_apply_revocation,\r\n do_not_scramble = @do_not_scramble,\r\n updated_counter = updated_counter + 1,\r\n updated_timestamp = CURRENT_TIMESTAMP\r\nWHERE id = @id";
command.Parameters.AddParameter("@id", NpgsqlDbType.Integer, (int)newer.BouquetId);
command.Parameters.AddParameter("@bouquet_name", NpgsqlDbType.Text, newer.BouquetName);
command.Parameters.AddParameter("@private_data_specifier", NpgsqlDbType.Bigint, newer.PrivateDataSpecifier);
command.Parameters.AddParameter("@uri_linkage_type", NpgsqlDbType.Integer, newer.UriLinkageType);
command.Parameters.AddParameter("@uri", NpgsqlDbType.Text, newer.Uri);
command.Parameters.AddParameter("@min_polling_interval", NpgsqlDbType.Integer, newer.MinPollingInterval);
command.Parameters.AddParameter("@control_remote_access_over_internet", NpgsqlDbType.Integer, newer.ControlRemoteAccessOverInternet);
command.Parameters.AddParameter("@do_not_apply_revocation", NpgsqlDbType.Boolean, newer.DoNotApplyRevocation);
command.Parameters.AddParameter("@do_not_scramble", NpgsqlDbType.Boolean, newer.DoNotScramble);
command.ExecuteNonQuery();
}
private BatBouquet SelectBat(NpgsqlConnection connection, int id)
{
NpgsqlCommand command = connection.CreateCommand();
command.CommandText = "SELECT * FROM dvb_bat WHERE id = @id";
command.Parameters.AddWithValue("@id", id);
NpgsqlDataReader dataReader = command.ExecuteReader();
BatBouquet result = null;
if (dataReader.Read())
{
ushort id2 = (ushort)dataReader.GetInt32(0);
result = new BatBouquet(id2);
DateTime dateadded = dataReader.GetDateTime(1);
result.BouquetName = dataReader.IsDBNull(2) ? null : dataReader.GetString(2);
result.PrivateDataSpecifier = dataReader.IsDBNull(3) ? null : (ushort)dataReader.GetInt64(3);
result.UriLinkageType = dataReader.IsDBNull(4) ? null : (byte)dataReader.GetInt32(4);
result.Uri = dataReader.IsDBNull(5) ? null : dataReader.GetString(5);
result.MinPollingInterval = dataReader.IsDBNull(6) ? null : (ushort)dataReader.GetInt32(6);
result.ControlRemoteAccessOverInternet = dataReader.IsDBNull(7) ? null : dataReader.GetInt32(7);
result.DoNotApplyRevocation = dataReader.IsDBNull(8) ? null : dataReader.GetBoolean(8);
result.DoNotScramble = dataReader.IsDBNull(9) ? null : dataReader.GetBoolean(9);
int updateCounter = dataReader.GetInt32(10);
DateTime? updatedTimestamp = dataReader.IsDBNull(11) ? null : dataReader.GetDateTime(11);
}
dataReader.Close();
command.Dispose();
return result;
}
private HashSet<DatabaseKeyBatTs> _knownBatTs;
public bool TestForBatTransportStream(ushort batBouquetBouquetId, BatTransportStream child)
{
if (_knownBatTs == null)
_knownBatTs = new HashSet<DatabaseKeyBatTs>();
DatabaseKeyBatTs ts = new DatabaseKeyBatTs(batBouquetBouquetId, child.TransportStreamId, child.OriginalNetworkId);
if (_knownBatTs.Contains(ts))
return true;
bool result = false;
using (NpgsqlConnection conn = new NpgsqlConnection(connectionStringBuilder.ToString()))
{
conn.Open();
NpgsqlCommand command = conn.CreateCommand();
command.CommandText = "SELECT dateAdded FROM dvb_bat_transport_stream WHERE bid = @bid AND tsid = @tsid AND onid = @onid";
command.Parameters.AddWithValue("@bid", NpgsqlDbType.Integer, (int)batBouquetBouquetId);
command.Parameters.AddWithValue("@tsid", NpgsqlDbType.Integer, (int)child.TransportStreamId);
command.Parameters.AddWithValue("@onid", NpgsqlDbType.Integer, (int)child.OriginalNetworkId);
NpgsqlDataReader dataReader = command.ExecuteReader();
result = dataReader.Read();
dataReader.Close();
command.Dispose();
conn.Close();
}
if (result)
_knownBatTs.Add(ts);
return result;
}
public void StoreBatTransportStream(ushort batBouquetBouquetId, BatTransportStream child)
{
EnqueueTask(x => WriteBatTransportStream(x, batBouquetBouquetId, child));
DatabaseKeyBatTs key = new DatabaseKeyBatTs(batBouquetBouquetId, child.TransportStreamId, child.OriginalNetworkId);
_knownBatTs.Add(key);
if (_updatedBatTs == null)
_updatedBatTs = new HashSet<DatabaseKeyBatTs>();
_updatedBatTs.Add(key);
}
private void WriteBatTransportStream(NpgsqlConnection connection, ushort bouquetId, BatTransportStream transportStream)
{
NpgsqlCommand command = connection.CreateCommand();
command.CommandText =
"INSERT INTO dvb_bat_transport_stream (bid, tsid, onid, private_data_specifier, default_authority) " +
"VALUES (@bid, @tsid, @onid, @private_data_specifier, @default_authority)";
command.Parameters.AddWithValue("@bid", NpgsqlDbType.Integer, (int)bouquetId);
command.Parameters.AddWithValue("@tsid", NpgsqlDbType.Integer, (int)transportStream.TransportStreamId);
command.Parameters.AddWithValue("@onid", NpgsqlDbType.Integer, (int)transportStream.OriginalNetworkId);
command.Parameters.AddParameter("@private_data_specifier", NpgsqlDbType.Bigint, transportStream.PrivateDataSpecifier);
command.Parameters.AddParameter("@default_authority", NpgsqlDbType.Text, transportStream.DefaultAuthority);
command.ExecuteNonQuery();
WriteBatTransportStreamCountryAvailability(connection, bouquetId, transportStream);
WriteBatTransportStreamServiceList(connection, bouquetId, transportStream);
}
private bool TestForBatTransportStreamServiceList(NpgsqlConnection connection, int bouquetId, int transportStreamId, int originalNetworkId, int serviceId)
{
NpgsqlCommand command = connection.CreateCommand();
command.CommandText = "SELECT dateadded FROM dvb_bat_transport_stream_service_list WHERE bid = @bid AND tsid = @tsid AND onid = @onid AND sid = @sid";
command.Parameters.AddWithValue("@bid", NpgsqlDbType.Integer, bouquetId);
command.Parameters.AddWithValue("@tsid", NpgsqlDbType.Integer, transportStreamId);
command.Parameters.AddWithValue("@onid", NpgsqlDbType.Integer, originalNetworkId);
command.Parameters.AddWithValue("@sid", NpgsqlDbType.Integer, serviceId);
NpgsqlDataReader dataReader = command.ExecuteReader();
bool result = dataReader.Read();
dataReader.Close();
command.Dispose();
return result;
}
private void WriteBatTransportStreamServiceList(NpgsqlConnection connection, ushort bouquetId, BatTransportStream transportStream)
{
if (transportStream.ServiceList == null)
return;
NpgsqlCommand command = connection.CreateCommand();
command.CommandText = "INSERT INTO dvb_bat_transport_stream_service_list (bid,tsid,onid,sid,service_type)" +
"VALUES (@bid,@tsid,@onid,@sid,@service_type)";
command.Parameters.AddWithValue("@bid", NpgsqlDbType.Integer, (int)bouquetId);
command.Parameters.AddWithValue("@tsid", NpgsqlDbType.Integer, (int)transportStream.TransportStreamId);
command.Parameters.AddWithValue("@onid", NpgsqlDbType.Integer, (int)transportStream.OriginalNetworkId);
command.Parameters.Add("@sid", NpgsqlDbType.Integer);
command.Parameters.Add("@service_type", NpgsqlDbType.Integer);
foreach (ServiceListDescriptor.Service service in transportStream.ServiceList)
{
if (TestForBatTransportStreamServiceList(connection,(int)bouquetId,(int)transportStream.TransportStreamId,(int)transportStream.OriginalNetworkId,service.ServiceId))
{
continue;
}
command.Parameters["@sid"].Value = (int)service.ServiceId;
command.Parameters["@service_type"].Value = (int)service.ServiceType;
command.ExecuteNonQuery();
}
}
private void WriteBatTransportStreamCountryAvailability(NpgsqlConnection connection, ushort bouquetId, BatTransportStream transportStream)
{
if (transportStream.CountryAvailability == null)
return;
foreach (KeyValuePair<string, bool> keyValuePair in transportStream.CountryAvailability)
{
throw new NotImplementedException();
}
}
private HashSet<DatabaseKeyBatTs> _updatedBatTs;
public bool UpdateBatTransportStream(ushort batBouquetBouquetId, BatTransportStream child)
{
if (_updatedBatTs == null)
_updatedBatTs = new HashSet<DatabaseKeyBatTs>();
DatabaseKeyBatTs key = new DatabaseKeyBatTs(batBouquetBouquetId, child.TransportStreamId, child.OriginalNetworkId);
if (_updatedBatTs.Contains(key))
return false;
EnqueueTask(x => WriteUpdateBatTs(x, batBouquetBouquetId, child));
_updatedBatTs.Add(key);
return true;
}
private void WriteUpdateBatTs(NpgsqlConnection connection, ushort batBouquetBouquetId, BatTransportStream transportStream)
{
DatabaseKeyBatTs key = new DatabaseKeyBatTs(batBouquetBouquetId, transportStream.TransportStreamId, transportStream.OriginalNetworkId);
BatTransportStream older = SelectBatTs(connection, batBouquetBouquetId, transportStream.TransportStreamId, transportStream.OriginalNetworkId);
if (!older.NeedsUpdate(transportStream))
{
return;
}
NpgsqlCommand command = connection.CreateCommand();
command.CommandText =
"UPDATE dvb_bat_transport_stream " +
"SET private_data_specifier = @private_data_specifier,\r\n default_authority = @default_authority " +
"WHERE bid = @bid AND tsid = @tsid AND onid = @onid\r\n";
command.Parameters.AddWithValue("@bid", NpgsqlDbType.Integer, (int)batBouquetBouquetId);
command.Parameters.AddWithValue("@tsid", NpgsqlDbType.Integer, (int)transportStream.TransportStreamId);
command.Parameters.AddWithValue("@onid", NpgsqlDbType.Integer, (int)transportStream.OriginalNetworkId);
command.Parameters.AddParameter("@private_data_specifier", NpgsqlDbType.Bigint, transportStream.PrivateDataSpecifier);
command.Parameters.AddParameter("@default_authority", NpgsqlDbType.Text, transportStream.DefaultAuthority);
command.ExecuteNonQuery();
}
private BatTransportStream SelectBatTs(NpgsqlConnection conn, ushort bouquetId, ushort transportStreamId, ushort originalNetworkId)
{
NpgsqlCommand command = conn.CreateCommand();
command.CommandText = "SELECT * FROM dvb_bat_transport_stream WHERE bid = @bid AND tsid = @tsid AND onid = @onid";
command.Parameters.AddParameter("@bid", NpgsqlDbType.Integer, (int)bouquetId);
command.Parameters.AddParameter("@tsid", NpgsqlDbType.Integer, (int)transportStreamId);
command.Parameters.AddParameter("@onid", NpgsqlDbType.Integer, (int)originalNetworkId);
NpgsqlDataReader dataReader = command.ExecuteReader();
BatTransportStream result = null;
if (dataReader.Read())
{
ushort bid = (ushort)dataReader.GetInt32(0);
ushort tsid = (ushort)dataReader.GetInt32(1);
ushort onid = (ushort)dataReader.GetInt32(2);
DateTime dateadded = dataReader.GetDateTime(3);
result = new BatTransportStream(tsid, onid);
result.PrivateDataSpecifier = dataReader.IsDBNull(4) ? null : (uint)dataReader.GetInt64(4);
result.DefaultAuthority = dataReader.IsDBNull(5) ? null : dataReader.GetString(5);
}
dataReader.Close();
command.Dispose();
return result;
}
}
}

View File

@ -0,0 +1,173 @@
using Npgsql;
using NpgsqlTypes;
using System;
using System.Collections.Generic;
using System.Data.Common;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using skyscraper5.Skyscraper.Gps;
namespace skyscraper5.Data.PostgreSql
{
public partial class PostgresqlDataStore
{
public void BeamsDisableAll()
{
using (NpgsqlConnection connection = new NpgsqlConnection(connectionStringBuilder.ToString()))
{
connection.Open();
NpgsqlCommand command = connection.CreateCommand();
command.CommandText = "UPDATE skyscraper5_beams SET enabled = FALSE";
command.ExecuteNonQuery();
connection.Close();
}
}
public void BeamsEnable(int id, float satpos, string name, DateTime processTimestamp)
{
using (NpgsqlConnection connection = new NpgsqlConnection(connectionStringBuilder.ToString()))
{
connection.Open();
NpgsqlCommand command = connection.CreateCommand();
command.CommandText = "SELECT dateadded FROM skyscraper5_beams WHERE id = @id AND process_timestamp = @process_timestamp";
command.Parameters.AddWithValue("@id", NpgsqlDbType.Integer, id);
command.Parameters.AddWithValue("@process_timestamp", NpgsqlDbType.Timestamp, processTimestamp);
NpgsqlDataReader dataReader = command.ExecuteReader();
bool isKnown = dataReader.Read();
dataReader.Close();
if (isKnown)
{
command.CommandText = "UPDATE skyscraper5_beams SET enabled = TRUE WHERE id = @id AND process_timestamp = @process_timestamp";
command.ExecuteNonQuery();
}
else
{
command.CommandText = "INSERT INTO skyscraper5_beams (id,satpos,name,process_timestamp) VALUES (@id,@satpos,@name,@process_timestamp)";
command.Parameters.AddWithValue("@satpos", NpgsqlDbType.Double, (double)satpos);
command.Parameters.AddWithValue("@name", NpgsqlDbType.Text, name);
command.ExecuteNonQuery();
}
connection.Close();
}
}
public void BeamFootprintStore(int databasePointerId, DateTime databasePointerBeamsProcessTimestamp,
string name,
string getPolygonString, string id)
{
using (NpgsqlConnection conn = new NpgsqlConnection(connectionStringBuilder.ToString()))
{
conn.Open();
NpgsqlCommand command = conn.CreateCommand();
command.CommandText =
"insert into skyscraper5_beams_footprints (beam_id, beam_process_timestamp, name, polygon,polygonid)\r\n" +
"values (@beam_id,@beam_process_timestamp,@name,@polygon,@polygonid)";
command.Parameters.AddWithValue("@beam_id", NpgsqlDbType.Integer, databasePointerId);
command.Parameters.AddWithValue("@beam_process_timestamp", NpgsqlDbType.Timestamp, databasePointerBeamsProcessTimestamp);
command.Parameters.AddWithValue("@name", NpgsqlDbType.Varchar, name);
command.Parameters.AddWithValue("@polygon", NpgsqlDbType.Text, getPolygonString);
command.Parameters.AddWithValue("@polygonid", NpgsqlDbType.Text, id);
command.ExecuteNonQuery();
conn.Close();
}
}
public bool TestForBeamFootprint(int databasePointerId, DateTime databasePointerBeamsProcessTimestamp, string name, string polygonid)
{
bool result;
using (NpgsqlConnection conn = new NpgsqlConnection(connectionStringBuilder.ToString()))
{
conn.Open();
NpgsqlCommand command = conn.CreateCommand();
command.CommandText = "SELECT dateadded " +
"FROM skyscraper5_beams_footprints " +
"WHERE beam_id = @beam_id " +
"AND beam_process_timestamp = @beam_process_timestamp " +
"AND name = @name " +
"AND polygonid = @polygonid ";
command.Parameters.AddWithValue("@beam_id", NpgsqlDbType.Integer, databasePointerId);
command.Parameters.AddWithValue("@beam_process_timestamp", NpgsqlDbType.Timestamp, databasePointerBeamsProcessTimestamp);
command.Parameters.AddWithValue("@name", NpgsqlDbType.Text, name);
command.Parameters.AddWithValue("@polygonid", NpgsqlDbType.Text, polygonid);
NpgsqlDataReader dataReader = command.ExecuteReader();
result = dataReader.Read();
dataReader.Close();
conn.Close();
}
return result;
}
public void BeamsDisableSpecific(int id, float databasePointerSatpos, string databasePointerName,
DateTime processTimestamp)
{
using (NpgsqlConnection connection = new NpgsqlConnection(connectionStringBuilder.ToString()))
{
connection.Open();
NpgsqlCommand command = connection.CreateCommand();
command.CommandText = "SELECT dateadded FROM skyscraper5_beams WHERE id = @id AND process_timestamp = @process_timestamp";
command.Parameters.AddWithValue("@id", NpgsqlDbType.Integer, id);
command.Parameters.AddWithValue("@process_timestamp", NpgsqlDbType.Timestamp, processTimestamp);
NpgsqlDataReader dataReader = command.ExecuteReader();
bool isKnown = dataReader.Read();
dataReader.Close();
if (isKnown)
{
command.CommandText = "UPDATE skyscraper5_beams SET enabled = FALSE WHERE id = @id AND process_timestamp = @process_timestamp";
command.ExecuteNonQuery();
}
else
{
//Not yet known, so we won't need to update. Okay, keep going.
}
connection.Close();
}
}
public IEnumerable<SatelliteBeam> BeamsSelectEnabled()
{
using (NpgsqlConnection connection = new NpgsqlConnection(connectionStringBuilder.ToString()))
{
connection.Open();
NpgsqlCommand command = connection.CreateCommand();
command.CommandText = "SELECT id, satpos, name, process_timestamp FROM skyscraper5_beams";
NpgsqlDataReader dataReader = command.ExecuteReader();
while (dataReader.Read())
{
int id = dataReader.GetInt32(0);
float satpos = dataReader.GetFloat(1);
string name = dataReader.GetString(2);
DateTime processTimestamp = dataReader.GetDateTime(3);
yield return new SatelliteBeam(id, satpos, name, processTimestamp);
}
dataReader.Close();
command.Dispose();
connection.Close();
}
}
public List<SatelliteBeamFootprint> BeamsSelectFootprints(int satelliteBeamId, DateTime satelliteBeamProcessTimestamp)
{
List<SatelliteBeamFootprint> result = new List<SatelliteBeamFootprint>();
using (NpgsqlConnection connection = new NpgsqlConnection(connectionStringBuilder.ToString()))
{
connection.Open();
NpgsqlCommand command = connection.CreateCommand();
command.CommandText = "SELECT name, polygon, dateadded, polygonid FROM skyscraper5_beams_footprints WHERE beam_id = @id AND beam_process_timestamp = @process_timestamp";
command.Parameters.AddWithValue("@id", NpgsqlDbType.Integer, satelliteBeamId);
command.Parameters.AddWithValue("@process_timestamp", NpgsqlDbType.Timestamp, satelliteBeamProcessTimestamp);
NpgsqlDataReader dataReader = command.ExecuteReader();
while (dataReader.Read())
{
string name = dataReader.GetString(0);
string polygon = dataReader.GetString(1);
DateTime dateadded = dataReader.GetDateTime(2);
string polygonId = dataReader.GetString(3);
result.Add(new SatelliteBeamFootprint(satelliteBeamId, satelliteBeamProcessTimestamp, name, polygon, dateadded, polygonId));
}
}
return result;
}
}
}

View File

@ -0,0 +1,572 @@
using skyscraper5.Skyscraper.IO.CrazycatStreamReader;
using skyscraper5.src.Skyscraper.FrequencyListGenerator;
using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Linq;
using System.Net.NetworkInformation;
using System.Text;
using System.Threading.Tasks;
using Npgsql;
using NpgsqlTypes;
using skyscraper5.Skyscraper;
using skyscraper5.Skyscraper.Gps;
namespace skyscraper5.Data.PostgreSql
{
public partial class PostgresqlDataStore
{
public void InsertBlindscanJob(DbBlindscanJob jobInDb)
{
using (NpgsqlConnection connection = new NpgsqlConnection(connectionStringBuilder.ToString()))
{
connection.Open();
NpgsqlCommand command = connection.CreateCommand();
command.CommandText = "insert into skyscraper5_blindscan_jobs (uuid, tuner_mac, tuner_std, diseqc_index, horizontal_low, horizontal_high,\r\n" +
" vertical_low, vertical_high, gps_lon, gps_lat, sat_position)\r\n" +
"values (@uuid,@tuner_mac,@tuner_std,@diseqc_index,@hl,@hh,@vl,@vh,@gps_lon,@gps_lat,@sat_position);";
command.Parameters.AddWithValue("@uuid", NpgsqlDbType.Uuid, jobInDb.JobGuid);
command.Parameters.AddWithValue("@tuner_mac", NpgsqlDbType.MacAddr, jobInDb.TunerMAC);
command.Parameters.AddWithValue("@tuner_std", NpgsqlDbType.Integer, (int)jobInDb.TunerStandard);
command.Parameters.AddWithValue("@diseqc_index", NpgsqlDbType.Integer, jobInDb.DiseqCIndex);
command.Parameters.AddWithValue("@hl", NpgsqlDbType.Integer, (int)jobInDb.HorizontalLowState);
command.Parameters.AddWithValue("@hh", NpgsqlDbType.Integer, (int)jobInDb.HorizontalHighState);
command.Parameters.AddWithValue("@vl", NpgsqlDbType.Integer, (int)jobInDb.VerticalLowState);
command.Parameters.AddWithValue("@vh", NpgsqlDbType.Integer, (int)jobInDb.VerticalHighState);
if (jobInDb.GpsCoordinate.HasValue)
{
command.Parameters.AddWithValue("@gps_lon", NpgsqlDbType.Double, (double)jobInDb.GpsCoordinate.Value.Longitude);
command.Parameters.AddWithValue("@gps_lat", NpgsqlDbType.Double, (double)jobInDb.GpsCoordinate.Value.Latitude);
}
else
{
command.Parameters.AddWithValue("@gps_lon", NpgsqlDbType.Double, DBNull.Value);
command.Parameters.AddWithValue("@gps_lat", NpgsqlDbType.Double, DBNull.Value);
}
if (jobInDb.SatPosition != null)
{
command.Parameters.AddWithValue("@sat_position", NpgsqlDbType.Integer, jobInDb.SatPosition.Checksum);
}
else
{
command.Parameters.AddWithValue("@sat_position", NpgsqlDbType.Integer, DBNull.Value);
}
command.ExecuteNonQuery();
command.Dispose();
connection.Close();
}
}
public void UpdateJobState(DbBlindscanJob jobInDb)
{
using (NpgsqlConnection connection = new NpgsqlConnection(connectionStringBuilder.ToString()))
{
connection.Open();
NpgsqlCommand command = connection.CreateCommand();
command.CommandText =
"UPDATE skyscraper5_blindscan_jobs SET horizontal_low = @hl, horizontal_high = @hh, vertical_low = @vl, vertical_high = @vh, dateupdated = CURRENT_TIMESTAMP, version = version + 1 WHERE uuid = @uuid";
command.Parameters.AddWithValue("@uuid", NpgsqlDbType.Uuid, jobInDb.JobGuid);
command.Parameters.AddWithValue("@hl", NpgsqlDbType.Integer, (int)jobInDb.HorizontalLowState);
command.Parameters.AddWithValue("@hh", NpgsqlDbType.Integer, (int)jobInDb.HorizontalHighState);
command.Parameters.AddWithValue("@vl", NpgsqlDbType.Integer, (int)jobInDb.VerticalLowState);
command.Parameters.AddWithValue("@vh", NpgsqlDbType.Integer, (int)jobInDb.VerticalHighState);
int result = command.ExecuteNonQuery();
if (result != 1)
throw new InvalidDataException("db update failed");
command.Dispose();
connection.Close();
}
}
public void InsertSearchResult(DbBlindscanJob jobInDb, bool satellite, SearchResult searchResult, int polarityIndex, SearchResult2 searchResult2)
{
using (NpgsqlConnection connection = new NpgsqlConnection(connectionStringBuilder.ToString()))
{
connection.Open();
NpgsqlCommand command = connection.CreateCommand();
command.CommandText =
"insert into skyscraper5_blindscan_search_results (related_job, satellite, polarity_index,\r\n" +
" lock, freq, pol, sr, std_type, mod_type, fec,\r\n" +
" inversion, roll_off, pilot, frame, coding_type, stream_type, mis,\r\n" +
" input_stream_ids, issyi, npd, pls, cw, bitrate, rf_level, snr, ber,\r\n" +
" pre_ber, bw, feclp, transmode, guard, hierarchy, plp, lid, s1type,\r\n" +
" payload, bw_ext, mode_t2, ver_t2, cell_id, net_id)\r\n" +
"values (@related_job, @satellite, @polarity_index, @lock, @freq, @pol, @sr, @std_type, @mod_type, @fec, @inversion,\r\n" +
" @roll_off, @pilot, @frame, @coding_type, @stream_type, @mis, @input_stream_ids, @issyi, @npd, @pls, @cw,\r\n" +
" @bitrate, @rf_level, @snr, @ber, @pre_ber, @bw, @feclp, @transmode, @guard, @hierarchy, @plp, @lid, @s1type,\r\n" +
" @payload, @bw_ext, @mode_t2, @ver_t2, @cell_id, @net_id)";
command.Parameters.Add("@related_job", NpgsqlDbType.Uuid);
command.Parameters.Add("@satellite", NpgsqlDbType.Boolean);
command.Parameters.Add("@polarity_index", NpgsqlDbType.Integer);
command.Parameters.Add("@lock", NpgsqlDbType.Boolean);
command.Parameters.Add("@freq", NpgsqlDbType.Integer);
command.Parameters.Add("@pol", NpgsqlDbType.Integer);
command.Parameters.Add("@sr", NpgsqlDbType.Integer);
command.Parameters.Add("@std_type", NpgsqlDbType.Integer);
command.Parameters.Add("@mod_type", NpgsqlDbType.Integer);
command.Parameters.Add("@fec", NpgsqlDbType.Integer);
command.Parameters.Add("@inversion", NpgsqlDbType.Integer);
command.Parameters.Add("@roll_off", NpgsqlDbType.Integer);
command.Parameters.Add("@pilot", NpgsqlDbType.Integer);
command.Parameters.Add("@frame", NpgsqlDbType.Integer);
command.Parameters.Add("@coding_type", NpgsqlDbType.Integer);
command.Parameters.Add("@stream_type", NpgsqlDbType.Integer);
command.Parameters.Add("@mis", NpgsqlDbType.Integer);
command.Parameters.Add("@input_stream_ids", NpgsqlDbType.Bytea);
command.Parameters.Add("@issyi", NpgsqlDbType.Smallint);
command.Parameters.Add("@npd", NpgsqlDbType.Smallint);
command.Parameters.Add("@pls", NpgsqlDbType.Integer);
command.Parameters.Add("@cw", NpgsqlDbType.Integer);
command.Parameters.Add("@bitrate", NpgsqlDbType.Integer);
command.Parameters.Add("@rf_level", NpgsqlDbType.Integer);
command.Parameters.Add("@snr", NpgsqlDbType.Double);
command.Parameters.Add("@ber", NpgsqlDbType.Double);
command.Parameters.Add("@pre_ber", NpgsqlDbType.Double);
//SR2
command.Parameters.Add("@bw", NpgsqlDbType.Integer);
command.Parameters.Add("@feclp", NpgsqlDbType.Integer);
command.Parameters.Add("@transmode", NpgsqlDbType.Integer);
command.Parameters.Add("@guard", NpgsqlDbType.Integer);
command.Parameters.Add("@hierarchy", NpgsqlDbType.Integer);
command.Parameters.Add("@plp", NpgsqlDbType.Integer);
command.Parameters.Add("@lid", NpgsqlDbType.Bytea);
command.Parameters.Add("@s1type", NpgsqlDbType.Integer);
command.Parameters.Add("@payload", NpgsqlDbType.Integer);
command.Parameters.Add("@bw_ext", NpgsqlDbType.Integer);
command.Parameters.Add("@mode_t2", NpgsqlDbType.Integer);
command.Parameters.Add("@ver_t2", NpgsqlDbType.Integer);
command.Parameters.Add("@cell_id", NpgsqlDbType.Integer);
command.Parameters.Add("@net_id", NpgsqlDbType.Integer);
foreach (NpgsqlParameter parameter in command.Parameters)
parameter.Value = DBNull.Value;
command.Parameters["@related_job"].Value = jobInDb.JobGuid;
command.Parameters["@satellite"].Value = satellite;
command.Parameters["@polarity_index"].Value = polarityIndex;
if (satellite)
{
command.Parameters["@lock"].Value = searchResult.Lock;
command.Parameters["@freq"].Value = searchResult.Freq;
command.Parameters["@pol"].Value = searchResult.Pol;
command.Parameters["@sr"].Value = searchResult.SR;
command.Parameters["@std_type"].Value = searchResult.StdType;
command.Parameters["@mod_type"].Value = searchResult.ModType;
command.Parameters["@fec"].Value = (int)searchResult.FEC;
command.Parameters["@inversion"].Value = searchResult.Inversion;
command.Parameters["@roll_off"].Value = searchResult.RollOff;
command.Parameters["@pilot"].Value = searchResult.Pilot;
command.Parameters["@frame"].Value = searchResult.Frame;
command.Parameters["@coding_type"].Value = searchResult.CodingType;
command.Parameters["@stream_type"].Value = searchResult.StreamType;
command.Parameters["@mis"].Value = searchResult.MIS;
command.Parameters["@input_stream_ids"].Value = searchResult.IS;
command.Parameters["@issyi"].Value = searchResult.ISSYI;
command.Parameters["@npd"].Value = searchResult.NPD;
command.Parameters["@pls"].Value = searchResult.PLS;
command.Parameters["@cw"].Value = searchResult.CW;
command.Parameters["@bitrate"].Value = DBNull.Value;
command.Parameters["@rf_level"].Value = searchResult.RFLevel;
command.Parameters["@snr"].Value = searchResult.SNR;
command.Parameters["@ber"].Value = searchResult.BER;
command.Parameters["@pre_ber"].Value = searchResult.preBER;
}
else
{
command.Parameters["@lock"].Value = searchResult2.Lock;
command.Parameters["@pol"].Value = 0;
command.Parameters["@freq"].Value = searchResult2.Freq;
command.Parameters["@sr"].Value = searchResult2.SR;
command.Parameters["@std_type"].Value = searchResult2.StdType;
command.Parameters["@mod_type"].Value = searchResult2.ModType;
command.Parameters["@fec"].Value = searchResult2.FEC;
command.Parameters["@bw"].Value = searchResult2.BW;
command.Parameters["@feclp"].Value = searchResult2.FECLP;
command.Parameters["@transmode"].Value = searchResult2.TransMode;
command.Parameters["@guard"].Value = searchResult2.Guard;
command.Parameters["@hierarchy"].Value = searchResult2.Hierarchy;
command.Parameters["@plp"].Value = searchResult2.PLP;
command.Parameters["@lid"].Value = searchResult2.LID;
command.Parameters["@s1type"].Value = searchResult2.S1Type;
command.Parameters["@payload"].Value = searchResult2.Payload;
command.Parameters["@bw_ext"].Value = searchResult2.BwExt;
command.Parameters["@mode_t2"].Value = searchResult2.ModeT2;
command.Parameters["@ver_t2"].Value = searchResult2.VerT2;
command.Parameters["@cell_id"].Value = searchResult2.CellID;
command.Parameters["@net_id"].Value = searchResult2.NetID;
}
command.ExecuteNonQuery();
command.Dispose();
connection.Close();
}
}
public void UpdateTransponderState(DbBlindscanJob jobInDb, bool satellite, SearchResult searchResult,BlindscanResultState blindscanResultState, SearchResult2 searchResult2)
{
using (NpgsqlConnection connection = new NpgsqlConnection(connectionStringBuilder.ToString()))
{
connection.Open();
NpgsqlCommand command = connection.CreateCommand();
if (satellite)
{
command.CommandText =
"UPDATE skyscraper5_blindscan_search_results\r\n" +
"SET state = @state, dateupdated = CURRENT_TIMESTAMP, version = version + 1\r\n" +
"WHERE related_job = @related_job AND satellite = TRUE AND freq = @freq AND pol = @pol";
command.Parameters.AddWithValue("@freq", NpgsqlDbType.Integer, searchResult.Freq);
command.Parameters.AddWithValue("@pol", NpgsqlDbType.Integer, searchResult.Pol);
}
else
{
command.CommandText =
"UPDATE skyscraper5_blindscan_search_results\r\n" +
"SET state = @state, dateupdated = CURRENT_TIMESTAMP, version = version + 1\r\n" +
"WHERE related_job = @related_job AND satellite = FALSE AND freq = @freq AND pol = 0";
command.Parameters.AddWithValue("@freq", NpgsqlDbType.Integer, searchResult2.Freq);
}
command.Parameters.AddWithValue("@related_job", NpgsqlDbType.Uuid, jobInDb.JobGuid);
command.Parameters.AddWithValue("@state", NpgsqlDbType.Integer, (int)blindscanResultState);
int i = command.ExecuteNonQuery();
if (i != 1)
throw new DBConcurrencyException(String.Format("Somehow I got {0} matches when I expected one.", i));
command.Dispose();
connection.Close();
}
}
public void InsertTransponderService(DbBlindscanJob jobInDb, bool resultSatellite, SearchResult resultSr1,SearchResult2 resultSr2, HumanReadableService humanReadableService)
{
using (NpgsqlConnection connection = new NpgsqlConnection(connectionStringBuilder.ToString()))
{
connection.Open();
NpgsqlCommand command = connection.CreateCommand();
command.CommandText =
"insert into skyscraper5_blindscan_services (related_job, freq, pol, sid, provider_name, service_name, ca_id,service_type)\r\n" +
"values (@related_job,@freq,@pol,@sid,@provider_name,@service_name,@ca_id,@service_type)";
command.Parameters.AddWithValue("@related_job", NpgsqlDbType.Uuid, jobInDb.JobGuid);
if (resultSatellite)
{
command.Parameters.AddWithValue("@freq", NpgsqlDbType.Integer, resultSr1.Freq);
command.Parameters.AddWithValue("@pol", NpgsqlDbType.Integer, resultSr1.Pol);
}
else
{
command.Parameters.AddWithValue("@freq", NpgsqlDbType.Integer, resultSr2.Freq);
command.Parameters.AddWithValue("@pol", NpgsqlDbType.Integer, 0);
}
command.Parameters.AddWithValue("@sid", NpgsqlDbType.Integer, (int)humanReadableService.ServiceId);
command.Parameters.AddWithValue("@provider_name", NpgsqlDbType.Text, humanReadableService.ProviderName.Trim((char)0));
string serviceName = humanReadableService.ServiceName.Trim((char)0).Trim();
command.Parameters.AddWithValue("@service_name", NpgsqlDbType.Text, serviceName);
if (humanReadableService.CaId.HasValue)
command.Parameters.AddWithValue("@ca_id", NpgsqlDbType.Integer, (int)humanReadableService.CaId.Value);
else
command.Parameters.AddWithValue("@ca_id", NpgsqlDbType.Integer, DBNull.Value);
command.Parameters.AddWithValue("@service_type", NpgsqlDbType.Integer, (int)humanReadableService.ServiceType);
command.ExecuteNonQuery();
command.Dispose();
connection.Close();
}
}
public bool TestForIncompleteJob()
{
using (NpgsqlConnection connection = new NpgsqlConnection(connectionStringBuilder.ToString()))
{
connection.Open();
NpgsqlCommand command = connection.CreateCommand();
command.CommandText = "SELECT uuid FROM skyscraper5_blindscan_jobs WHERE horizontal_low < 100 OR horizontal_high < 100 OR vertical_low < 100 OR vertical_high < 100";
NpgsqlDataReader dataReader = command.ExecuteReader();
bool result = dataReader.Read();
dataReader.Close();
command.Dispose();
connection.Close();
return result;
}
}
public DbBlindscanJob GetPastBlindscanJob(long offset)
{
using (NpgsqlConnection connection = new NpgsqlConnection(connectionStringBuilder.ToString()))
{
connection.Open();
NpgsqlCommand command = connection.CreateCommand();
command.CommandText = "SELECT * FROM skyscraper5_blindscan_jobs ORDER BY dateadded DESC LIMIT 1 OFFSET @pastindex";
command.Parameters.AddWithValue("@pastindex", NpgsqlDbType.Integer, (int)offset);
NpgsqlDataReader dataReader = command.ExecuteReader();
DbBlindscanJob result = null;
if (dataReader.Read())
{
Guid uuid = dataReader.GetGuid(0);
PhysicalAddress tuner_mac = (PhysicalAddress)dataReader.GetValue(1);
int tuner_std = dataReader.GetInt32(2);
int diseqc_index = dataReader.GetInt32(3);
int horizontal_low = dataReader.GetInt32(4);
int horizontal_high = dataReader.GetInt32(5);
int vertical_low = dataReader.GetInt32(6);
int vertical_high = dataReader.GetInt32(7);
DateTime date_added = dataReader.GetDateTime(8);
DateTime? date_updated = null;
if (!dataReader.IsDBNull(9))
date_updated = dataReader.GetDateTime(9);
int version = dataReader.GetInt32(10);
double gps_lon = dataReader.GetDouble(11);
double gps_lat = dataReader.GetDouble(12);
int sat_position = dataReader.GetInt32(13);
int serial = dataReader.GetInt32(14);
string note = null;
if (!dataReader.IsDBNull(15))
note = dataReader.GetString(15);
result = new DbBlindscanJob(uuid, tuner_mac, (STD_TYPE)tuner_std, diseqc_index, new DummyGpsReceiver(true,(float)gps_lat,(float)gps_lon), SatellitePosition.FromChecksum(sat_position));
result.DateAdded = date_added;
result.HorizontalHighState = (DbBlindscanJobPolarizationStatus)horizontal_high;
result.HorizontalLowState = (DbBlindscanJobPolarizationStatus)horizontal_low;
result.VerticalHighState = (DbBlindscanJobPolarizationStatus)vertical_high;
result.VerticalLowState = (DbBlindscanJobPolarizationStatus)vertical_low;
}
dataReader.Close();
command.Dispose();
return result;
}
}
public void DeleteBlindscanJob(Guid guid)
{
using (NpgsqlConnection connection = new NpgsqlConnection(connectionStringBuilder.ToString()))
{
connection.Open();
NpgsqlTransaction transaction = connection.BeginTransaction();
NpgsqlCommand command = connection.CreateCommand();
command.CommandText = "DELETE FROM skyscraper5_blindscan_services WHERE related_job = @uuid";
command.Parameters.AddWithValue("@uuid", NpgsqlDbType.Uuid, guid);
int servicesRemoved = command.ExecuteNonQuery();
command.Dispose();
command = connection.CreateCommand();
command.CommandText = "DELETE FROM skyscraper5_blindscan_search_results WHERE related_job = @uuid";
command.Parameters.AddWithValue("@uuid", NpgsqlDbType.Uuid, guid);
int searchResultRemoves = command.ExecuteNonQuery();
command.Dispose();
command = connection.CreateCommand();
command.CommandText = "DELETE FROM skyscraper5_blindscan_jobs WHERE uuid = @uuid";
command.Parameters.AddWithValue("@uuid", NpgsqlDbType.Uuid, guid);
int searchResultJobs = command.ExecuteNonQuery();
command.Dispose();
if (searchResultJobs != 1)
throw new DataException(String.Format("Expected to delete 1 row, but removed {0}", searchResultJobs));
transaction.Commit();
transaction.Dispose();
connection.Close();
}
}
public void DeleteBlindscanResults(Guid uuid, int pol)
{
pol++;
using (NpgsqlConnection connection = new NpgsqlConnection(connectionStringBuilder.ToString()))
{
connection.Open();
NpgsqlCommand command = connection.CreateCommand();
command.CommandText = "SELECT freq, pol, state FROM skyscraper5_blindscan_search_results WHERE related_job = @uuid AND polarity_index = @pol";
command.Parameters.AddWithValue("@uuid", NpgsqlDbType.Uuid, uuid);
command.Parameters.AddWithValue("@pol", NpgsqlDbType.Integer, pol);
NpgsqlDataReader reader = command.ExecuteReader();
List<Tuple<int, int, BlindscanResultState>> toBeDeleted = new List<Tuple<int, int, BlindscanResultState>>();
while (reader.Read())
{
int left = reader.GetInt32(0);
int mid = reader.GetInt32(1);
BlindscanResultState right = (BlindscanResultState)reader.GetInt32(2);
toBeDeleted.Add(new Tuple<int, int, BlindscanResultState>(left, mid, right));
}
reader.Close();
command.Dispose();
NpgsqlTransaction transaction = connection.BeginTransaction();
foreach (Tuple<int, int, BlindscanResultState> deleteMe in toBeDeleted)
{
switch (deleteMe.Item3)
{
case BlindscanResultState.Found:
//not yet touched, no services to be deleted.
break;
case BlindscanResultState.Tuning:
//failed to touch, no serives to be deleted
break;
case BlindscanResultState.Done:
DeleteBlindscanServices(connection, uuid, deleteMe.Item1, deleteMe.Item2);
break;
default:
throw new NotImplementedException(deleteMe.Item3.ToString());
}
}
command = connection.CreateCommand();
command.CommandText = "DELETE FROM skyscraper5_blindscan_search_results WHERE related_job = @uuid AND polarity_index = @pol";
command.Parameters.AddWithValue("@uuid", NpgsqlDbType.Uuid, uuid);
command.Parameters.AddWithValue("@pol", NpgsqlDbType.Integer, pol);
command.ExecuteNonQuery();
command.Dispose();
SetBlindscanPolarityState(connection, uuid, pol, DbBlindscanJobPolarizationStatus.SELECTED_WAITING);
transaction.Commit();
transaction.Dispose();
connection.Close();
}
}
private void SetBlindscanPolarityState(NpgsqlConnection connection, Guid uuid, int polarityIndex, DbBlindscanJobPolarizationStatus newStatus)
{
string updateColumn = null;
switch (polarityIndex)
{
case 1: updateColumn = "horizontal_low"; break;
case 2: updateColumn = "horizontal_high"; break;
case 3: updateColumn = "vertical_low"; break;
case 4: updateColumn = "vertical_high"; break;
default: throw new ArgumentOutOfRangeException(nameof(polarityIndex));
}
NpgsqlCommand command = connection.CreateCommand();
command.CommandText = String.Format("UPDATE skyscraper5_blindscan_jobs SET {0} = @value, dateupdated = CURRENT_TIMESTAMP, version = version + 1 WHERE uuid = @uuid", updateColumn);
command.Parameters.AddWithValue("@value", NpgsqlDbType.Integer, (int)newStatus);
command.Parameters.AddWithValue("@uuid", NpgsqlDbType.Uuid, uuid);
int result = command.ExecuteNonQuery();
if (result != 1)
throw new DataException(String.Format("Expected to update 1 row, but got {0}", result));
command.Dispose();
}
private void DeleteBlindscanServices(NpgsqlConnection connection, Guid uuid, int freq, int pol)
{
NpgsqlCommand cmd = connection.CreateCommand();
cmd.CommandText = "DELETE FROM skyscraper5_blindscan_services WHERE related_job = @uuid AND freq = @freq AND pol = @pol";
cmd.Parameters.AddWithValue("@uuid", NpgsqlDbType.Uuid, uuid);
cmd.Parameters.AddWithValue("@freq", NpgsqlDbType.Integer, freq);
cmd.Parameters.AddWithValue("@pol", NpgsqlDbType.Integer, pol);
cmd.ExecuteNonQuery();
}
public void MoveBlScanResultsToAnotherJob(Guid moveFrom, Guid moveTo, int polarity)
{
polarity++;
using (NpgsqlConnection connection = new NpgsqlConnection(connectionStringBuilder.ToString()))
{
//Services, die bewegt werden müssen finden
connection.Open();
NpgsqlCommand command = connection.CreateCommand();
command.CommandText = "SELECT freq, pol FROM skyscraper5_blindscan_search_results WHERE related_job = @uuid AND polarity_index = @pol";
command.Parameters.AddWithValue("@uuid", NpgsqlDbType.Uuid, moveFrom);
command.Parameters.AddWithValue("@pol", NpgsqlDbType.Integer, polarity);
NpgsqlDataReader reader = command.ExecuteReader();
List<Tuple<int, int>> toBeMoved = new List<Tuple<int, int>>();
while (reader.Read())
{
int left = reader.GetInt32(0);
int mid = reader.GetInt32(1);
toBeMoved.Add(new Tuple<int, int>(left, mid));
}
reader.Close();
command.Dispose();
NpgsqlTransaction transaction = connection.BeginTransaction();
//Services bewegen
int totalServices = 0;
command = connection.CreateCommand();
command.CommandText = "UPDATE skyscraper5_blindscan_services SET related_job = @moveTo WHERE freq = @freq AND pol = @pol AND related_job = @moveFrom";
foreach (Tuple<int, int> moveMe in toBeMoved)
{
command.Parameters.Clear();
command.Parameters.AddWithValue("@moveFrom", NpgsqlDbType.Uuid, moveFrom);
command.Parameters.AddWithValue("@moveTo", NpgsqlDbType.Uuid, moveTo);
command.Parameters.AddWithValue("@freq", NpgsqlDbType.Integer, moveMe.Item1);
command.Parameters.AddWithValue("@pol", NpgsqlDbType.Integer, moveMe.Item2);
totalServices += command.ExecuteNonQuery();
}
command.Dispose();
//Transponder bewegen
command = connection.CreateCommand();
command.CommandText = "UPDATE skyscraper5_blindscan_search_results SET related_job = @moveTo WHERE related_job = @moveFrom AND polarity_index = @polarity_index";
command.Parameters.AddWithValue("@moveTo", NpgsqlDbType.Uuid, moveTo);
command.Parameters.AddWithValue("@moveFrom", NpgsqlDbType.Uuid, moveFrom);
command.Parameters.AddWithValue("@pol", NpgsqlDbType.Integer, polarity);
command.ExecuteNonQuery();
command.Dispose();
SetBlindscanPolarityState(connection, moveFrom, polarity, DbBlindscanJobPolarizationStatus.SELECTED_WAITING);
SetBlindscanPolarityState(connection, moveTo, polarity, DbBlindscanJobPolarizationStatus.SELECTED_DONE);
transaction.Commit();
transaction.Dispose();
connection.Close();
}
}
public IEnumerable<DbBlindscanJob> GetDbBlindscanJobs()
{
using (NpgsqlConnection connection = new NpgsqlConnection(connectionStringBuilder.ToString()))
{
//Services, die bewegt werden müssen finden
connection.Open();
NpgsqlCommand command = connection.CreateCommand();
command.CommandText = "SELECT * FROM skyscraper5_blindscan_jobs ORDER BY dateadded DESC";
NpgsqlDataReader dataReader = command.ExecuteReader();
while (dataReader.Read())
{
Guid uuid = dataReader.GetGuid("uuid");
DateTime dateAdded = dataReader.GetDateTime("dateadded");
DbBlindscanJobPolarizationStatus horizontalLow = (DbBlindscanJobPolarizationStatus)dataReader.GetInt32("horizontal_low");
DbBlindscanJobPolarizationStatus horizontalHigh = (DbBlindscanJobPolarizationStatus)dataReader.GetInt32("horizontal_high");
DbBlindscanJobPolarizationStatus verticalLow = (DbBlindscanJobPolarizationStatus)dataReader.GetInt32("vertical_low");
DbBlindscanJobPolarizationStatus verticalHigh = (DbBlindscanJobPolarizationStatus)dataReader.GetInt32("vertical_high");
PhysicalAddress tunerMac = (PhysicalAddress)dataReader.GetValue("tuner_mac");
STD_TYPE tunerStd = (STD_TYPE)dataReader.GetInt32("tuner_std");
DummyGpsReceiver dgr = null;
if (!dataReader.IsDBNull("gps_lon"))
{
float gpsLon = (float)dataReader.GetDouble("gps_lon");
float gpsLat = (float)dataReader.GetDouble("gps_lat");
dgr = new DummyGpsReceiver(true, gpsLat, gpsLon);
}
SatellitePosition satPositionObj = null;
if (!dataReader.IsDBNull("sat_position"))
{
int satPosition = dataReader.GetInt32("sat_position");
satPositionObj = SatellitePosition.FromChecksum(satPosition);
}
int diseqcIndex = dataReader.GetInt32("diseqc_index");
int version = dataReader.GetInt32("version");
DbBlindscanJob child = new DbBlindscanJob(uuid, tunerMac, tunerStd, diseqcIndex, dgr, satPositionObj);
child.DateAdded = dateAdded;
child.HorizontalLowState = horizontalLow;
child.HorizontalHighState = horizontalHigh;
child.VerticalLowState = verticalLow;
child.VerticalHighState = verticalHigh;
yield return child;
}
dataReader.Close();
command.Dispose();
connection.Close();
}
}
}
}

View File

@ -0,0 +1,84 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Npgsql;
using NpgsqlTypes;
using skyscraper5.Mpeg2.Descriptors;
using skyscraper5.Skyscraper.Scraper.Storage.Utilities;
namespace skyscraper5.Data.PostgreSql
{
public partial class PostgresqlDataStore
{
private HashSet<DatabaseKeyCat> _knownCats;
public bool TestForCaSystem(int currentNetworkId, int currentTransportStreamId, int caDescriptorCaPid)
{
if (_knownCats == null)
_knownCats = new HashSet<DatabaseKeyCat>();
DatabaseKeyCat key = new DatabaseKeyCat(currentNetworkId, currentTransportStreamId, caDescriptorCaPid);
if (_knownCats.Contains(key))
return true;
bool result = false;
using (NpgsqlConnection conn = new NpgsqlConnection(connectionStringBuilder.ToString()))
{
conn.Open();
result = TestForCaSystemEx(currentNetworkId, currentTransportStreamId, caDescriptorCaPid, conn);
conn.Close();
}
if (result)
_knownCats.Add(key);
return result;
}
private static bool TestForCaSystemEx(int currentNetworkId, int currentTransportStreamId, int caDescriptorCaPid, NpgsqlConnection conn)
{
bool result;
NpgsqlCommand command = conn.CreateCommand();
command.CommandText = "SELECT dateadded FROM dvb_cat WHERE nid = @nid AND tsid = @tsid AND pid = @pid";
command.Parameters.AddWithValue("@nid", NpgsqlDbType.Integer, currentNetworkId);
command.Parameters.AddWithValue("@tsid", NpgsqlDbType.Integer, currentTransportStreamId);
command.Parameters.AddWithValue("@pid", NpgsqlDbType.Integer, caDescriptorCaPid);
NpgsqlDataReader dataReader = command.ExecuteReader();
result = dataReader.Read();
dataReader.Close();
command.Dispose();
return result;
}
public void StoreCaSystem(int currentNetworkId, int currentTransportStreamId, CaDescriptor caDescriptor)
{
EnqueueTask(x => WriteCaSystems(x, currentNetworkId, currentTransportStreamId, caDescriptor));
DatabaseKeyCat key = new DatabaseKeyCat(currentNetworkId, currentTransportStreamId, caDescriptor.CaPid);
_knownCats.Add(key);
}
private void WriteCaSystems(NpgsqlConnection connection, int currentNetworkId, int currentTransportStreamId, CaDescriptor caDescriptor)
{
if (TestForCaSystemEx(currentNetworkId,currentTransportStreamId,caDescriptor.CaPid,connection))
{
return;
}
NpgsqlCommand command = connection.CreateCommand();
command.CommandText = "INSERT INTO dvb_cat (nid,tsid,pid,ca_system_id,private_data) " +
"VALUES (@nid,@tsid,@pid,@ca_system_id,@private_data)";
command.Parameters.AddWithValue("@nid", NpgsqlDbType.Integer, currentNetworkId);
command.Parameters.AddWithValue("@tsid", NpgsqlDbType.Integer, currentTransportStreamId);
command.Parameters.AddWithValue("@pid", NpgsqlDbType.Integer, caDescriptor.CaPid);
command.Parameters.AddWithValue("@ca_system_id", NpgsqlDbType.Integer, (int)caDescriptor.CaSystemId);
object privateData = DBNull.Value;
if (caDescriptor.PrivateData != null && caDescriptor.PrivateData.Length > 0)
privateData = caDescriptor.PrivateData;
command.Parameters.AddWithValue("@private_data", NpgsqlDbType.Bytea, privateData);
command.ExecuteNonQuery();
}
}
}

View File

@ -0,0 +1,286 @@
using Npgsql;
using NpgsqlTypes;
using skyscraper5.src.Skyscraper.Scraper.Dns;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
namespace skyscraper5.Data.PostgreSql
{
public partial class PostgresqlDataStore
{
public long DnsCountA()
{
throw new NotImplementedException();
}
private uint dnsIpMisses;
public string DnsIpToName(IPAddress source)
{
string result = source.ToString();
using (NpgsqlConnection connection = new NpgsqlConnection(connectionStringBuilder.ToString()))
{
connection.Open();
NpgsqlCommand command = connection.CreateCommand();
command.CommandText =
"SELECT domain_name\r\n" +
"FROM dns_ips ips\r\n" +
"LEFT JOIN dns_records records on ips.ip_id = records.ip_id\r\n" +
"LEFT JOIN dns_domains domains on records.domain_id = domains.domain_id\r\n" +
"WHERE ips.ip_address = @ia\r\n" +
"AND (records.record_type = 1 OR records.record_type = 28)";
command.Parameters.AddWithValue("@ia", source);
NpgsqlDataReader dataReader = command.ExecuteReader();
if (dataReader.Read())
result = dataReader.GetString(0);
else
dnsIpMisses++;
dataReader.Close();
command.Dispose();
connection.Close();
}
return result;
}
public bool TestForIp(IPAddress iP)
{
bool result;
using (NpgsqlConnection connection = new NpgsqlConnection(connectionStringBuilder.ToString()))
{
connection.Open();
result = TestForIp(connection, iP);
connection.Close();
}
return result;
}
public void RememberDnsRecord(DnsRecord record)
{
if (record.ToString().Contains("\0"))
return;
EnqueueTask(x => {
RememberDnsRecordEx(x, record);
}
);
}
private uint deduplicated;
private void RememberDnsRecordEx(NpgsqlConnection x, DnsRecord record)
{
if (record.Domain.ToString().Contains("\0"))
{
return;
}
long domainId;
if (TestForDomainName(x,record.Domain))
domainId = SelectDomainId(x,record);
else
domainId = InsertDomainName(x,record);
bool isIp = record.RecordType.Item2.Equals("A") || record.RecordType.Item2.Equals("AAAA");
long? ipId = null;
if (isIp)
{
if (TestForIp(x,record.IP))
ipId = SelectIp(x,record.IP);
else
ipId = InsertIp(x,record.IP);
}
if (!TestForDnsRecord(x,record, domainId, ipId))
InsertDnsRecord(x,record, domainId, ipId);
else
deduplicated++;
if (isIp)
{
long vhostId;
if (TestForVhost(x, record.Domain))
vhostId = SelectVhostId(x, record.Domain);
else
vhostId = InsertVhost(x, record.Domain);
if (!TestForIpVHostMapping(x, ipId.Value, vhostId))
InsertIpVHostMapping(x, ipId.Value, vhostId);
}
}
private void InsertIpVHostMapping(NpgsqlConnection x, long ipId, long vhostId)
{
NpgsqlCommand command = x.CreateCommand();
command.CommandText = "INSERT INTO dns_ip_vhosts (ip_id, vhost_id) VALUES (@iid,@vid)";
command.Parameters.AddWithValue("@iid", ipId);
command.Parameters.AddWithValue("@vid", vhostId);
command.ExecuteNonQuery();
}
private bool TestForIpVHostMapping(NpgsqlConnection x, long ipId, long vhostId)
{
NpgsqlCommand command = x.CreateCommand();
command.CommandText = "SELECT dateadded FROM dns_ip_vhosts WHERE ip_id = @iid AND vhost_id = @vid";
command.Parameters.AddWithValue("@iid", ipId);
command.Parameters.AddWithValue("@vid", vhostId);
NpgsqlDataReader dataReader = command.ExecuteReader();
bool result = dataReader.Read();
dataReader.Close();
command.Dispose();
return result;
}
private long InsertVhost(NpgsqlConnection x, string domain)
{
NpgsqlCommand command = x.CreateCommand();
command.CommandText = "INSERT INTO dns_vhosts (vhost_name) VALUES (@vn) RETURNING vhost_id";
command.Parameters.AddWithValue("@vn", domain);
NpgsqlDataReader dataReader = command.ExecuteReader();
dataReader.Read();
long result = dataReader.GetInt64(0);
dataReader.Close();
command.Dispose();
return result;
}
private long SelectVhostId(NpgsqlConnection x, string domain)
{
NpgsqlCommand command = x.CreateCommand();
command.CommandText = "SELECT vhost_id FROM dns_vhosts WHERE vhost_name = @vn";
command.Parameters.AddWithValue("@vn", domain);
NpgsqlDataReader dataReader = command.ExecuteReader();
dataReader.Read();
long result = dataReader.GetInt64(0);
dataReader.Close();
command.Dispose();
return result;
}
private bool TestForVhost(NpgsqlConnection x, string domain)
{
NpgsqlCommand command = x.CreateCommand();
command.CommandText = "SELECT dateadded FROM dns_vhosts WHERE vhost_name = @vn";
command.Parameters.AddWithValue("@vn", domain);
NpgsqlDataReader dataReader = command.ExecuteReader();
bool result = dataReader.Read();
dataReader.Close();
command.Dispose();
return result;
}
private void InsertDnsRecord(NpgsqlConnection x, DnsRecord record, long domainId, long? ipId)
{
NpgsqlCommand command = x.CreateCommand();
command.CommandText = "INSERT INTO dns_records (domain_id, record_type, ttl, resource_data, ip_id) VALUES (@did,@rt,@ttl,@rd,@iid)";
command.Parameters.AddWithValue("@did", domainId);
command.Parameters.AddWithValue("@rt", record.RecordType.Item1);
command.Parameters.AddWithValue("@ttl", (int)record.TTL.TotalSeconds);
command.Parameters.AddWithValue("@rd", record.ResourceData);
if (ipId.HasValue)
command.Parameters.AddWithValue("@iid", NpgsqlDbType.Bigint, ipId);
else
command.Parameters.AddWithValue("@iid", NpgsqlDbType.Bigint, DBNull.Value);
command.ExecuteNonQuery();
}
private bool TestForDnsRecord(NpgsqlConnection x, DnsRecord record, long domainId, long? ipId)
{
NpgsqlCommand command = x.CreateCommand();
command.CommandText = "SELECT dateadded FROM dns_records WHERE domain_id = @did AND record_type = @rt AND resource_data = @rd";
command.Parameters.AddWithValue("@did", domainId);
command.Parameters.AddWithValue("@rt", record.RecordType.Item1);
command.Parameters.AddWithValue("@rd", record.ResourceData);
NpgsqlDataReader dataReader = command.ExecuteReader();
bool result = dataReader.Read();
dataReader.Close();
command.Dispose();
return result;
}
private long? InsertIp(NpgsqlConnection x, IPAddress iP)
{
NpgsqlCommand command = x.CreateCommand();
command.CommandText = "INSERT INTO dns_ips (ip_address) VALUES (@ia) RETURNING ip_id";
command.Parameters.AddWithValue("@ia", iP);
NpgsqlDataReader dataReader = command.ExecuteReader();
dataReader.Read();
long result = dataReader.GetInt64(0);
dataReader.Close();
command.Dispose();
return result;
}
private long? SelectIp(NpgsqlConnection x, IPAddress iP)
{
NpgsqlCommand command = x.CreateCommand();
command.CommandText = "SELECT ip_id FROM dns_ips WHERE ip_address = @ia";
command.Parameters.AddWithValue("@ia", iP);
NpgsqlDataReader dataReader = command.ExecuteReader();
dataReader.Read();
long result = dataReader.GetInt64(0);
dataReader.Close();
command.Dispose();
return result;
}
private bool TestForIp(NpgsqlConnection x, IPAddress iP)
{
bool result;
using (NpgsqlCommand cmd = x.CreateCommand())
{
cmd.CommandText = "SELECT dateadded FROM dns_ips WHERE ip_address = @ip";
cmd.Parameters.AddWithValue("@ip", iP);
using (NpgsqlDataReader reader = cmd.ExecuteReader())
{
result = reader.Read();
reader.Close();
}
}
return result;
}
private long InsertDomainName(NpgsqlConnection x, DnsRecord record)
{
long result;
NpgsqlCommand command = x.CreateCommand();
command.CommandText = "INSERT INTO dns_domains (domain_name) VALUES (@name) RETURNING domain_id";
command.Parameters.AddWithValue("@name", record.Domain);
NpgsqlDataReader dataReader = command.ExecuteReader();
dataReader.Read();
result = dataReader.GetInt64(0);
dataReader.Close();
command.Dispose();
return result;
}
private long SelectDomainId(NpgsqlConnection x, DnsRecord record)
{
NpgsqlCommand command = x.CreateCommand();
command.CommandText = "SELECT domain_id FROM dns_domains WHERE domain_name = @name";
command.Parameters.AddWithValue("@name", record.Domain);
NpgsqlDataReader dataReader = command.ExecuteReader();
dataReader.Read();
long result = dataReader.GetInt64(0);
dataReader.Close();
command.Dispose();
return result;
}
private bool TestForDomainName(NpgsqlConnection x, string domain)
{
bool result;
using (NpgsqlCommand cmd = x.CreateCommand())
{
cmd.CommandText = "SELECT dateadded FROM dns_domains WHERE domain_name = @name";
cmd.Parameters.AddWithValue("@name", domain);
NpgsqlDataReader npgsqlDataReader = cmd.ExecuteReader();
result = npgsqlDataReader.Read();
npgsqlDataReader.Close();
}
return result;
}
}
}

View File

@ -0,0 +1,283 @@
using Npgsql;
using NpgsqlTypes;
using skyscraper5.Docsis.MacManagement;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.NetworkInformation;
using System.Text;
using System.Threading.Tasks;
namespace skyscraper5.Data.PostgreSql
{
partial class PostgresqlDataStore
{
private HashSet<Tuple<int, uint>> knownDocsisUpstreams;
public bool TestForDocsisUpstreamChannel(PhysicalAddress mmmSource, uint mmmFrequency, int currentLocation)
{
if (knownDocsisUpstreams == null)
knownDocsisUpstreams = new HashSet<Tuple<int, uint>>();
Tuple<int, uint> tuple = new Tuple<int, uint>(currentLocation, mmmFrequency);
if (knownDocsisUpstreams.Contains(tuple))
return true;
using (NpgsqlConnection connection = new NpgsqlConnection(connectionStringBuilder.ToString()))
{
connection.Open();
NpgsqlCommand command = connection.CreateCommand();
command.CommandText = "SELECT dateadded FROM docsis_upstream_channel WHERE location = @loc AND frequency=@freq";
command.Parameters.AddWithValue("@loc", NpgsqlDbType.Integer, currentLocation);
command.Parameters.AddWithValue("@freq", NpgsqlDbType.Integer, (int)mmmFrequency);
NpgsqlDataReader reader = command.ExecuteReader();
bool result = reader.Read();
if (result)
{
knownDocsisUpstreams.Add(tuple);
}
reader.Close();
connection.Close();
return result;
}
}
public void StoreDocsisUpstreamChannel(UpstreamChannelDescriptor mmm, int currentLocation)
{
using (NpgsqlConnection connection = new NpgsqlConnection(connectionStringBuilder.ToString()))
{
connection.Open();
NpgsqlTransaction transaction = connection.BeginTransaction();
NpgsqlCommand command = connection.CreateCommand();
command.CommandText = "INSERT INTO docsis_upstream_channel " +
"VALUES (DEFAULT, DEFAULT, @loc, @freq, @upstreamChannelId, @configChangeCount, @minislotSize, @downstreamChannelId, @randomSeed, @symbolsInOfdmaFrame, " +
"@centerFrequencyOfSubcarrier, @subcarrierSpacing, @ofdmaRolloffPeriodSize, @ofdmaCyclicPrefixSize, @ofdmaTimesnapSnapshotDivide, @ofdmaTimestampSnapshot, " +
"@ucdChangeIndicator, @sCdmaMode, @preamblePattern, @modulationRate) RETURNING ss5_serial";
command.Parameters.AddWithValue("@loc", NpgsqlDbType.Integer, currentLocation);
command.Parameters.AddWithValue("@freq", NpgsqlDbType.Integer, (int)mmm.Frequency);
command.Parameters.AddWithValue("@upstreamChannelId", NpgsqlDbType.Integer, mmm.UpstreamChannelID);
command.Parameters.AddWithValue("@configChangeCount", NpgsqlDbType.Integer, mmm.ConfigurationChangeCount);
command.Parameters.AddWithValue("@minislotSize", NpgsqlDbType.Integer, mmm.MinislotSize);
command.Parameters.AddWithValue("@downstreamChannelId", NpgsqlDbType.Integer, mmm.DownstreamChannelId);
command.Parameters.AddWithValue("@randomSeed", NpgsqlDbType.Integer, (int)mmm.RandomizationSeed);
command.Parameters.AddWithValue("@symbolsInOfdmaFrame", NpgsqlDbType.Integer, mmm.SymbolsInOfdmaFrame);
command.Parameters.AddWithValue("@centerFrequencyOfSubcarrier", NpgsqlDbType.Bigint, mmm.CenterFrequencyOfSubcarrier0);
command.Parameters.AddWithValue("@subcarrierSpacing", NpgsqlDbType.Integer, mmm.SubcarrierSpacing);
command.Parameters.AddWithValue("@ofdmaRolloffPeriodSize", NpgsqlDbType.Integer, mmm.OfdmaRolloffPeriodSize);
command.Parameters.AddWithValue("@ofdmaCyclicPrefixSize", NpgsqlDbType.Integer, mmm.OfdmaCyclicPrefixSize);
command.Parameters.AddWithValue("@ofdmaTimesnapSnapshotDivide", NpgsqlDbType.Integer, mmm.OfdmaTimestampSnapshotDivideBy20);
command.Parameters.AddWithValue("@ofdmaTimestampSnapshot", NpgsqlDbType.Integer, mmm.OfdmaTimestampSnapshot);
command.Parameters.AddWithValue("@ucdChangeIndicator", NpgsqlDbType.Integer, mmm.UcdChangeIndicator?.GetRawValue());
command.Parameters.AddWithValue("@sCdmaMode", NpgsqlDbType.Boolean, mmm.S_CDMAMode);
command.Parameters.AddWithValue("@preamblePattern", NpgsqlDbType.Bytea, mmm.PreamblePattern);
command.Parameters.AddWithValue("@modulationRate", NpgsqlDbType.Integer, mmm.ModulationRate);
SetNulls(command);
NpgsqlDataReader dataReader = command.ExecuteReader();
dataReader.Read();
int ss5serial = dataReader.GetInt32(0);
dataReader.Close();
command.Dispose();
if (mmm.BurstDescriptors != null && mmm.BurstDescriptors.Count > 0)
{
InsertDocsisUpstreamChannelBurstDescriptors(connection, ss5serial, mmm.BurstDescriptors);
}
if (mmm.SubcarrierExclusionBand != null && mmm.SubcarrierExclusionBand.Length > 0)
{
throw new NotImplementedException();
}
transaction.Commit();
connection.Close();
}
}
private void InsertDocsisUpstreamChannelBurstDescriptors(NpgsqlConnection connection, int channelSs5serial, List<UpstreamChannelDescriptor.BurstDescriptor> burstDescriptors)
{
NpgsqlCommand cmd = connection.CreateCommand();
cmd.CommandText = "insert into docsis_upstream_channel_burst_descriptors VALUES (DEFAULT, @related_channel, DEFAULT, @subcarriers_fine_ranging, " +
"@ofdma_broadcast_ir_starting_power_level_increase, @ofdma_broadcast_ir_starting_power_level, @subcarriers_initial_ranging, @preamble_type, " +
"@rs_interleaver_block_size, @rs_interleaver_depth, @scrambler, @last_codeword_length, @guard_time_size, @maximum_burst_size, @scrambler_seed, " +
"@fec_codeword_information_bytes, @fec_error_correction, @preamble_value_offset, @preamble_length, @differential_encoding, @modulation_type, @interval_usage_code) RETURNING ss5_serial";
cmd.Parameters.AddWithValue("@related_channel", NpgsqlDbType.Integer, channelSs5serial);
cmd.Parameters.Add("@subcarriers_fine_ranging", NpgsqlDbType.Integer);
cmd.Parameters.Add("@ofdma_broadcast_ir_starting_power_level_increase", NpgsqlDbType.Double);
cmd.Parameters.Add("@ofdma_broadcast_ir_starting_power_level", NpgsqlDbType.Double);
cmd.Parameters.Add("@subcarriers_initial_ranging", NpgsqlDbType.Integer);
cmd.Parameters.Add("@preamble_type", NpgsqlDbType.Integer);
cmd.Parameters.Add("@rs_interleaver_block_size", NpgsqlDbType.Integer);
cmd.Parameters.Add("@rs_interleaver_depth", NpgsqlDbType.Integer);
cmd.Parameters.Add("@scrambler", NpgsqlDbType.Boolean);
cmd.Parameters.Add("@last_codeword_length", NpgsqlDbType.Integer);
cmd.Parameters.Add("@guard_time_size", NpgsqlDbType.Integer);
cmd.Parameters.Add("@maximum_burst_size", NpgsqlDbType.Integer);
cmd.Parameters.Add("@scrambler_seed", NpgsqlDbType.Integer);
cmd.Parameters.Add("@fec_codeword_information_bytes", NpgsqlDbType.Integer);
cmd.Parameters.Add("@fec_error_correction", NpgsqlDbType.Integer);
cmd.Parameters.Add("@preamble_value_offset", NpgsqlDbType.Integer);
cmd.Parameters.Add("@preamble_length", NpgsqlDbType.Integer);
cmd.Parameters.Add("@differential_encoding", NpgsqlDbType.Boolean);
cmd.Parameters.Add("@modulation_type", NpgsqlDbType.Integer);
cmd.Parameters.Add("@interval_usage_code", NpgsqlDbType.Integer);
foreach (UpstreamChannelDescriptor.BurstDescriptor bd in burstDescriptors)
{
cmd.Parameters["@subcarriers_fine_ranging"].Value = bd.SubcarriersFineRanging;
cmd.Parameters["@ofdma_broadcast_ir_starting_power_level_increase"].Value = bd.OfdmaBroadcastIrStartingPowerLevelIncrease;
cmd.Parameters["@ofdma_broadcast_ir_starting_power_level"].Value = bd.OfdmaBroadcastIrStartingPowerLevel;
cmd.Parameters["@subcarriers_initial_ranging"].Value = bd.SubcarriersInitialRanging;
cmd.Parameters["@preamble_type"].Value = (int)bd.PreambleType;
cmd.Parameters["@rs_interleaver_block_size"].Value = (int)bd.RsInterleaverBlockSize;
cmd.Parameters["@rs_interleaver_depth"].Value = bd.RsInterleaverDepth;
cmd.Parameters["@scrambler"].Value = bd.Scrambler;
cmd.Parameters["@last_codeword_length"].Value = (int)bd.LastCodewordLength;
cmd.Parameters["@guard_time_size"].Value = bd.GuardTimeSize;
cmd.Parameters["@maximum_burst_size"].Value = bd.MaximumBurstSize;
cmd.Parameters["@scrambler_seed"].Value = bd.ScramblerSeed;
cmd.Parameters["@fec_codeword_information_bytes"].Value = bd.FecCodewordInformationBytes;
cmd.Parameters["@fec_error_correction"].Value = bd.FecErrorCorrection;
cmd.Parameters["@preamble_value_offset"].Value = (int)bd.PreambleValueOffset;
cmd.Parameters["@preamble_length"].Value = (int)bd.PreambleLength;
cmd.Parameters["@differential_encoding"].Value = bd.DifferentialEncoding;
cmd.Parameters["@modulation_type"].Value = (int)bd.ModulationType;
cmd.Parameters["@interval_usage_code"].Value = bd.IntervalUsageCode;
SetNulls(cmd);
NpgsqlDataReader dataReader = cmd.ExecuteReader();
dataReader.Read();
int ourSerial = dataReader.GetInt32(0);
dataReader.Close();
if (bd.OfdmaDataProfiles != null && bd.OfdmaDataProfiles.Length > 0)
{
throw new NotImplementedException();
}
}
cmd.Dispose();
}
private HashSet<PhysicalAddress> _knownDocsisParticipants;
public void StoreDocsisParticipant(PhysicalAddress pa, int currentLocation)
{
if (_knownDocsisParticipants == null)
_knownDocsisParticipants = new HashSet<PhysicalAddress>();
if (_knownDocsisParticipants.Contains(pa))
return;
using (NpgsqlConnection connection = new NpgsqlConnection(connectionStringBuilder.ToString()))
{
connection.Open();
NpgsqlCommand command = connection.CreateCommand();
command.CommandText = "SELECT dateadded FROM docsis_participants WHERE physicalAddr=@mac";
command.Parameters.AddWithValue("@mac", NpgsqlDbType.MacAddr, pa);
NpgsqlDataReader reader = command.ExecuteReader();
if (reader.Read())
{
_knownDocsisParticipants.Add(pa);
connection.Close();
return;
}
reader.Close();
command.Dispose();
command = connection.CreateCommand();
command.CommandText = "INSERT INTO docsis_participants (location,physicalAddr) VALUES (@loc,@mac)";
command.Parameters.AddWithValue("@loc", NpgsqlDbType.Integer, currentLocation);
command.Parameters.AddWithValue("@mac", NpgsqlDbType.MacAddr, pa);
command.ExecuteNonQuery();
_knownDocsisParticipants.Add(pa);
command.Dispose();
connection.Close();
}
}
private HashSet<Tuple<int, uint>> _knownDownstreamChannels;
public bool TestForDocsisDownstreamChannel(PhysicalAddress physicalAddress, MacDomainDescriptor.DownstreamActiveChannel downstreamActiveChannel, int currentLocation)
{
if (_knownDownstreamChannels == null)
_knownDownstreamChannels = new HashSet<Tuple<int, uint>>();
Tuple<int, uint> currentTuple = new Tuple<int, uint>(currentLocation, downstreamActiveChannel.Frequency.Value);
if (_knownDownstreamChannels.Contains(currentTuple))
return true;
using (NpgsqlConnection connection = new NpgsqlConnection(connectionStringBuilder.ToString()))
{
connection.Open();
NpgsqlCommand command = connection.CreateCommand();
command.CommandText = "SELECT dateadded FROM docsis_downstream_channel WHERE location = @location AND frequency = @frequency";
command.Parameters.AddWithValue("@location", NpgsqlDbType.Integer, currentLocation);
command.Parameters.AddWithValue("@frequency", NpgsqlDbType.Bigint, (long)downstreamActiveChannel.Frequency);
NpgsqlDataReader dataReader = command.ExecuteReader();
bool result = dataReader.Read();
if (result)
_knownDownstreamChannels.Add(currentTuple);
dataReader.Close();
connection.Close();
return result;
}
}
public void StoreDocsisDownstreamChannel(PhysicalAddress physicalAddress, MacDomainDescriptor.DownstreamActiveChannel downstreamActiveChannel, int currentLocation)
{
using (NpgsqlConnection connection = new NpgsqlConnection(connectionStringBuilder.ToString()))
{
connection.Open();
NpgsqlCommand command = connection.CreateCommand();
command.CommandText = "insert into docsis_downstream_channel VALUES (DEFAULT, DEFAULT, @physical_address, @location, @frequency, @tukey_raised_cosine_window, " +
"@cyclic_prefix, @khz_subcarrier_spacing, @qam_fec_lock_recovery, @mdd_recovery, @qam_fec_lock_failure, @mdd_timeout, @primary_capable, @modulation_order, " +
"@annex, @channel_id)";
command.Parameters.AddWithValue("@physical_address", NpgsqlDbType.MacAddr, physicalAddress);
command.Parameters.AddWithValue("@location", NpgsqlDbType.Integer, currentLocation);
command.Parameters.AddWithValue("@frequency", NpgsqlDbType.Bigint, (long)downstreamActiveChannel.Frequency);
command.Parameters.AddWithValue("@tukey_raised_cosine_window", NpgsqlDbType.Integer, downstreamActiveChannel.TukeyRaisedCosineWindow);
command.Parameters.AddWithValue("@cyclic_prefix", NpgsqlDbType.Integer, downstreamActiveChannel.CyclicPrefix);
command.Parameters.AddWithValue("@khz_subcarrier_spacing", NpgsqlDbType.Boolean, downstreamActiveChannel._50khzSubcarrierSpacing);
command.Parameters.AddWithValue("@qam_fec_lock_recovery", NpgsqlDbType.Boolean, downstreamActiveChannel.QamFecLockRecovery);
command.Parameters.AddWithValue("@mdd_recovery", NpgsqlDbType.Boolean, downstreamActiveChannel.MddRecovery);
command.Parameters.AddWithValue("@qam_fec_lock_failure", NpgsqlDbType.Boolean, downstreamActiveChannel.QamFecLockFailure);
command.Parameters.AddWithValue("@mdd_timeout", NpgsqlDbType.Boolean, downstreamActiveChannel.MddTimeout);
command.Parameters.AddWithValue("@primary_capable", NpgsqlDbType.Integer, (int)downstreamActiveChannel.PrimaryCapable);
if (downstreamActiveChannel.ModulationOrder.HasValue)
command.Parameters.AddWithValue("@modulation_order", NpgsqlDbType.Integer, (int)downstreamActiveChannel.ModulationOrder);
else
command.Parameters.AddWithValue("@modulation_order", NpgsqlDbType.Integer, DBNull.Value);
if (downstreamActiveChannel.Annex.HasValue)
command.Parameters.AddWithValue("@annex", NpgsqlDbType.Integer, (int)downstreamActiveChannel.Annex);
else
command.Parameters.AddWithValue("@annex", NpgsqlDbType.Integer, DBNull.Value);
command.Parameters.AddWithValue("@channel_id", NpgsqlDbType.Integer, downstreamActiveChannel.ChannelId);
SetNulls(command);
command.ExecuteNonQuery();
command.Dispose();
connection.Close();
}
}
private HashSet<Tuple<PhysicalAddress, IPAddress>> cmts_ips;
public bool SetCmtsIp(PhysicalAddress arpHeaderSenderHardwareAddress, IPAddress arpHeaderSenderProtocolAddress)
{
if (cmts_ips == null)
cmts_ips = new HashSet<Tuple<PhysicalAddress, IPAddress>>();
Tuple<PhysicalAddress, IPAddress> currentTuple = new Tuple<PhysicalAddress, IPAddress>(arpHeaderSenderHardwareAddress, arpHeaderSenderProtocolAddress);
if (cmts_ips.Contains(currentTuple))
return false;
using (NpgsqlConnection connection = new NpgsqlConnection(connectionStringBuilder.ToString()))
{
connection.Open();
NpgsqlCommand command = connection.CreateCommand();
command.CommandText = "UPDATE docsis_participants SET ip = @ip WHERE physicaladdr = @mac";
command.Parameters.AddWithValue("@ip", NpgsqlDbType.Inet, arpHeaderSenderProtocolAddress);
command.Parameters.AddWithValue("@mac", NpgsqlDbType.MacAddr, arpHeaderSenderHardwareAddress);
int rows = command.ExecuteNonQuery();
bool result = rows > 0;
if (result)
cmts_ips.Add(currentTuple);
command.Dispose();
connection.Close();
return result;
}
}
}
}

View File

@ -0,0 +1,83 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using Npgsql;
using skyscraper5.Skyscraper.Scraper.Storage.Utilities;
namespace skyscraper5.Data.PostgreSql
{
public partial class PostgresqlDataStore
{
private HashSet<DatabaseKeyDsmCcModule> _blacklistedDsmCcModules;
public bool IsDsmCcModuleBlacklisted(int currentNetworkId, int currentTransportStreamId, int elementaryPid, ushort moduleId, byte moduleVersion)
{
using (NpgsqlConnection connection = new NpgsqlConnection(connectionStringBuilder.ToString()))
{
connection.Open();
NpgsqlCommand command = connection.CreateCommand();
command.CommandText = "SELECT MAX(progress) FROM dsmcc_modules_blacklist WHERE cnid = @cnid AND ctsid = @ctsid AND elementary_pid = @pid AND module_id = @moduleId AND module_version = @moduleVersion";
command.Parameters.AddWithValue("@cnid",NpgsqlTypes.NpgsqlDbType.Integer, currentNetworkId);
command.Parameters.AddWithValue("@ctsid", NpgsqlTypes.NpgsqlDbType.Integer, currentTransportStreamId);
command.Parameters.AddWithValue("@pid", NpgsqlTypes.NpgsqlDbType.Integer, elementaryPid);
command.Parameters.AddWithValue("@moduleId", NpgsqlTypes.NpgsqlDbType.Integer, (int)moduleId);
command.Parameters.AddWithValue("@moduleVersion", NpgsqlTypes.NpgsqlDbType.Integer, (int)moduleVersion);
NpgsqlDataReader dataReader = command.ExecuteReader();
if (!dataReader.Read())
{
dataReader.Close();
command.Dispose();
return false;
}
if (dataReader.IsDBNull(0))
{
dataReader.Close();
command.Dispose();
return false;
}
double bestProgress = dataReader.GetDouble(0);
dataReader.Close();
command.Dispose();
command = connection.CreateCommand();
command.CommandText = "SELECT COUNT(*) FROM dsmcc_modules_blacklist WHERE cnid = @cnid AND ctsid = @ctsid AND elementary_pid = @pid AND module_id = @moduleId AND module_version = @moduleVersion AND progress = @progress";
command.Parameters.AddWithValue("@cnid", NpgsqlTypes.NpgsqlDbType.Integer, currentNetworkId);
command.Parameters.AddWithValue("@ctsid", NpgsqlTypes.NpgsqlDbType.Integer, currentTransportStreamId);
command.Parameters.AddWithValue("@pid", NpgsqlTypes.NpgsqlDbType.Integer, elementaryPid);
command.Parameters.AddWithValue("@moduleId", NpgsqlTypes.NpgsqlDbType.Integer, (int)moduleId);
command.Parameters.AddWithValue("@moduleVersion", NpgsqlTypes.NpgsqlDbType.Integer, (int)moduleVersion);
command.Parameters.AddWithValue("@progress", NpgsqlTypes.NpgsqlDbType.Double, bestProgress);
dataReader = command.ExecuteReader();
dataReader.Read();
long numFailures = dataReader.GetInt64(0);
dataReader.Close();
command.Dispose();
connection.Close();
return numFailures >= 3;
}
}
public void FailDsmCcDownload(DatabaseKeyDsmCcModule key, double value)
{
using (NpgsqlConnection connection = new NpgsqlConnection(connectionStringBuilder.ToString()))
{
connection.Open();
NpgsqlCommand command = connection.CreateCommand();
command.CommandText = "INSERT INTO dsmcc_modules_blacklist (cnid, ctsid, elementary_pid, module_id, module_version, progress) VALUES (@cnid,@ctsid,@pid,@moduleId,@moduleVersion,@progress)";
command.Parameters.AddWithValue("@cnid", NpgsqlTypes.NpgsqlDbType.Integer, key.CurrentNetworkId);
command.Parameters.AddWithValue("@ctsid", NpgsqlTypes.NpgsqlDbType.Integer, key.CurrentTransportStreamId);
command.Parameters.AddWithValue("@pid", NpgsqlTypes.NpgsqlDbType.Integer, key.ElementaryPid);
command.Parameters.AddWithValue("@moduleId", NpgsqlTypes.NpgsqlDbType.Integer, (int)key.ModuleId);
command.Parameters.AddWithValue("@moduleVersion", NpgsqlTypes.NpgsqlDbType.Integer, (int)key.ModuleVersion);
command.Parameters.AddWithValue("@progress", NpgsqlTypes.NpgsqlDbType.Double, value);
int result = command.ExecuteNonQuery();
if (result != 1)
throw new NpgsqlException(String.Format("Excepted to write 1 line, but wrote {0}", result));
command.Dispose();
connection.Close();
}
}
}
}

View File

@ -0,0 +1,67 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Npgsql;
using NpgsqlTypes;
using skyscraper5.DsmCc.Descriptors;
namespace skyscraper5.Data.PostgreSql
{
public partial class PostgresqlDataStore
{
public void StoreDsmCcDoItNowEvent(DateTime value, int currentNetworkId, int currentTransportStreamId, int programNumber, StreamEventDescriptor descriptorListStreamEventDescriptor, int pid)
{
EnqueueTask(x => WriteDsmCcDoItNowEvent(x, value, currentNetworkId, currentTransportStreamId, programNumber, descriptorListStreamEventDescriptor, pid));
}
private void WriteDsmCcDoItNowEvent(NpgsqlConnection conn, DateTime value, int currentNetworkId, int currentTransportStreamId, int programNumber, StreamEventDescriptor descriptorListStreamEventDescriptor, int pid)
{
if (TestForDoItNowEvent(conn, value, currentNetworkId, currentTransportStreamId, programNumber, descriptorListStreamEventDescriptor, pid))
return;
NpgsqlCommand command = conn.CreateCommand();
command.CommandText =
"insert into dsmcc_do_it_now_events (cnid, ctsid, program_number, pid, utc, event_id, private_data, npt_event_microsecond, npt_event_seconds)" +
"values (@cnid, @ctsid, @program_number, @pid, @utc, @event_id, @private_data, @npt_event_microsecond, @npt_event_seconds);";
command.Parameters.AddWithValue("@cnid", NpgsqlDbType.Integer, currentNetworkId);
command.Parameters.AddWithValue("@ctsid", NpgsqlDbType.Integer, currentTransportStreamId);
command.Parameters.AddWithValue("@program_number", NpgsqlDbType.Integer, programNumber);
command.Parameters.AddWithValue("@pid", NpgsqlDbType.Integer, pid);
command.Parameters.AddWithValue("@utc", NpgsqlDbType.Timestamp, value);
command.Parameters.AddWithValue("@event_id", NpgsqlDbType.Integer, (int)descriptorListStreamEventDescriptor.EventId);
command.Parameters.AddWithValue("@private_data", NpgsqlDbType.Bytea, descriptorListStreamEventDescriptor.PrivateData);
command.Parameters.AddWithValue("@npt_event_microsecond", NpgsqlDbType.Bigint, (long)descriptorListStreamEventDescriptor.NptEventMicroseconds);
command.Parameters.AddWithValue("@npt_event_seconds", NpgsqlDbType.Bigint, (long)descriptorListStreamEventDescriptor.NptEventSeconds);
command.ExecuteNonQuery();
}
private bool TestForDoItNowEvent(NpgsqlConnection conn, DateTime value, int currentNetworkId,
int currentTransportStreamId, int programNumber, StreamEventDescriptor descriptorListStreamEventDescriptor,
int pid)
{
NpgsqlCommand command = conn.CreateCommand();
command.CommandText =
"SELECT dateadded " +
"FROM dsmcc_do_it_now_events " +
"WHERE cnid = @cnid " +
"AND ctsid = @ctsid " +
"AND program_number = @program_number " +
"AND pid = @pid " +
"AND utc = @utc " +
"AND event_id = @event_id";
command.Parameters.AddWithValue("@cnid", NpgsqlDbType.Integer, currentNetworkId);
command.Parameters.AddWithValue("@ctsid", NpgsqlDbType.Integer, currentTransportStreamId);
command.Parameters.AddWithValue("@program_number", NpgsqlDbType.Integer, programNumber);
command.Parameters.AddWithValue("@pid", NpgsqlDbType.Integer, pid);
command.Parameters.AddWithValue("@utc", NpgsqlDbType.Timestamp, value);
command.Parameters.AddWithValue("@event_id", NpgsqlDbType.Integer, (int)descriptorListStreamEventDescriptor.EventId);
NpgsqlDataReader dataReader = command.ExecuteReader();
bool result = dataReader.Read();
dataReader.Close();
command.Dispose();
return result;
}
}
}

View File

@ -0,0 +1,479 @@
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
using Npgsql;
using NpgsqlTypes;
using skyscraper5.Dvb.Descriptors;
using skyscraper5.Dvb.Psi.Model;
using skyscraper5.Mpeg2.Psi.Model;
using skyscraper5.Skyscraper.Scraper.Storage.Split;
using skyscraper5.Skyscraper.Scraper.Storage.Utilities;
namespace skyscraper5.Data.PostgreSql
{
public partial class PostgresqlDataStore
{
public bool StoreEitEvent(EitEvent eitEvent)
{
if (knownEitEvents == null)
knownEitEvents = new HashSet<DatabaseKeyEitEvent>();
DatabaseKeyEitEvent key = new DatabaseKeyEitEvent(eitEvent.ServiceId, eitEvent.TransportStreamId, eitEvent.OriginalNetworkId, eitEvent.EventId, eitEvent.StartTime);
if (knownEitEvents.Contains(key))
return false;
if (TestForEitEvent(key))
{
knownEitEvents.Add(key);
return false;
}
EnqueueTask(x => WriteEitEvent(x, eitEvent));
knownEitEvents.Add(key);
return true;
}
public void Ping()
{
using (NpgsqlConnection conn = new NpgsqlConnection(connectionStringBuilder.ToString()))
{
conn.Open();
NpgsqlCommand command = conn.CreateCommand();
command.CommandText = "SELECT relname FROM pg_catalog.pg_class";
NpgsqlDataReader dataReader = command.ExecuteReader();
bool hasDsmCcTables = false;
bool hasDvbTables = false;
bool hasScte35Tables = false;
bool hasSkyscraper5Tables = false;
while (dataReader.Read())
{
string tableName = dataReader.GetString(0);
if (tableName.StartsWith("dsmcc_"))
hasDsmCcTables = true;
if (tableName.StartsWith("dvb_"))
hasDvbTables = true;
if (tableName.StartsWith("scte35_"))
hasScte35Tables = true;
if (tableName.StartsWith("skyscraper5_"))
hasSkyscraper5Tables = true;
}
dataReader.Close();
command.Dispose();
conn.Close();
if (!hasDsmCcTables || !hasDvbTables || !hasScte35Tables || !hasSkyscraper5Tables)
{
throw new SchemaMissingException("The PostgreSQL schema does not seem to be installed.");
}
}
}
public IEnumerable<Tuple<int, int, ProgramMapping>> SelectAllPmt()
{
throw new NotImplementedException();
}
public SdtService SelectSdtById(int networkId, int tsId, ushort programMappingProgramNumber)
{
throw new NotImplementedException();
}
public IEnumerable<Tuple<int, int, SdtService>> SelectAllSdt()
{
throw new NotImplementedException();
}
private HashSet<DatabaseKeyEitEvent> knownEitEvents;
private bool TestForEitEvent(DatabaseKeyEitEvent eitEvent)
{
using (NpgsqlConnection conn = new NpgsqlConnection(connectionStringBuilder.ToString()))
{
conn.Open();
return TestForEitEventEx(eitEvent, conn);
}
}
private static bool TestForEitEventEx(DatabaseKeyEitEvent eitEvent, NpgsqlConnection conn)
{
NpgsqlCommand command = conn.CreateCommand();
command.CommandText =
"SELECT dateadded FROM dvb_eit WHERE sid = @sid AND tsid = @tsid AND onid = @onid AND event_id = @event_id AND start_time = @start_time";
command.Parameters.AddWithValue("@sid", NpgsqlDbType.Integer, (int)eitEvent.ServiceId);
command.Parameters.AddWithValue("@tsid", NpgsqlDbType.Integer, (int)eitEvent.TransportStreamId);
command.Parameters.AddWithValue("@onid", NpgsqlDbType.Integer, (int)eitEvent.OriginalNetworkId);
command.Parameters.AddWithValue("@event_id", NpgsqlDbType.Integer, (int)eitEvent.EventId);
command.Parameters.AddWithValue("@start_time", NpgsqlDbType.Timestamp, eitEvent.StartTime);
NpgsqlDataReader dataReader = command.ExecuteReader();
bool result = dataReader.Read();
dataReader.Close();
return result;
}
private void WriteEitEvent(NpgsqlConnection conn, EitEvent eitEvent)
{
DatabaseKeyEitEvent key = new DatabaseKeyEitEvent(eitEvent.ServiceId, eitEvent.TransportStreamId, eitEvent.OriginalNetworkId, eitEvent.EventId, eitEvent.StartTime);
if (TestForEitEventEx(key, conn))
{
return;
}
NpgsqlCommand command = conn.CreateCommand();
command.CommandText =
"INSERT INTO dvb_eit " +
"(sid, tsid, onid, event_id, start_time, running_status, free_ca, iso_639_language_code, event_name, text, extended_text, pdc, private_data_specifier, vps_string, reference_service_id, reference_event_id, control_remote_access_over_internet, do_not_apply_revocation, do_not_scramble) " +
"VALUES " +
"(@sid, @tsid, @onid, @event_id, @start_time, @running_status, @free_ca, @iso_639_language_code, @event_name, @text, @extended_text, @pdc, @private_data_specifier, @vps_string, @reference_service_id, @reference_event_id, @control_remote_access_over_internet, @do_not_apply_revocation, @do_not_scramble)";
command.Parameters.AddWithValue("@sid", NpgsqlDbType.Integer, (int)eitEvent.ServiceId);
command.Parameters.AddWithValue("@tsid", NpgsqlDbType.Integer, (int)eitEvent.TransportStreamId);
command.Parameters.AddWithValue("@onid", NpgsqlDbType.Integer, (int)eitEvent.OriginalNetworkId);
command.Parameters.AddWithValue("@event_id", NpgsqlDbType.Integer, (int)eitEvent.EventId);
command.Parameters.AddWithValue("@start_time", NpgsqlDbType.Timestamp, eitEvent.StartTime);
command.Parameters.AddWithValue("@running_status", NpgsqlDbType.Integer, (int)eitEvent.RunningStatus);
command.Parameters.AddWithValue("@free_ca", NpgsqlDbType.Boolean, eitEvent.FreeCa);
command.Parameters.AddWithValue("@iso_639_language_code", NpgsqlDbType.Varchar, eitEvent.Iso639LanguageCode);
command.Parameters.AddWithValue("@event_name", NpgsqlDbType.Text, eitEvent.EventName.TrimJunk());
command.Parameters.AddWithValue("@text", NpgsqlDbType.Text, eitEvent.Text.TrimJunk());
if (eitEvent.ExtendedText != null)
{
StringBuilder sb = new StringBuilder();
foreach (string s in eitEvent.ExtendedText)
if (s != null)
sb.Append(s.Trim('\0'));
command.Parameters.AddWithValue("@extended_text", NpgsqlDbType.Text, sb.ToString().TrimJunk());
}
else
{
command.Parameters.AddWithValue("@extended_text", NpgsqlDbType.Text, DBNull.Value);
}
command.Parameters.AddWithValue("@pdc", NpgsqlDbType.Timestamp, eitEvent.Pdc);
if (eitEvent.PrivateDataSpecifier.HasValue)
command.Parameters.AddWithValue("@private_data_specifier", NpgsqlDbType.Bigint, (long)eitEvent.PrivateDataSpecifier);
else
command.Parameters.AddWithValue("@private_data_specifier", NpgsqlDbType.Bigint, DBNull.Value);
command.Parameters.AddWithValue("@vps_string", NpgsqlDbType.Text, eitEvent.VpsString);
if (eitEvent.ReferenceServiceId.HasValue)
command.Parameters.AddWithValue("@reference_service_id", NpgsqlDbType.Integer, eitEvent.ReferenceServiceId);
else
command.Parameters.AddWithValue("@reference_service_id", NpgsqlDbType.Integer, DBNull.Value);
if (eitEvent.ReferenceEventId.HasValue)
command.Parameters.AddWithValue("@reference_event_id", NpgsqlDbType.Integer, eitEvent.ReferenceEventId);
else
command.Parameters.AddWithValue("@reference_event_id", NpgsqlDbType.Integer, DBNull.Value);
if (eitEvent.ControlRemoteAccessOverInternet.HasValue)
command.Parameters.AddWithValue("@control_remote_access_over_internet", NpgsqlDbType.Integer, eitEvent.ControlRemoteAccessOverInternet);
else
command.Parameters.AddWithValue("@control_remote_access_over_internet", NpgsqlDbType.Integer, DBNull.Value);
if (eitEvent.DoNotApplyRevocation.HasValue)
command.Parameters.AddWithValue("@do_not_apply_revocation", NpgsqlDbType.Boolean, eitEvent.DoNotApplyRevocation);
else
command.Parameters.AddWithValue("@do_not_apply_revocation", NpgsqlDbType.Boolean, DBNull.Value);
if (eitEvent.DoNotScramble.HasValue)
command.Parameters.AddWithValue("@do_not_scramble", NpgsqlDbType.Boolean, eitEvent.DoNotScramble);
else
command.Parameters.AddWithValue("@do_not_scramble", NpgsqlDbType.Boolean, DBNull.Value);
command.Parameters.CheckNulls();
command.ExecuteNonQuery();
WriteEitCaSystems(conn, eitEvent);
WriteEitComponents(conn, eitEvent);
WriteEitContent(conn, eitEvent);
WriteEitCrids(conn, eitEvent);
WriteEitItems(conn, eitEvent);
WriteEitLinkages(conn, eitEvent);
WriteEitParentalRatings(conn, eitEvent);
}
private void WriteEitParentalRatings(NpgsqlConnection conn, EitEvent eitEvent)
{
if (eitEvent.ParentalRatings == null)
return;
NpgsqlCommand command = conn.CreateCommand();
command.CommandText = "INSERT INTO dvb_eit_parental_ratings " +
"(sid,tsid,onid,event_id,start_time,ordinal,k,v) " +
"VALUES " +
"(@sid,@tsid,@onid,@event_id,@start_time,@ordinal,@k,@v)";
command.Parameters.AddWithValue("@sid", NpgsqlDbType.Integer, (int)eitEvent.ServiceId);
command.Parameters.AddWithValue("@tsid", NpgsqlDbType.Integer, (int)eitEvent.TransportStreamId);
command.Parameters.AddWithValue("@onid", NpgsqlDbType.Integer, (int)eitEvent.OriginalNetworkId);
command.Parameters.AddWithValue("@event_id", NpgsqlDbType.Integer, (int)eitEvent.EventId);
command.Parameters.AddWithValue("@start_time", NpgsqlDbType.Timestamp, eitEvent.StartTime);
command.Parameters.Add("@ordinal", NpgsqlDbType.Integer);
command.Parameters.Add("@k", NpgsqlDbType.Varchar);
command.Parameters.Add("@v", NpgsqlDbType.Integer);
for (int i = 0; i < eitEvent.ParentalRatings.Length; i++)
{
if (eitEvent.ParentalRatings[i] == null)
continue;
command.Parameters["@ordinal"].Value = i;
command.Parameters["@k"].Value = eitEvent.ParentalRatings[i].Item1;
command.Parameters["@v"].Value = eitEvent.ParentalRatings[i].Item2;
command.ExecuteNonQuery();
}
}
private void WriteEitLinkages(NpgsqlConnection conn, EitEvent eitEvent)
{
if (eitEvent.Linkages == null)
return;
NpgsqlCommand command = conn.CreateCommand();
command.CommandText =
"insert into dvb_eit_linkages (sid, tsid, onid, event_id, start_time, ordinal, l_tsid, l_onid, l_sid, 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) " +
"values " +
"(@sid,@tsid,@onid,@event_id,@start_time,@ordinal,@l_tsid,@l_onid,@l_sid,@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)";
command.Parameters.AddParameter("@sid", NpgsqlDbType.Integer, (int)eitEvent.ServiceId);
command.Parameters.AddParameter("@tsid", NpgsqlDbType.Integer, (int)eitEvent.TransportStreamId);
command.Parameters.AddParameter("@onid", NpgsqlDbType.Integer, (int)eitEvent.OriginalNetworkId);
command.Parameters.AddParameter("@event_id", NpgsqlDbType.Integer, (int)eitEvent.EventId);
command.Parameters.AddParameter("@start_time", NpgsqlDbType.Timestamp, eitEvent.StartTime);
command.Parameters.Add("@ordinal", NpgsqlDbType.Integer);
command.Parameters.Add("@l_tsid", NpgsqlDbType.Integer);
command.Parameters.Add("@l_onid", NpgsqlDbType.Integer);
command.Parameters.Add("@l_sid", NpgsqlDbType.Integer);
command.Parameters.Add("@linkage_type", NpgsqlDbType.Integer);
command.Parameters.Add("@handover_type", NpgsqlDbType.Integer);
command.Parameters.Add("@handover_origin_type", NpgsqlDbType.Boolean);
command.Parameters.Add("@handover_network_id", NpgsqlDbType.Integer);
command.Parameters.Add("@handover_initial_service_id", NpgsqlDbType.Integer);
command.Parameters.Add("@target_event_id", NpgsqlDbType.Integer);
command.Parameters.Add("@target_event_listed", NpgsqlDbType.Boolean);
command.Parameters.Add("@target_event_simulcasted", NpgsqlDbType.Boolean);
//@table_type,@private_data_bytes,@bouquet_id)";
command.Parameters.Add("@table_type", NpgsqlDbType.Integer);
command.Parameters.Add("@private_data_bytes", NpgsqlDbType.Bytea);
command.Parameters.Add("@bouquet_id", NpgsqlDbType.Integer);
for (int i = 0; i < eitEvent.Linkages.Count; i++)
{
LinkageDescriptor linkage = eitEvent.Linkages[i];
command.Parameters["@ordinal"].Value = i;
command.Parameters["@l_tsid"].Value = (int)linkage.TransportStreamId;
command.Parameters["@l_onid"].Value = (int)linkage.OriginalNetworkId;
command.Parameters["@l_sid"].Value = (int)linkage.ServiceId;
command.Parameters["@linkage_type"].Value = (int)linkage.LinkageType;
command.Parameters["@handover_type"].Value = linkage.HandoverType.HasValue ? (int)linkage.HandoverType.Value : DBNull.Value;
command.Parameters["@handover_origin_type"].Value = linkage.HandoverOriginType.HasValue ? linkage.HandoverOriginType.Value : DBNull.Value;
command.Parameters["@handover_network_id"].Value = linkage.HandoverNetworkId.HasValue ? (int)linkage.HandoverNetworkId.Value : DBNull.Value;
command.Parameters["@handover_initial_service_id"].Value = linkage.HandoverInitialServiceId.HasValue ? (int)linkage.HandoverInitialServiceId.Value : DBNull.Value;
command.Parameters["@target_event_id"].Value = linkage.TargetEventId.HasValue ? (int)linkage.TargetEventId.Value : DBNull.Value;
command.Parameters["@target_event_listed"].Value = linkage.TargetEventListed.HasValue ? linkage.TargetEventListed.Value : DBNull.Value;
command.Parameters["@target_event_simulcasted"].Value = linkage.TargetEventSimulcasted.HasValue ? linkage.TargetEventSimulcasted.Value : DBNull.Value;
command.Parameters["@table_type"].Value = linkage.TableType.HasValue ? (int)linkage.TableType.Value : DBNull.Value;
command.Parameters["@private_data_bytes"].Value = linkage.PrivateDataBytes != null ? linkage.PrivateDataBytes : DBNull.Value;
command.Parameters["@bouquet_id"].Value = linkage.BouquetId.HasValue ? (int)linkage.BouquetId.Value : DBNull.Value;
command.ExecuteNonQuery();
WriteEitLinkageExtendedEventLinkages(conn, eitEvent, i);
WriteEitLinkageIpmacLinkages(conn, eitEvent, i);
WriteEitLinkageSsuLinkStructure(conn, eitEvent, i);
}
}
private void WriteEitLinkageSsuLinkStructure(NpgsqlConnection conn, EitEvent eitEvent, int i)
{
if (eitEvent.Linkages[i].SystemSoftwareUpdateLinkStructure == null)
return;
for (int j = 0; j < eitEvent.Linkages[i].SystemSoftwareUpdateLinkStructure.Count; j++)
{
LinkageDescriptor.OuiPrivateData ssuLinkStruct = eitEvent.Linkages[i].SystemSoftwareUpdateLinkStructure[j];
throw new NotImplementedException();
}
}
private void WriteEitLinkageIpmacLinkages(NpgsqlConnection conn, EitEvent eitEvent, int i)
{
if (eitEvent.Linkages[i].IpMacNotificationLinkages == null)
return;
for (int j = 0; i < eitEvent.Linkages[i].IpMacNotificationLinkages.Count; j++)
{
LinkageDescriptor.IpMacNotificationLinkage ipMacNotificationLinkage = eitEvent.Linkages[i].IpMacNotificationLinkages[j];
throw new NotImplementedException();
}
}
private void WriteEitLinkageExtendedEventLinkages(NpgsqlConnection conn, EitEvent eitEvent, int i)
{
if (eitEvent.Linkages[i].ExtendedEventLinkages == null)
return;
for (int j = 0; i < eitEvent.Linkages[i].ExtendedEventLinkages.Length; j++)
{
LinkageDescriptor.ExtendedEventLinkageInfo extendedEventLinkage = eitEvent.Linkages[i].ExtendedEventLinkages[j];
throw new NotImplementedException();
}
}
private void WriteEitItems(NpgsqlConnection conn, EitEvent eitEvent)
{
if (eitEvent.Items == null)
return;
NpgsqlCommand command = conn.CreateCommand();
command.CommandText =
"INSERT INTO dvb_eit_items (sid, tsid, onid, event_id, start_time, description, item, ordinal) " +
"VALUES (@sid, @tsid, @onid, @event_id, @start_time, @description, @item, @ordinal)";
command.Parameters.AddParameter("@sid", NpgsqlDbType.Integer, eitEvent.ServiceId);
command.Parameters.AddParameter("@tsid", NpgsqlDbType.Integer, eitEvent.TransportStreamId);
command.Parameters.AddParameter("@onid", NpgsqlDbType.Integer, eitEvent.OriginalNetworkId);
command.Parameters.AddParameter("@event_id", NpgsqlDbType.Integer, eitEvent.EventId);
command.Parameters.AddParameter("@start_time", NpgsqlDbType.Timestamp, eitEvent.StartTime);
command.Parameters.Add("@description", NpgsqlDbType.Text);
command.Parameters.Add("@item", NpgsqlDbType.Text);
command.Parameters.Add("@ordinal", NpgsqlDbType.Integer);
for (int i = 0; i < eitEvent.Items.Count; i++)
{
EitEvent.EitEventItem item = eitEvent.Items[i];
command.Parameters["@description"].Value = item.Description;
command.Parameters["@item"].Value = item.Item;
command.Parameters["@ordinal"].Value = i;
command.Parameters.CheckNulls();
command.ExecuteNonQuery();
}
command.Dispose();
}
private void WriteEitCrids(NpgsqlConnection conn, EitEvent eitEvent)
{
if (eitEvent.Crids == null)
return;
NpgsqlCommand command = conn.CreateCommand();
command.CommandText = "INSERT INTO dvb_eit_crids " +
"(sid, tsid, onid, event_id, start_time, ordinal, crid_type, crid_location, crid_bytes, crid_ref) " +
"VALUES " +
"(@sid, @tsid, @onid, @event_id, @start_time, @ordinal, @crid_type, @crid_location, @crid_bytes, @crid_ref)";
command.Parameters.AddParameter("@sid", NpgsqlDbType.Integer, (int)eitEvent.ServiceId);
command.Parameters.AddParameter("@tsid", NpgsqlDbType.Integer, (int)eitEvent.TransportStreamId);
command.Parameters.AddParameter("@onid", NpgsqlDbType.Integer, (int)eitEvent.OriginalNetworkId);
command.Parameters.AddParameter("@event_id", NpgsqlDbType.Integer, (int)eitEvent.EventId);
command.Parameters.AddParameter("@start_time", NpgsqlDbType.Timestamp, eitEvent.StartTime);
command.Parameters.Add("@ordinal", NpgsqlDbType.Integer);
command.Parameters.Add("@crid_type", NpgsqlDbType.Integer);
command.Parameters.Add("@crid_location", NpgsqlDbType.Integer);
command.Parameters.Add("@crid_bytes", NpgsqlDbType.Bytea);
command.Parameters.Add("@crid_ref", NpgsqlDbType.Integer);
int ordinal = 0;
foreach (ContentIdentifierDescriptor.Crid eitEventCrid in eitEvent.Crids)
{
command.Parameters["@ordinal"].Value = ordinal++;
command.Parameters["@crid_type"].Value = (int)eitEventCrid.CridType;
command.Parameters["@crid_location"].Value = (int)eitEventCrid.CridLocation;
command.Parameters["@crid_bytes"].Value = eitEventCrid.CridBytes;
command.Parameters["@crid_ref"].Value = (int?)eitEventCrid.CridRef;
command.Parameters.CheckNulls();
}
}
private void WriteEitContent(NpgsqlConnection conn, EitEvent eitEvent)
{
if (eitEvent.Content == null)
return;
NpgsqlCommand command = conn.CreateCommand();
command.CommandText = "INSERT INTO dvb_eit_content " +
"(sid,tsid,onid,event_id,start_time,ordinal,l,m,r) " +
"VALUES " +
"(@sid,@tsid,@onid,@event_id,@start_time,@ordinal,@l,@m,@r)";
command.Parameters.AddWithValue("@sid", NpgsqlDbType.Integer, (int)eitEvent.ServiceId);
command.Parameters.AddWithValue("@tsid", NpgsqlDbType.Integer, (int)eitEvent.TransportStreamId);
command.Parameters.AddWithValue("@onid", NpgsqlDbType.Integer, (int)eitEvent.OriginalNetworkId);
command.Parameters.AddWithValue("@event_id", NpgsqlDbType.Integer, (int)eitEvent.EventId);
command.Parameters.AddWithValue("@start_time", NpgsqlDbType.Timestamp, eitEvent.StartTime);
command.Parameters.Add("@ordinal", NpgsqlDbType.Integer);
command.Parameters.Add("@l", NpgsqlDbType.Integer);
command.Parameters.Add("@m", NpgsqlDbType.Integer);
command.Parameters.Add("@r", NpgsqlDbType.Integer);
for (int i = 0; i < eitEvent.Content.Length; i++)
{
command.Parameters["@ordinal"].Value = i;
command.Parameters["@l"].Value = eitEvent.Content[i].Item1;
command.Parameters["@m"].Value = eitEvent.Content[i].Item2;
command.Parameters["@r"].Value = eitEvent.Content[i].Item3;
command.ExecuteNonQuery();
}
}
private void WriteEitComponents(NpgsqlConnection conn, EitEvent eitEvent)
{
if (eitEvent.Components == null)
return;
NpgsqlCommand command = conn.CreateCommand();
command.CommandText = "INSERT INTO dvb_eit_components " +
"(sid, tsid, onid, event_id, start_time, ordinal, stream_content_ext, stream_content, component_type, component_tag, iso_639_language_code, text) " +
"VALUES " +
"(@sid, @tsid, @onid, @event_id, @start_time, @ordinal, @stream_content_ext, @stream_content, @component_type, @component_tag, @iso_639_language_code, @text)";
command.Parameters.AddWithValue("@sid", NpgsqlDbType.Integer, (int)eitEvent.ServiceId);
command.Parameters.AddWithValue("@tsid", NpgsqlDbType.Integer, (int)eitEvent.TransportStreamId);
command.Parameters.AddWithValue("@onid", NpgsqlDbType.Integer, (int)eitEvent.OriginalNetworkId);
command.Parameters.AddWithValue("@event_id", NpgsqlDbType.Integer, (int)eitEvent.EventId);
command.Parameters.AddWithValue("@start_time", NpgsqlDbType.Timestamp, eitEvent.StartTime);
command.Parameters.Add("@ordinal", NpgsqlDbType.Integer);
command.Parameters.Add("@stream_content_ext", NpgsqlDbType.Integer);
command.Parameters.Add("@stream_content", NpgsqlDbType.Integer);
command.Parameters.Add("@component_type", NpgsqlDbType.Integer);
command.Parameters.Add("@component_tag", NpgsqlDbType.Integer);
command.Parameters.Add("@iso_639_language_code", NpgsqlDbType.Varchar);
command.Parameters.Add("@text", NpgsqlDbType.Text);
int ordinal = 0;
foreach (ComponentDescriptor component in eitEvent.Components)
{
command.Parameters["@ordinal"].Value = ordinal++;
command.Parameters["@stream_content_ext"].Value = component.StreamContentExt;
command.Parameters["@stream_content"].Value = component.StreamContent;
command.Parameters["@component_type"].Value = component.ComponentType;
command.Parameters["@component_tag"].Value = component.ComponentTag;
command.Parameters["@iso_639_language_code"].Value = component.Iso639LanguageCode;
string text = component.Text;
if (text != null)
text = component.Text.Trim('\0');
command.Parameters["@text"].Value = text;
command.Parameters.CheckNulls();
command.ExecuteNonQuery();
}
}
private void WriteEitCaSystems(NpgsqlConnection conn, EitEvent eitEvent)
{
if (eitEvent.CaSystems == null)
return;
NpgsqlCommand cmd = conn.CreateCommand();
cmd.CommandText = "insert into dvb_eit_ca_systems (sid, tsid, onid, event_id, start_time, ordinal, caid)\r\nvalues (@sid, @tsid, @onid, @event_id, @start_time, @ordinal, @caid)";
cmd.Parameters.AddWithValue("@sid", NpgsqlDbType.Integer, (int)eitEvent.ServiceId);
cmd.Parameters.AddWithValue("@tsid", NpgsqlDbType.Integer, (int)eitEvent.TransportStreamId);
cmd.Parameters.AddWithValue("@onid", NpgsqlDbType.Integer, (int)eitEvent.OriginalNetworkId);
cmd.Parameters.AddWithValue("@event_id", NpgsqlDbType.Integer, (int)eitEvent.EventId);
cmd.Parameters.AddWithValue("@start_time", NpgsqlDbType.Timestamp, eitEvent.StartTime);
cmd.Parameters.Add("@ordinal", NpgsqlDbType.Integer);
cmd.Parameters.Add("@caid", NpgsqlDbType.Integer);
for (int i = 0; i < eitEvent.CaSystems.Length; i++)
{
cmd.Parameters["@ordinal"].Value = i;
cmd.Parameters["@caid"].Value = (int)eitEvent.CaSystems[i];
cmd.ExecuteNonQuery();
}
}
}
}

View File

@ -0,0 +1,71 @@
using Npgsql;
using NpgsqlTypes;
using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace skyscraper5.Data.PostgreSql
{
public partial class PostgresqlDataStore
{
public bool ImportFileKnown(FileInfo fi)
{
using (NpgsqlConnection connection = new NpgsqlConnection(connectionStringBuilder.ToString()))
{
connection.Open();
NpgsqlCommand command = connection.CreateCommand();
command.CommandText = "SELECT dateadded FROM skyscraper5_jobs_files_imported WHERE path = @path";
command.Parameters.AddWithValue("@path", NpgsqlDbType.Text, fi.ToString());
NpgsqlDataReader dataReader = command.ExecuteReader();
bool result = dataReader.Read();
dataReader.Close();
command.Dispose();
connection.Close();
return result;
}
}
public void ImportMarkFileAsKnown(FileInfo fi, TimeSpan duration, int tstype)
{
using (NpgsqlConnection connection = new NpgsqlConnection(connectionStringBuilder.ToString()))
{
connection.Open();
NpgsqlCommand command = connection.CreateCommand();
command.CommandText = "INSERT INTO skyscraper5_jobs_files_imported (path,duration,tstype) VALUES (@path,@duration,@tstype)";
command.Parameters.AddWithValue("@path", NpgsqlDbType.Text, fi.ToString());
command.Parameters.AddWithValue("@duration", NpgsqlDbType.Double, duration.TotalSeconds);
command.Parameters.AddWithValue("@tstype", NpgsqlDbType.Integer, tstype);
int executeNonQuery = command.ExecuteNonQuery();
if (executeNonQuery != 1)
throw new DataException(String.Format("Expect to insert 1 line, but did {0}", executeNonQuery));
command.Dispose();
connection.Close();
}
}
public IReadOnlyList<string> ListImportFileByTag1(int tag1)
{
List<string> result = new List<string>();
using (NpgsqlConnection connection = new NpgsqlConnection(connectionStringBuilder.ToString()))
{
connection.Open();
NpgsqlCommand command = connection.CreateCommand();
command.CommandText = "SELECT path FROM skyscraper5_jobs_files_imported WHERE tag1 = @tag";
command.Parameters.AddWithValue("@tag", NpgsqlDbType.Integer, tag1);
NpgsqlDataReader dataReader = command.ExecuteReader();
while (dataReader.Read())
{
result.Add(dataReader.GetString(0));
}
dataReader.Close();
command.Dispose();
connection.Close();
}
return result;
}
}
}

View File

@ -0,0 +1,82 @@
using Npgsql;
using skyscraper5.Dvb.DataBroadcasting.IntModel;
using skyscraper5.Skyscraper.Scraper.Storage.Utilities;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace skyscraper5.Data.PostgreSql
{
public partial class PostgresqlDataStore
{
private HashSet<DatabaseKeyInt> _knownInts;
public bool TestForIpMacNotification(IpMacNotification notification)
{
if (_knownInts == null)
_knownInts = new HashSet<DatabaseKeyInt>();
DatabaseKeyInt key = new DatabaseKeyInt(notification.PlatformId);
if (_knownInts.Contains(key))
return true;
bool result;
using (NpgsqlConnection conn = new NpgsqlConnection(connectionStringBuilder.ToString()))
{
conn.Open();
NpgsqlCommand cmd = conn.CreateCommand();
cmd.CommandText = "SELECT dateadded FROM dvb_int WHERE platform_id = @id";
cmd.Parameters.AddWithValue("@id", NpgsqlTypes.NpgsqlDbType.Bigint, (long)notification.PlatformId);
NpgsqlDataReader reader = cmd.ExecuteReader();
result = reader.Read();
reader.Close();
cmd.Dispose();
conn.Close();
}
if (result)
_knownInts.Add(key);
return result;
}
public void StoreIpMacNotification(IpMacNotification notification)
{
EnqueueTask(x => WriteIpMacNotification(x, notification));
DatabaseKeyInt key = new DatabaseKeyInt(notification.PlatformId);
_knownInts.Add(key);
}
private void WriteIpMacNotification(NpgsqlConnection conn, IpMacNotification notification)
{
NpgsqlCommand cmd = conn.CreateCommand();
cmd.CommandText = "insert into dvb_int (platform_id, platform_name, platform_provider_name,\r\n platform_provider_name_language_code, platform_action_type, platform_name_language_code,\r\n platform_processing_order, target_type, target_name, operational_network_id,\r\n operational_mpe_fec_algorithm, operational_component_tag, operational_transport_stream_id,\r\n operational_time_slice_fec_id, operational_time_slicing, operational_onid, operational_sid,\r\n operational_time_slice_frame_size, operational_time_slice_max_average_rate,\r\n operational_time_slice_max_bust_duration) " +
"values " +
"(@platform_id,@platform_name,@platform_provider_name,@platform_provider_name_language_code,@platform_action_type,@platform_name_language_code,@platform_processing_order,@target_type,@target_name,@operational_network_id,@operational_mpe_fec_algorithm, @operational_component_tag, @operational_transport_stream_id,\r\n @operational_time_slice_fec_id, @operational_time_slicing, @operational_onid, @operational_sid,\r\n @operational_time_slice_frame_size, @operational_time_slice_max_average_rate,\r\n @operational_time_slice_max_bust_duration\r\n\r\n )";
cmd.Parameters.AddWithValue("@platform_id", NpgsqlTypes.NpgsqlDbType.Bigint, (long)notification.PlatformId);
cmd.Parameters.AddWithValue("@platform_name", NpgsqlTypes.NpgsqlDbType.Text, notification.PlatformName);
cmd.Parameters.AddWithValue("@platform_provider_name", NpgsqlTypes.NpgsqlDbType.Text, notification.PlatformProviderName);
cmd.Parameters.AddWithValue("@platform_provider_name_language_code", NpgsqlTypes.NpgsqlDbType.Varchar, notification.PlatformProviderNameLanguageCode);
cmd.Parameters.AddWithValue("@platform_action_type", NpgsqlTypes.NpgsqlDbType.Integer, notification.PlatformActionType);
cmd.Parameters.AddWithValue("@platform_name_language_code", NpgsqlTypes.NpgsqlDbType.Varchar, notification.PlatformNameLanguageCode);
cmd.Parameters.AddWithValue("@platform_processing_order", NpgsqlTypes.NpgsqlDbType.Integer, notification.PlatformProcessingOrder);
cmd.Parameters.AddWithValue("@target_type", NpgsqlTypes.NpgsqlDbType.Integer, notification.TargetType);
cmd.Parameters.AddWithValue("@target_name", NpgsqlTypes.NpgsqlDbType.Text, notification.TargetName);
//@operational_network_id,@operational_mpe_fec_algorithm,@operational_component_tag,@operational_transport_stream_id,@operational_time_slice_fec_id,@operational_time_slicing,@operational_onid,@operational_sid,@operational_time_slice_frame_size, @operational_time_slice_max_average_rate,\r\n @operational_time_slice_max_bust_duration\r\n\r\n )";
cmd.Parameters.AddWithValue("@operational_network_id", NpgsqlTypes.NpgsqlDbType.Integer, (int?)notification.OperationalNetworkId);
cmd.Parameters.AddWithValue("@operational_mpe_fec_algorithm", NpgsqlTypes.NpgsqlDbType.Integer, (int?)notification.OperationalMpeFecAlgorithm);
cmd.Parameters.AddWithValue("@operational_component_tag", NpgsqlTypes.NpgsqlDbType.Integer, (int?)notification.OperationalComponentTag);
cmd.Parameters.AddWithValue("@operational_transport_stream_id", NpgsqlTypes.NpgsqlDbType.Integer, (int?)notification.OperationalTransportStreamId);
cmd.Parameters.AddWithValue("@operational_time_slice_fec_id", NpgsqlTypes.NpgsqlDbType.Integer, (int?)notification.OperationalTimeSliceFecId);
cmd.Parameters.AddWithValue("@operational_time_slicing", NpgsqlTypes.NpgsqlDbType.Boolean, (bool?)notification.OperationalTimeSlicing);
cmd.Parameters.AddWithValue("@operational_onid", NpgsqlTypes.NpgsqlDbType.Integer, (int?)notification.OperationalOriginalNetworkId);
cmd.Parameters.AddWithValue("@operational_sid", NpgsqlTypes.NpgsqlDbType.Integer, (int?)notification.OperationalServiceId);
//@operational_time_slice_frame_size,@operational_time_slice_max_average_rate,@operational_time_slice_max_bust_duration
cmd.Parameters.AddWithValue("@operational_time_slice_frame_size", NpgsqlTypes.NpgsqlDbType.Integer, (int?)notification.OperationalTimeSliceFrameSize);
cmd.Parameters.AddWithValue("@operational_time_slice_max_average_rate", NpgsqlTypes.NpgsqlDbType.Integer, (int?)notification.OperationalTimeSliceMaxAverageRate);
cmd.Parameters.AddWithValue("@operational_time_slice_max_bust_duration", NpgsqlTypes.NpgsqlDbType.Integer, (int?)notification.OperationalTimeSliceMaxBurstDuration);
cmd.Parameters.CheckNulls();
cmd.ExecuteNonQuery();
}
}
}

View File

@ -0,0 +1,962 @@
using Ionic.Crc;
using Npgsql;
using skyscraper5.src.InteractionChannel.Model;
using skyscraper5.src.InteractionChannel.Model.Descriptors;
using skyscraper5.src.Skyscraper.Scraper.Storage.Utilities;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Net.NetworkInformation;
using System.Security.Cryptography;
namespace skyscraper5.Data.PostgreSql
{
public partial class PostgresqlDataStore
{
private List<Tuple<ushort, uint, uint>> _tbtpCache;
private ushort? timNid;
public bool TestForTerminalBurstTimePlan(ushort interactiveNetworkId, uint groupId, uint logonId)
{
timNid = interactiveNetworkId;
if (_tbtpCache == null)
_tbtpCache = new List<Tuple<ushort, uint, uint>>();
Tuple<ushort, uint, uint> coords = new Tuple<ushort, uint, uint>(interactiveNetworkId, groupId, logonId);
if (_tbtpCache.Contains(coords))
return true;
bool result;
using (NpgsqlConnection connection = new NpgsqlConnection(connectionStringBuilder.ToString()))
{
connection.Open();
NpgsqlCommand npgsqlCommand = connection.CreateCommand();
npgsqlCommand.CommandText = "SELECT dateadded FROM dvb_ic_tbtp WHERE network_id = @nid AND group_id = @gid AND @logon_id = @lid";
npgsqlCommand.Parameters.AddWithValue("@nid", (int)interactiveNetworkId);
npgsqlCommand.Parameters.AddWithValue("@gid", (long)groupId);
npgsqlCommand.Parameters.AddWithValue("@lid", (long)logonId);
NpgsqlDataReader dataReader = npgsqlCommand.ExecuteReader();
result = dataReader.Read();
dataReader.Close();
npgsqlCommand.Dispose();
connection.Close();
}
if (result)
_tbtpCache.Add(coords);
return result;
}
public void StoreTerminalBurstTimePlan(ushort interactiveNetworkId, uint gtoupId, uint superframeCount, uint frameNumber, Tbtp.TbtpFrame.BtpEntity btp)
{
timNid = interactiveNetworkId;
if (_tbtpCache == null)
_tbtpCache = new List<Tuple<ushort, uint, uint>>();
Tuple<ushort, uint, uint> coords = new Tuple<ushort, uint, uint>(interactiveNetworkId, gtoupId, btp.LogonId);
_tbtpCache.Add(coords);
EnqueueTask(x => WriteTbtp(x, interactiveNetworkId, gtoupId, superframeCount, frameNumber, btp));
}
private void WriteTbtp(NpgsqlConnection x, ushort interactiveNetworkId, uint gtoupId, uint superframeCount, uint frameNumber, Tbtp.TbtpFrame.BtpEntity btp)
{
timNid = interactiveNetworkId;
NpgsqlCommand command = x.CreateCommand();
command.CommandText = "insert into dvb_ic_tbtp (network_id, group_id, superframe_count, frame_number, logon_id, assignment_type,\r\n vbdc_queue_empty, start_slot, channel_id, assignment_count)\r\n" +
"values (@nid,@gid,@scount,@fnumber,@lid,@atype,@vqemtpy,@sslot,@cid,@acount);";
command.Parameters.AddWithValue("@nid", (int)interactiveNetworkId);
command.Parameters.AddWithValue("@gid", (long)gtoupId);
command.Parameters.AddWithValue("@scount", (long)superframeCount);
command.Parameters.AddWithValue("@fnumber", (long)frameNumber);
command.Parameters.AddWithValue("@lid", (long)btp.LogonId);
command.Parameters.AddWithValue("@atype", (int)btp.AssignmentType);
command.Parameters.AddWithValue("@vqempty", btp.VbdcQueueEmptyFlag);
command.Parameters.AddWithValue("@sslot", (long)btp.StartSlot);
command.Parameters.AddWithValue("@cid", (long?)btp.ChannelId);
command.Parameters.AddWithValue("@acount", (long)btp.AssignmentCount);
command.ExecuteNonQuery();
}
private List<Tuple<ushort, byte, ushort>> _cmtCache;
public bool TestForCmtEntry(ushort interactiveNetworkId, Cmt.CmtEntry entry)
{
timNid = interactiveNetworkId;
if (_cmtCache == null)
_cmtCache = new List<Tuple<ushort, byte, ushort>>();
Tuple<ushort, byte, ushort> tuple = new Tuple<ushort, byte, ushort>(interactiveNetworkId, entry.GroupId, entry.LoginId);
if (_cmtCache.Contains(tuple))
return true;
bool result;
using (NpgsqlConnection connection = new NpgsqlConnection(connectionStringBuilder.ToString()))
{
connection.Open();
NpgsqlCommand command = connection.CreateCommand();
command.CommandText = "SELECT dateadded FROM dvb_ic_cmt WHERE network_id = @nid AND group_id = @gid AND login_id = @lid";
command.Parameters.AddWithValue("@nid", (int)interactiveNetworkId);
command.Parameters.AddWithValue("@gid", (short)entry.GroupId);
command.Parameters.AddWithValue("@lid", (int)entry.LoginId);
NpgsqlDataReader dataReader = command.ExecuteReader();
result = dataReader.Read();
dataReader.Close();
command.Dispose();
connection.Close();
}
if (result)
_cmtCache.Add(tuple);
return result;
}
public void InsertCmtEntry(ushort interactiveNetworkId, Cmt.CmtEntry entry)
{
timNid = interactiveNetworkId;
if (_cmtCache == null)
_cmtCache = new List<Tuple<ushort, byte, ushort>>();
Tuple<ushort, byte, ushort> tuple = new Tuple<ushort, byte, ushort>(interactiveNetworkId, entry.GroupId, entry.LoginId);
_cmtCache.Add(tuple);
EnqueueTask(x => WriteCmt(x, interactiveNetworkId, entry));
}
private void WriteCmt(NpgsqlConnection x, ushort interactiveNetworkId, Cmt.CmtEntry entry)
{
timNid = interactiveNetworkId;
NpgsqlCommand command = x.CreateCommand();
command.CommandText = "insert into dvb_ic_cmt (network_id, group_id, login_id, slot_type, burst_time_scaling, burst_time_correction,\r\n power_correction, esn0, frequency_correction)\r\nvalues " +
"(@nid,@gid,@lid,@stype,@btscaling,@btcorrection,@pcorrection,@esn,@fcorrection)";
command.Parameters.AddWithValue("@nid", (int)interactiveNetworkId);
command.Parameters.AddWithValue("@gid", entry.GroupId);
command.Parameters.AddWithValue("@lid", (int)entry.LoginId);
command.Parameters.AddWithValue("@stype", (int)entry.SlotType);
command.Parameters.AddWithValue("@btscaling", entry.BurstTimeScaling);
command.Parameters.AddWithValue("@btcorrection", (long?)entry.BurstTimeCorrection);
command.Parameters.AddWithValue("@pcorrection", NpgsqlTypes.NpgsqlDbType.Integer, entry.PowerCorrection);
command.Parameters.AddWithValue("@esn", entry.EsN0);
command.Parameters.AddWithValue("@fcorrection", (int)entry.FrequencyCorrection);
SetNulls(command);
command.ExecuteNonQuery();
}
private Dictionary<ushort, int> _rmtTransmissionStdCache;
public int GetRmtTransmissionStandard(ushort networkId)
{
timNid = networkId;
if (_rmtTransmissionStdCache == null)
_rmtTransmissionStdCache = new Dictionary<ushort, int>();
if (_rmtTransmissionStdCache.ContainsKey(networkId))
return _rmtTransmissionStdCache[networkId];
int result = 0;
using (NpgsqlConnection connection = new NpgsqlConnection(connectionStringBuilder.ToString()))
{
connection.Open();
NpgsqlCommand command = connection.CreateCommand();
command.CommandText = "SELECT MAX(f_transmission_standard) FROM dvb_ic_rmt_transport_stream WHERE nid = @nid";
command.Parameters.AddWithValue("@nid", NpgsqlTypes.NpgsqlDbType.Integer, (int)networkId);
NpgsqlDataReader npgsqlDataReader = command.ExecuteReader();
if (npgsqlDataReader.Read())
{
if (!npgsqlDataReader.IsDBNull(0))
{
result = npgsqlDataReader.GetInt32(0);
}
}
npgsqlDataReader.Close();
command.Dispose();
connection.Close();
}
if (result != 0)
_rmtTransmissionStdCache.Add(networkId, result);
return result;
}
private Dictionary<ushort, byte[]> _tmstCache;
public byte[] GetTmst(ushort interactiveNetworkId)
{
timNid = interactiveNetworkId;
if (_tmstCache == null)
_tmstCache = new Dictionary<ushort, byte[]>();
if (_tmstCache.ContainsKey(interactiveNetworkId))
return _tmstCache[interactiveNetworkId];
byte[] result;
using (NpgsqlConnection connection = new NpgsqlConnection(connectionStringBuilder.ToString()))
{
connection.Open();
NpgsqlCommand command = connection.CreateCommand();
command.CommandText = "SELECT supported FROM dvb_ic_tmst WHERE network_id = @nid";
command.Parameters.AddWithValue("@nid", (int)interactiveNetworkId);
NpgsqlDataReader npgsqlDataReader = command.ExecuteReader();
if (npgsqlDataReader.Read())
result = npgsqlDataReader.GetByteArray(0);
else
result = null;
npgsqlDataReader.Close();
command.Dispose();
connection.Close();
}
_tmstCache.Add(interactiveNetworkId, result);
return result;
}
public void InsertTmst(ushort interactiveNetworkId, byte[] modes)
{
timNid = interactiveNetworkId;
if (_tmstCache == null)
_tmstCache = new Dictionary<ushort, byte[]>();
if (_tmstCache.ContainsKey(interactiveNetworkId))
if (_tmstCache[interactiveNetworkId] == null)
_tmstCache.Remove(interactiveNetworkId);
_tmstCache.Add(interactiveNetworkId, modes);
EnqueueTask(x => InsertTmstEx(x, interactiveNetworkId, modes));
}
private void InsertTmstEx(NpgsqlConnection x, ushort interactiveNetworkId, byte[] modes)
{
timNid = interactiveNetworkId;
NpgsqlCommand command = x.CreateCommand();
command.CommandText = "insert into dvb_ic_tmst (network_id, supported ) values (@nid,@data)";
command.Parameters.AddWithValue("@nid", (int)interactiveNetworkId);
command.Parameters.AddWithValue("@data", modes);
int a = command.ExecuteNonQuery();
command.Dispose();
}
public void UpdateTmst(ushort interactiveNetworkId, byte[] modes)
{
timNid = interactiveNetworkId;
if (_tmstCache == null)
_tmstCache = new Dictionary<ushort, byte[]>();
_tmstCache.Remove(interactiveNetworkId);
_tmstCache.Add(interactiveNetworkId, modes);
EnqueueTask(x => UpdateTmstEx(x, interactiveNetworkId, modes));
}
private void UpdateTmstEx(NpgsqlConnection x, ushort interactiveNetworkId, byte[] modes)
{
timNid = interactiveNetworkId;
NpgsqlCommand command = x.CreateCommand();
command.CommandText = "UPDATE dvb_ic_tmst\r\nSET supported = @data, version = version + 1, dateupdated = CURRENT_TIMESTAMP\r\nWHERE network_id = @nid";
command.Parameters.AddWithValue("@nid", (int)interactiveNetworkId);
command.Parameters.AddWithValue("@data", modes);
int a = command.ExecuteNonQuery();
command.Dispose();
}
private HashSet<DatabaseKeyRmtLinkage> _rmtLinkageCache;
public bool TestForRmtLinkage(_0x4a_LinkageDescriptor linkage)
{
if (_rmtLinkageCache == null)
_rmtLinkageCache = new HashSet<DatabaseKeyRmtLinkage>();
DatabaseKeyRmtLinkage key = linkage.ToKey();
if (_rmtLinkageCache.Contains(key))
return true;
bool result;
using (NpgsqlConnection connection = new NpgsqlConnection(connectionStringBuilder.ToString()))
{
connection.Open();
NpgsqlCommand command = connection.CreateCommand();
command.CommandText = "SELECT dateadded FROM dvb_ic_rmt_linkage WHERE tsid=@tsid AND onid=@onid AND sid=@sid AND inid=@inid";
command.Parameters.AddWithValue("@tsid", (int)linkage.TransportStreamId);
command.Parameters.AddWithValue("@onid", (int)linkage.OriginalNetworkId);
command.Parameters.AddWithValue("@sid", (int)linkage.ServiceId);
command.Parameters.AddWithValue("@inid", (int)linkage.InteractiveNetworkId);
NpgsqlDataReader dataReader = command.ExecuteReader();
result = dataReader.Read();
dataReader.Close();
command.Dispose();
connection.Close();
}
if (result)
_rmtLinkageCache.Add(key);
return result;
}
public void InsertRmtLinkage(_0x4a_LinkageDescriptor linkage)
{
if (_rmtLinkageCache == null)
_rmtLinkageCache = new HashSet<DatabaseKeyRmtLinkage>();
DatabaseKeyRmtLinkage key = linkage.ToKey();
if (_rmtLinkageCache.Contains(key))
return;
_rmtLinkageCache.Add(key);
EnqueueTask(x => InsertRmtLinkageEx(x, linkage));
}
private void InsertRmtLinkageEx(NpgsqlConnection x, _0x4a_LinkageDescriptor linkage)
{
NpgsqlCommand command = x.CreateCommand();
command.CommandText = "insert into dvb_ic_rmt_linkage (tsid, onid, sid, linkage_type, inid, private_data) values (@tsid,@onid,@sid,@ltype,@inid,@pdata) returning uuid";
command.Parameters.AddWithValue("@tsid", (int)linkage.TransportStreamId);
command.Parameters.AddWithValue("@onid", (int)linkage.OriginalNetworkId);
command.Parameters.AddWithValue("@sid", (int)linkage.ServiceId);
command.Parameters.AddWithValue("@ltype", (int)linkage.LinkageType);
command.Parameters.AddWithValue("@inid", (int)linkage.InteractiveNetworkId);
command.Parameters.AddWithValue("@pdata", linkage.PrivateData);
if (linkage.PopulationIds.Length > 0)
{
NpgsqlDataReader dataReader = command.ExecuteReader();
dataReader.Read();
object o = dataReader.GetValue(0);
dataReader.Close();
command.Dispose();
Guid parent = (Guid)o;
foreach (_0x4a_LinkageDescriptor.Population population in linkage.PopulationIds)
{
InsertRmtLinkagePopulation(x, parent, population);
}
}
else
{
command.ExecuteNonQuery();
command.Dispose();
}
}
private void InsertRmtLinkagePopulation(NpgsqlConnection x, Guid parent, _0x4a_LinkageDescriptor.Population population)
{
NpgsqlCommand command = x.CreateCommand();
command.CommandText = "insert into dvb_ic_rmt_linkage_populations (parent, base, mask) values (@parent,@base,@mask)";
command.Parameters.AddWithValue("@parent", NpgsqlTypes.NpgsqlDbType.Uuid, parent);
command.Parameters.AddWithValue("@base", NpgsqlTypes.NpgsqlDbType.Integer, (int)population.Base);
command.Parameters.AddWithValue("@mask", NpgsqlTypes.NpgsqlDbType.Integer, (int)population.Mask);
command.ExecuteNonQuery();
}
private HashSet<DatabaseKeyRmtTransportStream> _rmtTransportStreamCache;
public bool TestForRmtTransportStream(ushort networkId, Rmt.TransportStream transportStream)
{
timNid = networkId;
if (_rmtTransportStreamCache == null)
_rmtTransportStreamCache = new HashSet<DatabaseKeyRmtTransportStream>();
DatabaseKeyRmtTransportStream key = transportStream.ToKey(networkId);
if (_rmtTransportStreamCache.Contains(key))
return true;
bool result;
using (NpgsqlConnection connection = new NpgsqlConnection(connectionStringBuilder.ToString()))
{
connection.Open();
NpgsqlCommand command = connection.CreateCommand();
command.CommandText = "SELECT dateadded FROM dvb_ic_rmt_transport_stream WHERE nid=@nid AND tsid=@tsid AND onid=@onid";
command.Parameters.AddWithValue("@nid", (int)networkId);
command.Parameters.AddWithValue("@tsid", (int)transportStream.TransportStreamId);
command.Parameters.AddWithValue("@onid", (int)transportStream.OriginalNetworkId);
NpgsqlDataReader dataReader = command.ExecuteReader();
result = dataReader.Read();
dataReader.Close();
command.Dispose();
connection.Close();
}
if (result)
_rmtTransportStreamCache.Add(key);
return result;
}
public void InsertRmtTransportStream(ushort networkId, Rmt.TransportStream transportStream)
{
timNid = networkId;
if (_rmtTransportStreamCache == null)
_rmtTransportStreamCache = new HashSet<DatabaseKeyRmtTransportStream>();
DatabaseKeyRmtTransportStream key = transportStream.ToKey(networkId);
if (_rmtTransportStreamCache.Contains(key))
return;
_rmtTransportStreamCache.Add(key);
EnqueueTask(x => InsertRmtTransportStreamEx(x, networkId, transportStream));
}
private void InsertRmtTransportStreamEx(NpgsqlConnection x, ushort networkId, Rmt.TransportStream transportStream)
{
timNid = networkId;
_0xa9_SatelliteReturnLinkDescriptor r = transportStream.SatelliteReturnLink;
_0xa8_SatelliteForwardLinkDescriptor f = transportStream.SatelliteForwardLink;
NpgsqlCommand command = x.CreateCommand();
command.CommandText = "INSERT INTO dvb_ic_rmt_transport_stream (nid, tsid, onid, r_satellite_id, r_beam_id, r_gateway_id, r_orbital_position, r_cardinal_direction, r_superframe_id," +
"r_tx_frequency_offset, r_private_data, f_satellite_id, f_beam_id, f_ncc_id, f_link_usage, f_local_link_id, f_frequency, f_orbital_position, f_cardinal_direction, f_polarization, " +
"f_transmission_standard, f_scrambling_sequence_selector, f_roll_off, f_symbol_rate, f_fec_inner, f_input_stream_identifier, f_spreading_code_selector, f_scrambling_sequence_index, " +
"f_private_data_bytes) VALUES " +
"(@nid,@tsid,@onid,@rsid,@rbid,@rgid,@roposition,@rcdirection,@rsfid,@rtxfoffset,@rpdata,@fsid,@fbid,@fnccid,@flusage,@fllid,@ffrequency,@foposition,@fcdirection,@fpolarization,@ftstandard," +
"@fssselector,@froff,@fsrate,@ffecinner,@fisidentifier,@fscselector,@fssindex,@fprbytes)";
command.Parameters.AddWithValue("@nid", (int)networkId);
command.Parameters.AddWithValue("@tsid", (int)transportStream.TransportStreamId);
command.Parameters.AddWithValue("@onid", (int)transportStream.OriginalNetworkId);
command.Parameters.Add("@rsid", NpgsqlTypes.NpgsqlDbType.Integer);
command.Parameters.Add("@rbid", NpgsqlTypes.NpgsqlDbType.Integer);
command.Parameters.Add("@rgid", NpgsqlTypes.NpgsqlDbType.Integer);
command.Parameters.Add("@roposition", NpgsqlTypes.NpgsqlDbType.Integer);
command.Parameters.Add("@rcdirection", NpgsqlTypes.NpgsqlDbType.Boolean);
command.Parameters.Add("@rsfid", NpgsqlTypes.NpgsqlDbType.Integer);
command.Parameters.Add("@rtxfoffset", NpgsqlTypes.NpgsqlDbType.Bigint);
command.Parameters.Add("@rpdata", NpgsqlTypes.NpgsqlDbType.Bytea);
if (r != null)
{
command.Parameters["@rsid"].Value = (int)r.SatelliteId;
command.Parameters["@rbid"].Value = (int)r.BeamId;
command.Parameters["@rgid"].Value = (int)r.GatewayId;
command.Parameters["@roposition"].Value = (int)r.OrbitalPosition;
command.Parameters["@rcdirection"].Value = r.Eastern;
command.Parameters["@rsfid"].Value = (int)r.SuperframeId;
command.Parameters["@rtxfoffset"].Value = (long)r.TxFrequencyOffset;
command.Parameters["@rpdata"].Value = r.PrivateDataBytes;
}
command.Parameters.AddWithValue("@fsid", (int)f.SatelliteId);
command.Parameters.AddWithValue("@fbid", (int)f.BeamId);
command.Parameters.AddWithValue("@fnccid", (int)f.NccId);
command.Parameters.AddWithValue("@flusage", (int)f.LinkUsage);
command.Parameters.AddWithValue("@fllid", (int)f.LocalLinkId);
command.Parameters.AddWithValue("@ffrequency", (long)f.Frequency);
command.Parameters.AddWithValue("@foposition", (int)f.OrbitalPosition);
command.Parameters.AddWithValue("@fcdirection", f.East);
command.Parameters.AddWithValue("@fpolarization", (int)f.Polarization);
command.Parameters.AddWithValue("@ftstandard", (int)f.TransmissionStandard);
command.Parameters.AddWithValue("@fssselector", NpgsqlTypes.NpgsqlDbType.Boolean, f.ScramblingSequenceSelector);
command.Parameters.AddWithValue("@froff", NpgsqlTypes.NpgsqlDbType.Double, f.RollOff);
command.Parameters.AddWithValue("@fsrate", (int)f.SymbolRate);
command.Parameters.AddWithValue("@ffecinner", NpgsqlTypes.NpgsqlDbType.Integer, (int?)f.FecInner);
command.Parameters.AddWithValue("@fisidentifier", NpgsqlTypes.NpgsqlDbType.Integer, (int?)f.InputStreamIndentifier);
command.Parameters.AddWithValue("@fscselector", NpgsqlTypes.NpgsqlDbType.Integer, f.SpreadingCodeSelector);
command.Parameters.AddWithValue("@fssindex", f.ScramblingSequenceIndex);
command.Parameters.AddWithValue("@fprbytes", f.PrivateDataBytes);
SetNulls(command);
command.ExecuteNonQuery();
}
private HashSet<Tuple<int, long>> _sctCache;
public bool TestForSuperframeComposition(ushort interactiveNetworkId, Sct.Superframe superframe)
{
timNid = interactiveNetworkId;
if (_sctCache == null)
_sctCache = new HashSet<Tuple<int, long>>();
Tuple<int, long> key = new Tuple<int, long>(interactiveNetworkId, superframe.SuperframeId);
if (_sctCache.Contains(key))
return true;
bool result;
using (NpgsqlConnection connection = new NpgsqlConnection(connectionStringBuilder.ToString()))
{
connection.Open();
NpgsqlCommand command = connection.CreateCommand();
command.CommandText = "SELECT dateadded FROM dvb_ic_sct WHERE nid = @nid AND superframe_id = @sframeid";
command.Parameters.AddWithValue("@nid", NpgsqlTypes.NpgsqlDbType.Integer, (int)interactiveNetworkId);
command.Parameters.AddWithValue("@sframeid", NpgsqlTypes.NpgsqlDbType.Bigint, (long)superframe.SuperframeId);
NpgsqlDataReader dataReader = command.ExecuteReader();
result = dataReader.Read();
dataReader.Close();
command.Dispose();
connection.Close();
}
if (result)
_sctCache.Add(key);
return result;
}
public void StoreSuperframeComposition(ushort interactiveNetworkId, Sct.Superframe superframe)
{
timNid = interactiveNetworkId;
if (_sctCache == null)
_sctCache = new HashSet<Tuple<int, long>>();
Tuple<int, long> key = new Tuple<int, long>(interactiveNetworkId, superframe.SuperframeId);
if (_sctCache.Contains(key))
return;
EnqueueTask(x => StoreSuperframeCompositionEx(x, interactiveNetworkId, superframe));
}
private void StoreSuperframeCompositionEx(NpgsqlConnection x, ushort interactiveNetworkId, Sct.Superframe superframe)
{
timNid = interactiveNetworkId;
NpgsqlCommand command = x.CreateCommand();
command.CommandText = "SELECT dateadded FROM dvb_ic_sct WHERE nid = @nid AND superframe_id = @sframeid";
command.Parameters.AddWithValue("@nid", NpgsqlTypes.NpgsqlDbType.Integer, (int)interactiveNetworkId);
command.Parameters.AddWithValue("@sframeid", NpgsqlTypes.NpgsqlDbType.Bigint, (long)superframe.SuperframeId);
NpgsqlDataReader dataReader = command.ExecuteReader();
bool alreadyExists = dataReader.Read();
dataReader.Close();
command.Dispose();
if (alreadyExists)
return;
command = x.CreateCommand();
command.CommandText = "insert into dvb_ic_sct (nid, superframe_id, large_timing_uncertaintiy_flag, uplink_polarization, superframe_start_time_base, superframe_start_time_ext, " +
"superframe_duration, superframe_centre_frequency, superframe_counter) values (@nid,@sid,@ltuflag,@upolarization,@sstbase,@sstext,@sduration,@scfrequency,@scounter) RETURNING uuid";
command.Parameters.AddWithValue("@nid", NpgsqlTypes.NpgsqlDbType.Integer, (int)interactiveNetworkId);
command.Parameters.AddWithValue("@sid", NpgsqlTypes.NpgsqlDbType.Bigint, (long)superframe.SuperframeId);
command.Parameters.AddWithValue("@ltuflag", NpgsqlTypes.NpgsqlDbType.Boolean, superframe.LargeTimingUncertainityFlag);
command.Parameters.AddWithValue("@upolarization", NpgsqlTypes.NpgsqlDbType.Integer, (int)superframe.UplinkPolarization);
command.Parameters.AddWithValue("@sstbase", NpgsqlTypes.NpgsqlDbType.Bigint, (long)superframe.SuperframeStartTimeBase);
command.Parameters.AddWithValue("@sstext", NpgsqlTypes.NpgsqlDbType.Bigint, (long)superframe.SuperframeStartTimeExt);
command.Parameters.AddWithValue("@sduration", NpgsqlTypes.NpgsqlDbType.Bigint, (long)superframe.SuperframeDuration);
command.Parameters.AddWithValue("@scfrequency", NpgsqlTypes.NpgsqlDbType.Bigint, (long)superframe.SuperframeCentreFrequency);
command.Parameters.AddWithValue("@scounter", NpgsqlTypes.NpgsqlDbType.Bigint, (long)superframe.SuperframeCounter);
dataReader = command.ExecuteReader();
dataReader.Read();
Guid parent = dataReader.GetGuid(0);
dataReader.Close();
command.Dispose();
for (int i = 0; i < superframe.Frames.Length; i++)
{
StoreSuperframeFrame(x, parent, superframe.Frames[i], i);
}
}
private void StoreSuperframeFrame(NpgsqlConnection x, Guid parent, Sct.Superframe.Frame frame, int ordinal)
{
NpgsqlCommand command = x.CreateCommand();
command.CommandText = "INSERT INTO dvb_ic_sct_frame (parent, frame_id, frame_start_time, frame_centre_frequency_offset, ordinal) " +
"VALUES (@parent,@fid,@fstime,@fcfoffset,@ordinal)";
command.Parameters.AddWithValue("@parent", NpgsqlTypes.NpgsqlDbType.Uuid, parent);
command.Parameters.AddWithValue("@fid", NpgsqlTypes.NpgsqlDbType.Bigint, (long)frame.FrameId);
command.Parameters.AddWithValue("@fstime", NpgsqlTypes.NpgsqlDbType.Bigint, (long)frame.FrameStartTime);
command.Parameters.AddWithValue("@fcfoffset", NpgsqlTypes.NpgsqlDbType.Bigint, (long)frame.FrameCentreFrequencyOffset);
command.Parameters.AddWithValue("@ordinal", NpgsqlTypes.NpgsqlDbType.Integer, ordinal);
command.ExecuteNonQuery();
}
private HashSet<Tuple<int, int>> _fctCache;
public bool TestForFrameComposition(ushort interactiveNetworkId, Fct.Frame frame)
{
timNid = interactiveNetworkId;
if (_fctCache == null)
_fctCache = new HashSet<Tuple<int, int>>();
Tuple<int, int> key = new Tuple<int, int>((int)interactiveNetworkId, (int)frame.FrameId);
if (_fctCache.Contains(key))
return true;
bool result;
using (NpgsqlConnection connection = new NpgsqlConnection(connectionStringBuilder.ToString()))
{
connection.Open();
NpgsqlCommand command = connection.CreateCommand();
command.CommandText = "SELECT dateadded FROM dvb_ic_fct WHERE nid = @nid AND frame_id = @fid";
command.Parameters.AddWithValue("@nid", NpgsqlTypes.NpgsqlDbType.Integer, (int)interactiveNetworkId);
command.Parameters.AddWithValue("@fid", NpgsqlTypes.NpgsqlDbType.Integer, (int)frame.FrameId);
NpgsqlDataReader dataReader = command.ExecuteReader();
result = dataReader.Read();
dataReader.Close();
command.Dispose();
connection.Close();
}
if (result)
_fctCache.Add(key);
return result;
}
public void InsertFctFrame(ushort interactiveNetworkId, Fct.Frame frame)
{
timNid = interactiveNetworkId;
if (_fctCache == null)
_fctCache = new HashSet<Tuple<int, int>>();
Tuple<int, int> key = new Tuple<int, int>((int)interactiveNetworkId, (int)frame.FrameId);
if (_fctCache.Contains(key))
return;
_fctCache.Add(key);
EnqueueTask(x => InsertFctFrameEx(x, interactiveNetworkId, frame));
}
private void InsertFctFrameEx(NpgsqlConnection x, ushort interactiveNetworkId, Fct.Frame frame)
{
timNid = interactiveNetworkId;
NpgsqlCommand command = x.CreateCommand();
command.CommandText = "INSERT INTO dvb_ic_fct (nid, frame_id, frame_duration, total_timeslot_count, start_timeslot_number)" +
"VALUES (@nid,@fid,@fduration,@ttcount,@stnumber)RETURNING uuid";
command.Parameters.AddWithValue("@nid", NpgsqlTypes.NpgsqlDbType.Integer, (int)interactiveNetworkId);
command.Parameters.AddWithValue("@fid", NpgsqlTypes.NpgsqlDbType.Integer, (int)frame.FrameId);
command.Parameters.AddWithValue("@fduration", NpgsqlTypes.NpgsqlDbType.Bigint, (long)frame.FrameDuration);
command.Parameters.AddWithValue("@ttcount", NpgsqlTypes.NpgsqlDbType.Integer, (int)frame.TotalTimeslotCount);
command.Parameters.AddWithValue("@stnumber", NpgsqlTypes.NpgsqlDbType.Integer, (int)frame.StartTimeslotNumber);
NpgsqlDataReader dataReader = command.ExecuteReader();
dataReader.Read();
Guid guid = dataReader.GetGuid(0);
dataReader.Close();
command.Dispose();
for (int i = 0; i < frame.Timeslots.Length; i++)
{
InsertFctFrameTimeslot(x, guid, frame.Timeslots[i], i);
}
}
private void InsertFctFrameTimeslot(NpgsqlConnection x, Guid guid, Fct.Frame.Timeslot timeslot, int ordinal)
{
NpgsqlCommand command = x.CreateCommand();
command.CommandText = "INSERT INTO dvb_ic_fct_timeslot (parent,timeslot_id,timeslot_frequency_offset,timeslot_time_offset, repeat_count, ordinal) " +
"VALUES (@parent,@tid,@tfoffset,@ttoffset,@rcount,@ordinal)";
command.Parameters.AddWithValue("@parent", NpgsqlTypes.NpgsqlDbType.Uuid, guid);
command.Parameters.AddWithValue("@tid", NpgsqlTypes.NpgsqlDbType.Integer, (int)timeslot.TimeslotId);
command.Parameters.AddWithValue("@tfoffset", NpgsqlTypes.NpgsqlDbType.Bigint, (long)timeslot.TimeslotFrequencyOffset);
command.Parameters.AddWithValue("@ttoffset", NpgsqlTypes.NpgsqlDbType.Bigint, (long)timeslot.TimeslotTimeOffset);
command.Parameters.AddWithValue("@rcount", NpgsqlTypes.NpgsqlDbType.Integer, (int)timeslot.RepeatCount);
command.Parameters.AddWithValue("@ordinal", NpgsqlTypes.NpgsqlDbType.Integer, ordinal);
command.ExecuteNonQuery();
}
private HashSet<Tuple<int, int>> _sptCache;
public bool TestForSatellitePosition(ushort interactiveNetworkId, Spt.Satellite satellite)
{
timNid = interactiveNetworkId;
if (_sptCache == null)
_sptCache = new HashSet<Tuple<int, int>>();
Tuple<int, int> key = new Tuple<int, int>(interactiveNetworkId, satellite.Id);
if (_sptCache.Contains(key))
return true;
bool result;
using (NpgsqlConnection connection = new NpgsqlConnection(connectionStringBuilder.ToString()))
{
connection.Open();
NpgsqlCommand command = connection.CreateCommand();
command.CommandText = "SELECT dateadded FROM dvb_ic_spt WHERE network_id = @nid AND satellite_id = @sid";
command.Parameters.AddWithValue("@nid", (int)interactiveNetworkId);
command.Parameters.AddWithValue("@sid", (int)satellite.Id);
NpgsqlDataReader dataReader = command.ExecuteReader();
result = dataReader.Read();
dataReader.Close();
command.Dispose();
connection.Close();
}
_sptCache.Add(key);
return result;
}
public void StoreSatellitePosition(ushort interactiveNetworkId, Spt.Satellite satellite)
{
timNid = interactiveNetworkId;
if (_sptCache == null)
_sptCache = new HashSet<Tuple<int, int>>();
Tuple<int, int> key = new Tuple<int, int>(interactiveNetworkId, satellite.Id);
if (_sptCache.Contains(key))
return;
_sptCache.Add(key);
EnqueueTask(x => StoreSatellitePositionEx(x, interactiveNetworkId, satellite));
}
private void StoreSatellitePositionEx(NpgsqlConnection x, ushort interactiveNetworkId, Spt.Satellite satellite)
{
timNid = interactiveNetworkId;
NpgsqlCommand command = x.CreateCommand();
command.CommandText = "INSERT INTO dvb_ic_spt (network_id, satellite_id, x, y, z) VALUES (@nid,@sid,@x,@y,@z)";
command.Parameters.AddWithValue("@nid", NpgsqlTypes.NpgsqlDbType.Integer, (int)interactiveNetworkId);
command.Parameters.AddWithValue("@sid", NpgsqlTypes.NpgsqlDbType.Integer, (int)satellite.Id);
command.Parameters.AddWithValue("@x", NpgsqlTypes.NpgsqlDbType.Bigint, (long)satellite.X);
command.Parameters.AddWithValue("@y", NpgsqlTypes.NpgsqlDbType.Bigint, (long)satellite.Y);
command.Parameters.AddWithValue("@z", NpgsqlTypes.NpgsqlDbType.Bigint, (long)satellite.Z);
command.ExecuteNonQuery();
}
public void CreateTim(PhysicalAddress mac)
{
if (timNid == null)
return;
if (_tims == null)
_tims = new List<PhysicalAddress>();
if (_tims.Contains(mac))
return;
_tims.Add(mac);
EnqueueTask(x => CreateTimEx(x, mac, timNid.Value));
}
private void CreateTimEx(NpgsqlConnection x, PhysicalAddress mac, ushort nid)
{
NpgsqlCommand command = x.CreateCommand();
command.CommandText = "INSERT INTO dvb_ic_tim (mac,nid) VALUES (@mac,@nid)";
command.Parameters.AddWithValue("@mac", NpgsqlTypes.NpgsqlDbType.MacAddr, mac);
command.Parameters.AddWithValue("@nid", NpgsqlTypes.NpgsqlDbType.Integer, (int)nid);
command.ExecuteNonQuery();
}
private List<PhysicalAddress> _tims;
public bool TestForTim(PhysicalAddress mac)
{
if (timNid == null)
return true;
if (_tims == null)
_tims = new List<PhysicalAddress>();
if (_tims.Contains(mac))
return true;
bool result;
using (NpgsqlConnection connection = new NpgsqlConnection(connectionStringBuilder.ToString()))
{
connection.Open();
NpgsqlCommand command = connection.CreateCommand();
command.CommandText = "SELECT dateadded FROM dvb_ic_tim WHERE mac = @mac AND nid = @nid";
command.Parameters.AddWithValue("@nid", NpgsqlTypes.NpgsqlDbType.Integer, (int)timNid.Value);
command.Parameters.AddWithValue("@mac", NpgsqlTypes.NpgsqlDbType.MacAddr, mac);
NpgsqlDataReader dataReader = command.ExecuteReader();
result = dataReader.Read();
dataReader.Close();
command.Dispose();
connection.Close();
}
if (result)
_tims.Add(mac);
return result;
}
private List<PhysicalAddress> _correctedTims;
public bool CorrectTim(PhysicalAddress mac, _0xa1_CorrectionMessageDescriptor cmd)
{
if (timNid == null)
return false;
if (_correctedTims == null)
_correctedTims = new List<PhysicalAddress>();
if (_correctedTims.Contains(mac))
return false;
_correctedTims.Add(mac);
EnqueueTask(x => CorrectTimEx(x, mac, cmd,timNid.Value));
return true;
}
private void CorrectTimEx(NpgsqlConnection x, PhysicalAddress mac, _0xa1_CorrectionMessageDescriptor cmdKnown, ushort nid)
{
_0xa1_CorrectionMessageDescriptor cmdNew = new _0xa1_CorrectionMessageDescriptor(CorrectionMessageSlotType.TRF, 0, null, null, null, 0);
NpgsqlCommand selectCommand = x.CreateCommand();
selectCommand.CommandText = "SELECT cmd_slot_type, cmd_burst_time_scaling, cmd_burst_time_correction, cmd_power_correction, cmd_esn0, cmd_frequency_correction " +
"FROM dvb_ic_tim " +
"WHERE mac = @mac AND nid = @nid";
selectCommand.Parameters.AddWithValue("@mac", NpgsqlTypes.NpgsqlDbType.MacAddr, mac);
selectCommand.Parameters.AddWithValue("@nid", NpgsqlTypes.NpgsqlDbType.Integer, (int)timNid.Value);
NpgsqlDataReader dataReader = selectCommand.ExecuteReader();
if (dataReader.Read())
{
if (!dataReader.IsDBNull(0) && !dataReader.IsDBNull(1) && !dataReader.IsDBNull(5))
{
CorrectionMessageSlotType slotType = (CorrectionMessageSlotType)dataReader.GetInt32(0);
int burstTimeScaling = dataReader.GetInt32(1);
uint? burstTimeCorrection = null;
if (!dataReader.IsDBNull(2))
burstTimeCorrection = (uint)dataReader.GetInt64(2);
int? powerCorrection = null;
if (!dataReader.IsDBNull(3))
powerCorrection = dataReader.GetInt32(3);
int? esn0 = null;
if (!dataReader.IsDBNull(4))
esn0 = dataReader.GetInt32(4);
ushort frequencyCorrection = (ushort)dataReader.GetInt32(5);
cmdNew = new _0xa1_CorrectionMessageDescriptor(slotType, burstTimeScaling, burstTimeCorrection, powerCorrection, esn0, frequencyCorrection);
}
}
dataReader.Close();
selectCommand.Dispose();
if (cmdKnown.Equals(cmdNew))
return;
NpgsqlCommand updateCommand = x.CreateCommand();
updateCommand.CommandText = "UPDATE dvb_ic_tim " +
"SET cmd_slot_type = @stype, cmd_burst_time_scaling = @btscaling, cmd_burst_time_correction = @btcorrection, cmd_power_correction = @pcorrection, cmd_esn0 = @cesn, " +
"cmd_frequency_correction = @fcorrection, version = version + 1, dateupdated = CURRENT_TIMESTAMP " +
"WHERE mac = @mac AND nid = @nid";
updateCommand.Parameters.Add("@stype", NpgsqlTypes.NpgsqlDbType.Integer);
updateCommand.Parameters.Add("@btscaling", NpgsqlTypes.NpgsqlDbType.Integer);
updateCommand.Parameters.Add("@btcorrection", NpgsqlTypes.NpgsqlDbType.Bigint);
updateCommand.Parameters.Add("@pcorrection", NpgsqlTypes.NpgsqlDbType.Integer);
updateCommand.Parameters.Add("@esn", NpgsqlTypes.NpgsqlDbType.Integer);
updateCommand.Parameters.Add("@fcorrection", NpgsqlTypes.NpgsqlDbType.Integer);
updateCommand.Parameters.Add("@mac", NpgsqlTypes.NpgsqlDbType.MacAddr);
updateCommand.Parameters["@stype"].Value = cmdNew.SlotType;
updateCommand.Parameters["@btscaling"].Value = cmdNew.BurstTimeScaling;
updateCommand.Parameters["@btcorrection"].Value = cmdNew.BurstTimeCorrection;
updateCommand.Parameters["@pcorrection"].Value = cmdNew.PowerCorrection;
updateCommand.Parameters["@esn"].Value = cmdNew.EsN0;
updateCommand.Parameters["@fcorrection"].Value = cmdNew.FrequencyCorrection;
updateCommand.Parameters["@mac"].Value = mac;
updateCommand.Parameters.AddWithValue("@nid", NpgsqlTypes.NpgsqlDbType.Integer, (int)timNid.Value);
SetNulls(updateCommand);
int a = updateCommand.ExecuteNonQuery();
Debug.Assert(a != 0);
}
private List<PhysicalAddress> contentedTims;
public bool ContentionTim(PhysicalAddress mac, _0xab_ContentionControlDescriptor ccdNew)
{
if (timNid == null)
return false;
if (contentedTims == null)
contentedTims = new List<PhysicalAddress>();
if (contentedTims.Contains(mac))
return false;
bool needUpdate = true;
using (NpgsqlConnection connection = new NpgsqlConnection(connectionStringBuilder.ToString()))
{
connection.Open();
NpgsqlCommand command = connection.CreateCommand();
command.CommandText = "SELECT ccd_superframe_id, ccd_csc_response_timeout, ccd_csc_max_losses, ccd_max_time_before_retry " +
"FROM dvb_ic_tim " +
"WHERE mac = @mac AND nid = @nid";
command.Parameters.AddWithValue("@mac", NpgsqlTypes.NpgsqlDbType.MacAddr, mac);
command.Parameters.AddWithValue("@nid", NpgsqlTypes.NpgsqlDbType.Integer, (int)timNid.Value);
NpgsqlDataReader dataReader = command.ExecuteReader();
if (dataReader.Read())
{
if (!dataReader.IsDBNull(0))
{
int ccdSuperframeId = dataReader.GetInt32(0);
long ccdCscResponseTimeout = dataReader.GetInt64(1);
int ccdCscMaxLosses = dataReader.GetInt32(2);
long ccdMaxTimeBeforeRetry = dataReader.GetInt64(3);
_0xab_ContentionControlDescriptor ccdInDb = new _0xab_ContentionControlDescriptor((byte)ccdSuperframeId, (uint)ccdCscResponseTimeout, (byte)ccdCscMaxLosses, (uint)ccdMaxTimeBeforeRetry);
needUpdate = !ccdNew.Equals(ccdInDb);
}
}
dataReader.Close();
command.Dispose();
connection.Close();
}
contentedTims.Add(mac);
if (needUpdate)
{
EnqueueTask(x => ContentionTimEx(x, mac, timNid.Value, ccdNew));
}
return needUpdate;
}
private void ContentionTimEx(NpgsqlConnection x, PhysicalAddress mac, ushort value, _0xab_ContentionControlDescriptor ccdNew)
{
NpgsqlCommand command = x.CreateCommand();
command.CommandText = "UPDATE dvb_ic_tim " +
"SET ccd_superframe_id = @sid, ccd_csc_response_timeout = @crtimeout, ccd_csc_max_losses = @cmlosses, ccd_max_time_before_retry = @mtbretry, " +
" version = version + 1, dateupdated = CURRENT_TIMESTAMP " +
"WHERE mac = @mac AND nid = @nid";
command.Parameters.AddWithValue("@sid", ccdNew.SuperframeId);
command.Parameters.AddWithValue("@crtimeout", (long)ccdNew.CscResponseTimeout);
command.Parameters.AddWithValue("@cmlosses", ccdNew.CscMaxLosses);
command.Parameters.AddWithValue("@mtbretry", (long)ccdNew.MaxTimeBeforeRetry);
command.Parameters.AddWithValue("@mac", NpgsqlTypes.NpgsqlDbType.MacAddr, mac);
command.Parameters.AddWithValue("@nid", NpgsqlTypes.NpgsqlDbType.Integer, (int)timNid.Value);
command.ExecuteNonQuery();
}
private List<PhysicalAddress> correctionControlledTims;
public bool CorrectionControlTim(PhysicalAddress mac, _0xac_CorrectionControlDescriptor newCcd)
{
if (timNid == null)
return false;
if (correctionControlledTims == null)
correctionControlledTims = new List<PhysicalAddress>();
if (correctionControlledTims.Contains(mac))
return false;
bool needUpdate = true;
using (NpgsqlConnection connection = new NpgsqlConnection(connectionStringBuilder.ToString()))
{
connection.Open();
NpgsqlCommand command = connection.CreateCommand();
command.CommandText = "SELECT ccd_acq_response_timeout, ccd_sync_response_timeout, ccd_acq_max_losses, ccd_sync_max_losses " +
"FROM dvb_ic_tim " +
"WHERE mac = @mac AND nid = @nid";
command.Parameters.AddWithValue("@mac", NpgsqlTypes.NpgsqlDbType.MacAddr, mac);
command.Parameters.AddWithValue("@nid", NpgsqlTypes.NpgsqlDbType.Integer, (int)timNid.Value);
NpgsqlDataReader dataReader = command.ExecuteReader();
if (dataReader.Read())
{
if (!dataReader.IsDBNull(0))
{
long acqResonseTimeout = dataReader.GetInt64(0);
long syncResponseTimeout = dataReader.GetInt64(1);
int acqMaxLosses = dataReader.GetInt32(2);
int syncMaxLosses = dataReader.GetInt32(3);
_0xac_CorrectionControlDescriptor ccdInDb = new _0xac_CorrectionControlDescriptor((uint)acqResonseTimeout,(uint)syncResponseTimeout, (byte)acqMaxLosses, (byte)syncMaxLosses);
needUpdate = !newCcd.Equals(ccdInDb);
}
}
dataReader.Close();
command.Dispose();
connection.Close();
}
if (needUpdate)
EnqueueTask(x => CorrectionControlTimEx(x, timNid.Value, mac, newCcd));
return needUpdate;
}
private void CorrectionControlTimEx(NpgsqlConnection x, ushort value, PhysicalAddress mac, _0xac_CorrectionControlDescriptor newCcd)
{
NpgsqlCommand command = x.CreateCommand();
command.CommandText = "UPDATE dvb_ic_tim " +
"SET ccd_acq_response_timeout = @artimeout, ccd_sync_response_timeout = @srtimeout, ccd_acq_max_losses = @amlosses, ccd_sync_max_losses = @smlosses, version = version + 1, dateupdated = CURRENT_TIMESTAMP " +
"WHERE mac = @mac AND nid = @nid";
command.Parameters.AddWithValue("@artimeout", (long)newCcd.AcqResponseTimeout);
command.Parameters.AddWithValue("@srtimeout", (long)newCcd.SyncResponseTimeout);
command.Parameters.AddWithValue("@amlosses", newCcd.AcqMaxLosses);
command.Parameters.AddWithValue("@smlosses", newCcd.SyncMaxLosses);
command.Parameters.AddWithValue("@mac", NpgsqlTypes.NpgsqlDbType.MacAddr, mac);
command.Parameters.AddWithValue("@nid", NpgsqlTypes.NpgsqlDbType.Integer, (int)timNid.Value);
command.ExecuteNonQuery();
}
private Dictionary<Tuple<ushort, PhysicalAddress>, byte[]> _networkLayerInfoTims;
public bool NetworkLayerInfoTim(PhysicalAddress mac, _0xa0_NetworkLayerInfoDescriptor nlid, DateTime timestamp)
{
if (timNid == null)
return false;
if (_networkLayerInfoTims == null)
_networkLayerInfoTims = new Dictionary<Tuple<ushort, PhysicalAddress>, byte[]>();
Tuple<ushort, PhysicalAddress> coordinate = new Tuple<ushort, PhysicalAddress>(timNid.Value, mac);
if (!_networkLayerInfoTims.ContainsKey(coordinate))
{
byte[] newValue = new byte[0];
using (NpgsqlConnection connection = new NpgsqlConnection(connectionStringBuilder.ToString()))
{
connection.Open();
NpgsqlCommand command = connection.CreateCommand();
command.CommandText = "SELECT nli_message \r\nFROM dvb_ic_tim \r\nWHERE mac = @mac AND nid = @nid\r\n";
command.Parameters.AddWithValue("@mac", NpgsqlTypes.NpgsqlDbType.MacAddr, mac);
command.Parameters.AddWithValue("@nid", NpgsqlTypes.NpgsqlDbType.Integer, (int)timNid.Value);
NpgsqlDataReader dataReader = command.ExecuteReader();
if (dataReader.Read())
{
if (!dataReader.IsDBNull(0))
{
newValue = dataReader.GetByteArray(0);
}
}
dataReader.Close();
command.Dispose();
connection.Close();
}
_networkLayerInfoTims.Add(coordinate, newValue);
}
byte[] known = _networkLayerInfoTims[coordinate];
byte[] candi = nlid.MessageBuffer;
if (!AreArraysEqual(known,candi))
{
EnqueueTask(x => NetworkLayerInfoTimEx(x, coordinate, nlid));
return true;
}
return false;
}
private bool AreArraysEqual(byte[] l, byte[] r)
{
if (l.Length != r.Length)
return false;
for (int i = 0; i < l.Length; i++)
{
if (l[i] != r[i])
return false;
}
return true;
}
private void NetworkLayerInfoTimEx(NpgsqlConnection x, Tuple<ushort, PhysicalAddress> coordinate, _0xa0_NetworkLayerInfoDescriptor nlid)
{
NpgsqlCommand command = x.CreateCommand();
command.CommandText = "UPDATE dvb_ic_tim\r\nSET nli_message = @message, version = version + 1, dateupdated = CURRENT_TIMESTAMP\r\nWHERE mac = @mac AND nid = @nid";
command.Parameters.AddWithValue("@message", NpgsqlTypes.NpgsqlDbType.Bytea, nlid.MessageBuffer);
command.Parameters.AddWithValue("@mac", NpgsqlTypes.NpgsqlDbType.MacAddr, coordinate.Item2);
command.Parameters.AddWithValue("@nid", NpgsqlTypes.NpgsqlDbType.Integer, (int)coordinate.Item1);
command.ExecuteNonQuery();
}
}
}

View File

@ -0,0 +1,724 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Npgsql;
using NpgsqlTypes;
using skyscraper5.Dvb.Descriptors;
using skyscraper5.Dvb.Descriptors.Extension;
using skyscraper5.Dvb.Psi.Model;
using skyscraper5.Skyscraper.Scraper.Storage.Utilities;
namespace skyscraper5.Data.PostgreSql
{
public partial class PostgresqlDataStore
{
private HashSet<DatabaseKeyNitNetwork> knownNitNetworks;
public bool TestForNitNetwork(NitNetwork nitNetwork)
{
if (knownNitNetworks == null)
knownNitNetworks = new HashSet<DatabaseKeyNitNetwork>();
DatabaseKeyNitNetwork key = new DatabaseKeyNitNetwork(nitNetwork.NetworkId);
if (knownNitNetworks.Contains(key))
return true;
bool result = false;
using (NpgsqlConnection conn = new NpgsqlConnection(connectionStringBuilder.ToString()))
{
conn.Open();
NpgsqlCommand command = conn.CreateCommand();
command.CommandText = "SELECT dateadded FROM dvb_nit WHERE id = @id";
command.Parameters.AddParameter("@id", NpgsqlDbType.Integer, nitNetwork.NetworkId);
NpgsqlDataReader dataReader = command.ExecuteReader();
result = dataReader.Read();
dataReader.Close();
dataReader.Dispose();
command.Dispose();
conn.Close();
}
if (result)
knownNitNetworks.Add(key);
return result;
}
public void StoreNitNetwork(NitNetwork nitNetwork)
{
if (_knownUpdatedNitNetworks == null)
_knownUpdatedNitNetworks = new HashSet<DatabaseKeyNitNetwork>();
DatabaseKeyNitNetwork key = new DatabaseKeyNitNetwork(nitNetwork.NetworkId);
EnqueueTask(x => WriteNit(x, nitNetwork));
knownNitNetworks.Add(key);
_knownUpdatedNitNetworks.Add(key);
}
private void WriteNit(NpgsqlConnection connection, NitNetwork nitNetwork)
{
NpgsqlCommand command = connection.CreateCommand();
command.CommandText =
"INSERT INTO dvb_nit (id, name, 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, @private_data_specifier_id, @xait_pid, @region_name_country_code, @region_name_language_code, @region_country_code, @min_polling_interval, @uri, @uri_linkage_type)";
command.Parameters.AddParameter("@id", NpgsqlDbType.Integer, nitNetwork.NetworkId);
string name = nitNetwork.Name;
if (name != null)
name = name.Replace("\0", "");
command.Parameters.AddParameter("@name", NpgsqlDbType.Text, name);
command.Parameters.AddParameter("@private_data_specifier_id", NpgsqlDbType.Bigint, (long?)nitNetwork.PrivateDataSpecifierId);
command.Parameters.AddParameter("@xait_pid", NpgsqlDbType.Integer, (int?)nitNetwork.XaitPid);
command.Parameters.AddParameter("@region_name_country_code", NpgsqlDbType.Varchar, nitNetwork.RegionCountryCode);
command.Parameters.AddParameter("@region_name_language_code", NpgsqlDbType.Varchar, nitNetwork.RegionNameLanguageCode);
command.Parameters.AddParameter("@region_country_code", NpgsqlDbType.Varchar, nitNetwork.RegionCountryCode);
command.Parameters.AddParameter("@min_polling_interval", NpgsqlDbType.Integer, (int?)nitNetwork.MinPollingInterval);
command.Parameters.AddParameter("@uri", NpgsqlDbType.Text, nitNetwork.Uri);
command.Parameters.AddParameter("@uri_linkage_type", NpgsqlDbType.Integer, (int?)nitNetwork.UriLinkageType);
command.ExecuteNonQuery();
WriteNitCells(connection, nitNetwork);
WriteNitLinkages(connection, nitNetwork);
WriteNitMessage(connection, nitNetwork);
WriteNitMultilingualNetworkNames(connection, nitNetwork);
WriteNitRegionNames(connection, nitNetwork);
WriteNitRegions(connection, nitNetwork);
WriteNitServiceList(connection, nitNetwork);
}
private void WriteNitServiceList(NpgsqlConnection connection, NitNetwork nitNetwork)
{
if (nitNetwork.ServiceList == null)
return;
foreach (ServiceListDescriptor.Service service in nitNetwork.ServiceList)
{
throw new NotImplementedException();
}
}
private void WriteNitRegions(NpgsqlConnection connection, NitNetwork nitNetwork)
{
if (nitNetwork.Regions == null)
return;
foreach (TargetRegionDescriptor.TargetRegion region in nitNetwork.Regions)
{
throw new NotImplementedException();
}
}
private void WriteNitRegionNames(NpgsqlConnection connection, NitNetwork nitNetwork)
{
if (nitNetwork.RegionNames == null)
return;
foreach (TargetRegionNameDescriptor.TargetRegionName name in nitNetwork.RegionNames)
{
throw new NotImplementedException();
}
}
private void WriteNitMultilingualNetworkNames(NpgsqlConnection connection, NitNetwork nitNetwork)
{
if (nitNetwork.MultilingualNetworkName == null)
return;
NpgsqlCommand cmd = connection.CreateCommand();
cmd.CommandText = "insert into dvb_nit_multilingual_network_names (id, k, v) values (@id,@k,@v)";
cmd.Parameters.AddWithValue("@id", NpgsqlDbType.Integer, (int)nitNetwork.NetworkId);
cmd.Parameters.Add("@k", NpgsqlDbType.Varchar);
cmd.Parameters.Add("@v", NpgsqlDbType.Text);
foreach (KeyValuePair<string, string> keyValuePair in nitNetwork.MultilingualNetworkName)
{
cmd.Parameters["@k"].Value = keyValuePair.Key;
cmd.Parameters["@v"].Value = keyValuePair.Value;
cmd.ExecuteNonQuery();
}
}
private void WriteNitMessage(NpgsqlConnection connection, NitNetwork nitNetwork)
{
if (nitNetwork.Messages == null)
return;
foreach (MessageDescriptor message in nitNetwork.Messages)
{
throw new NotImplementedException();
}
}
private void WriteNitLinkages(NpgsqlConnection connection, NitNetwork nitNetwork)
{
if (nitNetwork.Linkages == null)
return;
NpgsqlCommand command = connection.CreateCommand();
command.CommandText =
"insert into dvb_nit_linkages (id, ordinal, l_tsid, l_onid, l_sid, 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) " +
"values " +
"(@id,@ordinal,@l_tsid,@l_onid,@l_sid,@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)";
command.Parameters.AddParameter("@id", NpgsqlDbType.Integer, nitNetwork.NetworkId);
command.Parameters.Add("@ordinal", NpgsqlDbType.Integer);
command.Parameters.Add("@l_tsid", NpgsqlDbType.Integer);
command.Parameters.Add("@l_onid", NpgsqlDbType.Integer);
command.Parameters.Add("@l_sid", NpgsqlDbType.Integer);
command.Parameters.Add("@linkage_type", NpgsqlDbType.Integer);
command.Parameters.Add("@handover_type", NpgsqlDbType.Integer);
command.Parameters.Add("@handover_origin_type", NpgsqlDbType.Boolean);
command.Parameters.Add("@handover_network_id", NpgsqlDbType.Integer);
command.Parameters.Add("@handover_initial_service_id", NpgsqlDbType.Integer);
command.Parameters.Add("@target_event_id", NpgsqlDbType.Integer);
command.Parameters.Add("@target_event_listed", NpgsqlDbType.Boolean);
command.Parameters.Add("@target_event_simulcasted", NpgsqlDbType.Boolean);
//@table_type,@private_data_bytes,@bouquet_id)";
command.Parameters.Add("@table_type", NpgsqlDbType.Integer);
command.Parameters.Add("@private_data_bytes", NpgsqlDbType.Bytea);
command.Parameters.Add("@bouquet_id", NpgsqlDbType.Integer);
for (int i = 0; i < nitNetwork.Linkages.Count; i++)
{
LinkageDescriptor linkage = nitNetwork.Linkages[i];
command.Parameters["@id"].Value = (int)nitNetwork.NetworkId;
command.Parameters["@ordinal"].Value = i;
command.Parameters["@l_tsid"].Value = (int)linkage.TransportStreamId;
command.Parameters["@l_onid"].Value = (int)linkage.OriginalNetworkId;
command.Parameters["@l_sid"].Value = (int)linkage.ServiceId;
command.Parameters["@linkage_type"].Value = (int)linkage.LinkageType;
command.Parameters["@handover_type"].Value = linkage.HandoverType.HasValue ? linkage.HandoverType.Value : DBNull.Value;
command.Parameters["@handover_origin_type"].Value = linkage.HandoverOriginType.HasValue ? linkage.HandoverOriginType.Value : DBNull.Value;
command.Parameters["@handover_network_id"].Value = linkage.HandoverNetworkId.HasValue ? linkage.HandoverNetworkId.Value : DBNull.Value;
command.Parameters["@handover_initial_service_id"].Value = linkage.HandoverInitialServiceId.HasValue ? linkage.HandoverInitialServiceId.Value : DBNull.Value;
command.Parameters["@target_event_id"].Value = linkage.TargetEventId.HasValue ? linkage.TargetEventId.Value : DBNull.Value;
command.Parameters["@target_event_listed"].Value = linkage.TargetEventListed.HasValue ? linkage.TargetEventListed.Value : DBNull.Value;
command.Parameters["@target_event_simulcasted"].Value = linkage.TargetEventSimulcasted.HasValue ? linkage.TargetEventSimulcasted.Value : DBNull.Value;
command.Parameters["@table_type"].Value = linkage.TableType.HasValue ? (int)linkage.TableType.Value : DBNull.Value;
command.Parameters["@private_data_bytes"].Value = linkage.PrivateDataBytes != null ? linkage.PrivateDataBytes : DBNull.Value;
command.Parameters["@bouquet_id"].Value = linkage.BouquetId.HasValue ? linkage.BouquetId : DBNull.Value;
command.ExecuteNonQuery();
WriteNitLinkageExtendedEventLinkages(connection, nitNetwork, linkage);
WriteNitLinkageIpmacLinkages(connection, nitNetwork, i);
WriteNitLinkageSsuLinkStructure(connection, nitNetwork, i);
}
}
private void WriteNitLinkageSsuLinkStructure(NpgsqlConnection connection, NitNetwork nitNetwork, int ordinal)
{
LinkageDescriptor linkage = nitNetwork.Linkages[ordinal];
if (linkage.SystemSoftwareUpdateLinkStructure == null)
return;
NpgsqlCommand command = connection.CreateCommand();
command.CommandText =
"INSERT INTO dvb_nit_linkages_ssu_link_structure (id, ordinal, subordinal, oui, selector) " +
"VALUES (@id, @ordinal, @subordinal, @oui, @selector)";
command.Parameters.AddWithValue("@id", NpgsqlDbType.Integer, (int)nitNetwork.NetworkId);
command.Parameters.AddWithValue("@ordinal", NpgsqlDbType.Integer, ordinal);
command.Parameters.Add("@subordinal", NpgsqlDbType.Integer);
command.Parameters.Add("@oui", NpgsqlDbType.Varchar);
command.Parameters.Add("@selector", NpgsqlDbType.Bytea);
for (int i = 0; i < linkage.SystemSoftwareUpdateLinkStructure.Count; i++)
{
LinkageDescriptor.OuiPrivateData ssuLinkStructure = linkage.SystemSoftwareUpdateLinkStructure[i];
command.Parameters["@subordinal"].Value = i;
command.Parameters["@oui"].Value = BitConverter.ToString(ssuLinkStructure.OUI);
command.Parameters["@selector"].Value = ssuLinkStructure.Selector;
command.ExecuteNonQuery();
}
}
private void WriteNitLinkageIpmacLinkages(NpgsqlConnection connection, NitNetwork nitNetwork, int ordinal)
{
LinkageDescriptor linkage = nitNetwork.Linkages[ordinal];
if (linkage.IpMacNotificationLinkages == null)
return;
foreach (LinkageDescriptor.IpMacNotificationLinkage ipMacNotificationLinkage in linkage.IpMacNotificationLinkages)
{
throw new NotImplementedException();
}
}
private void WriteNitLinkageExtendedEventLinkages(NpgsqlConnection connection, NitNetwork nitNetwork, LinkageDescriptor linkage)
{
if (linkage.ExtendedEventLinkages == null)
return;
for (int i = 0; i < linkage.ExtendedEventLinkages.Length; i++)
{
LinkageDescriptor.ExtendedEventLinkageInfo extendedEventLinkage = linkage.ExtendedEventLinkages[i];
throw new NotImplementedException();
}
}
private void WriteNitCells(NpgsqlConnection connection, NitNetwork nitNetwork)
{
if (nitNetwork.Cells == null)
return;
NpgsqlCommand npgsqlCommand = connection.CreateCommand();
npgsqlCommand.CommandText = "insert into dvb_nit_cells (id, cell_id, cell_lat, cell_lon, extent_lat, extent_lon) values (@id,@cellid,@cellat,@celllon,@extlat,@extlon)";
npgsqlCommand.Parameters.AddWithValue("@id", (int)nitNetwork.NetworkId);
npgsqlCommand.Parameters.Add("@cellid", NpgsqlDbType.Integer);
npgsqlCommand.Parameters.Add("@cellat", NpgsqlDbType.Integer);
npgsqlCommand.Parameters.Add("@celllon", NpgsqlDbType.Integer);
npgsqlCommand.Parameters.Add("@extlat", NpgsqlDbType.Bigint);
npgsqlCommand.Parameters.Add("@extlon", NpgsqlDbType.Bigint);
foreach (CellListDescriptor.Cell cell in nitNetwork.Cells)
{
npgsqlCommand.Parameters["@cellid"].Value = (int)cell.CellId;
npgsqlCommand.Parameters["@cellat"].Value = (int)cell.CellLatitude;
npgsqlCommand.Parameters["@celllon"].Value = (int)cell.CellLongitude;
npgsqlCommand.Parameters["@extlat"].Value = (long)cell.ExtentOfLatitude;
npgsqlCommand.Parameters["@extlon"].Value = (long)cell.ExtentOfLongitude;
npgsqlCommand.ExecuteNonQuery();
if (cell.Subcells != null)
{
if (cell.Subcells.Length > 0)
{
WriteNitSubcells(connection, nitNetwork.NetworkId, cell.CellId, cell.Subcells);
}
}
}
}
private void WriteNitSubcells(NpgsqlConnection connection, int networkId, int cellId, CellListDescriptor.Subcell[] subcells)
{
NpgsqlCommand command = connection.CreateCommand();
command.CommandText = "insert into dvb_nit_cells_subcells (id, cell_id, cell_id_extension, subcell_lat, subcell_lon, subcell_extent_lat, subcell_extent_lon) " +
"values (@nid,@cellid,@cellex,@subcelllat,@subcellon,@sbucellextlat,@subcell_extent_lon)";
command.Parameters.AddWithValue("@nid", networkId);
command.Parameters.AddWithValue("@cellid", cellId);
command.Parameters.Add("@cellex", NpgsqlDbType.Integer);
command.Parameters.Add("@subcelllat", NpgsqlDbType.Integer);
command.Parameters.Add("@subcellon", NpgsqlDbType.Integer);
command.Parameters.Add("@sbucellextlat", NpgsqlDbType.Integer);
command.Parameters.Add("@subcell_extent_lon", NpgsqlDbType.Integer);
foreach(CellListDescriptor.Subcell subcell in subcells)
{
command.Parameters["@cellex"].Value = (int)subcell.CellIdExtension;
command.Parameters["@subcelllat"].Value = (int)subcell.SubcellLatitude;
command.Parameters["@subcellon"].Value = (int)subcell.SubcellLongitude;
command.Parameters["@sbucellextlat"].Value = (int)subcell.CellIdExtension;
command.Parameters["@subcell_extent_lon"].Value = (int)subcell.CellIdExtension;
command.ExecuteNonQuery();
}
}
private HashSet<DatabaseKeyNitTs> _knownNitTs;
public bool TestForNitTransportStream(ushort networkId, NitTransportStream transportStream)
{
if (_knownNitTs == null)
_knownNitTs = new HashSet<DatabaseKeyNitTs>();
DatabaseKeyNitTs key = new DatabaseKeyNitTs(networkId, transportStream.TransportStreamId);
if (_knownNitTs.Contains(key))
return true;
bool result = false;
using (NpgsqlConnection conn = new NpgsqlConnection(connectionStringBuilder.ToString()))
{
conn.Open();
NpgsqlCommand command = conn.CreateCommand();
command.CommandText =
"SELECT dateadded FROM dvb_nit_transport_stream WHERE nid = @nid AND tsid = @tsid";
command.Parameters.AddWithValue("@nid", NpgsqlDbType.Integer, (int)networkId);
command.Parameters.AddWithValue("@tsid", NpgsqlDbType.Integer, (int)transportStream.TransportStreamId);
NpgsqlDataReader dataReader = command.ExecuteReader();
result = dataReader.Read();
dataReader.Close();
command.Dispose();
}
if (result)
_knownNitTs.Add(key);
return result;
}
public void StoreNitTransportStream(ushort networkId, NitTransportStream transportStream)
{
EnqueueTask(x => WriteNitTransportStream(x, networkId, transportStream));
DatabaseKeyNitTs ts = new DatabaseKeyNitTs(networkId, transportStream.TransportStreamId);
_knownNitTs.Add(ts);
if (_knownUpdatedNitTransportStream == null)
return;
_knownUpdatedNitTransportStream.Add(ts);
}
private void WriteNitTransportStream(NpgsqlConnection conn, ushort networkId, NitTransportStream transportStream)
{
if (TestForNitTransportStream(networkId,transportStream))
{
return;
}
NpgsqlCommand command = conn.CreateCommand();
command.CommandText =
"insert into dvb_nit_transport_stream (nid, tsid, onid, east, fec_inner, frequency, orbital_position, polarization, roll_off, s2, symbol_rate, scrambling_sequence_index, input_stream_identifier, timeslice_number, ts_gs_mode, private_data_specifier_id, tfs_flag, bandwidth, guard_interval, other_frequency_flag, plp_id, siso_miso, t2_system_id, transmission_mode, coding_type, modulation_type, fec_outer, code_rate_hp_stream, code_rate_lp_stream, hierarchy_information, mpe_fec_indicator, priority, time_slicing_indicator, network_name, target_region_country_code) " +
"values " +
"(@nid,@tsid,@onid,@east,@fec_inner,@frequency,@orbital_position,@polarization,@roll_off,@s2,@symbol_rate,@scrambling_sequence_index,@input_stream_identifier,@timeslice_number,@ts_gs_mode,@private_data_specifier_id,\r\n @tfs_flag, @bandwidth, @guard_interval, @other_frequency_flag, @plp_id, @siso_miso,\r\n @t2_system_id, @transmission_mode, @coding_type, @modulation_type, @fec_outer,\r\n @code_rate_hp_stream, @code_rate_lp_stream, @hierarchy_information,\r\n @mpe_fec_indicator, @priority, @time_slicing_indicator, @network_name,\r\n @target_region_country_code);";
command.Parameters.AddParameter("@nid", NpgsqlDbType.Integer, (int)networkId);
command.Parameters.AddParameter("@tsid", NpgsqlDbType.Integer, transportStream.TransportStreamId);
command.Parameters.AddParameter("@onid", NpgsqlDbType.Integer, transportStream.OriginalNetworkId);
command.Parameters.AddParameter("@east", NpgsqlDbType.Boolean, transportStream.East);
command.Parameters.AddParameter("@fec_inner", NpgsqlDbType.Integer, (int?)transportStream.FecInner);
command.Parameters.AddParameter("@frequency", NpgsqlDbType.Bigint, transportStream.Frequency);
command.Parameters.AddParameter("@orbital_position", NpgsqlDbType.Real, transportStream.OrbitalPosition);
command.Parameters.AddParameter("@polarization", NpgsqlDbType.Integer, (int?)transportStream.Polarization);
command.Parameters.AddParameter("@roll_off", NpgsqlDbType.Real, transportStream.RollOff);
command.Parameters.AddParameter("@s2", NpgsqlDbType.Boolean, transportStream.S2);
command.Parameters.AddParameter("@symbol_rate", NpgsqlDbType.Bigint, transportStream.SymbolRate);
command.Parameters.AddParameter("@scrambling_sequence_index", NpgsqlDbType.Integer, transportStream.ScramblingSequenceIndex);
command.Parameters.AddParameter("@input_stream_identifier", NpgsqlDbType.Integer, transportStream.InputStreamIdentifier);
command.Parameters.AddParameter("@timeslice_number", NpgsqlDbType.Integer, transportStream.TimesliceNumber);
command.Parameters.AddParameter("@ts_gs_mode", NpgsqlDbType.Integer, (int?)transportStream.TsGsMode);
//@private_data_specifier_id,@tfs_flag,@bandwidth,@guard_interval,@other_frequency_flag,@plp_id,@siso_miso,@t2_system_id,@transmission_mode,@coding_type,@modulation_type,@fec_outer,@code_rate_hp_stream,
command.Parameters.AddParameter("@private_data_specifier_id", NpgsqlDbType.Bigint, (long?)transportStream.PrivateDataSpecifierId);
command.Parameters.AddParameter("@tfs_flag", NpgsqlDbType.Boolean, transportStream.TfsFlag);
command.Parameters.AddParameter("@bandwidth", NpgsqlDbType.Integer, transportStream.Bandwidth);
command.Parameters.AddParameter("@guard_interval", NpgsqlDbType.Integer, transportStream.GuardInterval);
command.Parameters.AddParameter("@other_frequency_flag", NpgsqlDbType.Boolean, transportStream.OtherFrequencyFlag);
command.Parameters.AddParameter("@plp_id", NpgsqlDbType.Integer, (int?)transportStream.PlpId);
command.Parameters.AddParameter("@siso_miso", NpgsqlDbType.Integer, transportStream.SisoMiso);
command.Parameters.AddParameter("@t2_system_id", NpgsqlDbType.Integer, (int?)transportStream.T2SystemId);
command.Parameters.AddParameter("@transmission_mode", NpgsqlDbType.Integer, transportStream.TransmissionMode);
command.Parameters.AddParameter("@coding_type", NpgsqlDbType.Integer, (int?)transportStream.CodingType);
command.Parameters.AddParameter("@modulation_type", NpgsqlDbType.Integer, transportStream.ModulationType);
command.Parameters.AddParameter("@fec_outer", NpgsqlDbType.Integer, (int?)transportStream.FecOuter);
command.Parameters.AddParameter("@code_rate_hp_stream", NpgsqlDbType.Integer, (int?)transportStream.CodeRateHpStream);
//@code_rate_lp_stream,@hierarchy_information,@mpe_fec_indicator,@priority,@time_slicing_indicator,@network_name,@target_region_country_code)";
command.Parameters.AddParameter("@code_rate_lp_stream", NpgsqlDbType.Integer, (int?)transportStream.CodeRateLpStream);
command.Parameters.AddParameter("@hierarchy_information", NpgsqlDbType.Integer, (int?)transportStream.HierarchyInformation);
command.Parameters.AddParameter("@mpe_fec_indicator", NpgsqlDbType.Boolean, transportStream.MpeFecIndicator);
command.Parameters.AddParameter("@priority", NpgsqlDbType.Boolean, transportStream.Priority);
command.Parameters.AddParameter("@time_slicing_indicator", NpgsqlDbType.Integer, (int?)transportStream.TimesliceNumber);
command.Parameters.AddParameter("@network_name", NpgsqlDbType.Text, transportStream.NetworkName);
command.Parameters.AddParameter("@target_region_country_code", NpgsqlDbType.Varchar, transportStream.TargetRegionCountryCode);
command.Parameters.CheckNulls();
command.ExecuteNonQuery();
InsertNitTransportStreamCellFrequencies(conn, networkId, transportStream);
InsertNitTransportStreamCellInfos(conn, networkId, transportStream);
InsertNitTransportStreamCells(conn, networkId, transportStream);
InsertNitTransportStreamCentreFrequencies(conn, networkId, transportStream);
InsertNitTransportStreamLinkages(conn, networkId, transportStream);
InsertNitTransportStreamServiceList(conn, networkId, transportStream);
InsertNitTransportStreamTargetRegions(conn, networkId, transportStream);
}
private void InsertNitTransportStreamTargetRegions(NpgsqlConnection conn, ushort networkId, NitTransportStream transportStream)
{
if (transportStream.TargetRegions == null)
return;
foreach (TargetRegionDescriptor.TargetRegion targetRegion in transportStream.TargetRegions)
{
throw new NotImplementedException();
}
}
private void InsertNitTransportStreamServiceList(NpgsqlConnection conn, ushort networkId, NitTransportStream transportStream)
{
if (transportStream.Services == null)
return;
if (transportStream.Services.Services == null)
return;
NpgsqlCommand command = conn.CreateCommand();
command.CommandText = "INSERT INTO dvb_nit_transport_stream_service_list (tsid, nid, sid, service_type)" +
"VALUES (@tsid, @nid, @sid, @service_type)";
command.Parameters.AddWithValue("@tsid", NpgsqlDbType.Integer, (int)transportStream.TransportStreamId);
command.Parameters.AddWithValue("@nid", NpgsqlDbType.Integer, (int)networkId);
command.Parameters.Add("@sid", NpgsqlDbType.Integer);
command.Parameters.Add("@service_type", NpgsqlDbType.Integer);
foreach (ServiceListDescriptor.Service service in transportStream.Services.Services)
{
command.Parameters["@sid"].Value = (int)service.ServiceId;
command.Parameters["@service_type"].Value = (int)service.ServiceType;
command.ExecuteNonQuery();
}
}
private void InsertNitTransportStreamLinkages(NpgsqlConnection conn, ushort networkId, NitTransportStream transportStream)
{
if (transportStream.Linkages == null)
return;
for (int i = 0; i < transportStream.Linkages.Count; i++)
{
LinkageDescriptor linkage = transportStream.Linkages[i];
throw new NotImplementedException();
}
}
private void InsertNitTransportStreamCentreFrequencies(NpgsqlConnection conn, ushort networkId, NitTransportStream transportStream)
{
if (transportStream.CentreFrequencies == null)
return;
foreach (uint transportStreamCentreFrequency in transportStream.CentreFrequencies)
{
throw new NotImplementedException();
}
}
private void InsertNitTransportStreamCells(NpgsqlConnection conn, ushort networkId, NitTransportStream transportStream)
{
if (transportStream.Cells == null)
return;
foreach (CellListDescriptor.Cell cell in transportStream.Cells)
{
throw new NotImplementedException();
}
}
private void InsertNitTransportStreamCellInfos(NpgsqlConnection conn, ushort networkId, NitTransportStream transportStream)
{
if (transportStream.CellInfos == null)
return;
NpgsqlCommand command = conn.CreateCommand();
command.CommandText = "insert into dvb_nit_transport_stream_cell_infos (onid, tsid, cell_id)\r\nvalues (@onid, @tsid, @cell_id)\r\n";
command.Parameters.AddWithValue("@onid", NpgsqlDbType.Integer, (int)networkId);
command.Parameters.AddWithValue("@tsid", NpgsqlDbType.Integer, (int)transportStream.TransportStreamId);
command.Parameters.Add("@cell_id", NpgsqlDbType.Integer);
foreach (T2DeliverySystemDescriptor.CellInfo cellInfo in transportStream.CellInfos)
{
command.Parameters["@cell_id"].Value = (int)cellInfo.CellId;
command.ExecuteNonQuery();
InsertNitTransportStreamCellInfoSubcellInfos(conn, networkId, transportStream.TransportStreamId, cellInfo);
InsertNitTransportStreamCellInfoCentreFrequencies(conn, networkId, transportStream.TransportStreamId, cellInfo);
}
}
private void InsertNitTransportStreamCellInfoCentreFrequencies(NpgsqlConnection conn, ushort networkId, ushort transportStreamId, T2DeliverySystemDescriptor.CellInfo cellInfo)
{
if (cellInfo.CentreFrequencies == null)
return;
NpgsqlCommand cmd = conn.CreateCommand();
cmd.CommandText = "insert into dvb_nit_transport_stream_cell_frequencies (nid, tsid, cell_id, frequency, ordinal)\r\nvalues (@nid,@tsid,@cell_id,@frequency,@ordinal)";
cmd.Parameters.AddWithValue("@nid", NpgsqlDbType.Integer, (int)networkId);
cmd.Parameters.AddWithValue("@tsid", NpgsqlDbType.Integer, (int)transportStreamId);
cmd.Parameters.AddWithValue("@cell_id", NpgsqlDbType.Integer, (int)cellInfo.CellId);
cmd.Parameters.Add("@frequency", NpgsqlDbType.Bigint);
cmd.Parameters.Add("@ordinal", NpgsqlDbType.Integer);
for (int i = 0; i < cellInfo.CentreFrequencies.Length; i++)
{
cmd.Parameters["@frequency"].Value = (long)cellInfo.CentreFrequencies[i];
cmd.Parameters["@ordinal"].Value = i;
cmd.ExecuteNonQuery();
}
}
private void InsertNitTransportStreamCellInfoSubcellInfos(NpgsqlConnection conn, ushort networkId, ushort transportStreamId, T2DeliverySystemDescriptor.CellInfo cellInfo)
{
if (cellInfo.SubcellInfos == null)
return;
foreach (T2DeliverySystemDescriptor.SubcellInfo m in cellInfo.SubcellInfos)
{
throw new NotImplementedException();
}
}
private void InsertNitTransportStreamCellFrequencies(NpgsqlConnection conn, ushort networkId, NitTransportStream transportStream)
{
if (transportStream.CellFrequencies == null)
return;
foreach (CellFrequencyLinkDescriptor.Cell cell in transportStream.CellFrequencies)
{
throw new NotImplementedException();
}
}
private HashSet<DatabaseKeyNitNetwork> _knownUpdatedNitNetworks;
public bool UpdateNitNetwork(NitNetwork nitNetwork)
{
if (_knownUpdatedNitNetworks == null)
_knownUpdatedNitNetworks = new HashSet<DatabaseKeyNitNetwork>();
nitNetwork.Sanitize();
DatabaseKeyNitNetwork key = new DatabaseKeyNitNetwork(nitNetwork.NetworkId);
if (_knownUpdatedNitNetworks.Contains(key))
return false;
EnqueueTask(x => WriteUpdateNitNetwork(x, nitNetwork));
_knownUpdatedNitNetworks.Add(key);
return true;
}
private void WriteUpdateNitNetwork(NpgsqlConnection connection, NitNetwork newer)
{
NitNetwork older = SelectNitNetwork(connection, newer.NetworkId);
if (!older.NeedsUpdate(newer))
return;
NpgsqlCommand command = connection.CreateCommand();
command.CommandText =
"update dvb_nit\r\nset name = @name,\r\n private_data_specifier_id = @private_data_specifier_id,\r\n xait_pid = @xait_pid,\r\n region_name_country_code = @region_name_country_code,\r\n region_name_language_code = @region_name_language_code,\r\n region_country_code = @region_country_code,\r\n min_polling_interval = @min_polling_interval,\r\n uri = @uri,\r\n uri_linkage_type = @uri_linkage_type,\r\n updated_counter = updated_counter + 1,\r\n updated_timestamp = CURRENT_TIMESTAMP\r\nwhere id = @id";
command.Parameters.AddParameter("@id", NpgsqlDbType.Integer, newer.NetworkId);
command.Parameters.AddParameter("@name", NpgsqlDbType.Text, newer.Name);
command.Parameters.AddParameter("@private_data_specifier_id", NpgsqlDbType.Bigint, (long?)newer.PrivateDataSpecifierId);
command.Parameters.AddParameter("@xait_pid", NpgsqlDbType.Integer, (int?)newer.XaitPid);
command.Parameters.AddParameter("@region_name_country_code", NpgsqlDbType.Varchar, newer.RegionCountryCode);
command.Parameters.AddParameter("@region_name_language_code", NpgsqlDbType.Varchar, newer.RegionNameLanguageCode);
command.Parameters.AddParameter("@region_country_code", NpgsqlDbType.Varchar, newer.RegionCountryCode);
command.Parameters.AddParameter("@min_polling_interval", NpgsqlDbType.Integer, (int?)newer.MinPollingInterval);
command.Parameters.AddParameter("@uri", NpgsqlDbType.Text, newer.Uri);
command.Parameters.AddParameter("@uri_linkage_type", NpgsqlDbType.Integer, (int?)newer.UriLinkageType);
command.ExecuteNonQuery();
}
private NitNetwork SelectNitNetwork(NpgsqlConnection connection, int targetId)
{
NpgsqlCommand command = connection.CreateCommand();
command.CommandText = "SELECT * FROM dvb_nit WHERE id = @targetId";
command.Parameters.AddWithValue("@targetId", NpgsqlDbType.Integer, targetId);
NpgsqlDataReader dataReader = command.ExecuteReader();
NitNetwork result = null;
if (dataReader.Read())
{
ushort id = (ushort)dataReader.GetInt32(0);
DateTime dateadded = dataReader.GetDateTime(1);
result = new NitNetwork(id);
result.Name = dataReader.IsDBNull(2) ? null : dataReader.GetString(2);
result.PrivateDataSpecifierId = dataReader.IsDBNull(3) ? null : (uint)dataReader.GetInt64(3);
result.XaitPid = dataReader.IsDBNull(4) ? null : (ushort)dataReader.GetInt32(4);
result.RegionNameCountryCode = dataReader.IsDBNull(5) ? null : dataReader.GetString(5);
result.RegionNameLanguageCode = dataReader.IsDBNull(6) ? null : dataReader.GetString(6);
result.RegionCountryCode = dataReader.IsDBNull(7) ? null : dataReader.GetString(7);
result.MinPollingInterval = dataReader.IsDBNull(8) ? null : (ushort)dataReader.GetInt32(8);
result.Uri = dataReader.IsDBNull(9) ? null : dataReader.GetString(9);
result.UriLinkageType = dataReader.IsDBNull(10) ? null : (byte)dataReader.GetInt32(10);
}
dataReader.Close();
command.Dispose();
return result;
}
private HashSet<DatabaseKeyNitTs> _knownUpdatedNitTransportStream;
public bool UpdateNitTransportStream(ushort networkId, NitTransportStream transportStream)
{
if (_knownUpdatedNitTransportStream == null)
_knownUpdatedNitTransportStream = new HashSet<DatabaseKeyNitTs>();
DatabaseKeyNitTs key = new DatabaseKeyNitTs(networkId, transportStream.TransportStreamId);
if (_knownUpdatedNitTransportStream.Contains(key))
return false;
EnqueueTask(x => WriteNitUpdateTransportStream(x, networkId, transportStream));
_knownUpdatedNitTransportStream.Add(key);
return true;
}
private void WriteNitUpdateTransportStream(NpgsqlConnection connection, ushort networkId, NitTransportStream transportStream)
{
NitTransportStream older = SelectNitTransportStream(connection, networkId, transportStream.TransportStreamId);
if (older == null)
return;
if (!older.NeedUpdate(transportStream))
return;
NpgsqlCommand command = connection.CreateCommand();
command.CommandText =
"update dvb_nit_transport_stream\r\nset onid = @onid,\r\n east = @east,\r\n fec_inner = @fec_inner,\r\n frequency = @frequency,\r\n orbital_position = @orbital_position,\r\n polarization = @polarization,\r\n roll_off = @roll_off,\r\n s2 = @s2,\r\n symbol_rate = @symbol_rate,\r\n scrambling_sequence_index = @scrambling_sequence_index,\r\n input_stream_identifier = @input_stream_identifier,\r\n timeslice_number = @timeslice_number,\r\n ts_gs_mode = @ts_gs_mode,\r\n private_data_specifier_id = @private_data_specifier_id,\r\n tfs_flag = @tfs_flag,\r\n bandwidth = @bandwidth,\r\n guard_interval = @guard_interval,\r\n other_frequency_flag = @other_frequency_flag,\r\n plp_id = @plp_id,\r\n siso_miso = @siso_miso,\r\n t2_system_id = @t2_system_id,\r\n transmission_mode = @transmission_mode,\r\n coding_type = @coding_type,\r\n modulation_type = @modulation_type,\r\n fec_outer = @fec_outer,\r\n code_rate_hp_stream = @code_rate_hp_stream,\r\n code_rate_lp_stream = @code_rate_lp_stream,\r\n hierarchy_information = @hierarchy_information,\r\n mpe_fec_indicator = @mpe_fec_indicator,\r\n priority = @priority,\r\n time_slicing_indicator = @time_slicing_indicator,\r\n network_name = @network_name,\r\n target_region_country_code = @target_region_country_code\r\nwhere nid = @nid \r\nand tsid = @tsid";
command.Parameters.AddParameter("@nid", NpgsqlDbType.Integer, (int)networkId);
command.Parameters.AddParameter("@tsid", NpgsqlDbType.Integer, transportStream.TransportStreamId);
command.Parameters.AddParameter("@onid", NpgsqlDbType.Integer, transportStream.OriginalNetworkId);
command.Parameters.AddParameter("@east", NpgsqlDbType.Boolean, transportStream.East);
command.Parameters.AddParameter("@fec_inner", NpgsqlDbType.Integer, (int?)transportStream.FecInner);
command.Parameters.AddParameter("@frequency", NpgsqlDbType.Bigint, transportStream.Frequency);
command.Parameters.AddParameter("@orbital_position", NpgsqlDbType.Real, transportStream.OrbitalPosition);
command.Parameters.AddParameter("@polarization", NpgsqlDbType.Integer, (int?)transportStream.Polarization);
command.Parameters.AddParameter("@roll_off", NpgsqlDbType.Real, transportStream.RollOff);
command.Parameters.AddParameter("@s2", NpgsqlDbType.Boolean, transportStream.S2);
command.Parameters.AddParameter("@symbol_rate", NpgsqlDbType.Bigint, transportStream.SymbolRate);
command.Parameters.AddParameter("@scrambling_sequence_index", NpgsqlDbType.Integer, transportStream.ScramblingSequenceIndex);
command.Parameters.AddParameter("@input_stream_identifier", NpgsqlDbType.Integer, transportStream.InputStreamIdentifier);
command.Parameters.AddParameter("@timeslice_number", NpgsqlDbType.Integer, transportStream.TimesliceNumber);
command.Parameters.AddParameter("@ts_gs_mode", NpgsqlDbType.Integer, (int?)transportStream.TsGsMode);
//@private_data_specifier_id,@tfs_flag,@bandwidth,@guard_interval,@other_frequency_flag,@plp_id,@siso_miso,@t2_system_id,@transmission_mode,@coding_type,@modulation_type,@fec_outer,@code_rate_hp_stream,
command.Parameters.AddParameter("@private_data_specifier_id", NpgsqlDbType.Bigint, (long?)transportStream.PrivateDataSpecifierId);
command.Parameters.AddParameter("@tfs_flag", NpgsqlDbType.Boolean, transportStream.TfsFlag);
command.Parameters.AddParameter("@bandwidth", NpgsqlDbType.Integer, transportStream.Bandwidth);
command.Parameters.AddParameter("@guard_interval", NpgsqlDbType.Integer, transportStream.GuardInterval);
command.Parameters.AddParameter("@other_frequency_flag", NpgsqlDbType.Boolean, transportStream.OtherFrequencyFlag);
command.Parameters.AddParameter("@plp_id", NpgsqlDbType.Integer, (int?)transportStream.PlpId);
command.Parameters.AddParameter("@siso_miso", NpgsqlDbType.Integer, transportStream.SisoMiso);
command.Parameters.AddParameter("@t2_system_id", NpgsqlDbType.Integer, (int?)transportStream.T2SystemId);
command.Parameters.AddParameter("@transmission_mode", NpgsqlDbType.Integer, transportStream.TransmissionMode);
command.Parameters.AddParameter("@coding_type", NpgsqlDbType.Integer, (int?)transportStream.CodingType);
command.Parameters.AddParameter("@modulation_type", NpgsqlDbType.Integer, transportStream.ModulationType);
command.Parameters.AddParameter("@fec_outer", NpgsqlDbType.Integer, (int?)transportStream.FecOuter);
command.Parameters.AddParameter("@code_rate_hp_stream", NpgsqlDbType.Integer, (int?)transportStream.CodeRateHpStream);
//@code_rate_lp_stream,@hierarchy_information,@mpe_fec_indicator,@priority,@time_slicing_indicator,@network_name,@target_region_country_code)";
command.Parameters.AddParameter("@code_rate_lp_stream", NpgsqlDbType.Integer, (int?)transportStream.CodeRateLpStream);
command.Parameters.AddParameter("@hierarchy_information", NpgsqlDbType.Integer, (int?)transportStream.HierarchyInformation);
command.Parameters.AddParameter("@mpe_fec_indicator", NpgsqlDbType.Boolean, transportStream.MpeFecIndicator);
command.Parameters.AddParameter("@priority", NpgsqlDbType.Boolean, transportStream.Priority);
command.Parameters.AddParameter("@time_slicing_indicator", NpgsqlDbType.Integer, (int?)transportStream.TimesliceNumber);
command.Parameters.AddParameter("@network_name", NpgsqlDbType.Text, transportStream.NetworkName);
command.Parameters.AddParameter("@target_region_country_code", NpgsqlDbType.Varchar, transportStream.TargetRegionCountryCode);
command.Parameters.CheckNulls();
command.ExecuteNonQuery();
}
private NitTransportStream SelectNitTransportStream(NpgsqlConnection connection, ushort networkId, ushort transportStreamId)
{
NpgsqlCommand command = connection.CreateCommand();
command.CommandText = "SELECT * FROM dvb_nit_transport_stream WHERE nid = @nid AND tsid = @tsid";
command.Parameters.AddParameter("@nid", NpgsqlDbType.Integer, (int)networkId);
command.Parameters.AddParameter("@tsid", NpgsqlDbType.Integer, (int)transportStreamId);
NpgsqlDataReader dataReader = command.ExecuteReader();
NitTransportStream result = null;
if (dataReader.Read())
{
ushort nid = (ushort)dataReader.GetInt32(0);
ushort tsid = (ushort)dataReader.GetInt32(1);
DateTime dateadded = (DateTime)dataReader.GetDateTime(2);
ushort onid = (ushort)dataReader.GetInt32(3);
result = new NitTransportStream(onid, tsid);
result.East = dataReader.IsDBNull(4) ? null : dataReader.GetBoolean(4);
result.FecInner = dataReader.IsDBNull(5) ? null : (SatelliteDeliverySystemDescriptor.InnerFecScheme)dataReader.GetInt32(5);
result.Frequency = dataReader.IsDBNull(6) ? null : dataReader.GetInt64(6);
result.OrbitalPosition = dataReader.IsDBNull(7) ? null : dataReader.GetFloat(7);
result.Polarization = dataReader.IsDBNull(8) ? null : (SatelliteDeliverySystemDescriptor.PolarizationEnum)dataReader.GetInt32(8);
result.RollOff = dataReader.IsDBNull(9) ? null : dataReader.GetFloat(9);
result.S2 = dataReader.IsDBNull(10) ? null : dataReader.GetBoolean(10);
result.SymbolRate = dataReader.IsDBNull(11) ? null : dataReader.GetInt64(11);
result.ScramblingSequenceIndex = dataReader.IsDBNull(12) ? null : dataReader.GetInt32(12);
result.InputStreamIdentifier = dataReader.IsDBNull(13) ? null : (byte)dataReader.GetInt32(13);
result.TimesliceNumber = dataReader.IsDBNull(14) ? null : (byte)dataReader.GetInt32(14);
result.TsGsMode = dataReader.IsDBNull(15) ? null : (S2SatelliteDeliverySystemDescriptor.TsGsModeCoding)dataReader.GetInt32(15);
result.PrivateDataSpecifierId = dataReader.IsDBNull(16) ? null : (uint)dataReader.GetInt64(16);
result.TfsFlag = dataReader.IsDBNull(17) ? null : dataReader.GetBoolean(17);
result.Bandwidth = dataReader.IsDBNull(18) ? null : dataReader.GetInt32(18);
result.GuardInterval = dataReader.IsDBNull(19) ? null : dataReader.GetInt32(19);
result.OtherFrequencyFlag = dataReader.IsDBNull(20) ? null : dataReader.GetBoolean(20);
result.PlpId = dataReader.IsDBNull(21) ? null : dataReader.GetByte(21);
result.SisoMiso = dataReader.IsDBNull(22) ? null : dataReader.GetInt32(22);
result.T2SystemId = dataReader.IsDBNull(23) ? null : (ushort)dataReader.GetInt32(23);
result.TransmissionMode = dataReader.IsDBNull(24) ? null : dataReader.GetInt32(24);
result.CodingType = dataReader.IsDBNull(25) ? null : (FrequencyListDescriptor.CodingTypeValue)dataReader.GetInt32(25);
result.ModulationType = dataReader.IsDBNull(26) ? null : dataReader.GetInt32(26);
result.FecOuter = dataReader.IsDBNull(27) ? null : (CableDeliverySystemDescriptor.OuterFecScheme)dataReader.GetInt32(27);
result.CodeRateHpStream = dataReader.IsDBNull(28) ? null : (TerristialDeliverySystemDescriptor.CodeRate)dataReader.GetInt32(28);
result.CodeRateLpStream = dataReader.IsDBNull(29) ? null : (TerristialDeliverySystemDescriptor.CodeRate)dataReader.GetInt32(29);
result.HierarchyInformation = dataReader.IsDBNull(30) ? null : (TerristialDeliverySystemDescriptor.HierarchySignallingFormat)dataReader.GetInt32(30);
result.MpeFecIndicator = dataReader.IsDBNull(31) ? null : dataReader.GetBoolean(31);
result.Priority = dataReader.IsDBNull(32) ? null : dataReader.GetBoolean(32);
result.TimeSlicingIndicator = dataReader.IsDBNull(33) ? null : dataReader.GetInt32(33);
result.NetworkName = dataReader.IsDBNull(34) ? null : dataReader.GetString(34);
result.TargetRegionCountryCode = dataReader.IsDBNull(35) ? null : dataReader.GetString(35);
}
dataReader.Close();
command.Dispose();
return result;
}
}
}

View File

@ -0,0 +1,86 @@
using Npgsql;
using NpgsqlTypes;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace skyscraper5.Data.PostgreSql
{
internal static class NpgsqlParameterCollectionExtensions
{
public static void CheckNulls(this NpgsqlParameterCollection collection)
{
foreach (NpgsqlParameter o in collection)
{
if (o.Value == null)
o.Value = DBNull.Value;
else if (o.Value == DBNull.Value)
continue;
else
{
if (o.NpgsqlDbType == NpgsqlDbType.Text || o.NpgsqlDbType == NpgsqlDbType.Varchar)
{
string oValue = (string)o.Value;
oValue = oValue.Trim('\0');
o.Value = oValue;
}
}
}
}
public static void AddParameter(this NpgsqlParameterCollection collection, string parameterName, NpgsqlDbType columnType, object value)
{
if (value == null)
{
collection.AddWithValue(parameterName, columnType, DBNull.Value);
}
else
{
if (value is ushort && columnType == NpgsqlDbType.Integer)
{
collection.AddWithValue(parameterName, columnType, Convert.ToInt32((ushort)value));
}
else if (value is uint && columnType == NpgsqlDbType.Bigint)
{
collection.AddWithValue(parameterName, columnType, Convert.ToInt64((uint)value));
}
else
{
collection.AddWithValue(parameterName, columnType, value);
}
if (value is string)
{
string s = (string)value;
if (s.Contains("\0"))
s = s.Replace("\0", "");
}
}
}
public static byte[] GetByteArray(this NpgsqlDataReader dataReader, int ordinal)
{
if (dataReader.IsDBNull(ordinal))
return null;
Stream stream = dataReader.GetStream(ordinal);
byte[] buffer = new byte[stream.Length];
if (stream.Read(buffer, 0, buffer.Length) != buffer.Length)
throw new IOException("failed to read stream");
stream.Close();
return buffer;
}
public static void SetAllNull(this NpgsqlParameterCollection collection)
{
foreach (NpgsqlParameter o in collection)
{
o.Value = DBNull.Value;
}
}
}
}

View File

@ -0,0 +1,77 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Npgsql;
using NpgsqlTypes;
using skyscraper5.Skyscraper.Scraper.Storage.Utilities;
namespace skyscraper5.Data.PostgreSql
{
public partial class PostgresqlDataStore
{
private HashSet<DatabaseKeyPatEntry> knownPats;
public bool StorePatEntry(int currentNetworkId, int currentTransportStreamId, int pmtPid, ushort programId)
{
if (knownPats == null)
knownPats = new HashSet<DatabaseKeyPatEntry>();
DatabaseKeyPatEntry key = new DatabaseKeyPatEntry(currentNetworkId, currentTransportStreamId, programId);
if (knownPats.Contains(key))
{
return true;
}
bool alreadyKnownInDb = false;
using (NpgsqlConnection conn = new NpgsqlConnection(connectionStringBuilder.ToString()))
{
conn.Open();
alreadyKnownInDb = TestPat(currentNetworkId, currentTransportStreamId, programId, key, alreadyKnownInDb, conn);
conn.Close();
}
if (alreadyKnownInDb)
return true;
EnqueueTask(x => WritePat(x, currentNetworkId, currentTransportStreamId, pmtPid, programId));
knownPats.Add(key);
return false;
}
private bool TestPat(int currentNetworkId, int currentTransportStreamId, ushort programId, DatabaseKeyPatEntry key, bool alreadyKnownInDb, NpgsqlConnection conn)
{
NpgsqlCommand command = conn.CreateCommand();
command.CommandText = "SELECT dateadded FROM dvb_pat WHERE cnid = @cnid AND ctsid = @ctsid AND program_id = @program_id";
command.Parameters.AddWithValue("@cnid", NpgsqlDbType.Integer, currentNetworkId);
command.Parameters.AddWithValue("@ctsid", NpgsqlDbType.Integer, currentTransportStreamId);
command.Parameters.AddWithValue("@program_id", NpgsqlDbType.Integer, (int)programId);
NpgsqlDataReader dataReader = command.ExecuteReader();
if (dataReader.Read())
{
alreadyKnownInDb = true;
knownPats.Add(key);
}
dataReader.Close();
return alreadyKnownInDb;
}
private void WritePat(NpgsqlConnection conn, int currentNetworkId, int currentTransportStreamId, int pmtPid, ushort programId)
{
DatabaseKeyPatEntry key = new DatabaseKeyPatEntry(currentNetworkId, currentTransportStreamId, programId);
if (!TestPat(currentNetworkId, currentTransportStreamId, programId, key, false, conn))
{
NpgsqlCommand command = conn.CreateCommand();
command.CommandText = "INSERT INTO dvb_pat " +
"(cnid, ctsid, pmt_pid, program_id) " +
"VALUES " +
"(@cnid, @ctsid, @pmt_pid, @program_id)";
command.Parameters.AddWithValue("@cnid", NpgsqlDbType.Integer, currentNetworkId);
command.Parameters.AddWithValue("@ctsid", NpgsqlDbType.Integer, currentTransportStreamId);
command.Parameters.AddWithValue("@pmt_pid", NpgsqlDbType.Integer, pmtPid);
command.Parameters.AddWithValue("@program_id", NpgsqlDbType.Integer, (int)programId);
command.ExecuteNonQuery();
}
}
}
}

View File

@ -0,0 +1,587 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Npgsql;
using NpgsqlTypes;
using skyscraper5.Dvb.Descriptors;
using skyscraper5.Dvb.Descriptors.Extension;
using skyscraper5.Iso14496_1;
using skyscraper5.Iso14496_1.Descriptors;
using skyscraper5.Mpeg2.Descriptors;
using skyscraper5.Mpeg2.Psi.Model;
using skyscraper5.Skyscraper.Scraper.Storage.Utilities;
namespace skyscraper5.Data.PostgreSql
{
public partial class PostgresqlDataStore
{
private HashSet<DatabaseKeyPmtEntry> knownPmts;
public bool TestForPmtEvent(int currentNetworkId, int currentTransportStreamId, ProgramMapping mapping)
{
if (knownPmts == null)
knownPmts = new HashSet<DatabaseKeyPmtEntry>();
DatabaseKeyPmtEntry entry = new DatabaseKeyPmtEntry(currentNetworkId, currentTransportStreamId, mapping.ProgramNumber);
if (knownPmts.Contains(entry))
return true;
bool result = false;
using (NpgsqlConnection connection = new NpgsqlConnection(connectionStringBuilder.ToString()))
{
connection.Open();
NpgsqlCommand command = connection.CreateCommand();
command.CommandText = "SELECT dateadded FROM dvb_pmt WHERE cnid = @cnid AND ctsid = @ctsid AND program_number = @program_number";
command.Parameters.AddWithValue("@cnid", NpgsqlDbType.Integer, currentNetworkId);
command.Parameters.AddWithValue("@ctsid", NpgsqlDbType.Integer, currentTransportStreamId);
command.Parameters.AddWithValue("@program_number", NpgsqlDbType.Integer, (int)mapping.ProgramNumber);
NpgsqlDataReader dataReader = command.ExecuteReader();
result = dataReader.Read();
dataReader.Close();
connection.Close();
}
if (result)
knownPmts.Add(entry);
return result;
}
public bool StorePmtEvent(int currentNetworkId, int currentTransportStreamId, ProgramMapping mapping)
{
DatabaseKeyPmtEntry entry = new DatabaseKeyPmtEntry(currentNetworkId, currentTransportStreamId, mapping.ProgramNumber);
EnqueueTask(x => WritePmtEntry(x, currentNetworkId, currentTransportStreamId, mapping));
knownPmts.Add(entry);
return true;
}
private void WritePmtEntry(NpgsqlConnection conn, int currentNetworkId, int currentTransportStreamId, ProgramMapping mapping)
{
NpgsqlCommand command = conn.CreateCommand();
command.CommandText = "SELECT dateadded FROM dvb_pmt WHERE cnid = @cnid AND ctsid = @ctsid AND program_number = @program_number";
command.Parameters.AddParameter("@cnid", NpgsqlDbType.Integer, currentNetworkId);
command.Parameters.AddParameter("@ctsid", NpgsqlDbType.Integer, currentTransportStreamId);
command.Parameters.AddParameter("@program_number", NpgsqlDbType.Integer, mapping.ProgramNumber);
NpgsqlDataReader dataReader = command.ExecuteReader();
bool alreadyKnown = dataReader.Read();
dataReader.Close();
command.Dispose();
if (alreadyKnown)
return;
command = conn.CreateCommand();
command.CommandText =
"insert into dvb_pmt (cnid, ctsid, program_number, pcr_pid, maximum_bitrate,multiplex_buffer_utilization_bound_valid_flag, multiplex_ltw_offset_lower_bound,multiplex_ltw_offset_upper_bound, clock_accuracy_exponent, clock_accuracy_integer,\r\n external_clock_reference_indicator, sb_leak_rate, sb_size, ca_pid, ca_system_id, ca_private_data,\r\n private_data_specifiger, registration_additional_identification_info,\r\n registration_format_identifier, new_onid, new_sid, new_tsid, component_tag,\r\n metadata_input_leak_rate, metadata_buffer_size, metadata_output_leak_rate, scrambling_mode, es_id,\r\n audio_type, iso_639_language_code, scope_of_iod_label, iod_label, private_data_indicator,\r\n frame_rate, chroma_format, \"constrained_parameter_flag\", frame_rate_extension_flag, mpeg1_only_flag,\r\n multiple_framerate_flag, profile_and_level_indication, still_picture_flag, metadata_program_number,\r\n metadata_application_format, metadata_application_format_identifier, metadata_format,\r\n metadata_format_identifier, metadata_locator_record, metadata_locator_record_flag,\r\n metadata_service_id, mpeg_carriage_flag, metadata_private_data, transport_stream_id,\r\n transport_stream_location, free_format, audio_stream_id, layer, variable_rate_audio,\r\n copy_control_private_data, alignment_type, hierarchy_type, hierarchy_layer_type, tref_present_flag,hierarchy_channel, no_view_scalability_flag, hierarchy_embedded_layer_index,no_quality_scalability_flag, no_spatial_scalability_flag, no_temporal_scalability_flag)" +
"values " +
"(@cnid,@ctsid,@program_number,@pcr_pid,@maximum_bitrate,@multiplex_buffer_utilization_bound_valid_flag,@multiplex_ltw_offset_lower_bound,@multiplex_ltw_offset_upper_bound,@clock_accuracy_exponent, @clock_accuracy_integer,@external_clock_reference_indicator, @sb_leak_rate, @sb_size, @ca_pid, @ca_system_id, @ca_private_data,\r\n @private_data_specifiger, @registration_additional_identification_info,\r\n @registration_format_identifier, @new_onid, @new_sid, @new_tsid, @component_tag,\r\n @metadata_input_leak_rate, @metadata_buffer_size, @metadata_output_leak_rate, @scrambling_mode, @es_id,\r\n @audio_type, @iso_639_language_code, @scope_of_iod_label, @iod_label, @private_data_indicator,\r\n @frame_rate, @chroma_format, @constrained_parameter_flag, @frame_rate_extension_flag, @mpeg1_only_flag,\r\n @multiple_framerate_flag, @profile_and_level_indication, @still_picture_flag, @metadata_program_number,\r\n @metadata_application_format, @metadata_application_format_identifier, @metadata_format,\r\n @metadata_format_identifier, @metadata_locator_record, @metadata_locator_record_flag,\r\n @metadata_service_id, @mpeg_carriage_flag, @metadata_private_data, @transport_stream_id,\r\n @transport_stream_location, @free_format, @audio_stream_id, @layer, @variable_rate_audio,\r\n @copy_control_private_data, @alignment_type, @hierarchy_type, @hierarchy_layer_type, @tref_present_flag,\r\n @hierarchy_channel, @no_view_scalability_flag, @hierarchy_embedded_layer_index,@no_quality_scalability_flag, @no_spatial_scalability_flag, @no_temporal_scalability_flag)";
command.Parameters.AddParameter("@cnid", NpgsqlDbType.Integer, currentNetworkId);
command.Parameters.AddParameter("@ctsid", NpgsqlDbType.Integer, currentTransportStreamId);
command.Parameters.AddParameter("@program_number", NpgsqlDbType.Integer, mapping.ProgramNumber);
command.Parameters.AddParameter("@pcr_pid", NpgsqlDbType.Integer, mapping.PcrPid);
command.Parameters.AddParameter("@maximum_bitrate", NpgsqlDbType.Bigint, mapping.MaximumBitrate);
command.Parameters.AddParameter("@multiplex_buffer_utilization_bound_valid_flag", NpgsqlDbType.Boolean, mapping.MultiplexBufferUtilizationBoundValidFlag);
command.Parameters.AddParameter("@multiplex_ltw_offset_lower_bound", NpgsqlDbType.Integer, mapping.MultiplexLtwOffsetLowerBound);
command.Parameters.AddParameter("@multiplex_ltw_offset_upper_bound", NpgsqlDbType.Integer, mapping.MultiplexLtwOffsetUpperBound);
command.Parameters.AddParameter("@clock_accuracy_exponent", NpgsqlDbType.Integer, mapping.ClockAccuracyExponent);
command.Parameters.AddParameter("@clock_accuracy_integer", NpgsqlDbType.Integer, mapping.ClockAccuracyInteger);
command.Parameters.AddParameter("@external_clock_reference_indicator", NpgsqlDbType.Boolean, mapping.ExternalClockReferenceIndicator);
//@sb_leak_rate,@sb_size,@ca_pid,@ca_system_id,@ca_private_data,@private_data_specifiger,@registration_additional_identification_info,@registration_format_identifier,@new_onid,@new_sid,@new_tsid,@component_tag,
command.Parameters.AddParameter("@sb_leak_rate", NpgsqlDbType.Bigint, mapping.SbLeakRate);
command.Parameters.AddParameter("@sb_size", NpgsqlDbType.Bigint, mapping.SbSize);
command.Parameters.AddParameter("@ca_pid", NpgsqlDbType.Integer, mapping.CaPid);
command.Parameters.AddParameter("@ca_system_id", NpgsqlDbType.Integer, mapping.CaSystemId);
command.Parameters.AddParameter("@ca_private_data", NpgsqlDbType.Bytea, mapping.CaPrivateData);
command.Parameters.AddParameter("@private_data_specifiger", NpgsqlDbType.Bigint, mapping.PrivateDataIndicator);
command.Parameters.AddParameter("@registration_additional_identification_info", NpgsqlDbType.Bytea, mapping.RegistrationAdditionalIdentificationInfo);
command.Parameters.AddParameter("@registration_format_identifier", NpgsqlDbType.Bigint, mapping.RegistrationFormatIdentifier);
command.Parameters.AddParameter("@new_onid", NpgsqlDbType.Integer, mapping.NewOriginalNetworkId);
command.Parameters.AddParameter("@new_sid", NpgsqlDbType.Integer, mapping.NewServiceId);
command.Parameters.AddParameter("@new_tsid", NpgsqlDbType.Integer, mapping.NewTransportStreamId);
command.Parameters.AddParameter("@component_tag", NpgsqlDbType.Integer, mapping.ComponentTag);
//@metadata_input_leak_rate,@metadata_buffer_size,@metadata_output_leak_rate,@scrambling_mode,@es_id,@audio_type,@iso_639_language_code,@scope_of_iod_label,@iod_label,@private_data_indicator,
command.Parameters.AddParameter("@metadata_input_leak_rate", NpgsqlDbType.Integer, mapping.MetadataInputLeakRate);
command.Parameters.AddParameter("@metadata_buffer_size", NpgsqlDbType.Integer, mapping.MetadataBufferSize);
command.Parameters.AddParameter("@metadata_output_leak_rate", NpgsqlDbType.Integer, mapping.MetadataOutputLeakRate);
command.Parameters.AddParameter("@scrambling_mode", NpgsqlDbType.Integer, mapping.ScramblingMode);
command.Parameters.AddParameter("@es_id", NpgsqlDbType.Integer, mapping.EsId);
command.Parameters.AddParameter("@audio_type", NpgsqlDbType.Integer, (int?)mapping.AudioType);
command.Parameters.AddParameter("@iso_639_language_code", NpgsqlDbType.Varchar, mapping.Iso639LanguageCode);
command.Parameters.AddParameter("@scope_of_iod_label", NpgsqlDbType.Integer, mapping.ScopeOfIodLabel);
command.Parameters.AddParameter("@iod_label", NpgsqlDbType.Integer, mapping.IodLabel);
command.Parameters.AddParameter("@private_data_indicator", NpgsqlDbType.Bigint, mapping.PrivateDataIndicator);
//@frame_rate,@chroma_format,@constrained_parameter_flag,@frame_rate_extension_flag,@mpeg1_only_flag,@multiple_framerate_flag,@profile_and_level_indication,@still_picture_flag,@metadata_program_number,
command.Parameters.AddParameter("@frame_rate", NpgsqlDbType.Double, mapping.FrameRate);
command.Parameters.AddParameter("@chroma_format", NpgsqlDbType.Integer, mapping.ChromaFormat);
command.Parameters.AddParameter("@constrained_parameter_flag", NpgsqlDbType.Boolean, mapping.ConstrainedParameterFlag);
command.Parameters.AddParameter("@frame_rate_extension_flag", NpgsqlDbType.Integer, mapping.FrameRateExtensionFlag);
command.Parameters.AddParameter("@mpeg1_only_flag", NpgsqlDbType.Boolean, mapping.Mpeg1OnlyFlag);
command.Parameters.AddParameter("@multiple_framerate_flag", NpgsqlDbType.Boolean, mapping.MultipleFramerateFlag);
command.Parameters.AddParameter("@profile_and_level_indication", NpgsqlDbType.Integer, mapping.ProfileAndLevelIndication);
command.Parameters.AddParameter("@still_picture_flag", NpgsqlDbType.Boolean, mapping.StillPictureFlag);
command.Parameters.AddParameter("@metadata_program_number", NpgsqlDbType.Integer, mapping.MetadataProgramNumber);
//@metadata_application_format,@metadata_application_format_identifier,@metadata_format,@metadata_format_identifier,@metadata_locator_record,@metadata_locator_record_flag,@metadata_service_id,
command.Parameters.AddParameter("@metadata_application_format", NpgsqlDbType.Integer, mapping.MetadataApplicationFormat);
command.Parameters.AddParameter("@metadata_application_format_identifier", NpgsqlDbType.Bigint, mapping.MetadataApplicationFormatIdentifier);
command.Parameters.AddParameter("@metadata_format", NpgsqlDbType.Integer, mapping.MetadataFormat);
command.Parameters.AddParameter("@metadata_format_identifier", NpgsqlDbType.Bigint, mapping.MetadataFormatIdentifier);
command.Parameters.AddParameter("@metadata_locator_record", NpgsqlDbType.Bytea, mapping.MetadataLocatorRecord);
command.Parameters.AddParameter("@metadata_locator_record_flag", NpgsqlDbType.Boolean, mapping.MetadataLocatorRecordFlag);
command.Parameters.AddParameter("@metadata_service_id", NpgsqlDbType.Integer, mapping.MetadataServiceId);
//@mpeg_carriage_flag,@metadata_private_data,@transport_stream_id,@transport_stream_location,@free_format,@audio_stream_id,@layer,@variable_rate_audio,@copy_control_private_data,@alignment_type,
command.Parameters.AddParameter("@mpeg_carriage_flag", NpgsqlDbType.Integer, mapping.MpegCarriageFlag);
command.Parameters.AddParameter("@metadata_private_data", NpgsqlDbType.Bytea, mapping.MetadataPrivateData);
command.Parameters.AddParameter("@transport_stream_id", NpgsqlDbType.Integer, mapping.TransportStreamId);
command.Parameters.AddParameter("@transport_stream_location", NpgsqlDbType.Integer, mapping.TransportStreamLocation);
command.Parameters.AddParameter("@free_format", NpgsqlDbType.Boolean, mapping.FreeFormat);
command.Parameters.AddParameter("@audio_stream_id", NpgsqlDbType.Boolean, mapping.AudioStreamId);
command.Parameters.AddParameter("@layer", NpgsqlDbType.Integer, mapping.Layer);
command.Parameters.AddParameter("@variable_rate_audio", NpgsqlDbType.Boolean, mapping.VariableRateAudio);
command.Parameters.AddParameter("@copy_control_private_data", NpgsqlDbType.Bytea, mapping.CopyControlPrivateData);
command.Parameters.AddParameter("@alignment_type", NpgsqlDbType.Integer, mapping.AlignmentType);
//@hierarchy_type,@hierarchy_layer_type,@tref_present_flag,@hierarchy_channel,@no_view_scalability_flag,@hierarchy_embedded_layer_index,@no_quality_scalability_flag,@no_spatial_scalability_flag,
command.Parameters.AddParameter("@hierarchy_type", NpgsqlDbType.Integer, mapping.HierarchyType);
command.Parameters.AddParameter("@hierarchy_layer_type", NpgsqlDbType.Integer, mapping.HierarchyLayerType);
command.Parameters.AddParameter("@tref_present_flag", NpgsqlDbType.Boolean, mapping.TrefPresentFlag);
command.Parameters.AddParameter("@hierarchy_channel", NpgsqlDbType.Integer, mapping.HierarchyChannel);
command.Parameters.AddParameter("@no_view_scalability_flag", NpgsqlDbType.Boolean, mapping.NoViewScalabilityFlag);
command.Parameters.AddParameter("@hierarchy_embedded_layer_index", NpgsqlDbType.Integer, mapping.HierarchyEmbeddedLayerIndex);
command.Parameters.AddParameter("@no_quality_scalability_flag", NpgsqlDbType.Boolean, mapping.NoQualityScalabilityFlag);
command.Parameters.AddParameter("@no_spatial_scalability_flag", NpgsqlDbType.Boolean, mapping.NoSpatialScalabilityFlag);
//@no_temporal_scalability_flag)";
command.Parameters.AddParameter("@no_temporal_scalability_flag", NpgsqlDbType.Boolean, mapping.NoTemporalScalabilityFlag);
command.Parameters.CheckNulls();
command.ExecuteNonQuery();
WritePmtInitialObjectDescriptor(conn, currentNetworkId, currentTransportStreamId, mapping);
WritePmtStreams(conn, currentNetworkId, currentTransportStreamId, mapping);
}
private void WritePmtStreams(NpgsqlConnection conn, int currentNetworkId, int currentTransportStreamId, ProgramMapping mapping)
{
if (mapping.Streams == null)
return;
bool[] streamsDone = new bool[0x1fff];
foreach (ProgramMappingStream mappingStream in mapping.Streams)
{
if (streamsDone[mappingStream.ElementaryPid])
continue;
WritePmtStream(conn, currentNetworkId, currentTransportStreamId, mapping.ProgramNumber, mappingStream);
streamsDone[mappingStream.ElementaryPid] = true;
}
}
private void WritePmtStream(NpgsqlConnection conn, int currentNetworkId, int currentTransportStreamId, ushort mappingProgramNumber, ProgramMappingStream stream)
{
NpgsqlCommand command = conn.CreateCommand();
command.CommandText =
"insert into dvb_pmt_streams (cnid, ctsid, program_number, stream_type, elementary_pid, component_tag, audio_type, iso_639_language_code, carousel_format_id, carousel_id, data_broadcast_id," +
" data_broadcast_selector, supplementary_independant_stream, editorial_classification, supplementary_language_code, asvc, bsid, component_type, main_id, frame_rate, mpeg1_only_flag, chroma_format, " +
"the_constrained_parameter_flag, frame_rate_extension_flag, multiple_framerate_flag, profile_and_level_indication, still_picture_flag, alignment_type, maximum_bitrate, audio_stream_id, free_format, " +
"layer, variable_rate_audio, constraint_set0_flag, avc_24hour_picture_flag, avc_compatible_flag, avc_still_present, constraint_set1_flag, constraint_set2_flag, constraint_set3_flag, " +
"constraint_set4_flag, constraint_set5_flag, frame_packing_sei_not_present, level_idc, profile_rdc, ca_pid, ca_system_id, ca_private_data, private_data_specifier, format_identifier, " +
"additional_identification_info, association_tag_selector, association_tag_transaction_id, association_tag_use, association_tag_private_data, association_tag_timeout, aac_type, " +
"aac_additional_info, aac_profile_and_level, saoc_de_flag, ancillary_data_identifier, mix_info_exists, substream1, substream2, substream3, copied_44bits, frame_only_constraint_flag, " +
"hdr_wcg_idc, hevc_24hr_picture_present_flag, hevc_still_present_flag, interlaced_source_flag, non_packed_constraint_flag, profile_compatibility_indication, profile_idc, " +
"profile_space, progressive_source_flag, sub_pic_hrd_params_not_present_flag, temporal_id_max, tier_flag, temporal_id_min, ac4_channel_mode, ac4_dialog_enhancement, ac4_dsi, " +
"leak_valid_flag, sb_leak_rate, sb_size, private_data_indicator, \"_90khz_flag\", picture_and_timing_info_present_flag, hdr_management_valid_flag, k, n, num_units_in_tick, " +
"target_schedule_idx, target_schedule_idx_not_present_flag, adaption_field_data_identifier, fixed_frame_rate_flag, picture_to_display_conversion_flag, temporal_poc_flag, " +
"mpeg4_audio_profile_and_level, aac_channel_configuration, aac_profile, aac_additional_information, scrambling_mode, related_content_descriptor_present, num_t2mi_streams, " +
"t2mi_stream_id, pcr_iscr_common_clock_flag, audio_specific_config, audio_profile_level_indication)\r\n " +
"values\r\n " +
"(@cnid,@ctsid,@program_number,@stream_type,@elementary_pid,@component_tag,@audio_type,@iso_639_language_code,@carousel_format_id,@carousel_id,@data_broadcast_id,@data_broadcast_selector,@supplementary_independant_stream, @editorial_classification,\r\n @supplementary_language_code, @asvc, @bsid, @component_type, @main_id, @frame_rate,\r\n @mpeg1_only_flag, @chroma_format, @constrained_parameter_flag, @frame_rate_extension_flag,\r\n @multiple_framerate_flag, @profile_and_level_indication, @still_picture_flag, @alignment_type,\r\n @maximum_bitrate, @audio_stream_id, @free_format, @layer, @variable_rate_audio,\r\n @constraint_set0_flag, @avc_24hour_picture_flag, @avc_compatible_flag, @avc_still_present,\r\n @constraint_set1_flag, @constraint_set2_flag, @constraint_set3_flag, @constraint_set4_flag,\r\n @constraint_set5_flag, @frame_packing_sei_not_present, @level_idc, @profile_rdc, @ca_pid,\r\n @ca_system_id, @ca_private_data, @private_data_specifier, @format_identifier,\r\n @additional_identification_info, @association_tag_selector, @association_tag_transaction_id,\r\n @association_tag_use, @association_tag_private_data, @association_tag_timeout, @aac_type,\r\n @aac_additional_info, @aac_profile_and_level, @saoc_de_flag, @ancillary_data_identifier,\r\n @mix_info_exists, @substream1, @substream2, @substream3, @copied_44bits,\r\n @frame_only_constraint_flag, @hdr_wcg_idc, @hevc_24hr_picture_present_flag,\r\n @hevc_still_present_flag, @interlaced_source_flag, @non_packed_constraint_flag,\r\n @profile_compatibility_indication, @profile_idc, @profile_space, @progressive_source_flag,\r\n @sub_pic_hrd_params_not_present_flag, @temporal_id_max, @tier_flag, @temporal_id_min,\r\n @ac4_channel_mode, @ac4_dialog_enhancement, @ac4_dsi, @leak_valid_flag, @sb_leak_rate, @sb_size,\r\n @private_data_indicator, @_90khz_flag, @picture_and_timing_info_present_flag,\r\n @hdr_management_valid_flag, @k, @n, @num_units_in_tick, @target_schedule_idx,\r\n @target_schedule_idx_not_present_flag, @adaption_field_data_identifier,\r\n @fixed_frame_rate_flag, @picture_to_display_conversion_flag, @temporal_poc_flag,\r\n @mpeg4_audio_profile_and_level, @aac_channel_configuration, @aac_profile,\r\n @aac_additional_information, @scrambling_mode, @related_content_descriptor_present,\r\n @num_t2mi_streams, @t2mi_stream_id, @pcr_iscr_common_clock_flag, @audio_specific_config, @audio_profile_level_indication);";
command.Parameters.AddParameter("@cnid", NpgsqlDbType.Integer, currentNetworkId);
command.Parameters.AddParameter("@ctsid", NpgsqlDbType.Integer, currentTransportStreamId);
command.Parameters.AddParameter("@program_number", NpgsqlDbType.Integer, mappingProgramNumber);
command.Parameters.AddParameter("@stream_type", NpgsqlDbType.Integer, (int)stream.StreamType);
command.Parameters.AddParameter("@elementary_pid", NpgsqlDbType.Integer, stream.ElementaryPid);
command.Parameters.AddParameter("@component_tag", NpgsqlDbType.Integer, stream.ComponentTag);
command.Parameters.AddParameter("@audio_type", NpgsqlDbType.Integer, (int?)stream.AudioType);
command.Parameters.AddParameter("@iso_639_language_code", NpgsqlDbType.Varchar, stream.Iso639LanguageCode);
command.Parameters.AddParameter("@carousel_format_id", NpgsqlDbType.Integer, stream.CarouselFormatId);
command.Parameters.AddParameter("@carousel_id", NpgsqlDbType.Bigint, stream.CarouselId);
command.Parameters.AddParameter("@data_broadcast_id", NpgsqlDbType.Integer, stream.DataBroadcastId);
command.Parameters.AddParameter("@data_broadcast_selector", NpgsqlDbType.Bytea, stream.DataBroadcastSelector);
//@supplementary_independant_stream,@editorial_classification,@supplementary_language_code,@asvc,@bsid,@component_type,@main_id,@frame_rate,@mpeg1_only_flag,@chroma_format,@constrained_parameter_flag,
command.Parameters.AddParameter("@supplementary_independant_stream", NpgsqlDbType.Boolean, stream.SupplementaryIndependantStream);
command.Parameters.AddParameter("@editorial_classification", NpgsqlDbType.Integer, (int?)stream.EditorialClassification);
command.Parameters.AddParameter("@supplementary_language_code", NpgsqlDbType.Varchar, stream.SupplementaryLanguageCode);
command.Parameters.AddParameter("@asvc", NpgsqlDbType.Integer, stream.Asvc);
command.Parameters.AddParameter("@bsid", NpgsqlDbType.Integer, stream.BSID);
command.Parameters.AddParameter("@component_type", NpgsqlDbType.Integer, (int?)stream.ComponentType);
command.Parameters.AddParameter("@main_id", NpgsqlDbType.Integer, stream.MainId);
command.Parameters.AddParameter("@frame_rate", NpgsqlDbType.Double, stream.FrameRate);
command.Parameters.AddParameter("@mpeg1_only_flag", NpgsqlDbType.Boolean, stream.Mpeg1OnlyFlag);
command.Parameters.AddParameter("@chroma_format", NpgsqlDbType.Integer, stream.ChromaFormat);
command.Parameters.AddParameter("@constrained_parameter_flag", NpgsqlDbType.Boolean, stream.ConstrainedParameterFlag);
//@frame_rate_extension_flag,@multiple_framerate_flag,@profile_and_level_indication,@still_picture_flag,@alignment_type,@maximum_bitrate,@audio_stream_id,@free_format,@layer,@variable_rate_audio,
command.Parameters.AddParameter("@frame_rate_extension_flag", NpgsqlDbType.Integer, stream.FrameRateExtensionFlag);
command.Parameters.AddParameter("@multiple_framerate_flag", NpgsqlDbType.Boolean, stream.MultipleFramerateFlag);
command.Parameters.AddParameter("@profile_and_level_indication", NpgsqlDbType.Integer, stream.ProfileAndLevelIndication);
command.Parameters.AddParameter("@still_picture_flag", NpgsqlDbType.Boolean, stream.StillPictureFlag);
command.Parameters.AddParameter("@alignment_type", NpgsqlDbType.Integer, stream.AlignmentType);
command.Parameters.AddParameter("@maximum_bitrate", NpgsqlDbType.Bigint, stream.MaximumBitrate);
command.Parameters.AddParameter("@audio_stream_id", NpgsqlDbType.Boolean, stream.AudioStreamId);
command.Parameters.AddParameter("@free_format", NpgsqlDbType.Boolean, stream.FreeFormat);
command.Parameters.AddParameter("@layer", NpgsqlDbType.Integer, stream.Layer);
command.Parameters.AddParameter("@variable_rate_audio", NpgsqlDbType.Boolean, stream.VariableRateAudio);
//@constraint_set0_flag,@avc_24hour_picture_flag,@avc_compatible_flag,@avc_still_present,@constraint_set1_flag,@constraint_set2_flag,@constraint_set3_flag,@constraint_set4_flag,@constraint_set5_flag,
command.Parameters.AddParameter("@constraint_set0_flag", NpgsqlDbType.Boolean, stream.ConstraintSet0Flag);
command.Parameters.AddParameter("@constraint_set0_flag", NpgsqlDbType.Boolean, stream.ConstraintSet0Flag);
command.Parameters.AddParameter("@avc_24hour_picture_flag", NpgsqlDbType.Boolean, stream.Avc24HourPictureFlag);
command.Parameters.AddParameter("@avc_compatible_flag", NpgsqlDbType.Integer, stream.AvcCompatibleFlags);
command.Parameters.AddParameter("@avc_still_present", NpgsqlDbType.Boolean, stream.AvcStillPresent);
command.Parameters.AddParameter("@constraint_set1_flag", NpgsqlDbType.Boolean, stream.ConstraintSet1Flag);
command.Parameters.AddParameter("@constraint_set2_flag", NpgsqlDbType.Boolean, stream.ConstraintSet2Flag);
command.Parameters.AddParameter("@constraint_set3_flag", NpgsqlDbType.Boolean, stream.ConstraintSet3Flag);
command.Parameters.AddParameter("@constraint_set4_flag", NpgsqlDbType.Boolean, stream.ConstraintSet4Flag);
command.Parameters.AddParameter("@constraint_set5_flag", NpgsqlDbType.Boolean, stream.ConstraintSet5Flag);
//@frame_packing_sei_not_present,@level_idc,@profile_rdc,@ca_pid,@ca_system_id,@ca_private_data,@private_data_specifier,@format_identifier,@additional_identification_info,@association_tag_selector,
command.Parameters.AddParameter("@frame_packing_sei_not_present", NpgsqlDbType.Boolean, stream.FramePackingSeiNotPresent);
command.Parameters.AddParameter("@level_idc", NpgsqlDbType.Integer, stream.LevelIdc);
command.Parameters.AddParameter("@profile_rdc", NpgsqlDbType.Integer, stream.ProfileRdc);
command.Parameters.AddParameter("@ca_pid", NpgsqlDbType.Integer, stream.CaPid);
command.Parameters.AddParameter("@ca_system_id", NpgsqlDbType.Integer, stream.CaSystemId);
command.Parameters.AddParameter("@ca_private_data", NpgsqlDbType.Bytea, stream.CaPrivateData);
command.Parameters.AddParameter("@private_data_specifier", NpgsqlDbType.Bigint, stream.PrivateDataSpecifier);
command.Parameters.AddParameter("@format_identifier", NpgsqlDbType.Bigint, stream.FormatIdentifier);
command.Parameters.AddParameter("@additional_identification_info", NpgsqlDbType.Bytea, stream.AdditionalIdentificationInfo);
command.Parameters.AddParameter("@association_tag_selector", NpgsqlDbType.Bytea, stream.AssociationTagSelector);
//@association_tag_transaction_id,@association_tag_use,@association_tag_private_data,@association_tag_timeout,@aac_type,@aac_additional_info,@aac_profile_and_level,@saoc_de_flag,
command.Parameters.AddParameter("@association_tag_transaction_id", NpgsqlDbType.Bigint, stream.AssociationTagTransactionId);
command.Parameters.AddParameter("@association_tag_use", NpgsqlDbType.Integer, stream.AssociationTagUse);
command.Parameters.AddParameter("@association_tag_private_data", NpgsqlDbType.Bytea, stream.AssociationTagPrivateData);
command.Parameters.AddParameter("@association_tag_timeout", NpgsqlDbType.Bigint, stream.AssociationTagTimeOut);
command.Parameters.AddParameter("@aac_type", NpgsqlDbType.Integer, stream.AacType);
command.Parameters.AddParameter("@aac_additional_info", NpgsqlDbType.Bytea, stream.AacAdditionalInfo);
command.Parameters.AddParameter("@aac_profile_and_level", NpgsqlDbType.Integer, stream.AacProfileAndLevel);
command.Parameters.AddParameter("@saoc_de_flag", NpgsqlDbType.Boolean, stream.SaocDeFlag);
//@ancillary_data_identifier,@mix_info_exists,@substream1,@substream2,@substream3,@copied_44bits,@frame_only_constraint_flag,@hdr_wcg_idc,@hevc_24hr_picture_present_flag,@hevc_still_present_flag,
if (stream.AncillaryDataDescriptor != null)
command.Parameters.AddParameter("@ancillary_data_identifier", NpgsqlDbType.Integer, stream.AncillaryDataDescriptor.AncillaryDataIdentifier);
else
command.Parameters.AddWithValue("@ancillary_data_identifier", NpgsqlDbType.Integer, DBNull.Value);
command.Parameters.AddParameter("@mix_info_exists", NpgsqlDbType.Boolean, stream.MixInfoExists);
command.Parameters.AddParameter("@substream1", NpgsqlDbType.Integer, stream.Substream1);
command.Parameters.AddParameter("@substream2", NpgsqlDbType.Integer, stream.Substream2);
command.Parameters.AddParameter("@substream3", NpgsqlDbType.Integer, stream.Substream3);
command.Parameters.AddParameter("@copied_44bits", NpgsqlDbType.Bigint, stream.Copied44bits);
command.Parameters.AddParameter("@frame_only_constraint_flag", NpgsqlDbType.Boolean, stream.FrameOnlyConstraintFlag);
command.Parameters.AddParameter("@hdr_wcg_idc", NpgsqlDbType.Integer, stream.HdrWcgIdc);
command.Parameters.AddParameter("@hevc_24hr_picture_present_flag", NpgsqlDbType.Boolean, stream.Hevc24hrPicturePresentFlag);
command.Parameters.AddParameter("@hevc_still_present_flag", NpgsqlDbType.Boolean, stream.HevcStillPresentFlag);
//@interlaced_source_flag,@non_packed_constraint_flag,@profile_compatibility_indication,@profile_idc,@profile_space,@progressive_source_flag,@sub_pic_hrd_params_not_present_flag,@temporal_id_max,
command.Parameters.AddParameter("@interlaced_source_flag", NpgsqlDbType.Boolean, stream.InterlacedSourceFlag);
command.Parameters.AddParameter("@non_packed_constraint_flag", NpgsqlDbType.Boolean, stream.NonPackedConstraintFlag);
command.Parameters.AddParameter("@profile_compatibility_indication", NpgsqlDbType.Bigint, stream.ProfileCompatibilityIndication);
command.Parameters.AddParameter("@profile_idc", NpgsqlDbType.Bigint, stream.ProfileIdc);
command.Parameters.AddParameter("@profile_space", NpgsqlDbType.Integer, stream.ProfileSpace);
command.Parameters.AddParameter("@progressive_source_flag", NpgsqlDbType.Boolean, stream.ProgressiveSourceFlag);
command.Parameters.AddParameter("@sub_pic_hrd_params_not_present_flag", NpgsqlDbType.Boolean, stream.SubPicHrdParamsNotPresentFlag);
command.Parameters.AddParameter("@temporal_id_max", NpgsqlDbType.Integer, stream.TemporalIdMax);
//@tier_flag,@temporal_id_min,@ac4_channel_mode,@ac4_dialog_enhancement,@ac4_dsi,@leak_valid_flag,@sb_leak_rate,@sb_size,@private_data_indicator,@_90khz_flag,@picture_and_timing_info_present_flag,
command.Parameters.AddParameter("@tier_flag", NpgsqlDbType.Boolean, stream.TierFlag);
command.Parameters.AddParameter("@temporal_id_min", NpgsqlDbType.Integer, stream.TemporalIdMin);
command.Parameters.AddParameter("@ac4_channel_mode", NpgsqlDbType.Integer, stream.Ac4ChannelMode);
command.Parameters.AddParameter("@ac4_dialog_enhancement", NpgsqlDbType.Boolean, stream.Ac4DialogEnhancement);
command.Parameters.AddParameter("@ac4_dsi", NpgsqlDbType.Bytea, stream.Ac4Dsi);
command.Parameters.AddParameter("@ac4_dsi", NpgsqlDbType.Bytea, stream.Ac4Dsi);
command.Parameters.AddParameter("@leak_valid_flag", NpgsqlDbType.Boolean, stream.LeakValidFlag);
command.Parameters.AddParameter("@sb_leak_rate", NpgsqlDbType.Bigint, stream.SbLeakRate);
command.Parameters.AddParameter("@sb_size", NpgsqlDbType.Bigint, stream.SbSize);
command.Parameters.AddParameter("@private_data_indicator", NpgsqlDbType.Bigint, stream.PrivateDataIndicator);
command.Parameters.AddParameter("@_90khz_flag", NpgsqlDbType.Boolean, stream._90khzFlag);
command.Parameters.AddParameter("@picture_and_timing_info_present_flag", NpgsqlDbType.Boolean, stream.PictureAndTimingInfoPresentFlag);
//@hdr_management_valid_flag,@k,@n,@num_units_in_tick,@target_schedule_idx,@target_schedule_idx_not_present_flag,@adaption_field_data_identifier,@fixed_frame_rate_flag,
command.Parameters.AddParameter("@hdr_management_valid_flag", NpgsqlDbType.Boolean, stream.HdrManagementValidFlag);
command.Parameters.AddParameter("@k", NpgsqlDbType.Bigint, stream.K);
command.Parameters.AddParameter("@n", NpgsqlDbType.Bigint, stream.N);
command.Parameters.AddParameter("@num_units_in_tick", NpgsqlDbType.Bigint, stream.NumUnitsInTick);
command.Parameters.AddParameter("@target_schedule_idx", NpgsqlDbType.Integer, stream.TargetScheduleIdx);
command.Parameters.AddParameter("@target_schedule_idx_not_present_flag", NpgsqlDbType.Boolean, stream.TargetScheduleIdxNotPresentFlag);
command.Parameters.AddParameter("@adaption_field_data_identifier", NpgsqlDbType.Integer, stream.AdaptionFieldDataIdentifier);
command.Parameters.AddParameter("@fixed_frame_rate_flag", NpgsqlDbType.Boolean, stream.FixedFrameRateFlag);
//@picture_to_display_conversion_flag,@temporal_poc_flag,@mpeg4_audio_profile_and_level,@aac_channel_configuration,@aac_profile,@aac_additional_information,@scrambling_mode,
command.Parameters.AddParameter("@picture_to_display_conversion_flag", NpgsqlDbType.Boolean, stream.PictureToDisplayConversionFlag);
command.Parameters.AddParameter("@temporal_poc_flag", NpgsqlDbType.Boolean, stream.TemporalPocFlag);
command.Parameters.AddParameter("@mpeg4_audio_profile_and_level", NpgsqlDbType.Integer, stream.Mpeg4AudioProfileAndLevel);
command.Parameters.AddParameter("@aac_channel_configuration", NpgsqlDbType.Integer, stream.AacChannelConfiguration);
command.Parameters.AddParameter("@aac_profile", NpgsqlDbType.Integer, stream.AacProfile);
command.Parameters.AddParameter("@aac_additional_information", NpgsqlDbType.Bytea, stream.AacAdditionalInfo);
command.Parameters.AddParameter("@scrambling_mode", NpgsqlDbType.Integer, stream.ScramblingMode);
//@related_content_descriptor_present,@num_t2mi_streams,@t2mi_stream_id,@pcr_iscr_common_clock_flag); ";
command.Parameters.AddParameter("@related_content_descriptor_present",NpgsqlDbType.Boolean,stream.RelatedContentDescriptorPresent);
command.Parameters.AddParameter("@num_t2mi_streams", NpgsqlDbType.Integer,stream.NumT2MiStreams);
command.Parameters.AddParameter("@t2mi_stream_id", NpgsqlDbType.Integer,stream.T2MiStreamId);
command.Parameters.AddParameter("@pcr_iscr_common_clock_flag", NpgsqlDbType.Boolean,stream.PcrIscrCommonClockFlag);
//audio_specific_config, audio_profile_level_indication
command.Parameters.AddParameter("@audio_specific_config", NpgsqlDbType.Bytea, stream.AudioSpecifConfig);
command.Parameters.AddParameter("@audio_profile_level_indication", NpgsqlDbType.Bytea, stream.AudioProfileLevelIndication);
command.Parameters.CheckNulls();
command.ExecuteNonQuery();
WritePmtStreamApplications(conn, currentNetworkId, currentTransportStreamId, mappingProgramNumber,stream);
WritePmtStreamAudioPreselections(conn, currentNetworkId, currentTransportStreamId, mappingProgramNumber, stream);
WritePmtStreamFluxmuxChannels(conn, currentNetworkId, currentTransportStreamId, mappingProgramNumber, stream);
WritePmtStreamIpMacNotificationInfo(conn, currentNetworkId, currentTransportStreamId, mappingProgramNumber, stream);
WritePmtStreamSubtitlings(conn, currentNetworkId, currentTransportStreamId, mappingProgramNumber, stream);
WritePmtStreamTeletexts(conn, currentNetworkId, currentTransportStreamId, mappingProgramNumber, stream, false);
WritePmtStreamVbiData(conn, currentNetworkId, currentTransportStreamId, mappingProgramNumber, stream);
WritePmtStreamTeletexts(conn, currentNetworkId, currentTransportStreamId, mappingProgramNumber, stream, true);
}
private void WritePmtStreamVbiData(NpgsqlConnection conn, int currentNetworkId, int currentTransportStreamId, ushort mappingProgramNumber, ProgramMappingStream stream)
{
if (stream.VbiData == null)
return;
NpgsqlCommand command = conn.CreateCommand();
command.CommandText =
"insert into dvb_pmt_streams_vbi_data (cnid, ctsid, program_number, elementary_pid, ordinal, data_service_id, field_parity, line_offset) " +
"values (@cnid, @ctsid, @program_number, @elementary_pid, @ordinal, @data_service_id, @field_parity, @line_offset)";
command.Parameters.AddWithValue("@cnid", NpgsqlDbType.Integer, currentNetworkId);
command.Parameters.AddWithValue("@ctsid", NpgsqlDbType.Integer, currentTransportStreamId);
command.Parameters.AddWithValue("@program_number", NpgsqlDbType.Integer, (int)mappingProgramNumber);
command.Parameters.AddWithValue("@elementary_pid", NpgsqlDbType.Integer, stream.ElementaryPid);
command.Parameters.Add("@ordinal", NpgsqlDbType.Integer);
command.Parameters.Add("@data_service_id", NpgsqlDbType.Integer);
command.Parameters.Add("@field_parity", NpgsqlDbType.Boolean);
command.Parameters.Add("@line_offset", NpgsqlDbType.Integer);
int ordinalIterator = 0;
foreach (VbiDataDescriptor.DataService dataService in stream.VbiData)
{
for (int i = 0; i < dataService.FieldParity.Length; i++)
{
int ordinal = ordinalIterator++;
bool parity = dataService.FieldParity[i];
int lineOffset = dataService.LineOffset[i];
command.Parameters["@ordinal"].Value = ordinalIterator;
command.Parameters["@data_service_id"].Value = dataService.DataServiceId;
command.Parameters["@field_parity"].Value = parity;
command.Parameters["@line_offset"].Value = lineOffset;
command.ExecuteNonQuery();
}
}
}
private void WritePmtStreamTeletexts(NpgsqlConnection conn, int currentNetworkId, int currentTransportStreamId, ushort mappingProgramNumber, ProgramMappingStream stream, bool vbi)
{
TeletextDescriptor.TeletextDescriptorTeletext[] teletext;
string tableName;
if (vbi)
{
teletext = stream.VbiTeletexts;
tableName = "dvb_pmt_streams_vbi_teletexts";
}
else
{
teletext = stream.Teletexts;
tableName = "dvb_pmt_streams_teletexts";
}
if (teletext == null)
return;
NpgsqlCommand command = conn.CreateCommand();
command.CommandText =
String.Format(
"insert into {0} (cnid, ctsid, program_number, elementary_pid, ordinal, iso_639_language_code, teletext_type, teletext_magazine_number, teletext_page_number) " +
"values " +
"(@cnid, @ctsid, @program_number, @elementary_pid, @ordinal, @iso_639_language_code, @teletext_type, @teletext_magazine_number, @teletext_page_number)",
tableName);
command.Parameters.AddParameter("@cnid", NpgsqlDbType.Integer, currentNetworkId);
command.Parameters.AddParameter("@ctsid", NpgsqlDbType.Integer, currentTransportStreamId);
command.Parameters.AddParameter("@program_number", NpgsqlDbType.Integer, (int)mappingProgramNumber);
command.Parameters.AddParameter("@elementary_pid", NpgsqlDbType.Integer, (int)stream.ElementaryPid);
command.Parameters.Add("@ordinal", NpgsqlDbType.Integer);
command.Parameters.Add("@iso_639_language_code", NpgsqlDbType.Varchar);
command.Parameters.Add("@teletext_type", NpgsqlDbType.Integer);
command.Parameters.Add("@teletext_magazine_number", NpgsqlDbType.Integer);
command.Parameters.Add("@teletext_page_number", NpgsqlDbType.Integer);
for (int i = 0; i < teletext.Length; i++)
{
command.Parameters["@ordinal"].Value = i;
command.Parameters["@iso_639_language_code"].Value = teletext[i].Iso639LanguageCode.Replace("\0", ""); ;
command.Parameters["@teletext_type"].Value = (int)teletext[i].TeletextType;
command.Parameters["@teletext_magazine_number"].Value = (int)teletext[i].TeletextMagazineNumber;
command.Parameters["@teletext_page_number"].Value = (int)teletext[i].TeletextPageNumber;
command.ExecuteNonQuery();
}
}
private void WritePmtStreamSubtitlings(NpgsqlConnection conn, int currentNetworkId, int currentTransportStreamId, ushort mappingProgramNumber, ProgramMappingStream stream)
{
if (stream.Subtitlings == null)
return;
NpgsqlCommand command = conn.CreateCommand();
command.CommandText =
"insert into dvb_pmt_streams_subtitlings (cnid, ctsid, program_number, elementary_pid, ordinal, iso_639_language_code, subtitling_type, composition_page_id, ancillary_page_id) " +
"values " +
"(@cnid, @ctsid, @program_number, @elementary_pid, @ordinal, @iso_639_language_code, @subtitling_type, @composition_page_id, @ancillary_page_id)";
command.Parameters.AddParameter("@cnid", NpgsqlDbType.Integer, currentNetworkId);
command.Parameters.AddParameter("@ctsid", NpgsqlDbType.Integer, currentTransportStreamId);
command.Parameters.AddParameter("@program_number", NpgsqlDbType.Integer, (int)mappingProgramNumber);
command.Parameters.AddParameter("@elementary_pid", NpgsqlDbType.Integer, (int)stream.ElementaryPid);
command.Parameters.Add("@ordinal", NpgsqlDbType.Integer);
command.Parameters.Add("@iso_639_language_code", NpgsqlDbType.Varchar);
command.Parameters.Add("@subtitling_type", NpgsqlDbType.Integer);
command.Parameters.Add("@composition_page_id", NpgsqlDbType.Integer);
command.Parameters.Add("@ancillary_page_id", NpgsqlDbType.Integer);
for (int i = 0; i < stream.Subtitlings.Length; i++)
{
SubtitlingDescriptor.Subtitling subtitling = stream.Subtitlings[i];
command.Parameters["@ordinal"].Value = i;
command.Parameters["@iso_639_language_code"].Value = subtitling.Iso639LanguageCode;
command.Parameters["@subtitling_type"].Value = subtitling.SubtitlingType;
command.Parameters["@composition_page_id"].Value = (int)subtitling.CompositionPageId;
command.Parameters["@ancillary_page_id"].Value = (int)subtitling.AncillaryPageId;
command.ExecuteNonQuery();
}
}
private void WritePmtStreamIpMacNotificationInfo(NpgsqlConnection conn, int currentNetworkId, int currentTransportStreamId, ushort mappingProgramNumber, ProgramMappingStream stream)
{
if (stream.IpMacNotificationInfo == null)
return;
NpgsqlCommand cmd = conn.CreateCommand();
cmd.CommandText = "insert into dvb_pmt_streams_ip_mac_notification_info (cnid, ctsid, program_number, elementary_pid, platform_id,action_type, int_versioning_flag, int_version) " +
"values (@cnid, @ctsid, @program_number, @elementary_pid, @platform_id, @action_type, @int_versioning_flag, @int_version)";
cmd.Parameters.AddWithValue("@cnid",NpgsqlDbType.Integer, currentNetworkId);
cmd.Parameters.AddWithValue("@ctsid", NpgsqlDbType.Integer, currentTransportStreamId);
cmd.Parameters.AddWithValue("@program_number", NpgsqlDbType.Integer, (int)mappingProgramNumber);
cmd.Parameters.AddWithValue("@elementary_pid", NpgsqlDbType.Integer, stream.ElementaryPid);
cmd.Parameters.Add("@platform_id", NpgsqlDbType.Integer);
cmd.Parameters.Add("@action_type", NpgsqlDbType.Integer);
cmd.Parameters.Add("@int_versioning_flag", NpgsqlDbType.Boolean);
cmd.Parameters.Add("@int_version", NpgsqlDbType.Integer);
foreach (DataBroadcastIdDescriptor.IpMacPlatform ipMacPlatform in stream.IpMacNotificationInfo)
{
cmd.Parameters["@platform_id"].Value = (int)ipMacPlatform.PlatformId;
cmd.Parameters["@action_type"].Value = (int)ipMacPlatform.ActionType;
cmd.Parameters["@int_versioning_flag"].Value = ipMacPlatform.IntVersioningFlag;
cmd.Parameters["@int_version"].Value = (int)ipMacPlatform.IntVersion;
cmd.ExecuteNonQuery();
}
}
private void WritePmtStreamFluxmuxChannels(NpgsqlConnection conn, int currentNetworkId, int currentTransportStreamId, ushort mappingProgramNumber, ProgramMappingStream stream)
{
if (stream.FlexMuxChannels == null)
return;
foreach (FmcDescriptor.Fmc flexMuxChannel in stream.FlexMuxChannels)
{
throw new NotImplementedException();
}
}
private void WritePmtStreamAudioPreselections(NpgsqlConnection conn, int currentNetworkId, int currentTransportStreamId, ushort mappingProgramNumber, ProgramMappingStream stream)
{
if (stream.AudioPreselection == null)
return;
NpgsqlCommand command = conn.CreateCommand();
command.CommandText =
"insert into dvb_pmt_streams_audio_preselections (cnid, ctsid, program_number, elementary_pid, preselection_id, audio_rendering_indication, audio_description, spoken_subtitles, dialogue_enhancement, interactivity_enabled, iso_639_language_code,\r\n message_id, component_tags, future_extension) " +
"values " +
"(@cnid,@ctsid,@program_number,@elementary_pid,@preselection_id,@audio_rendering_indication,@audio_description,@spoken_subtitles,@dialogue_enhancement,@interactivity_enabled,@iso_639_language_code,@message_id, @component_tags, @future_extension)";
command.Parameters.AddWithValue("@cnid", NpgsqlDbType.Integer, currentNetworkId);
command.Parameters.AddWithValue("@ctsid", NpgsqlDbType.Integer, currentTransportStreamId);
command.Parameters.AddWithValue("@program_number", NpgsqlDbType.Integer, (int)mappingProgramNumber);
command.Parameters.AddWithValue("@elementary_pid", NpgsqlDbType.Integer, stream.ElementaryPid);
command.Parameters.Add("@preselection_id", NpgsqlDbType.Integer);
command.Parameters.Add("@audio_rendering_indication", NpgsqlDbType.Integer);
command.Parameters.Add("@audio_description", NpgsqlDbType.Boolean);
command.Parameters.Add("@spoken_subtitles", NpgsqlDbType.Boolean);
command.Parameters.Add("@dialogue_enhancement", NpgsqlDbType.Boolean);
command.Parameters.Add("@interactivity_enabled", NpgsqlDbType.Boolean);
command.Parameters.Add("@iso_639_language_code", NpgsqlDbType.Varchar);
//@message_id, @component_tags, @future_extension)";
command.Parameters.Add("@message_id", NpgsqlDbType.Integer);
command.Parameters.Add("@component_tags", NpgsqlDbType.Bytea);
command.Parameters.Add("@future_extension", NpgsqlDbType.Bytea);
foreach (AudioPreselectionDescriptor.AudioPreselection audioPreselection in stream.AudioPreselection)
{
command.Parameters["@preselection_id"].Value = audioPreselection.PreselectionId;
command.Parameters["@audio_rendering_indication"].Value = (int)audioPreselection.AudioRenderingIndication;
command.Parameters["@audio_description"].Value = audioPreselection.AudioDescription;
command.Parameters["@spoken_subtitles"].Value = audioPreselection.SpokenSubtitles;
command.Parameters["@dialogue_enhancement"].Value = audioPreselection.DialogueEnhancement;
command.Parameters["@interactivity_enabled"].Value = audioPreselection.InteractivityEnabled;
command.Parameters["@iso_639_language_code"].Value = audioPreselection.Iso639LangaugeCode;
command.Parameters["@message_id"].Value = audioPreselection.MessageId;
command.Parameters["@component_tags"].Value = audioPreselection.ComponentTags;
command.Parameters["@future_extension"].Value = audioPreselection.FutureExtension;
command.Parameters.CheckNulls();
command.ExecuteNonQuery();
}
}
private void WritePmtStreamApplications(NpgsqlConnection conn, int currentNetworkId, int currentTransportStreamId, ushort mappingProgramNumber, ProgramMappingStream stream)
{
if (stream.Applications == null)
return;
NpgsqlCommand command = conn.CreateCommand();
command.CommandText =
"insert into dvb_pmt_streams_applications (cnid, ctsid, program_number, elementary_pid, ordinal, application_type, ait_version_number) " +
"values " +
"(@cnid, @ctsid, @program_number, @elementary_pid, @ordinal, @application_type, @ait_version_number);";
command.Parameters.AddParameter("@cnid", NpgsqlDbType.Integer, currentNetworkId);
command.Parameters.AddParameter("@ctsid", NpgsqlDbType.Integer, currentTransportStreamId);
command.Parameters.AddParameter("@program_number", NpgsqlDbType.Integer, (int)mappingProgramNumber);
command.Parameters.AddParameter("@elementary_pid", NpgsqlDbType.Integer, (int)stream.ElementaryPid);
command.Parameters.Add("@ordinal", NpgsqlDbType.Integer);
command.Parameters.Add("@application_type", NpgsqlDbType.Integer);
command.Parameters.Add("@ait_version_number", NpgsqlDbType.Integer);
for (int i = 0; i < stream.Applications.Count; i++)
{
ApplicationSignallingDescriptor.ApplicationSignal applicationSignal = stream.Applications[i];
command.Parameters["@ordinal"].Value = i;
command.Parameters["@application_type"].Value = applicationSignal.ApplicationType;
command.Parameters["@ait_version_number"].Value = applicationSignal.AitVersionNumber;
command.ExecuteNonQuery();
}
}
private void WritePmtInitialObjectDescriptor(NpgsqlConnection conn, int currentNetworkId, int currentTransportStreamId, ProgramMapping mapping)
{
if (mapping.InitialObjectDescriptor == null)
return;
InitialObjectDescriptor iod = mapping.InitialObjectDescriptor;
NpgsqlCommand cmd = conn.CreateCommand();
cmd.CommandText = "insert into dvb_pmt_initial_object_descriptors (cnid, ctsid, program_number,\r\n graphics_profile_level_indication, visual_profile_level_indication,\r\n audio_profile_level_indication, scene_profile_level_indication,\r\n od_profile_level_indication, url_string,\r\n include_inline_profile_level_flag, url_flag, object_descriptor_id) " +
"values (@cnid, @ctsid, @program_number, @graphics_profile_level_indication, @visual_profile_level_indication, @audio_profile_level_indication, @scene_profile_level_indication, @od_profile_level_indication, @url_string, @include_inline_profile_level_flag, @url_flag, @object_descriptor_id)";
cmd.Parameters.AddWithValue("@cnid", NpgsqlDbType.Integer, currentNetworkId);
cmd.Parameters.AddWithValue("@ctsid", NpgsqlDbType.Integer, currentTransportStreamId);
cmd.Parameters.AddWithValue("@program_number", NpgsqlDbType.Integer, (int)mapping.ProgramNumber);
cmd.Parameters.AddWithValue("@graphics_profile_level_indication", NpgsqlDbType.Integer, (int?)iod.GraphicsProfileLevelIndication);
cmd.Parameters.AddWithValue("@visual_profile_level_indication", NpgsqlDbType.Integer, (int?)iod.VisualProfileLevelIndication);
cmd.Parameters.AddWithValue("@audio_profile_level_indication", NpgsqlDbType.Integer, (int?)iod.AudioProfileLevelIndication);
cmd.Parameters.AddWithValue("@scene_profile_level_indication", NpgsqlDbType.Integer, (int?)iod.SceneProfileLevelIndication);
cmd.Parameters.AddWithValue("@od_profile_level_indication", NpgsqlDbType.Integer, (int?)iod.OdProfileLevelIndication);
//@url_string, @include_inline_profile_level_flag, @url_flag, @object_descriptor_id)";
cmd.Parameters.AddWithValue("@url_string", NpgsqlDbType.Text, iod.UrlString);
cmd.Parameters.AddWithValue("@include_inline_profile_level_flag", NpgsqlDbType.Boolean, iod.IncludeInlineProfileLevelFlag);
cmd.Parameters.AddWithValue("@url_flag", NpgsqlDbType.Boolean, iod.UrlFlag);
cmd.Parameters.AddWithValue("@object_descriptor_id", NpgsqlDbType.Integer, iod.ObjectDescriptorId);
cmd.Parameters.CheckNulls();
cmd.ExecuteNonQuery();
}
}
}

View File

@ -0,0 +1,221 @@
using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Net;
using System.Net.NetworkInformation;
using Npgsql;
using NpgsqlTypes;
using skyscraper5.Docsis.MacManagement;
using skyscraper5.Dvb.Psi.Model;
using skyscraper5.Dvb.SystemSoftwareUpdate.Model;
using skyscraper5.Dvb.TvAnytime;
using skyscraper5.Rds.Messages;
using skyscraper5.Skyscraper.Gps;
using skyscraper5.Skyscraper.Headless;
using skyscraper5.Skyscraper.Scraper.Storage.Split;
using skyscraper5.src.InteractionChannel.Model;
using skyscraper5.src.InteractionChannel.Model.Descriptors;
using skyscraper5.src.Skyscraper.FrequencyListGenerator;
using skyscraper5.src.Skyscraper.Scraper.Dns;
namespace skyscraper5.Data.PostgreSql
{
public partial class PostgresqlDataStore : DataStorage
{
public PostgresqlDataStore(NpgsqlConnectionStringBuilder stringBuilder)
{
connectionStringBuilder = stringBuilder;
}
private NpgsqlConnectionStringBuilder connectionStringBuilder;
public bool TestForKnownRdsData(int currentNetworkId, int currentTransportStreamId, int programNumber)
{
throw new NotImplementedException();
}
public void EnableRdsCollection(int currentNetworkId, int currentTransportStreamId, int programNumber)
{
throw new NotImplementedException();
}
public bool UpdateRdsProgrammeServiceName(int currentNetworkId, int currentTransportStreamId, int programNumber,
string programmeService2)
{
throw new NotImplementedException();
}
public bool UpdateRdsRadioText(int currentNetworkId, int currentTransportStreamId, int programNumber,
string text)
{
throw new NotImplementedException();
}
public bool UpdateRdsPty(int currentNetworkId, int currentTransportStreamId, int programNumber,
PTY.ProgrammeTypeCodes pty)
{
throw new NotImplementedException();
}
public bool MarkAsRdsTrafficInformationProgramme(int currentNetworkId, int currentTransportStreamId,
int programNumber)
{
throw new NotImplementedException();
}
public bool TestForRelatedContent(EitEvent lEvent, RctLinkInfo rctLinkInfo)
{
throw new NotImplementedException();
}
public void SetRelatedContent(EitEvent lEvent, RctLinkInfo rctLinkInfo)
{
throw new NotImplementedException();
}
private static void SetNulls(NpgsqlCommand command)
{
foreach (NpgsqlParameter param in command.Parameters)
{
if (param.Value == null)
{
param.Value = DBNull.Value;
}
}
}
private int? detectedLocation;
public int? GetCurrentLocationId()
{
if (detectedLocation.HasValue)
return detectedLocation;
using (NpgsqlConnection connection = new NpgsqlConnection(connectionStringBuilder.ToString()))
{
Guid? locationUuid = null;
double? lon = null;
double? lat = null;
connection.Open();
NpgsqlCommand command = connection.CreateCommand();
command.CommandText = "SELECT uuid, ROUND(CAST(gps_lon as numeric),5), ROUND(CAST(gps_lat as numeric),5) FROM skyscraper5_blindscan_jobs\r\nWHERE tuner_std != 1\r\nORDER BY dateupdated DESC";
NpgsqlDataReader dataReader = command.ExecuteReader();
if (dataReader.Read())
{
locationUuid = dataReader.GetGuid(0);
lon = dataReader.GetDouble(1);
lat = dataReader.GetDouble(2);
}
dataReader.Close();
command.Dispose();
if (!locationUuid.HasValue)
{
command = connection.CreateCommand();
command.CommandText = "SELECT lonround, latround FROM docsis_locations WHERE guess_default = TRUE";
dataReader = command.ExecuteReader();
if (dataReader.Read())
{
locationUuid = Guid.NewGuid();
lon = dataReader.GetDouble(0);
lat = dataReader.GetDouble(1);
}
dataReader.Close();
command.Dispose();
}
if (locationUuid.HasValue)
{
command = connection.CreateCommand();
command.CommandText = "SELECT id FROM docsis_locations WHERE lonround = @lon AND latround = @lat";
command.Parameters.AddWithValue("@lon", NpgsqlDbType.Double, lon.Value);
command.Parameters.AddWithValue("@lat", NpgsqlDbType.Double, lat.Value);
dataReader = command.ExecuteReader();
if (dataReader.Read())
{
detectedLocation = dataReader.GetInt32(0);
dataReader.Close();
command.Dispose();
connection.Close();
return detectedLocation.Value;
}
dataReader.Close();
command = connection.CreateCommand();
command.CommandText = "INSERT INTO docsis_locations (lonround,latround) VALUES (@lon,@lat) RETURNING id";
command.Parameters.AddWithValue("@lon", NpgsqlDbType.Double, lon.Value);
command.Parameters.AddWithValue("@lat", NpgsqlDbType.Double, lat.Value);
dataReader = command.ExecuteReader();
dataReader.Read();
detectedLocation = dataReader.GetInt32(0);
dataReader.Close();
connection.Close();
return detectedLocation.Value;
}
connection.Close();
}
throw new NotImplementedException();
}
public HeadlessJob GetQueuedJob()
{
using (NpgsqlConnection connection = new NpgsqlConnection(connectionStringBuilder.ToString()))
{
connection.Open();
NpgsqlCommand command = connection.CreateCommand();
command.CommandText = "SELECT uuid, jobtype, iarg1, sarg1 FROM skyscraper5_job_queue WHERE completed = FALSE ORDER BY dateadded";
NpgsqlDataReader dataReader = command.ExecuteReader();
HeadlessJob job = null;
if (dataReader.Read())
{
job = new HeadlessJob();
job.uuid = dataReader.GetGuid(0);
job.jobType = (HeadlessJobType)dataReader.GetInt32(1);
if (!dataReader.IsDBNull(2))
job.iArg1 = dataReader.GetInt32(2);
if (!dataReader.IsDBNull(3))
job.sArg1 = dataReader.GetString(3);
}
dataReader.Close();
command.Dispose();
connection.Close();
return job;
}
}
public void SetQueuedJobComplete(HeadlessJob headlessJob)
{
using (NpgsqlConnection connection = new NpgsqlConnection(connectionStringBuilder.ToString()))
{
connection.Open();
NpgsqlCommand command = connection.CreateCommand();
command.CommandText = "UPDATE skyscraper5_job_queue SET completed = TRUE, dateupdated = CURRENT_TIMESTAMP, version = version + 1 WHERE uuid = @uuid";
command.Parameters.AddWithValue("@uuid", NpgsqlDbType.Uuid, headlessJob.uuid);
int executeNonQuery = command.ExecuteNonQuery();
if (executeNonQuery != 1)
throw new DataException(String.Format("Didn't expect to update {0} rows.", executeNonQuery));
command.Dispose();
connection.Close();
}
}
public object[] GetPluginConnector()
{
return new object[] { connectionStringBuilder };
}
}
}

View File

@ -0,0 +1,73 @@
using Npgsql;
using skyscraper5.Dvb.Psi.Model;
using skyscraper5.Skyscraper.Scraper.Storage.Utilities;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace skyscraper5.Data.PostgreSql
{
public partial class PostgresqlDataStore
{
private HashSet<DatabaseKeyRst> _knownRsts;
public bool StoreRunningStatus(uint transportStreamId, uint originalNetworkId, uint serviceId, uint eventId, RunningStatus runningStatus, DateTime currentTime)
{
if (_knownRsts == null)
_knownRsts = new HashSet<DatabaseKeyRst>();
DatabaseKeyRst key = new DatabaseKeyRst(transportStreamId, originalNetworkId, serviceId, eventId, runningStatus, currentTime);
if (_knownRsts.Contains(key))
return false;
bool alreadyKnown;
using (NpgsqlConnection conn = new NpgsqlConnection(connectionStringBuilder.ToString()))
{
conn.Open();
NpgsqlCommand cmd = conn.CreateCommand();
cmd.CommandText = "SELECT dateadded " +
"FROM dvb_rst " +
"WHERE tsid = @tsid " +
"AND onid = @onid " +
"AND sid = @sid " +
"AND eid = @eid " +
"AND running_status = @running_status " +
"AND dvb_time = @dvb_time";
cmd.Parameters.AddWithValue("@tsid", NpgsqlTypes.NpgsqlDbType.Integer, (int)transportStreamId);
cmd.Parameters.AddWithValue("@onid", NpgsqlTypes.NpgsqlDbType.Integer, (int)originalNetworkId);
cmd.Parameters.AddWithValue("@sid", NpgsqlTypes.NpgsqlDbType.Integer, (int)serviceId);
cmd.Parameters.AddWithValue("@eid", NpgsqlTypes.NpgsqlDbType.Integer, (int)eventId);
cmd.Parameters.AddWithValue("@running_status", NpgsqlTypes.NpgsqlDbType.Integer, (int)runningStatus);
cmd.Parameters.AddWithValue("@dvb_time", NpgsqlTypes.NpgsqlDbType.Timestamp, currentTime);
NpgsqlDataReader dataReader = cmd.ExecuteReader();
alreadyKnown = dataReader.Read();
dataReader.Close();
cmd.Dispose();
conn.Close();
}
if (!alreadyKnown)
{
EnqueueTask(x => InsertRst(x, transportStreamId, originalNetworkId, serviceId, eventId, runningStatus, currentTime));
}
_knownRsts.Add(key);
return !alreadyKnown;
}
private void InsertRst(NpgsqlConnection conn, uint transportStreamId, uint originalNetworkId, uint serviceId, uint eventId, RunningStatus runningStatus, DateTime currentTime)
{
NpgsqlCommand cmd = conn.CreateCommand();
cmd.CommandText = "INSERT INTO dvb_rst (tsid, onid, sid, eid, running_status, dvb_time) VALUES (@tsid, @onid, @sid, @eid, @running_status, @dvb_time)";
cmd.Parameters.AddWithValue("@tsid", NpgsqlTypes.NpgsqlDbType.Integer, (int)transportStreamId);
cmd.Parameters.AddWithValue("@onid", NpgsqlTypes.NpgsqlDbType.Integer, (int)originalNetworkId);
cmd.Parameters.AddWithValue("@sid", NpgsqlTypes.NpgsqlDbType.Integer, (int)serviceId);
cmd.Parameters.AddWithValue("@eid", NpgsqlTypes.NpgsqlDbType.Integer, (int)eventId);
cmd.Parameters.AddWithValue("@running_status", NpgsqlTypes.NpgsqlDbType.Integer, (int)runningStatus);
cmd.Parameters.AddWithValue("@dvb_time", NpgsqlTypes.NpgsqlDbType.Timestamp, currentTime);
cmd.ExecuteNonQuery();
cmd.Dispose();
}
}
}

View File

@ -0,0 +1,38 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
using System.Threading.Tasks;
namespace skyscraper5.Data.PostgreSql
{
[Serializable]
internal class SchemaMissingException : ApplicationException
{
//
// For guidelines regarding the creation of new exception types, see
// http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpgenref/html/cpconerrorraisinghandlingguidelines.asp
// and
// http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dncscol/html/csharp07192001.asp
//
public SchemaMissingException()
{
}
public SchemaMissingException(string message) : base(message)
{
}
public SchemaMissingException(string message, Exception inner) : base(message, inner)
{
}
protected SchemaMissingException(
SerializationInfo info,
StreamingContext context) : base(info, context)
{
}
}
}

View File

@ -0,0 +1,355 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Npgsql;
using NpgsqlTypes;
using skyscraper5.Scte35;
using skyscraper5.Skyscraper.Scraper.Storage.Utilities;
namespace skyscraper5.Data.PostgreSql
{
public partial class PostgresqlDataStore
{
public bool TestForScte35SpliceInsert(int currentNetworkId, int currentTransportStreamId, ushort programNumber, SpliceInsert spliceInsert)
{
bool result;
using (NpgsqlConnection conn = new NpgsqlConnection(connectionStringBuilder.ToString()))
{
conn.Open();
NpgsqlCommand command = conn.CreateCommand();
command.CommandText = "SELECT dateadded " +
"FROM scte35_splices " +
"WHERE cnid = @cnid " +
"AND ctsid = @ctsid " +
"AND program_number = @program_number " +
"AND splice_event_id = @splice_event_id";
command.Parameters.AddParameter("@cnid", NpgsqlDbType.Integer, currentNetworkId);
command.Parameters.AddParameter("@ctsid", NpgsqlDbType.Integer, currentTransportStreamId);
command.Parameters.AddParameter("@program_number", NpgsqlDbType.Integer, programNumber);
command.Parameters.AddParameter("@splice_event_id", NpgsqlDbType.Bigint, (long)spliceInsert.SpliceEventId);
NpgsqlDataReader dataReader = command.ExecuteReader();
result = dataReader.Read();
dataReader.Close();
}
return result;
}
public void StoreScte35SpliceInsert(int currentNetworkId, int currentTransportStreamId, ushort programNumber,
SpliceInsert spliceInsert)
{
EnqueueTask(x => WriteScte35SpliceInsert(x, currentNetworkId, currentTransportStreamId, programNumber, spliceInsert));
}
private void WriteScte35SpliceInsert(NpgsqlConnection connection, int currentNetworkId, int currentTransportStreamId, ushort programNumber, SpliceInsert spliceInsert)
{
if (TestForScte35SpliceInsert(currentNetworkId,currentTransportStreamId,programNumber,spliceInsert))
{
return;
}
transaction.Commit();
transaction = null;
transaction = connection.BeginTransaction();
NpgsqlCommand command = connection.CreateCommand();
command.CommandText =
"insert into scte35_splices (cnid, ctsid, program_number, splice_event_id, splice_event_cancel_indicator, out_of_network_indicator, program_splice_flag, duration_flag, splice_immediate_flag, splice_time, duration_auto_return, duration, unique_program_id, avail_num, avails_expected) " +
"values " +
"(@cnid,@ctsid,@program_number,@splice_event_id,@splice_event_cancel_indicator,@out_of_network_indicator,@program_splice_flag,@duration_flag,@splice_immediate_flag,@splice_time,@duration_auto_return, @duration, @unique_program_id, @avail_num, @avails_expected)";
command.Parameters.AddParameter("@cnid", NpgsqlDbType.Integer, currentNetworkId);
command.Parameters.AddParameter("@ctsid", NpgsqlDbType.Integer, currentTransportStreamId);
command.Parameters.AddParameter("@program_number", NpgsqlDbType.Integer, programNumber);
command.Parameters.AddParameter("@splice_event_id", NpgsqlDbType.Bigint, (long)spliceInsert.SpliceEventId);
command.Parameters.AddParameter("@splice_event_cancel_indicator", NpgsqlDbType.Boolean, spliceInsert.SpliceEventCancelIndicator);
command.Parameters.AddParameter("@out_of_network_indicator", NpgsqlDbType.Boolean, spliceInsert.OutOfNetworkIndicator);
command.Parameters.AddParameter("@program_splice_flag", NpgsqlDbType.Boolean, spliceInsert.ProgramSpliceFlag);
command.Parameters.AddParameter("@duration_flag", NpgsqlDbType.Boolean, spliceInsert.DurationFlag);
command.Parameters.AddParameter("@splice_immediate_flag", NpgsqlDbType.Boolean, spliceInsert.SpliceImmediateFlag);
command.Parameters.AddParameter("@splice_time", NpgsqlDbType.Bigint, (long?)spliceInsert.SpliceTime);
command.Parameters.AddParameter("@duration_auto_return", NpgsqlDbType.Boolean, spliceInsert.DurationAutoReturn);
//@duration, @unique_program_id, @avail_num, @avails_expected\r\n );\r\n";
command.Parameters.AddParameter("@duration", NpgsqlDbType.Bigint, (long?)spliceInsert.Duration);
command.Parameters.AddParameter("@unique_program_id", NpgsqlDbType.Integer, spliceInsert.UniqueProgramId);
command.Parameters.AddParameter("@avail_num", NpgsqlDbType.Integer, spliceInsert.AvailNum);
command.Parameters.AddParameter("@avails_expected", NpgsqlDbType.Integer, spliceInsert.AvailsExpected);
try
{
command.ExecuteNonQuery();
}
catch (PostgresException pe)
{
transaction.Rollback();
transaction = null;
transaction = connection.BeginTransaction();
Console.WriteLine("Warning: Network {0}, TSID {1}, Program {2}, Splice {3} not unique.", currentNetworkId, currentTransportStreamId, programNumber, spliceInsert.SpliceEventId);
return;
}
WriteScte35SpliceComponents(connection, currentNetworkId, currentTransportStreamId, programNumber, spliceInsert);
if (spliceInsert.Descriptors == null)
return;
if (spliceInsert.Descriptors.availDescriptor != null)
{
WriteScte35SpliceAvailability(connection, currentNetworkId, currentTransportStreamId, programNumber, spliceInsert);
}
if (spliceInsert.Descriptors.segmentationDescriptor != null)
{
WriteScte35SpliceSegmentation(connection, currentNetworkId, currentTransportStreamId, programNumber, spliceInsert);
}
if (spliceInsert.Descriptors.timeDescriptor != null)
{
throw new NotImplementedException();
}
}
private void WriteScte35SpliceAvailability(NpgsqlConnection connection, int currentNetworkId, int currentTransportStreamId, ushort programNumber, SpliceInsert spliceInsert)
{
Scte35.Descriptors.AvailDescriptor descriptor = spliceInsert.Descriptors.availDescriptor;
NpgsqlCommand command = connection.CreateCommand();
command.CommandText = "update scte35_splices\r\n" +
"set provider_avail_id = @provider_avail_id, identifier = @identifier\r\n" +
"where cnid = @cnid " +
"and ctsid = @ctsid " +
"and program_number = @program_number " +
"and splice_event_id = @splice_event_id\r\n";
command.Parameters.AddParameter("@cnid", NpgsqlDbType.Integer, currentNetworkId);
command.Parameters.AddParameter("@ctsid", NpgsqlDbType.Integer, currentTransportStreamId);
command.Parameters.AddParameter("@program_number", NpgsqlDbType.Integer, programNumber);
command.Parameters.AddParameter("@splice_event_id", NpgsqlDbType.Bigint, (long)spliceInsert.SpliceEventId);
command.Parameters.AddParameter("@provider_avail_id", NpgsqlDbType.Bigint, (long)descriptor.ProviderAvailId);
command.Parameters.AddParameter("@identifier", NpgsqlDbType.Bigint, (long)descriptor.Identifier);
command.ExecuteNonQuery();
}
private void WriteScte35SpliceSegmentation(NpgsqlConnection connection, int currentNetworkId, int currentTransportStreamId, ushort programNumber, SpliceInsert spliceInsert)
{
Scte35.Descriptors.SegmentationDescriptor segment = spliceInsert.Descriptors.segmentationDescriptor;
NpgsqlCommand cmd = connection.CreateCommand();
cmd.CommandText = "insert into scte35_splices_segmentations (cnid, ctsid, program_number, splice_event_id, splice_time,\r\n identifier, segmentation_event_id, segmentation_event_cancel_indicator,\r\n program_segmentation_flag, segmentation_duration_flag, web_delivery_flag,\r\n no_regional_blackout_flag, archive_allowed_flag, device_restrictions,\r\n segmentation_duration, segmentation_upid_type, segmentation_upid,\r\n segmentation_type_id, segment_num, segments_expected, sub_segment_num,\r\n sub_segments_expected) " +
"values " +
"(@cnid,@ctsid,@program_number,@splice_event_id,@splice_time,@identifier,@segmentation_event_id,@segmentation_event_cancel_indicator,@program_segmentation_flag,@segmentation_duration_flag,@web_delivery_flag,\r\n @no_regional_blackout_flag, @archive_allowed_flag, @device_restrictions,\r\n @segmentation_duration, @segmentation_upid_type, @segmentation_upid,\r\n @segmentation_type_id, @segment_num, @segments_expected, @sub_segment_num,\r\n @sub_segments_expected\r\n )";
cmd.Parameters.AddWithValue("@cnid", NpgsqlDbType.Integer, currentNetworkId);
cmd.Parameters.AddWithValue("@ctsid", NpgsqlDbType.Integer, currentTransportStreamId);
cmd.Parameters.AddWithValue("@program_number", NpgsqlDbType.Integer, (int)programNumber);
cmd.Parameters.AddWithValue("@splice_event_id", NpgsqlDbType.Bigint, (long)spliceInsert.SpliceEventId);
cmd.Parameters.AddWithValue("@splice_time", NpgsqlDbType.Bigint, (long?)spliceInsert.SpliceTime);
cmd.Parameters.AddWithValue("@identifier", NpgsqlDbType.Bigint, (long?)segment.Identifier);
cmd.Parameters.AddWithValue("@segmentation_event_id", NpgsqlDbType.Bigint, (long?)segment.SegmentationEventId);
cmd.Parameters.AddWithValue("@segmentation_event_cancel_indicator", NpgsqlDbType.Boolean, segment.SegmentationEventCancelIndicator);
cmd.Parameters.AddWithValue("@program_segmentation_flag", NpgsqlDbType.Boolean, segment.ProgramSegmentationFlag);
cmd.Parameters.AddWithValue("@segmentation_duration_flag", NpgsqlDbType.Boolean, segment.SegmentationDurationFlag);
//@web_delivery_flag,@no_regional_blackout_flag,@archive_allowed_flag,@device_restrictions,@segmentation_duration,@segmentation_upid_type,@segmentation_upid,@segmentation_type_id,@segment_num,@segments_expected, @sub_segment_num,\r\n @sub_segments_expected\r\n )";
cmd.Parameters.AddWithValue("@web_delivery_flag", NpgsqlDbType.Boolean, segment.WebDeliveryFlag);
cmd.Parameters.AddWithValue("@no_regional_blackout_flag", NpgsqlDbType.Boolean, segment.NoRegionalBlackoutFlag);
cmd.Parameters.AddWithValue("@archive_allowed_flag", NpgsqlDbType.Boolean, segment.ArchiveAllowedFlag);
cmd.Parameters.AddWithValue("@device_restrictions", NpgsqlDbType.Integer, segment.DeviceRestrictions);
cmd.Parameters.AddWithValue("@segmentation_duration", NpgsqlDbType.Bigint, segment.SegmentationDuration);
cmd.Parameters.AddWithValue("@segmentation_upid_type", NpgsqlDbType.Integer, segment.SegmentationUpidType);
cmd.Parameters.AddWithValue("@segmentation_upid", NpgsqlDbType.Text, segment.SegmentationUpid);
cmd.Parameters.AddWithValue("@segmentation_type_id", NpgsqlDbType.Integer, (int?)segment.SegmentationTypeId);
cmd.Parameters.AddWithValue("@segment_num", NpgsqlDbType.Integer, (int?)segment.SegmentNum);
//@segments_expected,@sub_segment_num,@sub_segments_expected
cmd.Parameters.AddWithValue("@segments_expected", NpgsqlDbType.Integer, (int?)segment.SegmentsExpected);
cmd.Parameters.AddWithValue("@sub_segment_num", NpgsqlDbType.Integer, (int?)segment.SubSegmentNum);
cmd.Parameters.AddWithValue("@sub_segments_expected", NpgsqlDbType.Integer, (int?)segment.SubSegmentsExpected);
cmd.Parameters.CheckNulls();
cmd.ExecuteNonQuery();
}
private void WriteScte35SpliceComponents(NpgsqlConnection connection, int currentNetworkId, int currentTransportStreamId, ushort programNumber, SpliceInsert spliceInsert)
{
if (spliceInsert.Components == null)
return;
for (int i = 0; i < spliceInsert.Components.Length; i++)
{
throw new NotImplementedException();
}
}
private Dictionary<DatabaseKeyScte35TimeSignal, DateTime> knownScte35TimeSignals;
public void SetScte35TimeSignal(int currentNetworkId, int currentTransportStreamId, DateTime currentTime, ushort programNumber,
TimeSignal timeSignal)
{
EnqueueTask(x => WriteScte35TimeSignal(x, currentNetworkId, currentTransportStreamId, currentTime, programNumber, timeSignal));
EnqueueTask(CommitTransaction);
}
private void WriteScte35TimeSignal(NpgsqlConnection connection, int cnid, int ctsid, DateTime timeSignalled, ushort programNumber,
TimeSignal timeSignal)
{
if (knownScte35TimeSignals == null)
knownScte35TimeSignals = new Dictionary<DatabaseKeyScte35TimeSignal, DateTime>();
DatabaseKeyScte35TimeSignal key = new DatabaseKeyScte35TimeSignal(cnid, ctsid, programNumber);
if (knownScte35TimeSignals.ContainsKey(key))
{
//already cached
DateTime timeInDb = knownScte35TimeSignals[key];
if (timeSignalled > timeInDb)
{
//Need to update
UpdateScte35TimeSignal(connection, cnid, ctsid, timeSignalled, programNumber, timeSignal);
knownScte35TimeSignals[key] = timeSignalled;
}
else
{
//Nothing to do
return;
}
}
else
{
//not yet cached
DateTime? timeInDb = SelectScte35TimeSignal(connection, cnid, ctsid, programNumber);
if (timeInDb.HasValue)
{
if (timeSignalled > timeInDb.Value)
{
//Need to update and cache
UpdateScte35TimeSignal(connection, cnid, ctsid, timeSignalled, programNumber, timeSignal);
knownScte35TimeSignals[key] = timeInDb.Value;
}
else
{
//Cache past value and do nothing
knownScte35TimeSignals[key] = timeInDb.Value;
return;
}
}
else
{
//Need to insert and cache
InsertScte35TimeSignal(connection, cnid, ctsid, timeSignalled, programNumber, timeSignal);
knownScte35TimeSignals[key] = timeSignalled;
}
}
}
private void UpdateScte35TimeSignal(NpgsqlConnection connection, int cnid, int ctsid, DateTime timeSignalled, ushort programNumber, TimeSignal timeSignal)
{
NpgsqlCommand command = connection.CreateCommand();
command.CommandText =
"update scte35_time_signal\r\nset ctime = @ctime,\r\n scte35_value = @scte35_value,\r\n provider_avail_id = @provider_avail_id,\r\n identifier = @identifier,\r\n sub_segments_expected = @sub_segments_expected,\r\n sub_segment_num = @sub_segment_num,\r\n segments_expected = @segments_expected,\r\n segment_num = @segment_num,\r\n segmentation_type_id = @segmentation_type_id,\r\n segmentation_upid = @segmentation_upid,\r\n segmentation_upid_type = @segmentation_upid_type,\r\n segmentation_duration = @segmentation_duration,\r\n program_segmentation_flag = @program_segmentation_flag,\r\n segmentation_event_cancel_indicator = @segmentation_event_cancel_indicator,\r\n device_restrictions = @device_restrictions,\r\n archive_allowed_flag = @archive_allowed_flag,\r\n no_regional_blackout_flag = @no_regional_blackout_flag,\r\n web_delivery_flag = @web_delivery_flag,\r\n segmentation_duration_flag = @segmentation_duration_flag,\r\n segmentation_event_id = @segmentation_event_id,\r\n seg_identifier = @seg_identifier,\r\n utc_offset = @utc_offset,\r\n tai_ns = @tai_ns,\r\n tai_seconds = @tai_seconds,\r\n time_identifier = @time_identifier,\r\n updated_counter = updated_counter + 1,\r\n updated_timestamp = CURRENT_TIMESTAMP\r\nwhere cnid = @cnid\r\nand tsid = @tsid\r\nand program_number = @program_number";
command.Parameters.AddParameter("@cnid", NpgsqlDbType.Integer, cnid);
command.Parameters.AddParameter("@tsid", NpgsqlDbType.Integer, ctsid);
command.Parameters.AddParameter("@ctime", NpgsqlDbType.Timestamp, timeSignalled);
command.Parameters.AddParameter("@program_number", NpgsqlDbType.Integer, programNumber);
command.Parameters.AddParameter("@scte35_value", NpgsqlDbType.Bigint, (long?)timeSignal.Value);
command.Parameters.AddParameter("@provider_avail_id", NpgsqlDbType.Bigint, (long?)timeSignal.Descriptors.availDescriptor?.ProviderAvailId);
command.Parameters.AddParameter("@identifier", NpgsqlDbType.Bigint, (long?)timeSignal.Descriptors.availDescriptor?.Identifier);
command.Parameters.AddParameter("@sub_segments_expected", NpgsqlDbType.Integer, (byte?)timeSignal.Descriptors.segmentationDescriptor?.SubSegmentsExpected);
command.Parameters.AddParameter("@sub_segment_num", NpgsqlDbType.Integer, (byte?)timeSignal.Descriptors.segmentationDescriptor?.SubSegmentNum);
command.Parameters.AddParameter("@segments_expected", NpgsqlDbType.Integer, (byte?)timeSignal.Descriptors.segmentationDescriptor?.SegmentsExpected);
command.Parameters.AddParameter("@segment_num", NpgsqlDbType.Integer, (byte?)timeSignal.Descriptors.segmentationDescriptor?.SegmentNum);
command.Parameters.AddParameter("@segmentation_type_id", NpgsqlDbType.Integer, (byte?)timeSignal.Descriptors.segmentationDescriptor?.SegmentationTypeId);
if (timeSignal.Descriptors.segmentationDescriptor != null)
{
if (timeSignal.Descriptors.segmentationDescriptor.SegmentationUpid.Contains("\0"))
{
timeSignal.Descriptors.segmentationDescriptor.SegmentationUpid = "";
}
}
command.Parameters.AddParameter("@segmentation_upid", NpgsqlDbType.Text, timeSignal.Descriptors.segmentationDescriptor?.SegmentationUpid);
//@segmentation_upid_type,@segmentation_duration,@program_segmentation_flag,@segmentation_event_cancel_indicator,@device_restrictions,@archive_allowed_flag,@no_regional_blackout_flag,@web_delivery_flag,@segmentation_duration_flag, @segmentation_event_id, @seg_identifier, @utc_offset, @tai_ns, @tai_seconds, @time_identifier)";
command.Parameters.AddParameter("@segmentation_upid_type", NpgsqlDbType.Integer, (byte?)timeSignal.Descriptors.segmentationDescriptor?.SegmentationUpidType);
command.Parameters.AddParameter("@segmentation_duration", NpgsqlDbType.Bigint, (long?)timeSignal.Descriptors.segmentationDescriptor?.SegmentationDuration);
command.Parameters.AddParameter("@program_segmentation_flag", NpgsqlDbType.Boolean, (bool?)timeSignal.Descriptors.segmentationDescriptor?.ProgramSegmentationFlag);
command.Parameters.AddParameter("@segmentation_event_cancel_indicator", NpgsqlDbType.Boolean, (bool?)timeSignal.Descriptors.segmentationDescriptor?.SegmentationEventCancelIndicator);
command.Parameters.AddParameter("@device_restrictions", NpgsqlDbType.Integer, (int?)timeSignal.Descriptors.segmentationDescriptor?.DeviceRestrictions);
command.Parameters.AddParameter("@archive_allowed_flag", NpgsqlDbType.Boolean, (bool?)timeSignal.Descriptors.segmentationDescriptor?.ArchiveAllowedFlag);
command.Parameters.AddParameter("@no_regional_blackout_flag", NpgsqlDbType.Boolean, (bool?)timeSignal.Descriptors.segmentationDescriptor?.NoRegionalBlackoutFlag);
command.Parameters.AddParameter("@web_delivery_flag", NpgsqlDbType.Boolean, (bool?)timeSignal.Descriptors.segmentationDescriptor?.WebDeliveryFlag);
//@segmentation_duration_flag, @segmentation_event_id, @seg_identifier, @utc_offset, @tai_ns, @tai_seconds, @time_identifier)";
command.Parameters.AddParameter("@segmentation_duration_flag", NpgsqlDbType.Boolean, (bool?)timeSignal.Descriptors.segmentationDescriptor?.SegmentationDurationFlag);
command.Parameters.AddParameter("@segmentation_event_id", NpgsqlDbType.Bigint, (long?)timeSignal.Descriptors.segmentationDescriptor?.SegmentationEventId);
command.Parameters.AddParameter("@seg_identifier", NpgsqlDbType.Bigint, (long?)timeSignal.Descriptors.segmentationDescriptor?.Identifier);
if (timeSignal.Descriptors.timeDescriptor != null)
{
command.Parameters.AddParameter("@utc_offset", NpgsqlDbType.Integer, (int?)timeSignal.Descriptors.timeDescriptor.UtcOffset);
command.Parameters.AddParameter("@tai_ns", NpgsqlDbType.Bigint, (long?)timeSignal.Descriptors.timeDescriptor.TaiNs);
command.Parameters.AddParameter("@tai_seconds", NpgsqlDbType.Bigint, (long?)timeSignal.Descriptors.timeDescriptor.TaiSeconds);
command.Parameters.AddParameter("@time_identifier", NpgsqlDbType.Bigint, (long?)timeSignal.Descriptors.timeDescriptor.Identifier);
}
else
{
command.Parameters.AddParameter("@utc_offset", NpgsqlDbType.Integer, DBNull.Value);
command.Parameters.AddParameter("@tai_ns", NpgsqlDbType.Bigint, DBNull.Value);
command.Parameters.AddParameter("@tai_seconds", NpgsqlDbType.Bigint, DBNull.Value);
command.Parameters.AddParameter("@time_identifier", NpgsqlDbType.Bigint, DBNull.Value);
}
command.ExecuteNonQuery();
}
private void InsertScte35TimeSignal(NpgsqlConnection connection, int cnid, int ctsid, DateTime timeSignalled, ushort programNumber, TimeSignal timeSignal)
{
if (timeSignal.Descriptors != null)
if (timeSignal.Descriptors.segmentationDescriptor != null)
if (timeSignal.Descriptors.segmentationDescriptor.SegmentationUpid != null)
if (timeSignal.Descriptors.segmentationDescriptor.SegmentationUpid.Contains("\0"))
timeSignal.Descriptors.segmentationDescriptor.SegmentationUpid = "";
NpgsqlCommand command = connection.CreateCommand();
command.CommandText =
"insert into scte35_time_signal (cnid, tsid, ctime, program_number, scte35_value, provider_avail_id, identifier, sub_segments_expected, sub_segment_num, segments_expected, segment_num," +
" segmentation_type_id, segmentation_upid, segmentation_upid_type, segmentation_duration, program_segmentation_flag, segmentation_event_cancel_indicator, device_restrictions, archive_allowed_flag,\r\n no_regional_blackout_flag, web_delivery_flag, segmentation_duration_flag,\r\n segmentation_event_id, seg_identifier, utc_offset, tai_ns, tai_seconds, time_identifier) " +
"values " +
"(@cnid,@tsid,@ctime,@program_number,@scte35_value,@provider_avail_id,@identifier,@sub_segments_expected,@sub_segment_num,@segments_expected,@segment_num,@segmentation_type_id,@segmentation_upid,@segmentation_upid_type, @segmentation_duration, @program_segmentation_flag, @segmentation_event_cancel_indicator, @device_restrictions, @archive_allowed_flag, @no_regional_blackout_flag, @web_delivery_flag, @segmentation_duration_flag, @segmentation_event_id, @seg_identifier, @utc_offset, @tai_ns, @tai_seconds, @time_identifier)";
command.Parameters.AddParameter("@cnid", NpgsqlDbType.Integer, cnid);
command.Parameters.AddParameter("@tsid", NpgsqlDbType.Integer, ctsid);
command.Parameters.AddParameter("@ctime", NpgsqlDbType.Timestamp, timeSignalled);
command.Parameters.AddParameter("@program_number", NpgsqlDbType.Integer, programNumber);
command.Parameters.AddParameter("@scte35_value", NpgsqlDbType.Bigint, (long?)timeSignal.Value);
command.Parameters.AddParameter("@provider_avail_id", NpgsqlDbType.Bigint, (long?)timeSignal.Descriptors.availDescriptor?.ProviderAvailId);
command.Parameters.AddParameter("@identifier", NpgsqlDbType.Bigint, (long?)timeSignal.Descriptors.availDescriptor?.Identifier);
command.Parameters.AddParameter("@sub_segments_expected", NpgsqlDbType.Integer, (byte?)timeSignal.Descriptors.segmentationDescriptor?.SubSegmentsExpected);
command.Parameters.AddParameter("@sub_segment_num", NpgsqlDbType.Integer, (byte?)timeSignal.Descriptors.segmentationDescriptor?.SubSegmentNum);
command.Parameters.AddParameter("@segments_expected", NpgsqlDbType.Integer, (byte?)timeSignal.Descriptors.segmentationDescriptor?.SegmentsExpected);
command.Parameters.AddParameter("@segment_num", NpgsqlDbType.Integer, (byte?)timeSignal.Descriptors.segmentationDescriptor?.SegmentNum);
command.Parameters.AddParameter("@segmentation_type_id", NpgsqlDbType.Integer, (byte?)timeSignal.Descriptors.segmentationDescriptor?.SegmentationTypeId);
command.Parameters.AddParameter("@segmentation_upid", NpgsqlDbType.Text, timeSignal.Descriptors.segmentationDescriptor?.SegmentationUpid);
//@segmentation_upid_type,@segmentation_duration,@program_segmentation_flag,@segmentation_event_cancel_indicator,@device_restrictions,@archive_allowed_flag,@no_regional_blackout_flag,@web_delivery_flag,@segmentation_duration_flag, @segmentation_event_id, @seg_identifier, @utc_offset, @tai_ns, @tai_seconds, @time_identifier)";
command.Parameters.AddParameter("@segmentation_upid_type", NpgsqlDbType.Integer, (byte?)timeSignal.Descriptors.segmentationDescriptor?.SegmentationUpidType);
command.Parameters.AddParameter("@segmentation_duration", NpgsqlDbType.Bigint, (long?)timeSignal.Descriptors.segmentationDescriptor?.SegmentationDuration);
command.Parameters.AddParameter("@program_segmentation_flag", NpgsqlDbType.Boolean, (bool?)timeSignal.Descriptors.segmentationDescriptor?.ProgramSegmentationFlag);
command.Parameters.AddParameter("@segmentation_event_cancel_indicator", NpgsqlDbType.Boolean, (bool?)timeSignal.Descriptors.segmentationDescriptor?.SegmentationEventCancelIndicator);
command.Parameters.AddParameter("@device_restrictions", NpgsqlDbType.Integer, (int?)timeSignal.Descriptors.segmentationDescriptor?.DeviceRestrictions);
command.Parameters.AddParameter("@archive_allowed_flag", NpgsqlDbType.Boolean, (bool?)timeSignal.Descriptors.segmentationDescriptor?.ArchiveAllowedFlag);
command.Parameters.AddParameter("@no_regional_blackout_flag", NpgsqlDbType.Boolean, (bool?)timeSignal.Descriptors.segmentationDescriptor?.NoRegionalBlackoutFlag);
command.Parameters.AddParameter("@web_delivery_flag", NpgsqlDbType.Boolean, (bool?)timeSignal.Descriptors.segmentationDescriptor?.WebDeliveryFlag);
//@segmentation_duration_flag, @segmentation_event_id, @seg_identifier, @utc_offset, @tai_ns, @tai_seconds, @time_identifier)";
command.Parameters.AddParameter("@segmentation_duration_flag", NpgsqlDbType.Boolean, (bool?)timeSignal.Descriptors.segmentationDescriptor?.SegmentationDurationFlag);
command.Parameters.AddParameter("@segmentation_event_id", NpgsqlDbType.Bigint, (long?)timeSignal.Descriptors.segmentationDescriptor?.SegmentationEventId);
command.Parameters.AddParameter("@seg_identifier", NpgsqlDbType.Bigint, (long?)timeSignal.Descriptors.segmentationDescriptor?.Identifier);
command.Parameters.AddParameter("@utc_offset", NpgsqlDbType.Integer, (int?)timeSignal.Descriptors.timeDescriptor?.UtcOffset);
command.Parameters.AddParameter("@tai_ns", NpgsqlDbType.Bigint, (long?)timeSignal.Descriptors.timeDescriptor?.TaiNs);
command.Parameters.AddParameter("@tai_seconds", NpgsqlDbType.Bigint, (long?)timeSignal.Descriptors.timeDescriptor?.TaiSeconds);
command.Parameters.AddParameter("@time_identifier", NpgsqlDbType.Bigint, (long?)timeSignal.Descriptors.timeDescriptor?.Identifier);
command.ExecuteNonQuery();
}
private DateTime? SelectScte35TimeSignal(NpgsqlConnection connection, int cnid, int ctsid, ushort programNumber)
{
DateTime? result = null;
NpgsqlCommand command = connection.CreateCommand();
command.CommandText =
"SELECT ctime FROM scte35_time_signal WHERE cnid = @cnid AND tsid = @tsid AND program_number = @program_number";
command.Parameters.AddWithValue("@cnid", NpgsqlDbType.Integer, cnid);
command.Parameters.AddWithValue("@tsid", NpgsqlDbType.Integer, ctsid);
command.Parameters.AddWithValue("@program_number", NpgsqlDbType.Integer, (int)programNumber);
NpgsqlDataReader dataReader = command.ExecuteReader();
if (dataReader.Read())
result = dataReader.GetDateTime(0);
dataReader.Close();
return result;
}
}
}

View File

@ -0,0 +1,575 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
using Npgsql;
using Npgsql.Internal.Postgres;
using NpgsqlTypes;
using skyscraper5.Dvb.Descriptors;
using skyscraper5.Dvb.Descriptors.Extension;
using skyscraper5.Dvb.Psi.Model;
using skyscraper5.Skyscraper.Scraper.Storage.Utilities;
using static skyscraper5.Dvb.Descriptors.NvodReferenceDescriptor;
namespace skyscraper5.Data.PostgreSql
{
public partial class PostgresqlDataStore
{
public bool TestForSdtService(ushort transportStreamId, ushort originalNetworkId, SdtService sdtService)
{
if (knownSdtServices == null)
knownSdtServices = new HashSet<DatabaseKeySdtService>();
DatabaseKeySdtService key = new DatabaseKeySdtService(transportStreamId, originalNetworkId, sdtService.ServiceId);
if (knownSdtServices.Contains(key))
return true;
using (NpgsqlConnection connection = new NpgsqlConnection(connectionStringBuilder.ToString()))
{
connection.Open();
NpgsqlCommand command = connection.CreateCommand();
command.CommandText =
"SELECT dateadded FROM dvb_sdt WHERE tsid = @tsid AND onid = @onid AND sid = @sid";
command.Parameters.AddWithValue("@tsid", NpgsqlDbType.Integer, (int)transportStreamId);
command.Parameters.AddWithValue("@onid", NpgsqlDbType.Integer, (int)originalNetworkId);
command.Parameters.AddWithValue("@sid", NpgsqlDbType.Integer, (int)sdtService.ServiceId);
NpgsqlDataReader dataReader = command.ExecuteReader();
bool result = false;
if (dataReader.Read())
{
result = true;
knownSdtServices.Add(key);
}
dataReader.Close();
connection.Close();
return result;
}
}
private HashSet<DatabaseKeySdtService> knownSdtServices;
public void StoreSdtService(ushort transportStreamId, ushort originalNetworkId, SdtService sdtService)
{
if (updatedSdtServices == null)
updatedSdtServices = new HashSet<DatabaseKeySdtService>();
DatabaseKeySdtService key = new DatabaseKeySdtService(transportStreamId, originalNetworkId, sdtService.ServiceId);
EnqueueTask(x => WriteSdtService(x, transportStreamId, originalNetworkId, sdtService));
knownSdtServices.Add(key);
updatedSdtServices.Add(key);
}
private void WriteSdtService(NpgsqlConnection connection, ushort transportStreamId, ushort originalNetworkId, SdtService sdtService)
{
NpgsqlCommand command = connection.CreateCommand();
command.CommandText = "SELECT dateadded FROM dvb_sdt WHERE tsid = @tsid AND onid = @onid AND sid = @sid";
command.Parameters.AddWithValue("@tsid", NpgsqlDbType.Integer, (int)transportStreamId);
command.Parameters.AddWithValue("@onid", NpgsqlDbType.Integer, (int)originalNetworkId);
command.Parameters.AddWithValue("@sid", NpgsqlDbType.Integer, (int)sdtService.ServiceId);
NpgsqlDataReader reader = command.ExecuteReader();
bool alreadyKnown = reader.Read();
reader.Close();
command.Dispose();
if (alreadyKnown)
return;
command = connection.CreateCommand();
command.CommandText = "INSERT INTO dvb_sdt " +
"( tsid, onid, sid, eit_schedule_flag, eit_present_following_flag, running_status, free_ca_mode, service_name, service_provider_name, service_type_coding, private_data_specifier, data_broadcast_id, selector, default_authority, control_remote_access_over_internet, reference_service_id, do_not_apply_revocation, do_not_scramble, old_onid, old_sid, old_tsid, component_tag, iso_639_language_code, text) " +
"VALUES " +
"( @tsid, @onid, @sid, @eit_schedule_flag, @eit_present_following_flag, @running_status, @free_ca_mode, @service_name, @service_provider_name, @service_type_coding, " +
" @private_data_specifier, @data_broadcast_id, @selector, @default_authority, @control_remote_access_over_internet, @reference_service_id, @do_not_apply_revocation, " +
" @do_not_scramble, @old_onid, @old_sid, @old_tsid, @component_tag, @iso_639_language_code, @text)";
command.Parameters.AddWithValue("@tsid", NpgsqlDbType.Integer, (int)transportStreamId);
command.Parameters.AddWithValue("@onid", NpgsqlDbType.Integer, (int)originalNetworkId);
command.Parameters.AddWithValue("@sid", NpgsqlDbType.Integer, (int)sdtService.ServiceId);
command.Parameters.AddWithValue("@eit_schedule_flag", NpgsqlDbType.Boolean, sdtService.EitScheduleFlag);
command.Parameters.AddWithValue("@eit_present_following_flag", NpgsqlDbType.Boolean, sdtService.EitPresentFollowingFlag);
command.Parameters.AddWithValue("@running_status", NpgsqlDbType.Integer, (int)sdtService.RunningStatus);
command.Parameters.AddWithValue("@free_ca_mode", NpgsqlDbType.Boolean, sdtService.FreeCaMode);
command.Parameters.AddWithValue("@service_name", NpgsqlDbType.Text, sdtService.ServiceName);
command.Parameters.AddWithValue("@service_provider_name", NpgsqlDbType.Text, sdtService.ServiceProviderName);
if (sdtService.ServiceType.HasValue)
command.Parameters.AddWithValue("@service_type_coding", NpgsqlDbType.Integer, (int)sdtService.ServiceType);
else
command.Parameters.AddWithValue("@service_type_coding", NpgsqlDbType.Integer, DBNull.Value);
if (sdtService.PrivateDataSpecifier.HasValue)
command.Parameters.AddWithValue("@private_data_specifier", NpgsqlDbType.Bigint, (long)sdtService.PrivateDataSpecifier);
else
command.Parameters.AddWithValue("@private_data_specifier", NpgsqlDbType.Bigint, DBNull.Value);
if (sdtService.DataBroadcastId.HasValue)
command.Parameters.AddWithValue("@data_broadcast_id", NpgsqlDbType.Integer, (int)sdtService.DataBroadcastId);
else
command.Parameters.AddWithValue("@data_broadcast_id", NpgsqlDbType.Integer, DBNull.Value);
if (sdtService.Selector != null)
command.Parameters.AddWithValue("@selector", NpgsqlDbType.Bytea, sdtService.Selector);
else
command.Parameters.AddWithValue("@selector", NpgsqlDbType.Bytea, DBNull.Value);
command.Parameters.AddWithValue("@default_authority", NpgsqlDbType.Varchar, sdtService.DefaultAuthority);
if (sdtService.ControlRemoteAccessOverInternet.HasValue)
command.Parameters.AddWithValue("@control_remote_access_over_internet", NpgsqlDbType.Integer, sdtService.ControlRemoteAccessOverInternet);
else
command.Parameters.AddWithValue("@control_remote_access_over_internet", NpgsqlDbType.Integer, DBNull.Value);
//@do_not_scramble, @old_onid, @old_sid, @old_tsid, @component_tag, @iso_639_language_code, @text
if (sdtService.ReferenceServiceId.HasValue)
command.Parameters.AddWithValue("@reference_service_id", NpgsqlDbType.Integer, (int)sdtService.ReferenceServiceId);
else
command.Parameters.AddWithValue("@reference_service_id", NpgsqlDbType.Integer, DBNull.Value);
if (sdtService.DoNotApplyRevocation.HasValue)
command.Parameters.AddWithValue("@do_not_apply_revocation", NpgsqlDbType.Boolean, sdtService.DoNotApplyRevocation);
else
command.Parameters.AddWithValue("@do_not_apply_revocation", NpgsqlDbType.Boolean, DBNull.Value);
if (sdtService.DoNotScramble.HasValue)
command.Parameters.AddWithValue("@do_not_scramble", NpgsqlDbType.Boolean, sdtService.DoNotScramble);
else
command.Parameters.AddWithValue("@do_not_scramble", NpgsqlDbType.Boolean, DBNull.Value);
if (sdtService.OldOriginalNetworkId.HasValue)
command.Parameters.AddWithValue("@old_onid", NpgsqlDbType.Integer, (int)sdtService.OldOriginalNetworkId);
else
command.Parameters.AddWithValue("@old_onid", NpgsqlDbType.Integer, DBNull.Value);
if (sdtService.OldServiceId.HasValue)
command.Parameters.AddWithValue("@old_sid", NpgsqlDbType.Integer, (int)sdtService.OldServiceId);
else
command.Parameters.AddWithValue("@old_sid", NpgsqlDbType.Integer, DBNull.Value);
if (sdtService.OldTransportStreamId.HasValue)
command.Parameters.AddWithValue("@old_tsid", NpgsqlDbType.Integer, (int)sdtService.OldTransportStreamId);
else
command.Parameters.AddWithValue("@old_tsid", NpgsqlDbType.Integer, DBNull.Value);
if (sdtService.ComponentTag.HasValue)
command.Parameters.AddWithValue("@component_tag", NpgsqlDbType.Integer, sdtService.ComponentTag);
else
command.Parameters.AddWithValue("@component_tag", NpgsqlDbType.Integer, DBNull.Value);
command.Parameters.AddWithValue("@iso_639_language_code", NpgsqlDbType.Varchar, sdtService.Iso639LanguageCode);
command.Parameters.AddWithValue("@text", NpgsqlDbType.Text, sdtService.Text);
command.Parameters.CheckNulls();
command.ExecuteNonQuery();
WriteSdtCaIdentifiers(connection, sdtService, transportStreamId, originalNetworkId);
WriteSdtComponents(connection, sdtService, transportStreamId, originalNetworkId);
WriteSdtCountryAvailability(connection, sdtService, transportStreamId, originalNetworkId);
WriteSdtLinkages(connection, sdtService, transportStreamId, originalNetworkId);
WriteSdtMultilingualServiceName(connection, sdtService, transportStreamId, originalNetworkId);
WriteSdtNvodReferences(connection, sdtService, transportStreamId, originalNetworkId);
WriteSdtMessages(connection, sdtService, transportStreamId, originalNetworkId);
}
private void WriteSdtMessages(NpgsqlConnection connection, SdtService sdtService, ushort transportStreamId, ushort originalNetworkId)
{
if (sdtService.Messages == null)
return;
NpgsqlCommand cmd = connection.CreateCommand();
cmd.CommandText = "insert into dvb_sdt_messages (tsid, onid, sid, msgid, language_code, message, dateadded)\r\nvalues (@tsid,@onid,@sid,@msgid,@language,@message,DEFAULT)";
cmd.Parameters.AddWithValue("@tsid", NpgsqlDbType.Integer, transportStreamId);
cmd.Parameters.AddWithValue("@onid", NpgsqlDbType.Integer, originalNetworkId);
cmd.Parameters.AddWithValue("@sid", NpgsqlDbType.Integer, (int)sdtService.ServiceId);
cmd.Parameters.Add("@msgid", NpgsqlDbType.Integer);
cmd.Parameters.Add("@language", NpgsqlDbType.Varchar);
cmd.Parameters.Add("@message", NpgsqlDbType.Text);
foreach (MessageDescriptor message in sdtService.Messages)
{
cmd.Parameters["@msgid"].Value = message.MessageId;
cmd.Parameters["@language"].Value = message.Iso639LanguageCode;
cmd.Parameters["@message"].Value = message.Message;
cmd.ExecuteNonQuery();
}
}
private void WriteSdtNvodReferences(NpgsqlConnection connection, SdtService sdtService, int tsid, int onid)
{
if (sdtService.NvodReferences == null)
return;
NpgsqlCommand cmd = connection.CreateCommand();
cmd.CommandText = "insert into dvb_sdt_nvod_references (tsid, onid, sid, ordinal, nvod_tsid, nvod_onid, nvod_sid)\r\n" +
"values (@tsid, @onid, @sid, @ordinal, @nvod_tsid, @nvod_onid, @nvod_sid)";
cmd.Parameters.AddWithValue("@tsid", NpgsqlDbType.Integer, tsid);
cmd.Parameters.AddWithValue("@onid", NpgsqlDbType.Integer, onid);
cmd.Parameters.AddWithValue("@sid", NpgsqlDbType.Integer, (int)sdtService.ServiceId);
cmd.Parameters.Add("@ordinal", NpgsqlDbType.Integer);
cmd.Parameters.Add("@nvod_tsid", NpgsqlDbType.Integer);
cmd.Parameters.Add("@nvod_onid", NpgsqlDbType.Integer);
cmd.Parameters.Add("@nvod_sid", NpgsqlDbType.Integer);
for (int i = 0; i < sdtService.NvodReferences.Length; i++)
{
NvodReference nvod = sdtService.NvodReferences[i];
if (nvod == null)
continue;
cmd.Parameters["@ordinal"].Value = i;
cmd.Parameters["@nvod_tsid"].Value = (int)nvod.TransportStreamId;
cmd.Parameters["@nvod_onid"].Value = (int)nvod.OriginalNetworkId;
cmd.Parameters["@nvod_sid"].Value = (int)nvod.ServiceId;
cmd.ExecuteNonQuery();
}
}
private void WriteSdtMultilingualServiceName(NpgsqlConnection connection, SdtService sdtService, ushort tsid, ushort onid)
{
if (sdtService.MultilingualServiceName == null)
return;
NpgsqlCommand cmd = connection.CreateCommand();
cmd.CommandText = "insert into dvb_sdt_multilingual_service_name (tsid, onid, sid, ordinal, iso_639_language_code, service_provider_name, service_name) " +
"values " +
"(@tsid, @onid, @sid, @ordinal, @iso_639_language_code, @service_provider_name, @service_name)";
cmd.Parameters.AddWithValue("@tsid", NpgsqlDbType.Integer, (int)tsid);
cmd.Parameters.AddWithValue("@onid", NpgsqlDbType.Integer, (int)onid);
cmd.Parameters.AddWithValue("@sid", NpgsqlDbType.Integer, (int)sdtService.ServiceId);
cmd.Parameters.Add("@ordinal", NpgsqlDbType.Integer);
cmd.Parameters.Add("@iso_639_language_code", NpgsqlDbType.Varchar);
cmd.Parameters.Add("@service_provider_name", NpgsqlDbType.Text);
cmd.Parameters.Add("@service_name", NpgsqlDbType.Text);
for (int i = 0; i < sdtService.MultilingualServiceName.Count; i++)
{
MultilingualServiceNameDescriptor.MultilingualServiceName multilingualServiceName = sdtService.MultilingualServiceName[i];
cmd.Parameters["@ordinal"].Value = i;
cmd.Parameters["@iso_639_language_code"].Value = multilingualServiceName.Iso639LanguageCode;
cmd.Parameters["@service_provider_name"].Value = multilingualServiceName.ServiceProviderName;
cmd.Parameters["@service_name"].Value = multilingualServiceName.ServiceName;
cmd.Parameters.CheckNulls();
cmd.ExecuteNonQuery();
}
}
private void WriteSdtLinkages(NpgsqlConnection connection, SdtService sdtService, ushort tsid, ushort onid)
{
if (sdtService.Linkages == null)
return;
NpgsqlCommand command = connection.CreateCommand();
command.CommandText =
"insert into dvb_sdt_linkages (tsid, onid, sid, ordinal, l_tsid, l_onid, l_sid, 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) " +
"values " +
"(@tsid,@onid,@sid,@ordinal,@l_tsid,@l_onid,@l_sid,@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)";
command.Parameters.AddParameter("@tsid", NpgsqlDbType.Integer, tsid);
command.Parameters.AddParameter("@onid", NpgsqlDbType.Integer, onid);
command.Parameters.AddParameter("@sid", NpgsqlDbType.Integer, sdtService.ServiceId);
command.Parameters.Add("@ordinal", NpgsqlDbType.Integer);
command.Parameters.Add("@l_tsid", NpgsqlDbType.Integer);
command.Parameters.Add("@l_onid", NpgsqlDbType.Integer);
command.Parameters.Add("@l_sid", NpgsqlDbType.Integer);
command.Parameters.Add("@linkage_type", NpgsqlDbType.Integer);
command.Parameters.Add("@handover_type", NpgsqlDbType.Integer);
command.Parameters.Add("@handover_origin_type", NpgsqlDbType.Boolean);
command.Parameters.Add("@handover_network_id", NpgsqlDbType.Integer);
command.Parameters.Add("@handover_initial_service_id", NpgsqlDbType.Integer);
command.Parameters.Add("@target_event_id", NpgsqlDbType.Integer);
command.Parameters.Add("@target_event_listed", NpgsqlDbType.Boolean);
command.Parameters.Add("@target_event_simulcasted", NpgsqlDbType.Boolean);
//@table_type,@private_data_bytes,@bouquet_id)";
command.Parameters.Add("@table_type", NpgsqlDbType.Integer);
command.Parameters.Add("@private_data_bytes", NpgsqlDbType.Bytea);
command.Parameters.Add("@bouquet_id", NpgsqlDbType.Integer);
int i = 0;
foreach (LinkageDescriptor linkage in sdtService.Linkages)
{
command.Parameters["@ordinal"].Value = i++;
command.Parameters["@l_tsid"].Value = (int)linkage.TransportStreamId;
command.Parameters["@l_onid"].Value = (int)linkage.OriginalNetworkId;
command.Parameters["@l_sid"].Value = (int)linkage.ServiceId;
command.Parameters["@linkage_type"].Value = (int)linkage.LinkageType;
command.Parameters["@handover_type"].Value = linkage.HandoverType.HasValue ? (int)linkage.HandoverType.Value : DBNull.Value;
command.Parameters["@handover_origin_type"].Value = linkage.HandoverOriginType.HasValue ? linkage.HandoverOriginType.Value : DBNull.Value;
command.Parameters["@handover_network_id"].Value = linkage.HandoverNetworkId.HasValue ? (int)linkage.HandoverNetworkId.Value : DBNull.Value;
command.Parameters["@handover_initial_service_id"].Value = linkage.HandoverInitialServiceId.HasValue ? linkage.HandoverInitialServiceId.Value : DBNull.Value;
command.Parameters["@target_event_id"].Value = linkage.TargetEventId.HasValue ? linkage.TargetEventId.Value : DBNull.Value;
command.Parameters["@target_event_listed"].Value = linkage.TargetEventListed.HasValue ? linkage.TargetEventListed.Value : DBNull.Value;
command.Parameters["@target_event_simulcasted"].Value = linkage.TargetEventSimulcasted.HasValue ? linkage.TargetEventSimulcasted.Value : DBNull.Value;
command.Parameters["@table_type"].Value = linkage.TableType.HasValue ? (int)linkage.TableType.Value : DBNull.Value;
command.Parameters["@private_data_bytes"].Value = linkage.PrivateDataBytes != null ? linkage.PrivateDataBytes : DBNull.Value;
command.Parameters["@bouquet_id"].Value = linkage.BouquetId.HasValue ? linkage.BouquetId : DBNull.Value;
command.ExecuteNonQuery();
WriteSdtLinkageExtendedEventLinkages(connection, sdtService, tsid, onid, linkage, i);
WriteSdtLinkageIpmacLinkages(connection, sdtService, tsid, onid, linkage, i);
WriteSdtLinkageSsuLinkStructure(connection, sdtService, tsid, onid, linkage, i);
}
}
private void WriteSdtLinkageSsuLinkStructure(NpgsqlConnection connection, SdtService sdtService, ushort tsid, ushort onid, LinkageDescriptor linkage, int i)
{
if (linkage.SystemSoftwareUpdateLinkStructure == null)
return;
foreach (LinkageDescriptor.OuiPrivateData ouiPrivateData in linkage.SystemSoftwareUpdateLinkStructure)
{
throw new NotImplementedException();
}
}
private void WriteSdtLinkageIpmacLinkages(NpgsqlConnection connection, SdtService sdtService, ushort tsid, ushort onid, LinkageDescriptor linkage, int i)
{
if (linkage.IpMacNotificationLinkages == null)
return;
foreach (LinkageDescriptor.IpMacNotificationLinkage notificationLinkage in
linkage.IpMacNotificationLinkages)
{
throw new NotImplementedException();
}
}
private void WriteSdtLinkageExtendedEventLinkages(NpgsqlConnection connection, SdtService sdtService, ushort tsid, ushort onid, LinkageDescriptor linkage, int i)
{
if (linkage.ExtendedEventLinkages == null)
return;
foreach (LinkageDescriptor.ExtendedEventLinkageInfo eventLinkage in linkage.ExtendedEventLinkages)
{
throw new NotImplementedException();
}
}
private void WriteSdtCountryAvailability(NpgsqlConnection connection, SdtService sdtService, ushort tsid, ushort onid)
{
if (sdtService.CountryAvailability == null)
return;
NpgsqlCommand command = connection.CreateCommand();
command.CommandText = "INSERT INTO dvb_sdt_country_availability (tsid, onid, sid, ordinal, k, v) " +
"VALUES (@tsid, @onid, @sid, @ordinal, @k, @v)";
command.Parameters.AddParameter("@tsid",NpgsqlDbType.Integer,tsid);
command.Parameters.AddParameter("@onid", NpgsqlDbType.Integer, onid);
command.Parameters.AddParameter("@sid", NpgsqlDbType.Integer, sdtService.ServiceId);
command.Parameters.Add("@ordinal", NpgsqlDbType.Integer);
command.Parameters.Add("@k", NpgsqlDbType.Varchar);
command.Parameters.Add("@v", NpgsqlDbType.Boolean);
int ordinal = 0;
foreach (var (key, value) in sdtService.CountryAvailability)
{
command.Parameters["@ordinal"].Value = ordinal++;
command.Parameters["@k"].Value = key;
command.Parameters["@v"].Value = value;
command.ExecuteNonQuery();
}
}
private void WriteSdtComponents(NpgsqlConnection connection, SdtService sdtService, ushort tsid, ushort onid)
{
if (sdtService.Components == null)
return;
NpgsqlCommand command = connection.CreateCommand();
command.CommandText =
"insert into dvb_sdt_components (tsid, onid, sid, ordinal, stream_content_ext, stream_content, component_type,component_tag, iso_639_language_code, text)" +
"values ( @tsid, @onid, @sid, @ordinal, @stream_content_ext, @stream_content, @component_type,@component_tag, @iso_639_language_code, @text)";
command.Parameters.AddParameter("@tsid", NpgsqlDbType.Integer, tsid);
command.Parameters.AddParameter("@onid", NpgsqlDbType.Integer, onid);
command.Parameters.AddParameter("@sid", NpgsqlDbType.Integer, sdtService.ServiceId);
command.Parameters.Add("@ordinal", NpgsqlDbType.Integer);
command.Parameters.Add("@stream_content_ext", NpgsqlDbType.Integer);
command.Parameters.Add("@stream_content", NpgsqlDbType.Integer);
command.Parameters.Add("@component_type", NpgsqlDbType.Integer);
command.Parameters.Add("@component_tag", NpgsqlDbType.Integer);
command.Parameters.Add("@iso_639_language_code", NpgsqlDbType.Varchar);
command.Parameters.Add("@text", NpgsqlDbType.Text);
for (int i = 0; i < sdtService.Components.Count; i++)
{
ComponentDescriptor component = sdtService.Components[i];
command.Parameters["@ordinal"].Value = i;
command.Parameters["@stream_content_ext"].Value = component.StreamContentExt;
command.Parameters["@stream_content"].Value = component.StreamContent;
command.Parameters["@component_type"].Value = component.ComponentType;
command.Parameters["@component_tag"].Value = component.ComponentTag;
command.Parameters["@iso_639_language_code"].Value = component.Iso639LanguageCode;
command.Parameters["@text"].Value = component.Text;
command.Parameters.CheckNulls();
command.ExecuteNonQuery();
}
}
private void WriteSdtCaIdentifiers(NpgsqlConnection connection, SdtService sdtService, ushort tsid, ushort onid)
{
if (sdtService.CaIdentifiers == null)
return;
NpgsqlCommand command = connection.CreateCommand();
command.CommandText = "INSERT INTO dvb_sdt_ca_identifiers (tsid, onid, sid, ordinal, caid) " +
"VALUES (@tsid, @onid, @sid, @ordinal, @caid)";
command.Parameters.AddParameter("@tsid", NpgsqlDbType.Integer, tsid);
command.Parameters.AddParameter("@onid", NpgsqlDbType.Integer, onid);
command.Parameters.AddParameter("@sid", NpgsqlDbType.Integer, sdtService.ServiceId);
command.Parameters.Add("@ordinal", NpgsqlDbType.Integer);
command.Parameters.Add("@caid", NpgsqlDbType.Integer);
for (int i = 0; i < sdtService.CaIdentifiers.Length; i++)
{
command.Parameters["@ordinal"].Value = i;
command.Parameters["@caid"].Value = (int)sdtService.CaIdentifiers[i];
command.ExecuteNonQuery();
}
}
private HashSet<DatabaseKeySdtService> updatedSdtServices;
public bool UpdateSdtService(ushort transportStreamId, ushort originalNetworkId, SdtService newerSdtService)
{
if (updatedSdtServices == null)
updatedSdtServices = new HashSet<DatabaseKeySdtService>();
DatabaseKeySdtService key = new DatabaseKeySdtService(transportStreamId, originalNetworkId, newerSdtService.ServiceId);
if (updatedSdtServices.Contains(key))
return false;
SdtService olderSdtService = ReadSdtService(transportStreamId, originalNetworkId, newerSdtService.ServiceId, false);
bool result = olderSdtService.NeedsUpdate(newerSdtService);
if (result)
{
EnqueueTask(x => WriteSdtServiceUpdate(x, transportStreamId, originalNetworkId, newerSdtService));
}
updatedSdtServices.Add(key);
return result;
}
private void WriteSdtServiceUpdate(NpgsqlConnection connection, ushort transportStreamId, ushort originalNetworkId, SdtService sdtService)
{
NpgsqlCommand command = connection.CreateCommand();
command.CommandText =
"UPDATE dvb_sdt\r\nSET eit_schedule_flag = @eit_schedule_flag,\r\n eit_present_following_flag = @eit_present_following_flag,\r\n running_status = @running_status,\r\n free_ca_mode = @free_ca_mode,\r\n service_name = @service_name,\r\n service_provider_name = @service_provider_name,\r\n service_type_coding = @service_type_coding,\r\n private_data_specifier = @private_data_specifier,\r\n data_broadcast_id = @data_broadcast_id,\r\n selector = @selector,\r\n default_authority = @default_authority,\r\n control_remote_access_over_internet = @control_remote_access_over_internet,\r\n reference_service_id = @reference_service_id,\r\n do_not_apply_revocation = @do_not_apply_revocation,\r\n do_not_scramble = @do_not_scramble,\r\n old_onid = @old_onid,\r\n old_sid = @old_sid,\r\n old_tsid = @old_tsid,\r\n component_tag = @component_tag,\r\n iso_639_language_code = @iso_639_language_code,\r\n text = @text,\r\n updated_counter = updated_counter + 1,\r\n updated_timestamp = CURRENT_TIMESTAMP\r\nWHERE tsid = @tsid\r\nAND onid = @onid\r\nAND sid = @sid";
command.Parameters.AddWithValue("@tsid", NpgsqlDbType.Integer, (int)transportStreamId);
command.Parameters.AddWithValue("@onid", NpgsqlDbType.Integer, (int)originalNetworkId);
command.Parameters.AddWithValue("@sid", NpgsqlDbType.Integer, (int)sdtService.ServiceId);
command.Parameters.AddWithValue("@eit_schedule_flag", NpgsqlDbType.Boolean, sdtService.EitScheduleFlag);
command.Parameters.AddWithValue("@eit_present_following_flag", NpgsqlDbType.Boolean, sdtService.EitPresentFollowingFlag);
command.Parameters.AddWithValue("@running_status", NpgsqlDbType.Integer, (int)sdtService.RunningStatus);
command.Parameters.AddWithValue("@free_ca_mode", NpgsqlDbType.Boolean, sdtService.FreeCaMode);
command.Parameters.AddWithValue("@service_name", NpgsqlDbType.Text, sdtService.ServiceName);
command.Parameters.AddWithValue("@service_provider_name", NpgsqlDbType.Text, sdtService.ServiceProviderName);
if (sdtService.ServiceType.HasValue)
command.Parameters.AddWithValue("@service_type_coding", NpgsqlDbType.Integer, (int)sdtService.ServiceType);
else
command.Parameters.AddWithValue("@service_type_coding", NpgsqlDbType.Integer, DBNull.Value);
if (sdtService.PrivateDataSpecifier.HasValue)
command.Parameters.AddWithValue("@private_data_specifier", NpgsqlDbType.Bigint, (long)sdtService.PrivateDataSpecifier);
else
command.Parameters.AddWithValue("@private_data_specifier", NpgsqlDbType.Bigint, DBNull.Value);
if (sdtService.DataBroadcastId.HasValue)
command.Parameters.AddWithValue("@data_broadcast_id", NpgsqlDbType.Integer, (int)sdtService.DataBroadcastId);
else
command.Parameters.AddWithValue("@data_broadcast_id", NpgsqlDbType.Integer, DBNull.Value);
if (sdtService.Selector != null)
command.Parameters.AddWithValue("@selector", NpgsqlDbType.Bytea, sdtService.Selector);
else
command.Parameters.AddWithValue("@selector", NpgsqlDbType.Bytea, DBNull.Value);
command.Parameters.AddWithValue("@default_authority", NpgsqlDbType.Varchar, sdtService.DefaultAuthority);
if (sdtService.ControlRemoteAccessOverInternet.HasValue)
command.Parameters.AddWithValue("@control_remote_access_over_internet", NpgsqlDbType.Integer, sdtService.ControlRemoteAccessOverInternet);
else
command.Parameters.AddWithValue("@control_remote_access_over_internet", NpgsqlDbType.Integer, DBNull.Value);
//@do_not_scramble, @old_onid, @old_sid, @old_tsid, @component_tag, @iso_639_language_code, @text
if (sdtService.ReferenceServiceId.HasValue)
command.Parameters.AddWithValue("@reference_service_id", NpgsqlDbType.Integer, (int)sdtService.ReferenceServiceId);
else
command.Parameters.AddWithValue("@reference_service_id", NpgsqlDbType.Integer, DBNull.Value);
if (sdtService.DoNotApplyRevocation.HasValue)
command.Parameters.AddWithValue("@do_not_apply_revocation", NpgsqlDbType.Boolean, sdtService.DoNotApplyRevocation);
else
command.Parameters.AddWithValue("@do_not_apply_revocation", NpgsqlDbType.Boolean, DBNull.Value);
if (sdtService.DoNotScramble.HasValue)
command.Parameters.AddWithValue("@do_not_scramble", NpgsqlDbType.Boolean, sdtService.DoNotScramble);
else
command.Parameters.AddWithValue("@do_not_scramble", NpgsqlDbType.Boolean, DBNull.Value);
if (sdtService.OldOriginalNetworkId.HasValue)
command.Parameters.AddWithValue("@old_onid", NpgsqlDbType.Integer, sdtService.OldOriginalNetworkId);
else
command.Parameters.AddWithValue("@old_onid", NpgsqlDbType.Integer, DBNull.Value);
if (sdtService.OldServiceId.HasValue)
command.Parameters.AddWithValue("@old_sid", NpgsqlDbType.Integer, sdtService.OldServiceId);
else
command.Parameters.AddWithValue("@old_sid", NpgsqlDbType.Integer, DBNull.Value);
if (sdtService.OldTransportStreamId.HasValue)
command.Parameters.AddWithValue("@old_tsid", NpgsqlDbType.Integer, sdtService.OldTransportStreamId);
else
command.Parameters.AddWithValue("@old_tsid", NpgsqlDbType.Integer, DBNull.Value);
if (sdtService.ComponentTag.HasValue)
command.Parameters.AddWithValue("@component_tag", NpgsqlDbType.Integer, sdtService.ComponentTag);
else
command.Parameters.AddWithValue("@component_tag", NpgsqlDbType.Integer, DBNull.Value);
command.Parameters.AddWithValue("@iso_639_language_code", NpgsqlDbType.Varchar, sdtService.Iso639LanguageCode);
command.Parameters.AddWithValue("@text", NpgsqlDbType.Text, sdtService.Text);
command.Parameters.CheckNulls();
command.ExecuteNonQuery();
command.Dispose();
}
private SdtService ReadSdtService(ushort transportStreamId, ushort originalNetworkId, ushort serviceId, bool recursive)
{
using (NpgsqlConnection conn = new NpgsqlConnection(connectionStringBuilder.ToString()))
{
conn.Open();
NpgsqlCommand command = conn.CreateCommand();
command.CommandText = "SELECT * FROM dvb_sdt WHERE tsid = @tsid AND onid = @onid AND sid = @sid";
command.Parameters.AddWithValue("@tsid", NpgsqlDbType.Integer, (int)transportStreamId);
command.Parameters.AddWithValue("@onid", NpgsqlDbType.Integer, (int)originalNetworkId);
command.Parameters.AddWithValue("@sid", NpgsqlDbType.Integer, (int)serviceId);
NpgsqlDataReader dataReader = command.ExecuteReader();
SdtService result = null;
if (dataReader.Read())
{
transportStreamId = (ushort)dataReader.GetInt32(0);
originalNetworkId = (ushort)dataReader.GetInt32(1);
serviceId = (ushort)dataReader.GetInt32(2);
DateTime dateAdded = dataReader.GetDateTime(3);
bool eitScheduleFlag = dataReader.GetBoolean(4);
bool eitPresentFollowingFlag = dataReader.GetBoolean(5);
RunningStatus runningStatus = (RunningStatus)dataReader.GetInt32(6);
bool freeCaMode = dataReader.GetBoolean(7);
result = new SdtService(serviceId, eitScheduleFlag, eitPresentFollowingFlag, runningStatus, freeCaMode);
result.ServiceName = dataReader.IsDBNull(8) ? null : dataReader.GetString(8);
result.ServiceProviderName = dataReader.IsDBNull(9) ? null : dataReader.GetString(9);
result.ServiceType = dataReader.IsDBNull(10) ? null : (ServiceDescriptor.ServiceTypeCoding)dataReader.GetInt32(10);
result.PrivateDataSpecifier = dataReader.IsDBNull(11) ? null : (uint)dataReader.GetInt64(11);
result.DataBroadcastId = dataReader.IsDBNull(12) ? null : (ushort)dataReader.GetInt32(12);
result.Selector = dataReader.IsDBNull(13) ? null : dataReader.GetByteArray(13);
result.DefaultAuthority = dataReader.IsDBNull(14) ? null : dataReader.GetString(14);
result.ControlRemoteAccessOverInternet = dataReader.IsDBNull(15) ? null : (int)dataReader.GetInt32(15);
result.ReferenceServiceId = dataReader.IsDBNull(16) ? null : (ushort)dataReader.GetInt32(16);
result.DoNotApplyRevocation = dataReader.IsDBNull(17) ? null : (bool)dataReader.GetBoolean(17);
result.DoNotScramble = dataReader.IsDBNull(18) ? null : (bool)dataReader.GetBoolean(18);
result.OldOriginalNetworkId = dataReader.IsDBNull(19) ? null : (ushort)dataReader.GetInt32(19);
result.OldServiceId = dataReader.IsDBNull(20) ? null : (ushort)dataReader.GetInt32(20);
result.OldTransportStreamId = dataReader.IsDBNull(21) ? null : (ushort)dataReader.GetInt32(21);
result.ComponentTag = dataReader.IsDBNull(22) ? null : (byte)dataReader.GetInt32(22);
result.Iso639LanguageCode = dataReader.IsDBNull(23) ? null : dataReader.GetString(23);
result.Text = dataReader.IsDBNull(24) ? null : dataReader.GetString(24);
}
dataReader.Close();
command.Dispose();
conn.Close();
return result;
}
}
}
}

View File

@ -0,0 +1,31 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace skyscraper5.Data.PostgreSql
{
internal static class StringExtensions
{
public static string TrimJunk(this string str)
{
if (str == null)
return null;
str = str.Trim('\0');
if (!str.Contains("\0"))
return str;
string iris = "";
foreach(char c in str)
{
if (c == 0)
break;
iris += c;
}
return iris;
}
}
}

View File

@ -0,0 +1,177 @@
using Npgsql;
using skyscraper5.Skyscraper.Scraper.Storage.Utilities;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace skyscraper5.Data.PostgreSql
{
public partial class PostgresqlDataStore
{
public Dictionary<DatabaseKeyT2MI,DateTime> _knownT2MiTimestamps;
public DateTime T2MiGetTimestamp(int currentNetworkId, int currentTransportStreamId, int pid)
{
if (_knownT2MiTimestamps == null)
_knownT2MiTimestamps = new Dictionary<DatabaseKeyT2MI, DateTime>();
DatabaseKeyT2MI key = new DatabaseKeyT2MI(currentNetworkId, currentTransportStreamId, pid);
if (_knownT2MiTimestamps.ContainsKey(key))
return _knownT2MiTimestamps[key];
DateTime result;
using (NpgsqlConnection conn = new NpgsqlConnection(connectionStringBuilder.ToString()))
{
conn.Open();
NpgsqlCommand cmd = conn.CreateCommand();
cmd.CommandText = "select t2mi_time\r\nfrom dvb_t2mi_timestamps\r\nWHERE cnid = @cnid\r\nAND ctsid = @ctsid\r\nAND pid = @pid";
cmd.Parameters.AddWithValue("@cnid", NpgsqlTypes.NpgsqlDbType.Integer, currentNetworkId);
cmd.Parameters.AddWithValue("@ctsid", NpgsqlTypes.NpgsqlDbType.Integer, currentTransportStreamId);
cmd.Parameters.AddWithValue("@pid", NpgsqlTypes.NpgsqlDbType.Integer, pid);
NpgsqlDataReader reader = cmd.ExecuteReader();
if (reader.Read())
{
result = reader.GetDateTime(0);
_knownT2MiTimestamps[key] = result;
}
else
{
result = DateTime.MinValue;
}
reader.Close();
cmd.Dispose();
conn.Close();
}
return result;
}
public void T2MiSetTimestamp(int currentNetworkId, int currentTransportStreamId, int pid, DateTime resolveTime)
{
DatabaseKeyT2MI key = new DatabaseKeyT2MI(currentNetworkId, currentTransportStreamId, pid);
if (_knownT2MiTimestamps.ContainsKey(key))
{
//already in db, so perform update
EnqueueTask(x => UpdateT2MiTimestamp(x, currentNetworkId, currentTransportStreamId, pid, resolveTime));
}
else
{
//not yet in db, so perform insert
EnqueueTask(x => InsertT2MiTimestamp(x, currentNetworkId, currentTransportStreamId, pid, resolveTime));
}
_knownT2MiTimestamps[key] = resolveTime;
EnqueueTask(CommitTransaction);
}
private void UpdateT2MiTimestamp(NpgsqlConnection x, int currentNetworkId, int currentTransportStreamId, int pid, DateTime resolveTime)
{
NpgsqlCommand cmd = x.CreateCommand();
cmd.CommandText = "UPDATE dvb_t2mi_timestamps " +
"SET t2mi_time = @resolveTime, updated_counter = updated_counter + 1, updated_timestamp = current_timestamp " +
"WHERE cnid = @cnid " +
"AND ctsid = @ctsid " +
"AND pid = @pid";
cmd.Parameters.AddWithValue("@resolveTime", NpgsqlTypes.NpgsqlDbType.Timestamp, resolveTime);
cmd.Parameters.AddWithValue("@cnid", NpgsqlTypes.NpgsqlDbType.Integer, currentNetworkId);
cmd.Parameters.AddWithValue("@ctsid", NpgsqlTypes.NpgsqlDbType.Integer, currentTransportStreamId);
cmd.Parameters.AddWithValue("@pid", NpgsqlTypes.NpgsqlDbType.Integer, pid);
cmd.ExecuteNonQuery();
}
private void InsertT2MiTimestamp(NpgsqlConnection x, int currentNetworkId, int currentTransportStreamId, int pid, DateTime resolveTime)
{
NpgsqlCommand cmd = x.CreateCommand();
cmd.CommandText = "insert into dvb_t2mi_timestamps (cnid, ctsid, pid, t2mi_time)\r\nvalues (@cnid,@ctsid,@pid,@t2mi_time)";
cmd.Parameters.AddWithValue("@cnid", currentNetworkId);
cmd.Parameters.AddWithValue("@ctsid", currentTransportStreamId);
cmd.Parameters.AddWithValue("@pid", pid);
cmd.Parameters.AddWithValue("@t2mi_time", resolveTime);
cmd.ExecuteNonQuery();
}
private HashSet<DatabaseKeyT2MiTransmitter> _knownT2MiTransmitters;
public bool T2MiTestForTransmitter(int? currentNetworkId, int? currentTransportStreamId, int relatedPid, ushort txIdentifier)
{
if (_knownT2MiTransmitters == null)
_knownT2MiTransmitters = new HashSet<DatabaseKeyT2MiTransmitter>();
DatabaseKeyT2MiTransmitter key = new DatabaseKeyT2MiTransmitter(currentNetworkId.Value, currentTransportStreamId.Value, relatedPid, txIdentifier);
if (_knownT2MiTransmitters.Contains(key))
return true;
bool result;
using (NpgsqlConnection conn = new NpgsqlConnection(connectionStringBuilder.ToString()))
{
conn.Open();
NpgsqlCommand cmd = conn.CreateCommand();
cmd.CommandText = "SELECT dateadded \r\nFROM dvb_t2mi_transmitters\r\nWHERE cnid = @cnid\r\nAND ctsid = @ctsid\r\nAND pid = @pid\r\nAND tx = @tx";
cmd.Parameters.AddWithValue("@cnid", NpgsqlTypes.NpgsqlDbType.Integer, currentNetworkId.Value);
cmd.Parameters.AddWithValue("@ctsid", NpgsqlTypes.NpgsqlDbType.Integer, currentTransportStreamId.Value);
cmd.Parameters.AddWithValue("@pid", NpgsqlTypes.NpgsqlDbType.Integer, relatedPid);
cmd.Parameters.AddWithValue("@tx", NpgsqlTypes.NpgsqlDbType.Integer, (int)txIdentifier);
NpgsqlDataReader dataReader = cmd.ExecuteReader();
result = dataReader.Read();
dataReader.Close();
cmd.Dispose();
conn.Close();
}
if (result)
_knownT2MiTransmitters.Add(key);
return result;
}
public void T2MiRememberTransmitter(int? currentNetworkId, int? currentTransportStreamId, int relatedPid, ushort txIdentifier)
{
EnqueueTask(x => InsertT2MiTransmitter(x, currentNetworkId.Value, currentTransportStreamId.Value, relatedPid, (int)txIdentifier));
DatabaseKeyT2MiTransmitter key = new DatabaseKeyT2MiTransmitter(currentNetworkId.Value, currentTransportStreamId.Value, relatedPid, txIdentifier);
_knownT2MiTransmitters.Add(key);
}
private void InsertT2MiTransmitter(NpgsqlConnection x, int currentNetworkId, int currentTransportStreamId, int relatedPid, int txIdentifier)
{
NpgsqlCommand cmd = x.CreateCommand();
cmd.CommandText = "INSERT INTO dvb_t2mi_transmitters (cnid, ctsid, pid, tx) VALUES (@cnid, @ctsid, @pid, @tx)";
cmd.Parameters.AddWithValue("@cnid", NpgsqlTypes.NpgsqlDbType.Integer, currentNetworkId);
cmd.Parameters.AddWithValue("@ctsid", NpgsqlTypes.NpgsqlDbType.Integer, currentTransportStreamId);
cmd.Parameters.AddWithValue("@pid", NpgsqlTypes.NpgsqlDbType.Integer, relatedPid);
cmd.Parameters.AddWithValue("@tx", NpgsqlTypes.NpgsqlDbType.Integer, (int)txIdentifier);
cmd.ExecuteNonQuery();
}
private Dictionary<DatabaseKeyT2MiTransmitter, ushort> _knownT2MiTimeOffsets;
public void T2MiSetTransmitterTimeOffset(int? currentNetworkId, int? currentTransportStreamId, int relatedPid, ushort txIdentifier, ushort timeOffset)
{
if (_knownT2MiTimeOffsets == null)
_knownT2MiTimeOffsets = new Dictionary<DatabaseKeyT2MiTransmitter, ushort>();
DatabaseKeyT2MiTransmitter key = new DatabaseKeyT2MiTransmitter(currentNetworkId.Value, currentTransportStreamId.Value, relatedPid, txIdentifier);
if (_knownT2MiTimeOffsets.ContainsKey(key))
{
if (_knownT2MiTimeOffsets[key] == timeOffset)
return;
}
EnqueueTask(x => UpdateT2MiTransmitterTimeOffset(x, currentNetworkId.Value, currentTransportStreamId.Value, relatedPid, txIdentifier, timeOffset));
_knownT2MiTimeOffsets[key] = timeOffset;
}
private void UpdateT2MiTransmitterTimeOffset(NpgsqlConnection x, int currentNetworkId, int currentTransportStreamId, int relatedPid, ushort txIdentifier, ushort timeOffset)
{
NpgsqlCommand cmd = x.CreateCommand();
cmd.CommandText = "UPDATE dvb_t2mi_transmitters\r\n" +
"SET timeoffset = @timeoffset, updated_counter = updated_counter + 1, updated_timestamp = CURRENT_TIMESTAMP\r\n" +
"WHERE cnid = @cnid\r\n" +
"AND ctsid = @ctsid\r\n" +
"AND pid = @pid\r\n" +
"AND tx = @tx";
cmd.Parameters.AddWithValue("@cnid", NpgsqlTypes.NpgsqlDbType.Integer, currentNetworkId);
cmd.Parameters.AddWithValue("@ctsid", NpgsqlTypes.NpgsqlDbType.Integer, currentTransportStreamId);
cmd.Parameters.AddWithValue("@pid", NpgsqlTypes.NpgsqlDbType.Integer, relatedPid);
cmd.Parameters.AddWithValue("@tx", NpgsqlTypes.NpgsqlDbType.Integer, (int)txIdentifier);
cmd.Parameters.AddWithValue("@timeoffset", NpgsqlTypes.NpgsqlDbType.Integer, (int)timeOffset);
cmd.ExecuteNonQuery();
}
}
}

View File

@ -0,0 +1,98 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;
using Npgsql;
using NpgsqlTypes;
using skyscraper5.Skyscraper.Scraper.Storage.Utilities;
namespace skyscraper5.Data.PostgreSql
{
public partial class PostgresqlDataStore
{
private Dictionary<DatabaseKeyTdt, DateTime> _knownTdt;
public bool UpdateTimeAndDate(int currentNetworkId, int currentTransportStreamId, DateTime utcTime)
{
if (_knownTdt == null)
_knownTdt = new Dictionary<DatabaseKeyTdt, DateTime>();
DatabaseKeyTdt key = new DatabaseKeyTdt(currentNetworkId, currentTransportStreamId);
if (!_knownTdt.ContainsKey(key))
{
DateTime? inDb = SelectTdt(currentNetworkId, currentTransportStreamId);
if (inDb.HasValue)
{
//already in db
_knownTdt.Add(key, inDb.Value);
}
else
{
//not in db, need insert
EnqueueTask(x => InsertTdt(x, currentNetworkId, currentTransportStreamId, utcTime));
EnqueueTask(CommitTransaction);
_knownTdt.Add(key, utcTime);
return true;
}
}
DateTime lastKnownTime = _knownTdt[key];
if (lastKnownTime < utcTime)
{
EnqueueTask(x => UpdateTdt(x, currentNetworkId, currentTransportStreamId, utcTime));
EnqueueTask(CommitTransaction);
_knownTdt[key] = utcTime;
return true;
}
return false;
}
private void UpdateTdt(NpgsqlConnection connection, int currentNetworkId, int currentTransportStreamId, DateTime utcTime)
{
NpgsqlCommand command = connection.CreateCommand();
command.CommandText =
"UPDATE dvb_tdt " +
"SET utc_time = @utc, updated_counter = updated_counter + 1, updated_timestamp = CURRENT_TIMESTAMP " +
"WHERE cnid = @cnid " +
"AND ctsid = @ctsid";
command.Parameters.AddWithValue("@cnid", NpgsqlDbType.Integer, currentNetworkId);
command.Parameters.AddWithValue("@ctsid", NpgsqlDbType.Integer, currentTransportStreamId);
command.Parameters.AddWithValue("@utc", NpgsqlDbType.Timestamp, utcTime);
command.ExecuteNonQuery();
}
private void InsertTdt(NpgsqlConnection conn, int currentNetworkId, int currentTransportStreamId, DateTime utcTime)
{
NpgsqlCommand command = conn.CreateCommand();
command.CommandText = "INSERT INTO dvb_tdt (cnid, ctsid, utc_time) VALUES (@cnid, @ctsid, @utc)";
command.Parameters.AddWithValue("@cnid", NpgsqlDbType.Integer, currentNetworkId);
command.Parameters.AddWithValue("@ctsid", NpgsqlDbType.Integer, currentTransportStreamId);
command.Parameters.AddWithValue("@utc", NpgsqlDbType.Timestamp, utcTime);
command.ExecuteNonQuery();
}
private DateTime? SelectTdt(int currentNetworkId, int currentTransportStreamId)
{
DateTime? result = null;
using (NpgsqlConnection conn = new NpgsqlConnection(connectionStringBuilder.ToString()))
{
conn.Open();
NpgsqlCommand command = conn.CreateCommand();
command.CommandText = "SELECT utc_time FROM dvb_tdt WHERE cnid = @cnid AND ctsid = @ctsid";
command.Parameters.AddWithValue("@cnid", NpgsqlDbType.Integer, currentNetworkId);
command.Parameters.AddWithValue("@ctsid", NpgsqlDbType.Integer, currentTransportStreamId);
NpgsqlDataReader dataReader = command.ExecuteReader();
if (dataReader.Read())
{
result = dataReader.GetDateTime(0);
}
dataReader.Close();
command.Dispose();
conn.Close();
}
return result;
}
}
}

View File

@ -0,0 +1,65 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Npgsql;
using NpgsqlTypes;
using skyscraper5.Skyscraper.Scraper.Storage.Utilities;
using skyscraper5.Teletext;
namespace skyscraper5.Data.PostgreSql
{
public partial class PostgresqlDataStore
{
private HashSet<DatabaseKeyTeletextPage> knownTeletextPages;
public bool StoreTeletextPage(int networkId, int transportStreamId, ushort programNumber, TeletextMagazine magazine, DateTime timestamp)
{
if (knownTeletextPages == null)
knownTeletextPages = new HashSet<DatabaseKeyTeletextPage>();
timestamp = new DateTime(timestamp.Year, timestamp.Month, timestamp.Day, timestamp.Hour, timestamp.Minute, 0);
DatabaseKeyTeletextPage key = new DatabaseKeyTeletextPage(networkId, transportStreamId, programNumber, magazine.HumanReadablePageNumber, timestamp);
if (knownTeletextPages.Contains(key))
return false;
EnqueueTask(x => WriteTeletextPage(x, networkId, transportStreamId, programNumber, magazine, timestamp));
knownTeletextPages.Add(key);
return true;
}
private void WriteTeletextPage(NpgsqlConnection connection, int networkId, int transportStreamId, ushort programNumber, TeletextMagazine magazine, DateTime timestamp)
{
if (TestForTeletextPage(connection, networkId, transportStreamId, programNumber, magazine.HumanReadablePageNumber, timestamp))
return;
NpgsqlCommand command = connection.CreateCommand();
command.CommandText =
"INSERT INTO teletext (nid, tsid, program_number, page, tdt_time, page_content) " +
"VALUES (@nid, @tsid, @program_number, @page, @tdt_time, @page_content)";
command.Parameters.AddWithValue("@nid", NpgsqlDbType.Integer, networkId);
command.Parameters.AddWithValue("@tsid", NpgsqlDbType.Integer, transportStreamId);
command.Parameters.AddWithValue("@program_number", NpgsqlDbType.Integer, (int)programNumber);
command.Parameters.AddWithValue("@page", NpgsqlDbType.Integer, (int)magazine.HumanReadablePageNumber);
command.Parameters.AddWithValue("@tdt_time", NpgsqlDbType.Timestamp, timestamp);
command.Parameters.AddWithValue("@page_content", NpgsqlDbType.Bytea, magazine.FormatAsByteArray());
command.ExecuteNonQuery();
}
private bool TestForTeletextPage(NpgsqlConnection connection, int networkId, int transportStreamId, ushort programNumber, int pageNumber, DateTime timestamp)
{
NpgsqlCommand command = connection.CreateCommand();
command.CommandText = "SELECT dateadded FROM teletext WHERE nid = @nid AND tsid = @tsid AND program_number = @program_number AND page = @page AND tdt_time = @tdt_time";
command.Parameters.AddWithValue("@nid", NpgsqlDbType.Integer, networkId);
command.Parameters.AddWithValue("@tsid", NpgsqlDbType.Integer, transportStreamId);
command.Parameters.AddWithValue("@program_number", NpgsqlDbType.Integer, (int)programNumber);
command.Parameters.AddWithValue("@page", NpgsqlDbType.Integer, pageNumber);
command.Parameters.AddWithValue("@tdt_time", NpgsqlDbType.Timestamp, timestamp);
NpgsqlDataReader dataReader = command.ExecuteReader();
bool result = dataReader.Read();
dataReader.Close();
command.Dispose();
return result;
}
}
}

View File

@ -0,0 +1,149 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Npgsql;
using NpgsqlTypes;
using skyscraper5.Dvb.Descriptors;
using skyscraper5.Skyscraper.Scraper.Storage.Utilities;
namespace skyscraper5.Data.PostgreSql
{
public partial class PostgresqlDataStore
{
private Dictionary<DatabaseKeyTot, DateTime> _knownTots;
public bool UpdateTimeOffsetTable(int currentNetworkId, int currentTransportStreamId, DateTime utcTime, LocalTimeOffsetDescriptor ltod)
{
if (_knownTots == null)
_knownTots = new Dictionary<DatabaseKeyTot, DateTime>();
if (ltod == null)
return false;
bool result = false;
foreach (LocalTimeOffsetDescriptor.LocalTime offset in ltod.LocalTimeOffsets)
{
DatabaseKeyTot key = new DatabaseKeyTot(currentNetworkId, currentTransportStreamId, offset.CountryCode, (int)offset.LocalTimeOffset.TotalSeconds, offset.LocalTimeOffsetPolarity);
if (_knownTots.ContainsKey(key))
{
//Already cached
DateTime inCache = _knownTots[key];
if (inCache < utcTime)
{
//We are in the future
EnqueueTask(x => WriteUpdateTot(x,currentNetworkId,currentTransportStreamId,utcTime, offset));
_knownTots[key] = utcTime;
result = true;
}
else
{
//We are in the past, nothing to do.
continue;
}
}
else
{
//not yet cached
DateTime? inDb = SelectTot(currentNetworkId, currentTransportStreamId, offset.CountryCode, (int)offset.LocalTimeOffset.TotalSeconds, offset.LocalTimeOffsetPolarity);
if (inDb.HasValue)
{
if (inDb < utcTime)
{
//Database time in the past, need to update
EnqueueTask(x => WriteUpdateTot(x, currentNetworkId, currentTransportStreamId, utcTime, offset));
_knownTots[key] = utcTime;
result = true;
}
else
{
//Database time in the future, no update needed
_knownTots[key] = inDb.Value;
continue;
}
}
else
{
//not yet in database, need to insert
EnqueueTask(x => WriteTot(x, currentNetworkId, currentTransportStreamId, utcTime, offset));
_knownTots[key] = utcTime;
result = true;
}
}
}
EnqueueTask(CommitTransaction);
return result;
}
private void WriteTot(NpgsqlConnection connection, int currentNetworkId, int currentTransportStreamId, DateTime utcTime, LocalTimeOffsetDescriptor.LocalTime offset)
{
NpgsqlCommand command = connection.CreateCommand();
command.CommandText =
"insert into dvb_tot (cnid, ctsid, country_code, utc, country_region_id, local_time_offset_polarity,\r\n local_time_offset, time_of_change, next_time_offset) " +
"values (@cnid, @ctsid, @country_code, @utc, @country_region_id, @local_time_offset_polarity,\r\n @local_time_offset, @time_of_change, @next_time_offset)";
command.Parameters.AddParameter("@cnid", NpgsqlDbType.Integer, (ushort)currentNetworkId);
command.Parameters.AddParameter("@ctsid", NpgsqlDbType.Integer, (ushort)currentTransportStreamId);
command.Parameters.AddParameter("@country_code", NpgsqlDbType.Varchar, offset.CountryCode.Trim('\0'));
command.Parameters.AddParameter("@utc", NpgsqlDbType.Timestamp, utcTime);
command.Parameters.AddParameter("@country_region_id", NpgsqlDbType.Integer, offset.CountryRegionId);
command.Parameters.AddParameter("@local_time_offset_polarity", NpgsqlDbType.Boolean, offset.LocalTimeOffsetPolarity);
command.Parameters.AddParameter("@local_time_offset", NpgsqlDbType.Integer, (int)offset.LocalTimeOffset.TotalSeconds);
command.Parameters.AddParameter("@time_of_change", NpgsqlDbType.Timestamp, offset.TimeOfChange);
command.Parameters.AddParameter("@next_time_offset", NpgsqlDbType.Integer, offset.NextTimeOffset.TotalSeconds);
command.ExecuteNonQuery();
}
private void WriteUpdateTot(NpgsqlConnection connection, int currentNetworkId, int currentTransportStreamId, DateTime utcTime, LocalTimeOffsetDescriptor.LocalTime offset)
{
NpgsqlCommand command = connection.CreateCommand();
command.CommandText =
"UPDATE dvb_tot\r\n" +
"SET utc = @utc," +
" country_region_id = @country_region_id," +
" time_of_change = @time_of_change," +
" next_time_offset = @next_time_offset," +
" updated_counter = updated_counter + 1," +
" updated_timestamp = CURRENT_TIMESTAMP " +
"WHERE cnid = @cnid " +
"AND ctsid = @ctsid " +
"AND country_region_id = @country_region_id " +
"AND local_time_offset_polarity = @local_time_offset_polarity " +
"AND local_time_offset = @local_time_offset";
command.Parameters.AddParameter("@cnid", NpgsqlDbType.Integer, (ushort)currentNetworkId);
command.Parameters.AddParameter("@ctsid", NpgsqlDbType.Integer, (ushort)currentTransportStreamId);
command.Parameters.AddParameter("@country_code", NpgsqlDbType.Varchar, offset.CountryCode);
command.Parameters.AddParameter("@utc", NpgsqlDbType.Timestamp, utcTime);
command.Parameters.AddParameter("@country_region_id", NpgsqlDbType.Integer, offset.CountryRegionId);
command.Parameters.AddParameter("@local_time_offset_polarity", NpgsqlDbType.Boolean, offset.LocalTimeOffsetPolarity);
command.Parameters.AddParameter("@local_time_offset", NpgsqlDbType.Integer, (int)offset.LocalTimeOffset.TotalSeconds);
command.Parameters.AddParameter("@time_of_change", NpgsqlDbType.Timestamp, offset.TimeOfChange);
command.Parameters.AddParameter("@next_time_offset", NpgsqlDbType.Integer, offset.NextTimeOffset.TotalSeconds);
command.ExecuteNonQuery();
}
private DateTime? SelectTot(int currentNetworkId, int currentTransportStreamId, string countyCode, int totalSeconds, bool offsetLocalTimeOffsetPolarity)
{
DateTime? result = null;
using (NpgsqlConnection conn = new NpgsqlConnection(connectionStringBuilder.ToString()))
{
conn.Open();
NpgsqlCommand command = conn.CreateCommand();
command.CommandText =
"SELECT utc FROM dvb_tot WHERE cnid = @cnid AND ctsid = @ctsid AND country_code = @country_code AND local_time_offset = @local_time_offset AND local_time_offset_polarity = @local_time_offset_polarity";
command.Parameters.AddParameter("@cnid", NpgsqlDbType.Integer, currentNetworkId);
command.Parameters.AddParameter("@ctsid", NpgsqlDbType.Integer, currentTransportStreamId);
command.Parameters.AddParameter("@country_code", NpgsqlDbType.Varchar, countyCode.Trim('\0'));
command.Parameters.AddParameter("@local_time_offset", NpgsqlDbType.Integer, totalSeconds);
command.Parameters.AddParameter("@local_time_offset_polarity", NpgsqlDbType.Boolean, offsetLocalTimeOffsetPolarity);
NpgsqlDataReader dataReader = command.ExecuteReader();
if (dataReader.Read())
result = dataReader.GetDateTime(0);
dataReader.Close();
command.Dispose();
conn.Close();
}
return result;
}
}
}

View File

@ -0,0 +1,123 @@
using Npgsql;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace skyscraper5.Data.PostgreSql
{
public partial class PostgresqlDataStore
{
private HashSet<Tuple<int, int, string>> _knownCompliances;
public bool IsCompliant(int currentNetworkId, int currentTransportStreamId, string compliance)
{
if (_knownCompliances == null)
_knownCompliances = new HashSet<Tuple<int, int, string>>();
Tuple<int, int, string> key = new Tuple<int, int, string>(currentNetworkId, currentTransportStreamId, compliance);
if (_knownCompliances.Contains(key))
return true;
bool result;
using (NpgsqlConnection conn = new NpgsqlConnection(connectionStringBuilder.ToString()))
{
conn.Open();
NpgsqlCommand cmd = conn.CreateCommand();
cmd.CommandText = "SELECT dateadded FROM dvb_tsdt WHERE cnid = @cnid AND ctsid = @ctsid AND compliance = @compliance";
cmd.Parameters.AddWithValue("@cnid", NpgsqlTypes.NpgsqlDbType.Integer, currentNetworkId);
cmd.Parameters.AddWithValue("@ctsid", NpgsqlTypes.NpgsqlDbType.Integer, currentTransportStreamId);
cmd.Parameters.AddWithValue("@compliance", NpgsqlTypes.NpgsqlDbType.Text, compliance);
NpgsqlDataReader reader = cmd.ExecuteReader();
result = reader.Read();
reader.Close();
cmd.Dispose();
conn.Close();
}
if (result)
_knownCompliances.Add(key);
return result;
}
public void MarkAsCompliant(int currentNetworkId, int currentTransportStreamId, string compliance)
{
EnqueueTask(x => InsertTsdt(x, currentNetworkId, currentTransportStreamId, compliance));
Tuple<int, int, string> key = new Tuple<int, int, string>(currentNetworkId, currentTransportStreamId, compliance);
_knownCompliances.Add(key);
}
private void InsertTsdt(NpgsqlConnection x, int currentNetworkId, int currentTransportStreamId, string compliance)
{
NpgsqlCommand cmd = x.CreateCommand();
cmd.CommandText = "INSERT INTO dvb_tsdt (cnid,ctsid,compliance) VALUES (@cnid,@ctsid,@compliance)";
cmd.Parameters.AddWithValue("@cnid", NpgsqlTypes.NpgsqlDbType.Integer, currentNetworkId);
cmd.Parameters.AddWithValue("@ctsid", NpgsqlTypes.NpgsqlDbType.Integer, currentTransportStreamId);
cmd.Parameters.AddWithValue("@compliance", NpgsqlTypes.NpgsqlDbType.Text, compliance);
cmd.ExecuteNonQuery();
}
private HashSet<Tuple<int, int, string>> knownStationIdentifications;
public bool SetStationIdentification(int currentNetworkId, int currentTransportStreamId, string stationIdentification)
{
if (stationIdentification == null)
return false;
if (knownStationIdentifications == null)
knownStationIdentifications = new HashSet<Tuple<int, int, string>>();
Tuple<int, int, string> key = new Tuple<int, int, string>(currentNetworkId, currentTransportStreamId, stationIdentification);
if (knownStationIdentifications.Contains(key))
return false;
string currentStationIdentification = null;
using (NpgsqlConnection conn = new NpgsqlConnection(connectionStringBuilder.ToString()))
{
conn.Open();
NpgsqlCommand cmd = conn.CreateCommand();
cmd.CommandText = "SELECT station_identification FROM dvb_tsdt WHERE cnid = @cnid AND ctsid = @ctsid";
cmd.Parameters.AddWithValue("@cnid", NpgsqlTypes.NpgsqlDbType.Integer, currentNetworkId);
cmd.Parameters.AddWithValue("@ctsid", NpgsqlTypes.NpgsqlDbType.Integer, currentTransportStreamId);
NpgsqlDataReader reader = cmd.ExecuteReader();
if (!reader.Read())
{
//station identification without compliance? weird, let's wait a bit and try again.
reader.Close();
conn.Close();
return false;
}
if (!reader.IsDBNull(0))
currentStationIdentification = reader.GetString(0);
reader.Close();
cmd.Dispose();
conn.Close();
}
if (stationIdentification.Equals(currentStationIdentification))
{
//schon bekannt, alles gut.
knownStationIdentifications.Add(key);
return false;
}
else
{
//irgendwie anders
EnqueueTask(x => UpdateStationIdentification(x, currentNetworkId, currentTransportStreamId, stationIdentification));
knownStationIdentifications.Add(key);
return true;
}
}
private void UpdateStationIdentification(NpgsqlConnection x, int currentNetworkId, int currentTransportStreamId, string stationIdentification)
{
NpgsqlCommand cmd = x.CreateCommand();
cmd.CommandText = "update dvb_tsdt\r\n" +
"set station_identification = @station_identification\r\n" +
"where cnid = @cnid\r\n" +
"and ctsid = @ctsid";
cmd.Parameters.AddWithValue("@cnid", NpgsqlTypes.NpgsqlDbType.Integer, currentNetworkId);
cmd.Parameters.AddWithValue("@ctsid", NpgsqlTypes.NpgsqlDbType.Integer, currentTransportStreamId);
cmd.Parameters.AddWithValue("@station_identification", NpgsqlTypes.NpgsqlDbType.Text, stationIdentification);
cmd.ExecuteNonQuery();
}
}
}

View File

@ -0,0 +1,297 @@
using Npgsql;
using NpgsqlTypes;
using skyscraper5.Skyscraper;
using skyscraper5.Skyscraper.Equipment;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace skyscraper5.Data.PostgreSql
{
public partial class PostgresqlDataStore
{
private int uiVersion;
public void UiSetVersion(int version)
{
this.uiVersion = version;
}
public List<LnbType> UiLnbTypesListAll()
{
List<LnbType> lnbTypes = new List<LnbType>();
using (NpgsqlConnection conn = new NpgsqlConnection(connectionStringBuilder.ToString()))
{
conn.Open();
NpgsqlCommand cmd = conn.CreateCommand();
cmd.CommandText = "SELECT * FROM skyscraper5_lnbs";
NpgsqlDataReader dataReader = cmd.ExecuteReader();
while (dataReader.Read())
{
int id = dataReader.GetInt32(0);
DateTime added = dataReader.GetDateTime(1);
string name = dataReader.GetString(2);
int lof1 = dataReader.GetInt32(3);
int lof2 = dataReader.GetInt32(4);
int lofSw = dataReader.GetInt32(5);
int minFreq = dataReader.GetInt32(6);
int maxFreq = dataReader.GetInt32(7);
lnbTypes.Add(new LnbType(name, lof1, lof2, lofSw, minFreq, maxFreq) { DateAdded = added, Id = id });
}
dataReader.Close();
cmd.Dispose();
conn.Close();
}
return lnbTypes;
}
public void UiLnbTypesAdd(LnbType defaultLnbType)
{
using (NpgsqlConnection conn = new NpgsqlConnection(connectionStringBuilder.ToString()))
{
conn.Open();
NpgsqlCommand cmd = conn.CreateCommand();
cmd.CommandText =
"INSERT INTO skyscraper5_lnbs (name, lof1, lof2, lof_sw, min_freq, max_freq) VALUES (@name,@lof1,@lof2,@lof_sw,@min_freq,@max_freq)";
cmd.Parameters.AddWithValue("@name", NpgsqlDbType.Text, defaultLnbType.Name);
cmd.Parameters.AddWithValue("@lof1", NpgsqlDbType.Integer, defaultLnbType.Lof1);
cmd.Parameters.AddWithValue("@lof2", NpgsqlDbType.Integer, defaultLnbType.Lof2);
cmd.Parameters.AddWithValue("@lof_sw", NpgsqlDbType.Integer, defaultLnbType.LofSw);
cmd.Parameters.AddWithValue("@min_freq", NpgsqlDbType.Integer, defaultLnbType.MinimumFrequency);
cmd.Parameters.AddWithValue("@max_freq", NpgsqlDbType.Integer, defaultLnbType.MaximumFrequency);
cmd.ExecuteNonQuery();
cmd.Dispose();
conn.Close();
}
}
public List<DishType> UiDishTypesListAll()
{
List<DishType> result = new List<DishType>();
using (NpgsqlConnection conn = new NpgsqlConnection(connectionStringBuilder.ToString()))
{
conn.Open();
NpgsqlCommand cmd = conn.CreateCommand();
cmd.CommandText = "SELECT * FROM skyscraper5_dishes";
NpgsqlDataReader dataReader = cmd.ExecuteReader();
while (dataReader.Read())
{
int id = dataReader.GetInt32(0);
DateTime added = dataReader.GetDateTime(1);
string name = dataReader.GetString(2);
int diameter = dataReader.GetInt32(3);
DishShape shape = (DishShape)dataReader.GetInt32(4);
result.Add(new DishType(name, diameter, shape) { DateAdded = added, Id = id });
}
}
return result;
}
public void UiDishTypesAdd(DishType defaultDishType)
{
using (NpgsqlConnection conn = new NpgsqlConnection(connectionStringBuilder.ToString()))
{
conn.Open();
NpgsqlCommand cmd = conn.CreateCommand();
cmd.CommandText = "INSERT INTO skyscraper5_dishes (name, diameter, shape) VALUES (@name,@diameter,@shape)";
cmd.Parameters.AddWithValue("@name", NpgsqlDbType.Text, defaultDishType.Name);
cmd.Parameters.AddWithValue("@diameter", NpgsqlDbType.Integer, defaultDishType.Diameter);
cmd.Parameters.AddWithValue("@shape", NpgsqlDbType.Integer, (int)defaultDishType.Shape);
cmd.ExecuteNonQuery();
cmd.Dispose();
conn.Close();
}
}
public List<SatellitePosition> UiSatellitesListAll()
{
List<SatellitePosition> positions = new List<SatellitePosition>();
using (NpgsqlConnection conn = new NpgsqlConnection(connectionStringBuilder.ToString()))
{
conn.Open();
NpgsqlCommand cmd = conn.CreateCommand();
cmd.CommandText = "SELECT * FROM skyscraper5_satellite_positions";
NpgsqlDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
float angle = (float)reader.GetDouble(0);
int cardinal = reader.GetInt32(1);
string name = reader.GetString(2);
SatellitePosition child = new SatellitePosition(angle, cardinal, name);
positions.Add(child);
}
reader.Close();
cmd.Dispose();
conn.Close();
}
return positions;
}
public void UiSatellitesAdd(SatellitePosition newPosition)
{
using (NpgsqlConnection conn = new NpgsqlConnection(connectionStringBuilder.ToString()))
{
conn.Open();
NpgsqlCommand cmd = conn.CreateCommand();
cmd.CommandText =
"insert into skyscraper5_satellite_positions (angle, cardinal, name, keyversion, key) " +
"values (@angle, @cardinal, @name, @keyversion, @key)";
cmd.Parameters.AddWithValue("@angle", NpgsqlDbType.Real, newPosition.angle);
cmd.Parameters.AddWithValue("@cardinal", NpgsqlDbType.Integer, newPosition.cardinalDirection);
cmd.Parameters.AddWithValue("@name", NpgsqlDbType.Text, newPosition.name);
cmd.Parameters.AddWithValue("@keyversion", NpgsqlDbType.Integer, uiVersion);
cmd.Parameters.AddWithValue("@key", NpgsqlDbType.Text, newPosition.Checksum.ToString());
cmd.ExecuteNonQuery();
cmd.Dispose();
conn.Close();
}
}
public void UiSatellitesDelete(SatellitePosition satellitePosition)
{
using (NpgsqlConnection conn = new NpgsqlConnection(connectionStringBuilder.ToString()))
{
conn.Open();
NpgsqlCommand cmd = conn.CreateCommand();
cmd.CommandText =
"DELETE FROM skyscraper5_satellite_positions WHERE keyversion = @keyversion AND key = @key";
cmd.Parameters.AddWithValue("@keyversion", NpgsqlDbType.Integer, uiVersion);
cmd.Parameters.AddWithValue("@key", NpgsqlDbType.Text, satellitePosition.Checksum.ToString());
cmd.ExecuteNonQuery();
cmd.Dispose();
conn.Close();
}
}
public bool UiTunerTestFor(TunerMetadata tuner)
{
bool result;
using (NpgsqlConnection conn = new NpgsqlConnection(connectionStringBuilder.ToString()))
{
conn.Open();
NpgsqlCommand cmd = conn.CreateCommand();
cmd.CommandText =
"SELECT dateadded FROM skyscraper5_tuners WHERE mac = @mac AND satkeyversion = @satkeyversion";
cmd.Parameters.AddWithValue("@mac", NpgsqlDbType.Varchar, tuner.MacAddress.ToString());
cmd.Parameters.AddWithValue("@satkeyversion", NpgsqlDbType.Integer, uiVersion);
NpgsqlDataReader reader = cmd.ExecuteReader();
result = reader.Read();
reader.Close();
cmd.Dispose();
conn.Close();
}
return result;
}
public void UiTunerUpdate(TunerMetadata tuner)
{
using (NpgsqlConnection conn = new NpgsqlConnection(connectionStringBuilder.ToString()))
{
conn.Open();
NpgsqlCommand cmd = conn.CreateCommand();
cmd.CommandText = "UPDATE skyscraper5_tuners " +
"SET diseqc_type = @diseqc_type, sat1 = @sat1, sat2 = @sat2, sat3 = @sat3, sat4 = @sat4," +
" lnb1 = @lnb1, lnb2 = @lnb2, lnb3 = @lnb3, lnb4 = @lnb4," +
" dish1 =@dish1,dish2 =@dish2,dish3 =@dish3,dish4 =@dish4 " +
"WHERE mac = @mac AND satkeyversion = @satkeyversion";
cmd.Parameters.AddWithValue("@diseqc_type", NpgsqlDbType.Integer, (int)tuner.DiseqcType);
cmd.Parameters.AddWithValue("@sat1", NpgsqlDbType.Integer, tuner.Satellites[0]);
cmd.Parameters.AddWithValue("@sat2", NpgsqlDbType.Integer, tuner.Satellites[1]);
cmd.Parameters.AddWithValue("@sat3", NpgsqlDbType.Integer, tuner.Satellites[2]);
cmd.Parameters.AddWithValue("@sat4", NpgsqlDbType.Integer, tuner.Satellites[3]);
cmd.Parameters.AddWithValue("@mac", NpgsqlDbType.Varchar, tuner.MacAddress.ToString());
cmd.Parameters.AddWithValue("@satkeyversion", NpgsqlDbType.Integer, uiVersion);
cmd.Parameters.AddWithValue("@lnb1", NpgsqlDbType.Integer, tuner.Lnbs[0]);
cmd.Parameters.AddWithValue("@lnb2", NpgsqlDbType.Integer, tuner.Lnbs[1]);
cmd.Parameters.AddWithValue("@lnb3", NpgsqlDbType.Integer, tuner.Lnbs[2]);
cmd.Parameters.AddWithValue("@lnb4", NpgsqlDbType.Integer, tuner.Lnbs[3]);
cmd.Parameters.AddWithValue("@dish1", NpgsqlDbType.Integer, tuner.Dishes[0]);
cmd.Parameters.AddWithValue("@dish2", NpgsqlDbType.Integer, tuner.Dishes[1]);
cmd.Parameters.AddWithValue("@dish3", NpgsqlDbType.Integer, tuner.Dishes[2]);
cmd.Parameters.AddWithValue("@dish4", NpgsqlDbType.Integer, tuner.Dishes[3]);
cmd.ExecuteNonQuery();
cmd.Dispose();
conn.Close();
}
}
public void UiTunerInsert(TunerMetadata tuner)
{
using (NpgsqlConnection conn = new NpgsqlConnection(connectionStringBuilder.ToString()))
{
conn.Open();
NpgsqlCommand cmd = conn.CreateCommand();
cmd.CommandText =
"insert into skyscraper5_tuners (mac, vindex, vname, v_std_type, caps, diseqc_type, sat1, sat2, sat3, sat4, satkeyversion, lnb1, lnb2, lnb3, lnb4, dish1, dish2, dish3, dish4) " +
"values " +
"(@mac, @vindex, @vname, @v_std_type, @caps, @diseqc_type, @sat1, @sat2, @sat3, @sat4, @satkeyversion, @lnb1, @lnb2, @lnb3, @lnb4, @dish1, @dish2, @dish3, @dish4)";
cmd.Parameters.AddWithValue("@mac", NpgsqlDbType.Varchar, tuner.MacAddress.ToString());
cmd.Parameters.AddWithValue("@vindex", NpgsqlDbType.Integer, tuner.Index);
cmd.Parameters.AddWithValue("@vname", NpgsqlDbType.Text, tuner.Name);
cmd.Parameters.AddWithValue("@v_std_type", NpgsqlDbType.Integer, (int)tuner.Type);
cmd.Parameters.AddWithValue("@caps", NpgsqlDbType.Integer, (int)tuner.Caps);
cmd.Parameters.AddWithValue("@diseqc_type", NpgsqlDbType.Integer, (int)tuner.DiseqcType);
cmd.Parameters.AddWithValue("@sat1", NpgsqlDbType.Integer, tuner.Satellites[0]);
cmd.Parameters.AddWithValue("@sat2", NpgsqlDbType.Integer, tuner.Satellites[1]);
cmd.Parameters.AddWithValue("@sat3", NpgsqlDbType.Integer, tuner.Satellites[2]);
cmd.Parameters.AddWithValue("@sat4", NpgsqlDbType.Integer, tuner.Satellites[3]);
cmd.Parameters.AddWithValue("@satkeyversion", NpgsqlDbType.Integer, uiVersion);
cmd.Parameters.AddWithValue("@lnb1", NpgsqlDbType.Integer, tuner.Lnbs[0]);
cmd.Parameters.AddWithValue("@lnb2", NpgsqlDbType.Integer, tuner.Lnbs[1]);
cmd.Parameters.AddWithValue("@lnb3", NpgsqlDbType.Integer, tuner.Lnbs[2]);
cmd.Parameters.AddWithValue("@lnb4", NpgsqlDbType.Integer, tuner.Lnbs[3]);
cmd.Parameters.AddWithValue("@dish1", NpgsqlDbType.Integer, tuner.Dishes[0]);
cmd.Parameters.AddWithValue("@dish2", NpgsqlDbType.Integer, tuner.Dishes[1]);
cmd.Parameters.AddWithValue("@dish3", NpgsqlDbType.Integer, tuner.Dishes[2]);
cmd.Parameters.AddWithValue("@dish4", NpgsqlDbType.Integer, tuner.Dishes[3]);
cmd.ExecuteNonQuery();
cmd.Dispose();
conn.Close();
}
}
public void UiTunerGetConfiguration(TunerMetadata foundTuner)
{
using (NpgsqlConnection conn = new NpgsqlConnection(connectionStringBuilder.ToString()))
{
conn.Open();
NpgsqlCommand cmd = conn.CreateCommand();
cmd.CommandText =
"SELECT diseqc_type, sat1, sat2, sat3, sat4, lnb1, lnb2, lnb3, lnb4, dish1, dish2, dish3, dish4 FROM skyscraper5_tuners WHERE mac = @mac AND satkeyversion = @satkeyversion";
cmd.Parameters.AddWithValue("@mac", NpgsqlDbType.Varchar, foundTuner.MacAddress.ToString());
cmd.Parameters.AddWithValue("@satkeyversion", NpgsqlDbType.Integer, uiVersion);
NpgsqlDataReader reader = cmd.ExecuteReader();
if (reader.Read())
{
foundTuner.DiseqcType = reader.GetInt32(0);
foundTuner.Satellites[0] = reader.GetInt32(1);
foundTuner.Satellites[1] = reader.GetInt32(2);
foundTuner.Satellites[2] = reader.GetInt32(3);
foundTuner.Satellites[3] = reader.GetInt32(4);
foundTuner.Lnbs[0] = reader.GetInt32(5);
foundTuner.Lnbs[1] = reader.GetInt32(6);
foundTuner.Lnbs[2] = reader.GetInt32(7);
foundTuner.Lnbs[3] = reader.GetInt32(8);
foundTuner.Dishes[0] = reader.GetInt32(9);
foundTuner.Dishes[1] = reader.GetInt32(10);
foundTuner.Dishes[2] = reader.GetInt32(11);
foundTuner.Dishes[3] = reader.GetInt32(12);
}
reader.Close();
cmd.Dispose();
conn.Close();
}
}
}
}

View File

@ -0,0 +1,257 @@
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Npgsql;
using NpgsqlTypes;
using skyscraper5.Dvb.SystemSoftwareUpdate.Model;
using skyscraper5.Skyscraper.Scraper.Storage.Utilities;
namespace skyscraper5.Data.PostgreSql
{
public partial class PostgresqlDataStore
{
private HashSet<DatabaseKeyUntGroup> _knownUntGroups;
private HashSet<DatabaseKeyUntCompatibility> _knownUntCompatibility;
private HashSet<DatabaseKeyUntPlatform> _knownUntPlatforms;
public void StoreUpdateNotification(int hashCode, UpdateNotificationGroup common, Compatibility compatibility, Platform platform)
{
if (_knownUntGroups == null)
_knownUntGroups = new HashSet<DatabaseKeyUntGroup>();
if (_knownUntCompatibility == null)
_knownUntCompatibility = new HashSet<DatabaseKeyUntCompatibility>();
if (_knownUntPlatforms == null)
_knownUntPlatforms = new HashSet<DatabaseKeyUntPlatform>();
DatabaseKeyUntPlatform platformCoordinate = new DatabaseKeyUntPlatform(common.ActionType, common.OuiHash,
common.Oui, common.ProcessingOrder, compatibility.DescriptorType, platform.GetFlagsForSqlKey());
if (_knownUntPlatforms.Contains(platformCoordinate))
{
return;
}
EnqueueTask(x => WriteUnt(x, common, compatibility, platform));
_knownUntPlatforms.Add(platformCoordinate);
}
private void WriteUnt(NpgsqlConnection connection, UpdateNotificationGroup common, Compatibility compatibility,
Platform platform)
{
if (!TestForUnt(connection, common))
InsertUnt(connection, common);
if (!TestForUntCompat(connection, common, compatibility))
InsertUntCompat(connection, common, compatibility);
if (!TestForUntCompatPlatform(connection, common, compatibility, platform))
InsertUntCompatPlatform(connection, common, compatibility, platform);
}
private bool TestForUnt(NpgsqlConnection connection, UpdateNotificationGroup common)
{
DatabaseKeyUntGroup groupCoordinate =
new DatabaseKeyUntGroup(common.ActionType, common.OuiHash, common.Oui, common.ProcessingOrder);
if (_knownUntGroups.Contains(groupCoordinate))
return true;
NpgsqlCommand command = connection.CreateCommand();
command.Transaction = transaction;
command.CommandText =
"SELECT dateadded FROM dvb_unt WHERE action_type = @action_type AND oui_hash = @oui_hash AND oui = @oui AND processing_order = @processing_order";
command.Parameters.AddParameter("@action_type", NpgsqlDbType.Integer, common.ActionType);
command.Parameters.AddParameter("@oui_hash", NpgsqlDbType.Integer, common.OuiHash);
command.Parameters.AddParameter("@oui", NpgsqlDbType.Varchar, common.Oui);
command.Parameters.AddParameter("@processing_order", NpgsqlDbType.Integer, common.ProcessingOrder);
NpgsqlDataReader mySqlDataReader = command.ExecuteReader();
bool read = mySqlDataReader.Read();
if (read)
_knownUntGroups.Add(groupCoordinate);
mySqlDataReader.Close();
return read;
}
private void InsertUnt(NpgsqlConnection connection, UpdateNotificationGroup common)
{
NpgsqlCommand command = connection.CreateCommand();
command.Transaction = transaction;
command.CommandText =
"INSERT INTO dvb_unt (action_type, oui_hash, oui, processing_order, data_broadcast_id, association_tag, private_data, update_flag, update_method, update_priority) " +
"VALUES (@action_type, @oui_hash, @oui, @processing_order, @data_broadcast_id, @association_tag, @private_data, @update_flag, @update_method, @update_priority)";
command.Parameters.AddParameter("@action_type", NpgsqlDbType.Integer, common.ActionType);
command.Parameters.AddParameter("@oui_hash", NpgsqlDbType.Integer, common.OuiHash);
command.Parameters.AddParameter("@oui", NpgsqlDbType.Varchar, common.Oui);
command.Parameters.AddParameter("@processing_order", NpgsqlDbType.Integer, common.ProcessingOrder);
command.Parameters.AddParameter("@data_broadcast_id", NpgsqlDbType.Integer, common.DataBroadcastId);
command.Parameters.AddParameter("@association_tag", NpgsqlDbType.Integer, common.AssociationTag);
command.Parameters.AddParameter("@private_data", NpgsqlDbType.Bytea, common.PrivateData);
command.Parameters.AddParameter("@update_flag", NpgsqlDbType.Integer, common.UpdateFlag);
command.Parameters.AddParameter("@update_method", NpgsqlDbType.Integer, common.UpdateMethod);
command.Parameters.AddParameter("@update_priority", NpgsqlDbType.Integer, common.UpdatePriority);
command.Parameters.CheckNulls();
command.ExecuteNonQuery();
DatabaseKeyUntGroup groupCoordinate =
new DatabaseKeyUntGroup(common.ActionType, common.OuiHash, common.Oui, common.ProcessingOrder);
_knownUntGroups.Add(groupCoordinate);
}
private bool TestForUntCompat(NpgsqlConnection connection, UpdateNotificationGroup common,
Compatibility compatibility)
{
DatabaseKeyUntCompatibility compatibilityCoordinate = new DatabaseKeyUntCompatibility(common.ActionType,
common.OuiHash, common.Oui, common.ProcessingOrder, compatibility.DescriptorType);
if (_knownUntCompatibility.Contains(compatibilityCoordinate))
return true;
NpgsqlCommand command = connection.CreateCommand();
command.Transaction = transaction;
command.CommandText =
"SELECT dateadded FROM dvb_unt_compatibility WHERE " +
"action_type = @action_type AND oui_hash = @oui_hash AND oui = @oui AND processing_order = @processing_order AND descriptor_type = @descriptor_type";
command.Parameters.AddParameter("@action_type", NpgsqlDbType.Integer,common.ActionType);
command.Parameters.AddParameter("@oui_hash", NpgsqlDbType.Integer, common.OuiHash);
command.Parameters.AddParameter("@oui", NpgsqlDbType.Varchar, common.Oui);
command.Parameters.AddParameter("@processing_order", NpgsqlDbType.Integer, common.ProcessingOrder);
command.Parameters.AddParameter("@descriptor_type", NpgsqlDbType.Integer, compatibility.DescriptorType);
NpgsqlDataReader dataReader = command.ExecuteReader();
bool result = dataReader.Read();
if (result)
_knownUntCompatibility.Add(compatibilityCoordinate);
dataReader.Close();
return result;
}
private void InsertUntCompat(NpgsqlConnection connection, UpdateNotificationGroup common,
Compatibility compatibility)
{
NpgsqlCommand preCommand = connection.CreateCommand();
preCommand.CommandText = "SELECT dateadded FROM dvb_unt_compatibility WHERE action_type = @atype AND oui_hash = @ohash AND oui = @oui AND processing_order = @porder AND descriptor_type = @dtype";
preCommand.Parameters.AddParameter("@atype", NpgsqlDbType.Integer, common.ActionType);
preCommand.Parameters.AddParameter("@ohash", NpgsqlDbType.Integer, common.OuiHash);
preCommand.Parameters.AddParameter("@oui", NpgsqlDbType.Varchar, common.Oui);
preCommand.Parameters.AddParameter("@porder", NpgsqlDbType.Integer, common.ProcessingOrder);
preCommand.Parameters.AddParameter("@dtype", NpgsqlDbType.Integer, compatibility.DescriptorType);
NpgsqlDataReader dataReader = preCommand.ExecuteReader();
bool alreadyKnown = dataReader.Read();
dataReader.Close();
preCommand.Dispose();
if (alreadyKnown)
return;
NpgsqlCommand command = connection.CreateCommand();
command.Transaction = transaction;
command.CommandText =
"INSERT INTO dvb_unt_compatibility (action_type, oui_hash, oui, processing_order, descriptor_type, private_data, specifier_type, specifier_data, model, version) " +
"VALUES (@action_type, @oui_hash, @oui, @processing_order, @descriptor_type, @private_data, @specifier_type, @specifier_data, @model, @version)";
command.Parameters.AddParameter("@action_type", NpgsqlDbType.Integer, common.ActionType);
command.Parameters.AddParameter("@oui_hash", NpgsqlDbType.Integer, common.OuiHash);
command.Parameters.AddParameter("@oui", NpgsqlDbType.Varchar, common.Oui);
command.Parameters.AddParameter("@processing_order", NpgsqlDbType.Integer, common.ProcessingOrder);
command.Parameters.AddParameter("@descriptor_type", NpgsqlDbType.Integer, compatibility.DescriptorType);
command.Parameters.AddParameter("@private_data", NpgsqlDbType.Bytea, compatibility.PrivateData);
command.Parameters.AddParameter("@specifier_type", NpgsqlDbType.Integer, compatibility.SpecifierType);
command.Parameters.AddParameter("@specifier_data", NpgsqlDbType.Text, compatibility.SpecifierData);
command.Parameters.AddParameter("@model",NpgsqlDbType.Integer, compatibility.Model);
command.Parameters.AddParameter("@version", NpgsqlDbType.Integer, compatibility.Version);
command.Parameters.CheckNulls();
command.ExecuteNonQuery();
_knownUntCompatibility.Add(new DatabaseKeyUntCompatibility(common.ActionType, common.OuiHash, common.Oui,
common.ProcessingOrder, compatibility.DescriptorType));
}
private bool TestForUntCompatPlatform(NpgsqlConnection connection, UpdateNotificationGroup common,
Compatibility compatibility, Platform platform)
{
int sqlKey = platform.GetFlagsForSqlKey();
DatabaseKeyUntPlatform platformCoordinate = new DatabaseKeyUntPlatform(common.ActionType, common.OuiHash,
common.Oui, common.ProcessingOrder, compatibility.DescriptorType, sqlKey);
NpgsqlCommand command = transaction.Connection.CreateCommand();
command.Transaction = transaction;
command.CommandText =
"SELECT dateadded FROM dvb_unt_compatibility_platform WHERE action_type = @action_type AND oui_hash = @oui_hash AND oui = @oui AND processing_order = @processing_order " +
"AND descriptor_type = @descriptor_type AND platform_type_bitmask = @platform_type_bitmask";
command.Parameters.AddParameter("@action_type", NpgsqlDbType.Integer, common.ActionType);
command.Parameters.AddParameter("@oui_hash", NpgsqlDbType.Integer, common.OuiHash);
command.Parameters.AddParameter("@oui", NpgsqlDbType.Varchar, common.Oui);
command.Parameters.AddParameter("@processing_order", NpgsqlDbType.Integer, common.ProcessingOrder);
command.Parameters.AddParameter("@descriptor_type", NpgsqlDbType.Integer, compatibility.DescriptorType);
command.Parameters.AddParameter("@platform_type_bitmask", NpgsqlDbType.Integer, sqlKey);
NpgsqlDataReader dataReader = command.ExecuteReader();
bool result = dataReader.Read();
if (result)
_knownUntPlatforms.Add(platformCoordinate);
dataReader.Close();
return result;
}
private void InsertUntCompatPlatform(NpgsqlConnection connection, UpdateNotificationGroup common,
Compatibility compatibility, Platform platform)
{
int sqlKey = platform.GetFlagsForSqlKey();
DatabaseKeyUntPlatform platformCoordinate = new DatabaseKeyUntPlatform(common.ActionType, common.OuiHash,
common.Oui, common.ProcessingOrder, compatibility.DescriptorType, sqlKey);
NpgsqlCommand command = connection.CreateCommand();
command.Transaction = transaction;
command.CommandText =
"INSERT INTO dvb_unt_compatibility_platform (action_type, oui_hash, oui, processing_order, descriptor_type, platform_type_bitmask, update_flag, update_method, update_priority, data_broadcast_id, association_tag, private_data, smart_card_number, super_ca_system_id, serial_data, mac_address_mask, subgroup_tag) " +
"VALUES (@action_type, @oui_hash, @oui, @processing_order, @descriptor_type, @platform_type_bitmask, @update_flag, @update_method, @update_priority, @data_broadcast_id, " +
" @association_tag, @private_data, @smart_card_number, @super_ca_system_id, @serial_data, @mac_address_mask, @subgroup_tag)";
command.Parameters.AddParameter("@action_type", NpgsqlDbType.Integer, common.ActionType);
command.Parameters.AddParameter("@oui_hash", NpgsqlDbType.Integer, common.OuiHash);
command.Parameters.AddParameter("@oui", NpgsqlDbType.Varchar, common.Oui);
command.Parameters.AddParameter("@processing_order", NpgsqlDbType.Integer, common.ProcessingOrder);
command.Parameters.AddParameter("@descriptor_type", NpgsqlDbType.Integer, compatibility.DescriptorType);
command.Parameters.AddParameter("@platform_type_bitmask", NpgsqlDbType.Integer, sqlKey);
command.Parameters.AddParameter("@update_flag", NpgsqlDbType.Integer, platform.UpdateFlag);
command.Parameters.AddParameter("@update_method", NpgsqlDbType.Integer, platform.UpdateMethod);
command.Parameters.AddParameter("@update_priority", NpgsqlDbType.Integer, platform.UpdatePriority);
command.Parameters.AddParameter("@data_broadcast_id", NpgsqlDbType.Integer, platform.DataBroadcastId);
command.Parameters.AddParameter("@association_tag", NpgsqlDbType.Integer, platform.AssociationTag);
command.Parameters.AddParameter("@private_data", NpgsqlDbType.Bytea, platform.PrivateData);
command.Parameters.AddParameter("@smart_card_number", NpgsqlDbType.Text, platform.SmartCardNumber);
command.Parameters.AddParameter("@super_ca_system_id", NpgsqlDbType.Bigint, platform.SuperCaSystemId);
command.Parameters.AddParameter("@serial_data", NpgsqlDbType.Bytea, platform.SerialData);
command.Parameters.AddParameter("@mac_address_mask", NpgsqlDbType.Varchar, platform.MacAddressMask);
command.Parameters.AddParameter("@subgroup_tag", NpgsqlDbType.Bytea, platform.SubgroupTag);
command.ExecuteNonQuery();
InsertUntCompatPlatformMacAddressMatches(connection, platformCoordinate, platform);
_knownUntPlatforms.Add(platformCoordinate);
}
private void InsertUntCompatPlatformMacAddressMatches(NpgsqlConnection connection,
DatabaseKeyUntPlatform platformCoordinate, Platform platform)
{
if (platform.MacAddressMatches == null)
return;
if (platform.MacAddressMatches.Length == 0)
return;
NpgsqlCommand command = connection.CreateCommand();
command.Transaction = transaction;
command.CommandText =
"INSERT INTO dvb_unt_compatibility_platform_mac_address_matches (action_type, oui_hash, oui, processing_order, descriptor_type, platform_type_bitmask, mac_match) " +
"VALUES (@action_type, @oui_hash, @oui, @processing_order, @descriptor_type, @platform_type_bitmask, @mac_match) ";
command.Parameters.AddParameter("@action_type", NpgsqlDbType.Integer, platformCoordinate.CommonActionType);
command.Parameters.AddParameter("@oui_hash", NpgsqlDbType.Integer, platformCoordinate.CommonOuiHash);
command.Parameters.AddParameter("@oui", NpgsqlDbType.Varchar, platformCoordinate.CommonOui);
command.Parameters.AddParameter("@processing_order", NpgsqlDbType.Integer, platformCoordinate.CommonProcessingOrder);
command.Parameters.AddParameter("@descriptor_type", NpgsqlDbType.Integer, platformCoordinate.CompatibilityDescriptorType);
command.Parameters.AddParameter("@platform_type_bitmask", NpgsqlDbType.Integer, platformCoordinate.PlatformKey);
command.Parameters.Add("@mac_match", NpgsqlDbType.Varchar);
foreach (string match in platform.MacAddressMatches)
{
command.Parameters["@mac_match"].Value = match;
command.ExecuteNonQuery();
}
}
}
}

View File

@ -0,0 +1,65 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace skyscraper5.Data.PostgreSql
{
public partial class PostgresqlDataStore
{
private bool _isWaitingForCompletion;
public void WaitForCompletion()
{
if (_writerThread != null)
{
if (_writerThread.IsAlive)
{
Console.WriteLine("database still busy");
if (_writerThread == null)
return;
_isWaitingForCompletion = true;
_writerThread.Join();
_isWaitingForCompletion = false;
_writerThread = null;
_writerTasks = null;
}
}
knownEitEvents = null;
knownSdtServices = null;
knownPats = null;
knownPmts = null;
_knownBatBouquets = null;
knownNitNetworks = null;
updatedSdtServices = null;
_blacklistedDsmCcModules = null;
_knownTdt = null;
_knownNitTs = null;
knownTeletextPages = null;
_updatedBats = null;
_knownUpdatedNitNetworks = null;
_knownBatTs = null;
_knownCats = null;
knownScte35TimeSignals = null;
_knownInts = null;
_knownT2MiTimestamps = null;
_knownT2MiTransmitters = null;
_knownT2MiTimeOffsets = null;
_knownCompliances = null;
_tbtpCache = null;
_cmtCache = null;
_rmtTransmissionStdCache = null;
_tmstCache = null;
_rmtLinkageCache = null;
_rmtTransportStreamCache = null;
_sctCache = null;
_fctCache = null;
_sptCache = null;
timNid = null;
contentedTims = null;
correctionControlledTims = null;
_networkLayerInfoTims = null;
}
}
}

View File

@ -0,0 +1,76 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Npgsql;
namespace skyscraper5.Data.PostgreSql
{
public partial class PostgresqlDataStore
{
private Thread _writerThread;
private delegate void WriterTask(NpgsqlConnection connection);
private Queue<WriterTask> _writerTasks;
private void EnqueueTask(WriterTask task)
{
if (_writerTasks == null)
{
_writerTasks = new Queue<WriterTask>();
}
lock (_writerTasks)
{
_writerTasks.Enqueue(task);
}
if (_writerThread == null)
{
_writerThread = new Thread(WriterThreadFunction);
_writerThread.Priority = ThreadPriority.Highest;
_writerThread.Name = "PostgreSQL Writer Thread";
_writerThread.Start();
}
}
private NpgsqlTransaction transaction;
private void WriterThreadFunction()
{
using (NpgsqlConnection connection = new NpgsqlConnection(connectionStringBuilder.ToString()))
{
connection.Open();
transaction = connection.BeginTransaction();
while (_writerTasks.Count > 0)
{
WriterTask task;
lock (_writerTasks)
{
task = _writerTasks.Dequeue();
}
task(connection);
}
transaction.Commit();
transaction.Dispose();
connection.Close();
}
_writerThread = null;
}
private void CommitTransaction(NpgsqlConnection conn)
{
transaction.Commit();
transaction.Dispose();
transaction = conn.BeginTransaction();
if (_isWaitingForCompletion)
{
Console.WriteLine("-> DB: {0} tasks remain.", _writerTasks.Count);
}
}
}
}

View File

@ -0,0 +1,16 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Npgsql" Version="9.0.3" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\skyscraper8\skyscraper8.csproj" />
</ItemGroup>
</Project>

40
Documentation/16660841.cs Normal file
View File

@ -0,0 +1,40 @@
public static void ToLatLon(double utmX, double utmY, string utmZone, out double latitude, out double longitude)
{
bool isNorthHemisphere = utmZone.Last() >= 'N';
var diflat = -0.00066286966871111111111111111111111111;
var diflon = -0.0003868060578;
var zone = int.Parse(utmZone.Remove(utmZone.Length - 1));
var c_sa = 6378137.000000;
var c_sb = 6356752.314245;
var e2 = Math.Pow((Math.Pow(c_sa,2) - Math.Pow(c_sb,2)),0.5)/c_sb;
var e2cuadrada = Math.Pow(e2,2);
var c = Math.Pow(c_sa,2) / c_sb;
var x = utmX - 500000;
var y = isNorthHemisphere ? utmY : utmY - 10000000;
var s = ((zone * 6.0) - 183.0);
var lat = y / (c_sa * 0.9996);
var v = (c / Math.Pow(1 + (e2cuadrada * Math.Pow(Math.Cos(lat), 2)), 0.5)) * 0.9996;
var a = x / v;
var a1 = Math.Sin(2 * lat);
var a2 = a1 * Math.Pow((Math.Cos(lat)), 2);
var j2 = lat + (a1 / 2.0);
var j4 = ((3 * j2) + a2) / 4.0;
var j6 = ((5 * j4) + Math.Pow(a2 * (Math.Cos(lat)), 2)) / 3.0;
var alfa = (3.0 / 4.0) * e2cuadrada;
var beta = (5.0 / 3.0) * Math.Pow(alfa, 2);
var gama = (35.0 / 27.0) * Math.Pow(alfa, 3);
var bm = 0.9996 * c * (lat - alfa * j2 + beta * j4 - gama * j6);
var b = (y - bm) / v;
var epsi = ((e2cuadrada * Math.Pow(a, 2)) / 2.0) * Math.Pow((Math.Cos(lat)), 2);
var eps = a * (1 - (epsi / 3.0));
var nab = (b * (1 - epsi)) + lat;
var senoheps = (Math.Exp(eps) - Math.Exp(-eps)) / 2.0;
var delt = Math.Atan(senoheps/(Math.Cos(nab) ) );
var tao = Math.Atan(Math.Cos(delt) * Math.Tan(nab));
longitude = ((delt * (180.0 / Math.PI)) + s) + diflon;
latitude = ((lat + (1 + e2cuadrada * Math.Pow(Math.Cos(lat), 2) - (3.0 / 2.0) * e2cuadrada * Math.Sin(lat) * Math.Cos(lat) * (tao - lat)) * (tao - lat)) * (180.0 / Math.PI)) + diflat;
}

52
Documentation/68725547.r Normal file
View File

@ -0,0 +1,52 @@
require(tidyverse)
require(purrr)
require(testthat)
find_one_utm_zone <- function(longitude, latitude) {
# Special zones for Svalbard
if (latitude >= 72.0 && latitude <= 84.0 ) {
if (longitude >= 0.0 && longitude < 9.0)
return("31X");
if (longitude >= 9.0 && longitude < 21.0)
return("33X")
if (longitude >= 21.0 && longitude < 33.0)
return("35X")
if (longitude >= 33.0 && longitude < 42.0)
return("37X")
}
# Special zones for Norway
if (latitude >= 56.0 && latitude < 64.0 ) {
if (longitude >= 0.0 && longitude < 3.0)
return("31V");
if (longitude >= 3.0 && longitude < 12.0)
return("32V")
}
# North + South Poles
if (latitude > 84.0){
if ((longitude+180)%%360-180 < 0) {return("Y")}
if ((longitude+180)%%360-180 > 0) {return("Z")}
} else if (latitude < -80.0){
if ((longitude+180)%%360-180 < 0) {return("A")}
if ((longitude+180)%%360-180 > 0) {return("B")}
}
# Everything in the middle
if ( (latitude>-80.0) && (latitude<=84.0) ){
mid_zones <- LETTERS[c(3:8,10:14,16:24)] # C to X, skip I and O
utm_letter <- mid_zones[ min(floor( (latitude + 80) / 8 )+1 , 20) ]
utm_number <- (floor( (longitude + 180) / 6 ) %% 60) + 1 # modulo in case longitude is 0 to 360 instead of -180 to 180
utm_zone <- paste0(utm_number, utm_letter)
return(utm_zone)
} else {
stop("lat long not valid (or something else broke)")
}
}
find_utm_zone <- function(lon, lat){
purrr::map2_chr(.x = lon, .y = lat, .f = find_one_utm_zone)
}

140
Documentation/TODO.md Normal file
View File

@ -0,0 +1,140 @@
# skyscraper5 TODO
* [DONE] LocalStreamReader (und rsr-server) ausgliedern, damit Main Assembly wieder in MSIL kompiliert werden kann.
* [DONE] LocalStreamReader als eigene Assembly (Library)
* [DONE] rsr-server als eigene eigene Assembly (Console Application)
* [DONE] dvbtmagic als eigene Assembly, hat ja nicht wirklich was mit skyscraping zu tun.
* AC3 Parser (kein Decoder) fur Ancillary Data
* MP2 Parser (kein Decoder) fur Ancillary Data
* AAC Parser (kein Decoder) fur Ancillary Data
* MPEG-2 Parser (kein Decoder) fur Auxillary Data
* H.264 Parser (kein Decoder) fur Auxillary Data
* H.265 Parser (kein Decoder) fur Auxillary Data
* [DONE] LNB Typen definieren, und in der UI einstellbar machen
* [DONE] LNB Typen sollten pro Tuner-Anschluss, nicht pro Satellit definiert werden.
* [DONE] Antennen Typen definieren, und in der UI einstellbar machen
* [DONE] GPS Position sollte ermittelt werden konnen.
* [DONE] manuell
* [DONE] direkt angeschlossenes Gerat per SerialPort
* [DONE] via TCP aus gpsd
* [DONE] via UDP Broadcast/Multicast
* [DONE] Blindscan-Jobs in Datenbank schreiben. (inkl. Tuner-ID/MAC, LNB-Typ, Antennen-Typ und GPS Daten)
* [DONE] Blindscan-Ergebnisse in Datenbank schreiben
* rudimanteren Java-Port
* (inkl. Disketten-Image for the lulz - keine Abhangigkeiten außer vielleicht Apache Commons ;) )
* [DONE] uberlegen, ob sich satbeams.com scrapen lasst.
* [DONE] Dabei einzelne Satelliten, Beams und Footprints dieser Beams in DB schreiben,
* und dann in der UI Moglichkeit bieten, anhand von GPS-Daten, Antennen-Typ und LNB-Typ zu ermitteln welche Beams empfangbar sind.
* [DONE] satbeams.com geht definitiv nicht.
* [DONE] Aber das da: https://genmap.lyngsat.org/server2/kml
* [DONE] Das ist ein JSON, welches eine Liste an KML-Files zuruckgibt.
* [DONE] KML File parsen trivial - ist XML.
* [DONE] mithilfe von https://gis.stackexchange.com/questions/42879/check-if-lat-long-point-is-within-a-set-of-polygons-using-google-maps/46720#46720 testen ob in shape
* Blockstream parsen. Dazu Blog-Post "Anatomy of Blockstream Satellite" zur Hilfe nehmen. ( https://destevez.net/2022/10/anatomy-of-blockstream-satellite/ )
* Client/Server-Architektur fur ScraperStorage
* [DONE] Architektur aufbauen, um Handler fur eingehende MPE/IP Pakete auszugliedern
* [DONE] APRS in eben jenes ausgliedern
* [DONE] Plugin-System so ausbauen, dass Assembly-Scanning nur noch an einer Stelle notwendig ist.
* [DONE] T2MI Packet Types
* [DONE] StreamTypeAutodetection
* [DONE] Behandlung des Gewinners nicht im SkyscraperContext sondern im Contestant selber, sonst ist's witzlos.
* [DONE] ScraperStorageFactoryConnectionManager
* [DONE] TunerFactoryConnectionManager
* [DONE] TsDescriptorUnpacker
* [DONE] Mpeg2ExtensionDescriptorConverter
* [DONE] UserDefinedDescriptorUnpacker
* [DONE] bereits vorhandene PrivateDataSpecifiers in eigene Assemblys auslagern
* [DONE] DvbExtensionDescriptorConverter
* [DONE] DsmCcMessageUnpacker
* [DONE] PushMacManagementMessage
* [DONE] GPS in der UI auswählbar machen
* [DONE] Optional Fenster mit GPS Daten einblenden lassen
* [DONE] GPS via GeoIP simulieren
* [DONE] Kabel-TV Frequenzlistengenerator
* [DONE] sauberen Exception-Tree aufbauen, mit Vererbung und allem drum und dran.
* Tests mit Code-Coverage
* [DONE] TS-Generator als System.IO.Stream
* [DONE] PAT-Generator
* [DONE] PMT-Generator
* [DONE] SDT-Generator
* [DONE] CAT-Generator
* [DONE] TDT-Generator
* [DONE] TOT-Generator
* [DONE] Namespaces aufräumen
* [DONE] StreamReader Versionen prüfen. Eventuell eine KnownIssues Funktion zum Server hinzufügen? (Beispiel: StreamReader 1.2.4.101 sehr gut, StreamReader 1.2.5.176 doof)
* [DONE] Dafür PE-Parser hinzufügen (um DLLs und EXEn zu parsen)
* [DONE] DLL-Versionsinfo aus PE lesen.
* [DONE] 1.2.5.194 -> bad
* [DONE] 1.2.5.176 -> bad
* [DONE] 1.2.4.101 -> good
* Inhalte von einer Datenbank in eine andere kopieren.
* [DONE] Im SDT Parser sollte der Message Descriptor geparst werden.
* [DONE] Die Messages sollten natürlich auch in eine Datenbank geschrieben werden.
* [DONE] In TestDrid: Kooperativer Blindscan. Scannen mit einer Karte, zappen mit einer anderen.
* Tuning Retries
* ExternalEsIdDescriptor implementieren.
* Natürlich auch in die Datenbank schreiben.
* Unbekanntes Text Encoding auf Eutelsat 7, 12648 H, MIS3
* [DONE] "Unknown Protocol" 50
* [DONE] "Unknown Protocal" 47
* In MinioObjectStorage.cs bei Zeile 132 - behandeln dass nicht immer unbedingt eine MinioException rauskommt!
* skyscraper5.Ietf.Rfc971.InternetHeader sollte Validatable implementieren.
* In Testdrid: Einen Notizblock
* Wenn ein Blindscan false zurückgibt, aber dennoch Ergebnisse geliefert hat, diese trotzdem abklopfen.
* [DONE] Paketfiltersystem hinzufügen, statt Pakete manuell zu droppen.
* [DONE] Aufzeichnungssystem in den Paketfilter verlagern.
* [DONE] Scramble Paket Dropper
* Tester ob zwischen Scramble und Non-Scramble geswitcht wird.
* Den Screenshotter da dran hängen!
* [DONE] TEI Paket Dropper
* [DONE] Prioritätensystem da dran hängen. (Schließlich sollen die Pakete immer zuerst aufgezeichnet werden)
* [DONE] Skip x (512) Packets Filter
* PCR Monitor dorthin verlagern
* TCP Proxy dorthin verlagern
* Descriptor 0x2E (46) bei PMT (TsDescriptorUnpacker.cs, Zeile 81)
* Netzwerkschnittstelle einbauen
* PCAP Writer
* UDPDump
* TAP Adapter (siehe https://github.com/HBSnail/UniversalTunTapDriver/blob/master/README.md )
* /dev/null
* IP-in-IP Encapsulation, new Socket(AddressFamily.InterNetwork, Socket.Raw, ProtocolType.IP)
* [DONE] Intelsat Internet reverse engineeren. Gutes Beispiel auf Intelsat 68,5°E 12625/H. TS Header ist nicht 4 sondern 9 Bytes
* [DONE] Oder auf Intelsat 72,1°E 12718/H
* [DONE] Hängt möglicherweise mit Digital Devices BBFRAMES zusammen?
* Ja, tut es, deshalb auch BBFRAME Header parsen
* SeaweedFS als File-Storage implementieren
* In GSE und MPE Paketen:
* [DONE] DNS Responses parsen und daraus "lernen"
* [DONE] DNS Type 39
* UDP L2TP & L2F Pakete parsen & reingucken. (z.B. in skyscraper_20240830_1254_0235E_11620_H_5931.ts)
* NTP parsen (z.B. in 12551_h_intelsat_like_internet.ts)
* [DONE] Von hier klauen: https://github.com/kapetan/dns
* In IP-in-IP Pakete reingucken.
* In IPv6 Encapsulation Pakete reingucken.
* In GRE Pakete reingucken.
* In RFC3652 Pakete (Type 253) reingucken. Ist in der Payload das Offset 6 = 0x45, so ist ein getunneltes IPv4 Paket. :)
* [DONE] ServiceListDescriptor im BatParser
* [DONE] ExtensionDescriptor 32, in DvbExtensionDescriptorConverter, Zeile 35
* [DONE] CAID 0x0649 in CaSystemNames
* [DONE] DNS Record Type 48 [ {Z:\Freebies\Datasets\SkyscraperLibrarian\DVB-S\E0008_Ku_Thor\skyscraper_20230404_2125_0010W_11876_V_19999.ts}, {Z:\Freebies\Datasets\SkyscraperLibrarian\DVB-S August 2024\Telstar15\skyscraper_20240826_1530_0150W_12596_V_44999.ts} ]
* [DONE] RCS Maps parsen
* [DONE] RCS Maps in DB schreiben
* [DONE] NuGet Caching Proxy
* [DONE] DNS Record Type 49213
* HLS Stream
* benötigt vorher einen PCR delayten Stream
* benötigt vorher einen Rate-Limited Stream
* ScraperStorage ablösen, und stattdessen DataStorage und FileStorage einzeln setzen.
* .tar/.tar.gz File mit FilesystemStorage Inhalt importieren
* WGS84 zu Lat/Lon konvertieren - für RCS-Map.
* Beispielcode in C# hier: https://stackoverflow.com/a/16660841
* Benötigt vorher eine Ermittelung der UTM-Zone:
* Beispielcode zur Ermittelung der UTM-Zone (in R) hier: https://stackoverflow.com/a/68725547
* [DONE] IP-Protokoll 139 (skyscraper_20230408_1727_0390E_12739_H_3926_gse.ts)
* [DONE] DNS Record Type 20366 (skyscraper_20230410_1450_0660E_12626_V_38329.ts)
* [DONE] DNS IN ( {Z:\Freebies\Datasets\SkyscraperLibrarian\DVB-S August 2024\Telstar15\skyscraper_20240826_1530_0150W_12596_V_44999.ts} )
* ScraperStorage: Big File
* ScraperStorage: Big File mit Index
* [DONE] Für BigFiles: Gesplitteter Stream, für FAT32 und Freunde
* [DONE] Einen "Forget Blindscan Job" Button in der UI
* TransportProtocolDescriptor - unbekannte ProtocolIDs ohne Exception behandeln. (Vielleicht eine Warning?)

View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<tsduck>
<PAT transport_stream_id="1">
<service service_id="700" program_map_PID="5000"/>
</PAT>
</tsduck>

View File

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="UTF-8"?>
<tsduck>
<!-- See ETSI EN 301 192, section 7.2 -->
<PMT service_id="700">
<private_data_specifier_descriptor private_data_specifier="0x534f5048"/>
<component elementary_PID="5003" stream_type="0x0D">
<stream_identifier_descriptor component_tag="1"/>
<data_broadcast_id_descriptor data_broadcast_id="0x0005"/>
<generic_descriptor tag="0x80">
457574656C736174375F31323536375F765F53444142
</generic_descriptor>
</component>
<component elementary_PID="5004" stream_type="0x82">
<stream_identifier_descriptor component_tag="2"/>
</component>
<component elementary_PID="5005" stream_type="0x0D">
<stream_identifier_descriptor component_tag="3"/>
<data_broadcast_id_descriptor data_broadcast_id="0x0005"/>
<generic_descriptor tag="0x80">
4173747261335F31323136385F765F53444142
</generic_descriptor>
</component>
</PMT>
</tsduck>

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<tsduck>
<SDT transport_stream_id="1" original_network_id="1">
<service service_id="700" running_status="running">
<service_descriptor service_type="0x0C" service_name="sophia.net Test Feed" service_provider_name="sophia.net"/>
</service>
</SDT>
</tsduck>

View File

@ -0,0 +1,23 @@
set BITRATE=224000000
set PCR_PER_SEC=5
set PCR_DISTANCE=2000
set PCR_PID=5004
tsp -v --bitrate %BITRATE% --max-flushed-packets 70 ^
-I null ^
-P regulate --packet-burst 14 ^
-P filter --every %PCR_DISTANCE% --set-label 1 ^
-P craft --only-label 1 --pid %PCR_PID% --no-payload --pcr 0 ^
-P continuity --pid %PCR_PID% --fix ^
-P pcradjust --pid %PCR_PID% ^
-P inject pat.xml --pid 0 --bitrate 2000 ^
-P cat -c ^
-P inject pmt.xml --pid 5000 --bitrate 2000 ^
-P inject sdt.xml --pid 17 --bitrate 2000 ^
-P inject tdt.xml --pid 0x14 --bitrate 2000 --stuffing ^
-P timeref --system-synchronous ^
-P mpeinject 6969 --pid 5003 --max-queue 8192 ^
-P mpeinject 6970 --pid 5005 --max-queue 8192 ^
-O file --max-size 1000000000 test.ts
pause

View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<tsduck>
<TDT UTC_time="1984-01-01 00:13:37"/>
</tsduck>

View File

@ -0,0 +1,58 @@
LibDvbV5Device device = new LibDvbV5Device();
device.SetLog(8, null);
device.Find();
LibDvbV5DeviceList findDeviceByDeliverySystem = device.FindDeviceByDeliverySystem(LibDvbV5FrontendDeliverySystem.SYS_DVBC_ANNEX_A);
if (findDeviceByDeliverySystem == null)
return;
LibDvbV5DeviceList demuxerName = device.GetSisterDevice(findDeviceByDeliverySystem, DvbDeviceType.Demux);
LibDvbV5DeviceList dvrName = device.GetSisterDevice(findDeviceByDeliverySystem, DvbDeviceType.Dvr);
LibDvb5FrontendParameters frontend = findDeviceByDeliverySystem.ToFrontendParameters();
frontend.SetDeliverySystem(LibDvbV5FrontendDeliverySystem.SYS_DVBC_ANNEX_A);
frontend.StoreParameter(17, (uint)LibDvbV5FrontendDeliverySystem.SYS_DVBC_ANNEX_A);
frontend.StoreParameter(3, 610000000); //freq
frontend.StoreParameter(8, 6900000); //symbol rate
frontend.SetParameters();
Thread.Sleep(400);
frontend.GetStatistics();
Thread.Sleep(400);
uint retrieveStats = frontend.RetrieveStats(512);
if ((retrieveStats & 0x10) != 0)
{
Console.WriteLine("got lock!");
LibDvbV5OpenDescriptor dvrFd = device.DeviceOpen(dvrName);
if (dvrFd == null)
throw new IOException("open failed");
dvrFd.SetBufferSize(1024 * 1024);
LibDvbV5OpenDescriptor demuxFd = device.DeviceOpen(demuxerName);
if (demuxFd == null)
throw new IOException("open failed");
demuxFd.DemuxSetPesFilter(0x2000, DemuxerPesType.DMX_PES_OTHER);
FileStream fileStream = File.OpenWrite(String.Format("{0}.ts", DateTime.Now.Ticks));
byte[] packBuffer = new byte[188];
int readLen = 0;
for (int i = 0; i < 9001; i++)
{
readLen = dvrFd.Read(packBuffer, 188);
if (readLen > 0)
{
fileStream.Write(packBuffer, 0, 188);
}
}
fileStream.Flush(true);
fileStream.Close();
demuxFd.Dispose();
dvrFd.Dispose();
}
else
{
Console.WriteLine("no lock :(");
}
frontend.Dispose();
device.Dispose();

View File

@ -0,0 +1,58 @@
int dvbSatSearchLnb = LibDvbV5.DvbSatSearchLnb("EXTENDED");
LibDvbV5SatLnb lnb = new LibDvbV5SatLnb(dvbSatSearchLnb);
LibDvbV5Device device = new LibDvbV5Device();
device.SetLog(8, null);
device.Find();
LibDvbV5DeviceList demuxerName = device.SeekBySystemName(0, 0, DvbDeviceType.Demux);
LibDvbV5DeviceList dvrName = device.SeekBySystemName(0, 0, DvbDeviceType.Dvr);
LibDvbV5DeviceList frontendName = device.SeekBySystemName(0, 0, DvbDeviceType.Frontend);
LibDvb5FrontendParameters frontend = new LibDvb5FrontendParameters(0, 0);
frontend.SetLnb(lnb);
frontend.StoreParameter(3, 11362000); //freq
frontend.StoreParameter(8, 22000000); //symbol rate
frontend.StoreParameter(17, (uint)LibDvbV5FrontendDeliverySystem.SYS_DVBS2);
frontend.StoreParameter(256, (uint)LibDvbV5SatPolarization.Horizontal);
frontend.SetParameters();
Thread.Sleep(400);
frontend.GetStatistics();
Thread.Sleep(400);
uint retrieveStats = frontend.RetrieveStats(512);
if ((retrieveStats & 0x10) != 0)
{
Console.WriteLine("got lock!");
LibDvbV5OpenDescriptor dvrFd = device.DeviceOpen(dvrName);
if (dvrFd == null)
throw new IOException("open failed");
dvrFd.SetBufferSize(1024 * 1024);
LibDvbV5OpenDescriptor demuxFd = device.DeviceOpen(demuxerName);
if (demuxFd == null)
throw new IOException("open failed");
demuxFd.DemuxSetPesFilter(0x2000, DemuxerPesType.DMX_PES_OTHER);
FileStream fileStream = File.OpenWrite(String.Format("{0}.ts", DateTime.Now.Ticks));
byte[] packBuffer = new byte[188];
int readLen = 0;
for (int i = 0; i < 9001; i++)
{
readLen = dvrFd.Read(packBuffer, 188);
if (readLen > 0)
{
fileStream.Write(packBuffer, 0, 188);
}
}
fileStream.Flush(true);
fileStream.Close();
demuxFd.Dispose();
dvrFd.Dispose();
}
else
{
Console.WriteLine("no lock :(");
}
frontend.Dispose();
device.Dispose();

View File

@ -0,0 +1,35 @@
# Sophia.net Signalling
When either a Private Data Descriptor or a Registration Descriptor with the value "0x534f5048" is found in any table
the following Signalling applies:
## Stream Types in PMT:
|Stream Type|Interpretation |
|0x80 |TBS 6903-X GSE Packets |
|0x81 |AC-3 Audio |
|0x82 |PID only used for PCR |
## Descriptors:
Sophia.net employs the following descriptors:
|Descriptor |Interpretation |
|0x80 |Encapsulated Transport Stream over MPE |
### 0x80: Encapsulated Transport Stream over MPE
When the following conditions all apply:
- This Descriptor is encountered in the inner loop of a PMT
- The Stream Type is 0x0D (data broadcast)
- A data_broadcast_id_descriptor is present
- data_broadcast_id is 5
THEN: This PID will contain an Encapsulated Transport Stream carried within MPE Packets.
Data within this descriptor should be a human readable description of what the Encapsulated Transport Stream is, but can be left empty.
## Other Rules:
Aside from that, the following rules shall apply:
* The IRD MUST process any TDT/TOT tables, regardless of whether the Transport Stream ID and Network ID is known or not.

View File

@ -0,0 +1,56 @@
using Minio;
using Minio.DataModel.Args;
using MySqlConnector;
using skyscraper5.Data;
using skyscraper5.Data.MySql;
using skyscraper5.Skyscraper.Scraper.Storage;
using skyscraper5.Skyscraper.Scraper.Storage.Split;
namespace skyscraper5.Storage.MariaDbMinio
{
[ScrapeStorageFactoryId(2,"MariaDB & MinIO",false)]
public class MariaDbMinioStorageFactory : IScraperStorageFactory
{
public IScraperStroage CreateScraperStroage()
{
MySqlConnectionStringBuilder mcsb = new MySqlConnectionStringBuilder();
mcsb.Database = MariaDbDatabase;
mcsb.Password = MariaDbPassword;
mcsb.Port = MariaDbPort;
mcsb.Server = MariaDbHost;
mcsb.UserID = MariaDbUsername;
mcsb.ApplicationName = "skyscraper5";
mcsb.Pooling = true;
IMinioClient mc = new MinioClient()
.WithEndpoint(MinioEndpoint)
.WithCredentials(MinioAccessKey, MinioSecretKey)
.WithSSL(MinioSecure).Build();
BucketExistsArgs bucketExistsArgs = new BucketExistsArgs().WithBucket(MinioBucket);
bool bucketExists = mc.BucketExistsAsync(bucketExistsArgs).Result;
if (!bucketExists)
{
MakeBucketArgs makeBucketArgs = new MakeBucketArgs().WithBucket(MinioBucket);
mc.MakeBucketAsync(makeBucketArgs).Wait();
}
MySqlDataStorage myds = new MySqlDataStorage(mcsb);
MinioObjectStorage mos = new MinioObjectStorage(mc, MinioBucket);
return new SplitScraperStorage(myds, mos);
}
public string MariaDbHost { get; set; }
public ushort MariaDbPort { get; set; }
public string MariaDbUsername { get; set; }
public string MariaDbPassword { get; set; }
public string MariaDbDatabase { get; set; }
public string MinioEndpoint { get; set; }
public string MinioAccessKey { get; set; }
public string MinioSecretKey { get; set; }
public bool MinioSecure { get; set; }
public string MinioBucket { get; set; }
}
}

View File

@ -0,0 +1,12 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\..\BlobStorages\skyscraper5.Data.Minio\skyscraper5.Data.Minio.csproj" />
<ProjectReference Include="..\..\DataTableStorages\skyscraper5.Data.MySql\skyscraper8.Data.MySql.csproj" />
</ItemGroup>
</Project>

View File

@ -0,0 +1,70 @@
using System.Diagnostics;
using Minio;
using Minio.DataModel.Args;
using Npgsql;
using skyscraper5.Data;
using skyscraper5.Data.PostgreSql;
using skyscraper5.Skyscraper.Plugins;
using skyscraper5.Skyscraper.Scraper.Storage;
using skyscraper5.Skyscraper.Scraper.Storage.Split;
namespace skyscraper5.Storage.PostgresqlMinio
{
[SkyscraperPlugin]
[ScrapeStorageFactoryId(3,"PostgreSQL & MinIO",false)]
public class PostgresqlMinioStorageFactory : IScraperStorageFactory
{
public IScraperStroage CreateScraperStroage()
{
NpgsqlConnectionStringBuilder ncsb = new NpgsqlConnectionStringBuilder();
ncsb.Database = PostgreSqlDatabase;
ncsb.ApplicationName = "skyscraper5";
ncsb.Host = PostgreSqlHost;
ncsb.Password = PostgreSqlPassword;
ncsb.Pooling = true;
ncsb.Port = PostgreSqlPort;
ncsb.Username = PostgreSqlUsername;
if (Debugger.IsAttached)
ncsb.Timeout = 1024;
IMinioClient mc = new MinioClient()
.WithEndpoint(MinioEndpoint)
.WithCredentials(MinioAccessKey, MinioSecretKey)
.WithSSL(MinioSecure).Build();
BucketExistsArgs bucketExistsArgs = new BucketExistsArgs().WithBucket(MinioBucket);
bool bucketExists = mc.BucketExistsAsync(bucketExistsArgs).Result;
if (!bucketExists)
{
MakeBucketArgs makeBucketArgs = new MakeBucketArgs().WithBucket(MinioBucket);
mc.MakeBucketAsync(makeBucketArgs).Wait();
}
PostgresqlDataStore postgresDs = new PostgresqlDataStore(ncsb);
MinioObjectStorage minioOs = new MinioObjectStorage(mc, MinioBucket);
return new SplitScraperStorage(postgresDs, minioOs);
}
public string MinioBucket { get; set; }
public bool MinioSecure { get; set; }
public string MinioSecretKey { get; set; }
public string MinioAccessKey { get; set; }
public string MinioEndpoint { get; set; }
public string PostgreSqlUsername { get; set; }
public ushort PostgreSqlPort { get; set; }
public string PostgreSqlPassword { get; set; }
public string PostgreSqlHost { get; set; }
public string PostgreSqlDatabase { get; set; }
}
}

View File

@ -0,0 +1,13 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\..\BlobStorages\skyscraper5.Data.Minio\skyscraper5.Data.Minio.csproj" />
<ProjectReference Include="..\..\DataTableStorages\skyscraper5.Data.PostgreSql\skyscraper5.Data.PostgreSql.csproj" />
</ItemGroup>
</Project>

7
GUIs/skyscraper5.UI/.gitignore vendored Normal file
View File

@ -0,0 +1,7 @@
/.vs/ProjectEvaluation
/.vs/skyscraper5.UI/DesignTimeBuild
/.vs/skyscraper5.UI/FileContentIndex
/.vs/skyscraper5.UI/v17
/bin/Debug/net8.0-windows
/obj/Debug/net8.0-windows
/obj

352
GUIs/skyscraper5.UI/Form1.Designer.cs generated Normal file
View File

@ -0,0 +1,352 @@
namespace skyscraper5.UI
{
partial class Form1
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
components = new System.ComponentModel.Container();
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Form1));
ListViewItem listViewItem1 = new ListViewItem(new string[] { "Source", "???" }, -1, Color.Empty, Color.FromArgb(192, 255, 192), null);
ListViewItem listViewItem2 = new ListViewItem(new string[] { "Run Time", "???" }, -1, Color.Empty, Color.FromArgb(128, 255, 128), null);
ListViewItem listViewItem3 = new ListViewItem(new string[] { "Source Status", "???" }, -1, Color.Empty, Color.FromArgb(192, 255, 192), null);
menuStrip1 = new MenuStrip();
statusStrip1 = new StatusStrip();
tabControl1 = new TabControl();
tabPage1 = new TabPage();
splitContainer1 = new SplitContainer();
splitContainer2 = new SplitContainer();
treeView1 = new TreeView();
imageList1 = new ImageList(components);
bottomLeft = new ListView();
columnHeader4 = new ColumnHeader();
columnHeader5 = new ColumnHeader();
splitContainer3 = new SplitContainer();
textBox1 = new TextBox();
tableLayoutPanel1 = new TableLayoutPanel();
pidListView = new ListView();
columnHeader1 = new ColumnHeader();
columnHeader2 = new ColumnHeader();
columnHeader3 = new ColumnHeader();
columnHeader6 = new ColumnHeader();
columnHeader7 = new ColumnHeader();
bottomCenter = new TextBox();
timer1 = new System.Windows.Forms.Timer(components);
tabControl1.SuspendLayout();
tabPage1.SuspendLayout();
((System.ComponentModel.ISupportInitialize)splitContainer1).BeginInit();
splitContainer1.Panel1.SuspendLayout();
splitContainer1.Panel2.SuspendLayout();
splitContainer1.SuspendLayout();
((System.ComponentModel.ISupportInitialize)splitContainer2).BeginInit();
splitContainer2.Panel1.SuspendLayout();
splitContainer2.Panel2.SuspendLayout();
splitContainer2.SuspendLayout();
((System.ComponentModel.ISupportInitialize)splitContainer3).BeginInit();
splitContainer3.Panel1.SuspendLayout();
splitContainer3.Panel2.SuspendLayout();
splitContainer3.SuspendLayout();
tableLayoutPanel1.SuspendLayout();
SuspendLayout();
//
// menuStrip1
//
menuStrip1.Location = new Point(0, 0);
menuStrip1.Name = "menuStrip1";
menuStrip1.Size = new Size(832, 24);
menuStrip1.TabIndex = 0;
menuStrip1.Text = "menuStrip1";
//
// statusStrip1
//
statusStrip1.Location = new Point(0, 457);
statusStrip1.Name = "statusStrip1";
statusStrip1.Size = new Size(832, 22);
statusStrip1.TabIndex = 1;
statusStrip1.Text = "statusStrip1";
//
// tabControl1
//
tabControl1.Controls.Add(tabPage1);
tabControl1.Dock = DockStyle.Fill;
tabControl1.Location = new Point(0, 24);
tabControl1.Name = "tabControl1";
tabControl1.SelectedIndex = 0;
tabControl1.Size = new Size(832, 433);
tabControl1.TabIndex = 2;
//
// tabPage1
//
tabPage1.Controls.Add(splitContainer1);
tabPage1.Location = new Point(4, 24);
tabPage1.Name = "tabPage1";
tabPage1.Padding = new Padding(3);
tabPage1.Size = new Size(824, 405);
tabPage1.TabIndex = 0;
tabPage1.Text = "TS Structure";
tabPage1.UseVisualStyleBackColor = true;
//
// splitContainer1
//
splitContainer1.Dock = DockStyle.Fill;
splitContainer1.Location = new Point(3, 3);
splitContainer1.Name = "splitContainer1";
//
// splitContainer1.Panel1
//
splitContainer1.Panel1.Controls.Add(splitContainer2);
//
// splitContainer1.Panel2
//
splitContainer1.Panel2.Controls.Add(splitContainer3);
splitContainer1.Size = new Size(818, 399);
splitContainer1.SplitterDistance = 272;
splitContainer1.TabIndex = 0;
//
// splitContainer2
//
splitContainer2.Dock = DockStyle.Fill;
splitContainer2.Location = new Point(0, 0);
splitContainer2.Name = "splitContainer2";
splitContainer2.Orientation = Orientation.Horizontal;
//
// splitContainer2.Panel1
//
splitContainer2.Panel1.Controls.Add(treeView1);
//
// splitContainer2.Panel2
//
splitContainer2.Panel2.Controls.Add(bottomLeft);
splitContainer2.Size = new Size(272, 399);
splitContainer2.SplitterDistance = 265;
splitContainer2.TabIndex = 0;
//
// treeView1
//
treeView1.Dock = DockStyle.Fill;
treeView1.ImageIndex = 0;
treeView1.ImageList = imageList1;
treeView1.Location = new Point(0, 0);
treeView1.Name = "treeView1";
treeView1.SelectedImageIndex = 0;
treeView1.Size = new Size(272, 265);
treeView1.TabIndex = 0;
treeView1.AfterSelect += treeView1_AfterSelect_1;
//
// imageList1
//
imageList1.ColorDepth = ColorDepth.Depth32Bit;
imageList1.ImageStream = (ImageListStreamer)resources.GetObject("imageList1.ImageStream");
imageList1.TransparentColor = Color.Transparent;
imageList1.Images.SetKeyName(0, "???");
imageList1.Images.SetKeyName(1, "Table");
imageList1.Images.SetKeyName(2, "services.ico");
imageList1.Images.SetKeyName(3, "Control_Timer.bmp");
imageList1.Images.SetKeyName(4, "database.bmp");
imageList1.Images.SetKeyName(5, "Calendar_scheduleHS.png");
imageList1.Images.SetKeyName(6, "PrimaryKeyHS.png");
imageList1.Images.SetKeyName(7, "InsertHyperlinkHS.png");
imageList1.Images.SetKeyName(8, "gear_32.bmp");
//
// bottomLeft
//
bottomLeft.Columns.AddRange(new ColumnHeader[] { columnHeader4, columnHeader5 });
bottomLeft.Dock = DockStyle.Fill;
bottomLeft.Items.AddRange(new ListViewItem[] { listViewItem1, listViewItem2, listViewItem3 });
bottomLeft.Location = new Point(0, 0);
bottomLeft.Name = "bottomLeft";
bottomLeft.Size = new Size(272, 130);
bottomLeft.TabIndex = 0;
bottomLeft.UseCompatibleStateImageBehavior = false;
bottomLeft.View = View.Details;
//
// columnHeader4
//
columnHeader4.Text = "K";
columnHeader4.Width = 80;
//
// columnHeader5
//
columnHeader5.Text = "V";
//
// splitContainer3
//
splitContainer3.Dock = DockStyle.Fill;
splitContainer3.Location = new Point(0, 0);
splitContainer3.Name = "splitContainer3";
splitContainer3.Orientation = Orientation.Horizontal;
//
// splitContainer3.Panel1
//
splitContainer3.Panel1.Controls.Add(textBox1);
//
// splitContainer3.Panel2
//
splitContainer3.Panel2.Controls.Add(tableLayoutPanel1);
splitContainer3.Size = new Size(542, 399);
splitContainer3.SplitterDistance = 118;
splitContainer3.TabIndex = 0;
//
// textBox1
//
textBox1.Dock = DockStyle.Fill;
textBox1.Location = new Point(0, 0);
textBox1.Multiline = true;
textBox1.Name = "textBox1";
textBox1.ReadOnly = true;
textBox1.ScrollBars = ScrollBars.Vertical;
textBox1.Size = new Size(542, 118);
textBox1.TabIndex = 0;
//
// tableLayoutPanel1
//
tableLayoutPanel1.ColumnCount = 1;
tableLayoutPanel1.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100F));
tableLayoutPanel1.Controls.Add(pidListView, 0, 0);
tableLayoutPanel1.Controls.Add(bottomCenter, 0, 1);
tableLayoutPanel1.Dock = DockStyle.Fill;
tableLayoutPanel1.Location = new Point(0, 0);
tableLayoutPanel1.Name = "tableLayoutPanel1";
tableLayoutPanel1.RowCount = 2;
tableLayoutPanel1.RowStyles.Add(new RowStyle(SizeType.Percent, 100F));
tableLayoutPanel1.RowStyles.Add(new RowStyle(SizeType.Absolute, 120F));
tableLayoutPanel1.Size = new Size(542, 277);
tableLayoutPanel1.TabIndex = 1;
//
// pidListView
//
pidListView.Columns.AddRange(new ColumnHeader[] { columnHeader1, columnHeader2, columnHeader3, columnHeader6, columnHeader7 });
pidListView.Dock = DockStyle.Fill;
pidListView.Location = new Point(3, 3);
pidListView.Name = "pidListView";
pidListView.Size = new Size(536, 151);
pidListView.SmallImageList = imageList1;
pidListView.TabIndex = 0;
pidListView.UseCompatibleStateImageBehavior = false;
pidListView.View = View.Details;
pidListView.ColumnClick += pidListView_ColumnClick;
//
// columnHeader1
//
columnHeader1.Text = "PID";
//
// columnHeader2
//
columnHeader2.Text = "Packets";
//
// columnHeader3
//
columnHeader3.Text = "Usage";
//
// columnHeader6
//
columnHeader6.Text = "Program";
columnHeader6.Width = 100;
//
// columnHeader7
//
columnHeader7.Text = "Usage";
//
// bottomCenter
//
bottomCenter.BackColor = Color.Black;
bottomCenter.Dock = DockStyle.Fill;
bottomCenter.ForeColor = Color.Lime;
bottomCenter.Location = new Point(3, 160);
bottomCenter.Multiline = true;
bottomCenter.Name = "bottomCenter";
bottomCenter.ReadOnly = true;
bottomCenter.Size = new Size(536, 114);
bottomCenter.TabIndex = 1;
bottomCenter.Tag = "";
bottomCenter.Text = resources.GetString("bottomCenter.Text");
//
// timer1
//
timer1.Enabled = true;
timer1.Interval = 1000;
timer1.Tick += timer1_Tick;
//
// Form1
//
AutoScaleDimensions = new SizeF(7F, 15F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(832, 479);
Controls.Add(tabControl1);
Controls.Add(statusStrip1);
Controls.Add(menuStrip1);
MainMenuStrip = menuStrip1;
Name = "Form1";
Text = "Form1";
FormClosed += Form1_FormClosed;
Load += Form1_Load;
tabControl1.ResumeLayout(false);
tabPage1.ResumeLayout(false);
splitContainer1.Panel1.ResumeLayout(false);
splitContainer1.Panel2.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)splitContainer1).EndInit();
splitContainer1.ResumeLayout(false);
splitContainer2.Panel1.ResumeLayout(false);
splitContainer2.Panel2.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)splitContainer2).EndInit();
splitContainer2.ResumeLayout(false);
splitContainer3.Panel1.ResumeLayout(false);
splitContainer3.Panel1.PerformLayout();
splitContainer3.Panel2.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)splitContainer3).EndInit();
splitContainer3.ResumeLayout(false);
tableLayoutPanel1.ResumeLayout(false);
tableLayoutPanel1.PerformLayout();
ResumeLayout(false);
PerformLayout();
}
#endregion
private MenuStrip menuStrip1;
private StatusStrip statusStrip1;
private TabControl tabControl1;
private TabPage tabPage1;
private SplitContainer splitContainer1;
private SplitContainer splitContainer2;
private TreeView treeView1;
private SplitContainer splitContainer3;
private TextBox textBox1;
private ListView pidListView;
private ColumnHeader columnHeader1;
private ColumnHeader columnHeader2;
private ColumnHeader columnHeader3;
private ListView bottomLeft;
private ColumnHeader columnHeader4;
private ColumnHeader columnHeader5;
private System.Windows.Forms.Timer timer1;
private TableLayoutPanel tableLayoutPanel1;
private TextBox bottomCenter;
private ColumnHeader columnHeader6;
private ColumnHeader columnHeader7;
private ImageList imageList1;
}
}

View File

@ -0,0 +1,392 @@
using skyscraper5.Mpeg2;
using skyscraper5.Skyscraper.Scraper;
using skyscraper5.Skyscraper.Scraper.Storage;
using skyscraper5.UI.Overrides;
using skyscraper5.UI.StreamAcquisition;
namespace skyscraper5.UI
{
public partial class Form1 : Form, INodeEngine
{
public Form1()
{
InitializeComponent();
}
public Form1(StreamSource acquiredStream)
: this()
{
AcquiredStream = acquiredStream;
tsContext = new TsContext();
tsContext.OnPacketLoss += TsContext_OnPacketLoss;
skyscraperContext = new SkyscraperContext(tsContext, eventLogger, storage);
skyscraperContext.UiJunction = uiJunction;
}
private void TsContext_OnPacketLoss(uint pid, uint oldContinuity, uint newContinuity, long packetLossEvents)
{
continuityErrors = packetLossEvents;
}
public StreamSource AcquiredStream { get; }
private TsContext tsContext;
private SkyscraperContext skyscraperContext;
private ISkyscraperEventLogger eventLogger;
private IScraperStroage storage;
private Form1UiJunction uiJunction;
private DateTime windowOpenedTimestamp;
private TimeSpan windowOpenDuration;
private long continuityErrors;
private TeiCounter teiCounterFilter;
private PmtCounter pmtCounter;
private PacketsPerSecondCounter packetsPerSecondCounter;
private ScrambleCounter scrambleCounter;
private void Form1_Load(object sender, EventArgs e)
{
scrambleCounter = new ScrambleCounter();
packetsPerSecondCounter = new PacketsPerSecondCounter();
teiCounterFilter = new TeiCounter();
skyscraperContext.InitalizeFilterChain(teiCounterFilter, packetsPerSecondCounter, scrambleCounter);
uiJunction = new Form1UiJunction(this);
skyscraperContext.UiJunction = uiJunction;
windowOpenedTimestamp = DateTime.Now;
windowOpenDuration = new TimeSpan(0, 0, 0);
bottomLeft.Items[0].SubItems[1].Text = AcquiredStream.GetSourceName();
skyscraperContext.PatDecoder.OnValidSection += PsiDecoder_OnValidSection;
skyscraperContext.PatDecoder.OnCrcError += PsiDecoder_OnCrcError;
pmtCounter = new PmtCounter();
skyscraperContext.PmtDecoderTransformer = pmtCounter;
skyscraperContext.CatDecoder.OnValidSection += PsiDecoder_OnValidSection;
skyscraperContext.CatDecoder.OnCrcError += PsiDecoder_OnCrcError;
skyscraperContext.NitDecoder.OnValidSection += PsiDecoder_OnValidSection;
skyscraperContext.NitDecoder.OnCrcError += PsiDecoder_OnCrcError;
skyscraperContext.Pid0x11Decoder.OnValidSection += PsiDecoder_OnValidSection;
skyscraperContext.Pid0x11Decoder.OnCrcError += PsiDecoder_OnCrcError;
skyscraperContext.Pid0x12Decoder.OnValidSection += PsiDecoder_OnValidSection;
skyscraperContext.Pid0x12Decoder.OnCrcError += PsiDecoder_OnCrcError;
DrawBottomCenter();
pidListView_ColumnClick(this, new ColumnClickEventArgs(0));
AcquiredStream.StartSource(skyscraperContext);
}
private long patErrors, catErrors, nitErrors, sdtErrors, batErrors, eitErrors;
private void PsiDecoder_OnCrcError(PsiSection section, int pid, long available)
{
switch (section.TableId)
{
case 0: patErrors++; break;
case 1: catErrors++; break;
case 0x40: nitErrors++; break;
case 0x41: nitErrors++; break;
case 0x42: sdtErrors++; break;
case 0x46: sdtErrors++; break;
case 0x4a: batErrors++; break;
default:
if (section.TableId >= 0x4e && section.TableId <= 0x6f)
{
eitErrors++;
break;
}
throw new NotImplementedException();
}
}
private long patValids, catValids, nitValids, sdtValids, batValids, eitValids;
private void PsiDecoder_OnValidSection(PsiSection section, int pid, long available)
{
switch (section.TableId)
{
case 0: patValids++; break;
case 1: catValids++; break;
case 0x40: nitValids++; break;
case 0x41: nitValids++; break;
case 0x42: sdtValids++; break;
case 0x46: sdtValids++; break;
case 0x4a: batValids++; break;
default:
if (section.TableId >= 0x4e && section.TableId <= 0x6f)
{
eitValids++;
break;
}
throw new NotImplementedException();
}
}
private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
AcquiredStream.StopSource();
}
private void timer1_Tick(object sender, EventArgs e)
{
windowOpenDuration = windowOpenDuration.Add(new TimeSpan(0, 0, 1));
bottomLeft.Items[1].SubItems[1].Text = windowOpenDuration.ToString();
DrawBottomCenter();
RenderPidList();
bottomLeft.Items[2].SubItems[1].Text = AcquiredStream.State.ToString();
}
private string bottomCenterTemplate;
private void DrawBottomCenter()
{
if (string.IsNullOrWhiteSpace(bottomCenterTemplate))
{
bottomCenterTemplate = bottomCenter.Text;
}
long patSections = patValids;
long pmtSections = pmtCounter.ValidSection; ;
long catSections = catValids;
long nitSections = nitValids;
long sdtSections = sdtValids;
long eitSections = eitValids;
long patCrcErrors = patErrors;
long pmtCrcErrors = pmtCounter.CrcErrors;
long catCrcErrors = catErrors;
long nitCrcErrors = nitErrors;
long sdtCrcErrors = sdtErrors;
long eitCrcErrors = eitErrors;
long continuityErrors = this.continuityErrors;
string muxBitrate = "???";
long teiErrors = this.teiCounterFilter.TransportErrors;
string lastSec = RenderPacketsPerSecond();
long syncLosses = 0;
long inBuffer = 0;
long outBuffer = 0;
bottomCenter.Text = String.Format(bottomCenterTemplate, patSections, pmtSections, catSections, nitSections, sdtSections, eitSections, patCrcErrors,
pmtCrcErrors, catCrcErrors, nitCrcErrors, sdtCrcErrors, eitCrcErrors, continuityErrors, muxBitrate, teiErrors, lastSec, syncLosses, inBuffer, outBuffer);
}
private char[] dataUnits = { 'K', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y', 'R', 'Q' };
private string RenderPacketsPerSecond()
{
if (!packetsPerSecondCounter.Ready)
{
return "???";
}
long packetsPerSecond = packetsPerSecondCounter.PacketsPerSecond;
long bytesPerSecond = packetsPerSecond * 188;
long bitsPerSecond = bytesPerSecond * 8;
if (bitsPerSecond < 1000)
{
return String.Format("{0} bits/s", bytesPerSecond);
}
int unitOffset = -1;
while (bitsPerSecond > 1000)
{
bitsPerSecond /= 1000;
unitOffset++;
}
return String.Format("{0} {1}bits/s", bitsPerSecond, dataUnits[unitOffset]);
}
private PidListViewItem[] listViewItems;
private Color scrambledColor = Color.FromArgb(255, 255, 128, 128);
private Color unscrambledColor = Color.FromArgb(255, 128, 255, 128);
private void RenderPidList()
{
if (listViewItems == null)
listViewItems = new PidListViewItem[0x2000];
ulong[] ulongs = tsContext.GetPidStatistics();
for (int i = 0; i < 0x2000; i++)
{
if (ulongs[i] != 0)
{
if (listViewItems[i] == null)
{
listViewItems[i] = new PidListViewItem(i);
pidListView.Items.Add(listViewItems[i]);
}
listViewItems[i].SetPackageStats(ulongs[i], packetsPerSecondCounter.TotalPacketsOverall);
listViewItems[i].BackColor = scrambleCounter.IsScrambled(i) ? scrambledColor : unscrambledColor;
}
if (uiJunction.PidToPrograms != null && uiJunction.SdtNames != null)
{
if (uiJunction.PidToPrograms.ContainsKey(i))
{
uint program = uiJunction.PidToPrograms[i];
if (uiJunction.SdtNames.ContainsKey(program))
{
listViewItems[i].ProgramName = uiJunction.SdtNames[program];
}
}
}
if (uiJunction.UsageLabels != null)
{
if (uiJunction.UsageLabels.ContainsKey(i))
{
if (listViewItems[i] != null)
{
listViewItems[i].UsageLabel = uiJunction.UsageLabels[i];
}
}
}
}
}
private PidListViewItemSorter lvwColumnSorter;
private void pidListView_ColumnClick(object sender, ColumnClickEventArgs e)
{
if (lvwColumnSorter == null)
{
lvwColumnSorter = new PidListViewItemSorter();
pidListView.ListViewItemSorter = lvwColumnSorter;
}
if (e.Column == lvwColumnSorter.SortColumn)
{
if (lvwColumnSorter.Order == SortOrder.Ascending)
{
lvwColumnSorter.Order = SortOrder.Descending;
}
else
{
lvwColumnSorter.Order = SortOrder.Ascending;
}
}
else
{
// Set the column number that is to be sorted; default to ascending.
lvwColumnSorter.SortColumn = e.Column;
lvwColumnSorter.Order = SortOrder.Ascending;
}
pidListView.Sort();
}
SkyscraperUiNode INodeEngine.EnsureNodeExists(params string[] path)
{
SkyscraperUiNode result = null;
if (IsDisposed)
return null;
Invoke(new Action(() => { result = EnsureNodeExistsEx(path); }));
return result;
}
private SkyscraperUiNode EnsureNodeExistsEx(params string[] path)
{
TreeNodeCollection rootNodes = treeView1.Nodes;
SkyscraperUiNode parent = null;
for (int i = 0; i < path.Length; i++)
{
SkyscraperUiNode foundNode = null;
if (i == 0)
{
foreach (TreeNode rootNode in rootNodes)
{
if (rootNode.Text.Equals(path[i]))
{
foundNode = (SkyscraperUiNode)rootNode;
break;
}
}
if (foundNode == null)
{
foundNode = new SkyscraperUiNode();
foundNode.Text = path[i];
rootNodes.Add(foundNode);
}
}
else
{
foreach (TreeNode childNode in parent.Nodes)
{
if (childNode.Text.Equals(path[i]))
{
foundNode = (SkyscraperUiNode)childNode;
break;
}
}
if (foundNode == null)
{
foundNode = new SkyscraperUiNode();
foundNode.Text = path[i];
parent.Nodes.Add(foundNode);
}
}
parent = foundNode;
}
return parent;
}
public void RunOnUiThread(Action action)
{
Invoke(action);
}
private void treeView1_AfterSelect_1(object sender, TreeViewEventArgs e)
{
SkyscraperUiNode node = e.Node as SkyscraperUiNode;
if (node == null)
return;
textBox1.Text = node.DetailedText;
}
public bool TestForNode(params string[] path)
{
TreeNodeCollection rootNodes = treeView1.Nodes;
SkyscraperUiNode parent = null;
for (int i = 0; i < path.Length; i++)
{
SkyscraperUiNode foundNode = null;
if (i == 0)
{
foreach (TreeNode rootNode in rootNodes)
{
if (rootNode.Text.Equals(path[i]))
{
foundNode = (SkyscraperUiNode)rootNode;
break;
}
}
if (foundNode == null)
{
return false;
}
}
else
{
foreach (TreeNode childNode in parent.Nodes)
{
if (childNode.Text.Equals(path[i]))
{
foundNode = (SkyscraperUiNode)childNode;
break;
}
}
if (foundNode == null)
{
return false;
}
}
parent = foundNode;
}
return true;
}
void INodeEngine.SetIcon(SkyscraperUiNode node, int index)
{
RunOnUiThread(() => {
node.ImageIndex = index;
node.SelectedImageIndex = index;
});
}
}
}

View File

@ -0,0 +1,363 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="menuStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
<metadata name="statusStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>132, 17</value>
</metadata>
<metadata name="imageList1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>335, 17</value>
</metadata>
<data name="imageList1.ImageStream" mimetype="application/x-microsoft.net.object.binary.base64">
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAEZTeXN0ZW0uV2luZG93cy5Gb3JtcywgQ3VsdHVyZT1uZXV0cmFs
LCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAAmU3lzdGVtLldpbmRvd3MuRm9ybXMu
SW1hZ2VMaXN0U3RyZWFtZXIBAAAABERhdGEHAgIAAAAJAwAAAA8DAAAAZDIAAAJNU0Z0AUkBTAIBAQkB
AAFIAQABSAEAARABAAEQAQAE/wEhAQAI/wFCAU0BNgcAATYDAAEoAwABQAMAATADAAEBAQABIAYAATAS
AAH/AQAD/wEAA/8BAAP/AQAD/wEAA/8BAAP/AQAD/wEAA/8BAAP/AQAD/wEAA/8BAAP/AQAD/wEAA/8B
AAP/AQAC/8AAAf8BAAP/AQAD/wEAA/8BAAP/AQAD/wEAAv8BtAKiAf8BcwI4Af8BdgE7ATwB/wFgAS4B
LwL/AQAD/wEAA/8BAAP/AQAD/wEAA/8BAAL/wAAB/wEAA/8BAAP/AQAC/wGMAWMBZAH/AXoCRAH/AY8B
QgFDAf8BjgJ6Af8BjgJLAf8BxAFhAWAB/wFgAi0C/wEAAv8BtQJgAf8BbgE0ATUB/wHLAqsC/wEAA/8B
AAL/wAAB/wEAAv8B7AHaAdsB/wGdAWcBaAH/AcEBdgF3Af8ByQJ7Af8BZAIuAf8BbQE1ATYB/wG7AWYB
ZwH/AcgBZwFmAf8BkAJFAf8BVgErASwB/wFzATgBOQH/AagCUQH/AXYBOAE5Af8BugKVAv8BAAL/wAAB
/wEAAv8B4AG/AcAB/wGmAl4B/wHkApMB/wHgAowB/wHLAnwB/wHFAXUBdAH/AdECdQH/AcwCbgH/AcgC
ZwH/AaMCUwH/AbQBWAFXAf8BwQFdAVwB/wG6AVoBWQH/AXABOAE5Av8BAAL/wAAB/wEAAv8B5gHLAcwB
/wHKAo0B/wG8AnUB/wHlApMB/wHgAowB/wHcAoUB/wHWAn0B/wHRAXYBdQH/AcwBbgFtAf8ByAFnAWYB
/wHDAmEB/wG+AVwBWwH/AXUBOgE7Af8B3ALDAv8BAAL/wAAB/wEAA/8BAAL/AaoBjgGPAf8BswFqAWwB
/wHlAZcBmAH/AeUCkwH/AcIBdAF1Af8BpAFgAWEB/wGgAVwBXQH/AbkCaAH/AcwBbgFtAf8BxwFnAWYB
/wGlAlMB/wFkATABMQL/AQAD/wEAAv/AAAHYAckBygH/AbcBWgFbAf8BrAFZAVoB/wG0AVwBXQH/Ae8B
ogGjAf8BwQF4AXkB/wGHAlEB/wHoAs0B/wHbAbcBuAH/Ab4BhQGGAf8BuAJnAf8BzAFuAW0B/wHIAWcB
ZgH/AY0COwH/AXABOAE5Af8BbgE2ATcB/8AAAcYCsQH/Ad0BhQGGAf8B/AG2AbgB/wH5AbEBsgH/AfQB
qgGrAf8BfQI9Af8BsQFxAXAB/wHNAa0BrwH/AeYB1AHVAf8BsQF2AXUB/wGbAVcBWAH/AdECdQH/AcwB
bgFtAf8BxwFnAWYB/wHEAmEB/wF9AT0BPgH/wAABxQGwAbEB/wHeAoYB/wH9AcABwQH/AfsBtQG2Af8B
+AGxAbIB/wGQAkkB/wHaAZMBlAH/AYIBRAFFAf8BjgFVAVYB/wHCAX4BfwH/AZkBVwFYAf8B1gF+AX0B
/wHRAXYBdQH/AcUBaQFqAf8BngFRAVIB/wGAAUABQQH/wAAB/wEAAv8B5QGZAZoB/wHiAaMBpAH/AeAB
lQGWAf8B+gG0AbYB/wHbAZIBkwH/AakBbgFvAf8B5wGkAaUB/wHkAp8B/wGwAnkB/wHAAXMBdAH/AdsB
hQGEAf8BzgJ4Af8BowJdAf8BrgJ4Af8BpgJyAf/AAAH/AQAD/wEAA/8BAAL/AbsBYAFhAf8B+wG2AbcB
/wH9AbcBuAH/AdcBjgGPAf8BiwFIAUkB/wGIAUcBSAH/AdEBhgGHAf8B5AKTAf8B4AKMAf8BwwJ1Af8B
ZQEzATQC/wEAA/8BAAL/wAAB/wEAA/8BAAL/AbwCUQH/AfgBsgGzAv8BuwG8Af8B/QG5AboB/wH8AbcB
uAH/AfkBsQGyAf8B9AGqAasB/wHuAqMB/wHoApkB/wHlAZMBlAH/AeACjAH/Ab4BcQFyAf8BegJIAv8B
AAL/wAAB/wEAA/8BAAL/AeUBlAGTAf8B+gG1AbYB/wH+AbkBugH/AcoCegH/AcMBdAF1Af8B/AG2AbgB
/wH5AbEBsgH/AcABegF7Af8BogFiAWMB/wG4AXMBdAH/AeUCkwH/AcMCeAH/AaUBZQFmAv8BAAL/wAAB
/wEAA/8BAAP/AQAC/wHoAqIB/wHeAY8BkAL/AQAC/wHPAYoBjQL/AbsBvAH/AfwBtgG3Af8BoAFXAVoC
/wEAAv8B2gGvAbAB/wGpAWkBaAH/AaoBaQFqAv8BAAP/AQAC/8AAAf8BAAP/AQAD/wEAA/8BAAP/AQAD
/wEAAv8BzgGIAYkB/wHXAZABkQH/Ac0BgQGCAf8BzQF7AXwC/wEAA/8BAAP/AQAD/wEAA/8BAAP/AQAC
/8AAAf8BAAP/AQAD/wEAAv8B4gHvAfQB/wGoAckB1wH/AXwBpAG2Af8BXwGGAZwB/wFKAXEBigH/AUUB
bAGHAf8BRQF2AZUB/wFYAY4BqwH/AY8BtwHNAf8B3QHqAfEC/wEAA/8BAAP/AQAC/4gAATICMQFNAVkB
VAFQAaEBagFYAUkB4wFhAU8BPgHjAVIBTgFKAaEDMQFNBAABMgIxAU0BWQFUAVABoQFqAVgBSQHjAWEB
TwE+AeMBUgFOAUoBoQMxAU0EAAH/AQAD/wEAAv8BrQHPAd8B/wFXAZEBrQH/AVwBowG/Af8BeAHAAdQB
/wGVAdkB5gH/AYEB2wHwAf8BUAHGAewB/wEkAaoB3QH/ARYBkgHHAf8BIgGAAawB/wE5AXEBkgH/AZ0B
vwHRAv8BAAP/AQAC/wG3AaIBkwH/AWMBSQE1Af8BYwFJATUB/wFjAUkBNQH/AWUBSwE4Af8BYwFJATUB
/wFjAUkBNQH/AWMBSQE1Af8BYwFJATUB/wFjAUkBNQH/AWMBSQE1Af8BYwFJATUB/wFjAUkBNQH/AWMB
SQE1Af8BYwFJATUB/wFjAUkBNQH/RAADNgFVAZMBggF3AecByAGyAaQB/wHjAc8BwgH/Ad0BxAG1Af8B
rQGRAX0B/wFuAVYBSAHnAVEBTgFMAY4BkwGCAXcB5wHIAbIBpAH/AeMBzwHCAf8B3QHEAbUB/wGtAZEB
fQH/AW4BVgFIAecCNQE0AVUB/wEAA/8BAAL/AVoBhAGbAf8BRAG9AecB/wFnAdMB8QH/AYwB4wH0Af8B
ogHrAfYB/wGDAd8B9AH/AVABygHwAf8BHgG2Ae0B/wECAacB6AH/AQEBoQHhAf8BCQGWAdIB/wE9AV4B
egL/AQAD/wEAAv8BvAGnAZgB/wHXAbcBnwH/AcQBngGEAf8BsgGLAW8B/wHaAboBowH/AckBqAGPAf8B
tAGPAXQB/wHZAbkBoQH/AcQBnwGEAf8BsgGLAXAB/wHXAbUBnQH/AcMBngGDAf8BsgGLAW8B/wHRAaoB
jwH/Ab8BmAF7Af8BYwFJATUB/xgAAysBQQEqAUUBVQHtAy8BSSAAAWsBZQFgAbIB3gHPAcQB/wFvAWYB
YQHCAXQBZQFbAdQBhgF5AW4B1AFOASwBFwH7AUcBJgEMAf8BRwEmAQwB/wFHASYBDAH/AWIBTwFBAeYB
dAFlAVsB1AGGAXkBbgHUAXwBcgFtAcIBtAGYAYQB/wFXAVABSQGyAf8BAAP/AQAC/wFdAYcBngH/AUMB
xAHwAf8BaQHUAfEB/wGMAeMB9AH/AaIB6wH2Af8BgwHfAfQB/wFQAcoB8AH/AR4BtgHtAf8BAgGoAegB
/wEBAaEB4QH/AQMBnAHaAf8BPgFfAXwC/wEAA/8BAAL/Ab4BqAGaAf8D/gH/A/4B/wHAAZkBfAH/Af0B
+gH4Af8B/QH4AfUB/wHBAZsBfQH/AfsB8gHsAf8B+wHwAekB/wG/AZcBeQH/AfoB6QHdAf8B+wHqAeAB
/wHBAZwBfwH/AfkB3wHPAf8B1AG9Aa4B/wFjAUkBNQH/GAABDQFEAWQB/gE0Aa8B1QH3ATgBRAFLAd8D
MwFSHAABpgGQAX0B9AL/Af0B/wFSAT4BMAHfAx4BKgGLAX8BdwHNAv8B/gL/AfUB7wH/AfkB6AHeAf8B
8QHbAc0B/wHrAdABwQH/AUsBSAFGAY0DHgEqAY8BfwFzAd8B5wHPAcEB/wFkAUkBNQH0Af8BAAP/AQAC
/wFfAYkBoAH/AUMBxAHvAf8BaAHUAfEB/wGNAeMB9AH/AaIB6wH2Af8BggHfAfMB/wFRAcoB8AH/AR4B
tgHtAf8BAgGoAegB/wECAaEB4QH/AQMBnAHaAf8BQAFiAX4C/wEAA/8BAAL/AcABqwGcAf8D/gH/A/4B
/wHOAaUBiAH/Af4C/AH/Af4B+gH4Af8BzQGjAYUB/wH9AfQB8AH/AfsB8QHqAf8BzQGjAYUB/wH7AeoB
4AH/AfoB6AHdAf8BzQGjAYUB/wH5AeEB0QH/AdMBvAGvAf8BYwFJATUB/xgAARIBUQFxAf8BWwHbAfcB
/QE5AY8BpQHxATcBPwFGAeAcAAFsAWYBYQGyAeoB3gHWAf8BfQFwAWYB3QFVAToBJgHzAWQBSgExAfsB
tAGZAYYB/QHMAbABngH/AcEBpAGQAfwB0wG6AaoB/wGzAZ0BjQHzAVkBSwE9AdYBZAFUAUgB1AF0AWsB
ZQHCAcQBrAGdAf8BXAFWAVABsgH/AQAD/wEAAv8BYQGMAaIB/wFFAcYB8AH/AWoB1AHxAf8BjAHjAfQB
/wGiAesB9gH/AYIB3wH0Af8BUQHKAfAB/wEeAbYB7QH/AQIBqAHoAf8BAQGiAeIB/wEEAZsB2wH/AUIB
ZQGAAv8BAAP/AQAC/wHCAa4BngH/AdQBrwGVAf8BwQGaAX4B/wGyAYsBbwH/Ac0BowGFAf8BvwGXAXoB
/wGyAYsBbwH/Ac0BowGFAf8BvwGXAXoB/wEMAUAB5wH/AQoBOwHaAf8BCAE0AccB/wEFAS0BtAH/Ac0B
owGFAf8BvwGXAXoB/wFjAUkBNQH/GAABFwFeAXwB/wFXAeAC/wEOATEBSAH8AygBOxwAAUoBSAFHAXsB
twGgAZUB+AHkAdkB0AH/Af4B9gH0Af8B+QHvAegB/wHRAb4BsQH/AZ0BfwFsAf8BfwFnAUwB/wG/AacB
lwH/AeQB2QHQAf8B/gH2AfQB/wH5Ae8B6AH/AdEBvgGxAf8BiwF4AW4B5wE2AjUBVQH/AQAD/wEAAv8B
ZAGPAaUB/wFGAcYB8AH/AWoB1AHyAf8BjQHjAfQB/wGiAesB9gH/AYMB3wH0Af8BUAHKAfAB/wEeAbYB
7QH/AQEBpwHoAf8BAQGhAeIB/wEDAZwB2wH/AUQBaAGDAv8BAAP/AQAC/wHFAa8BoAH/A/4B/wP+Af8B
vwGXAXkB/wP+Af8D/gH/Ab8BlwF5Af8B/QH6AfgB/wH9AfcB9AH/AS8BYAH2Af8B/QH3AfQB/wH9AfQB
8AH/AQgBNAHHAf8B+gHmAdsB/wHUAcEBtQH/AWMBSQE1Af8YAAEeAWsBiwH/AW4B5wL/AUIBpQG9AfQB
RgFNAVMBzBgAAxYBHQFjAV8BWwGwAdYBiwFkAf8BuQGNAWsB/wGnAZYBeQH/AZ4BjwF1Af8BjgF6AV0B
/wE3AYgBIgH/AWkBaAE3Af8BjQFmAU0B/wGGAXQBaQHiAZcBhQF5AeYBkQF+AXMB4wFfAVoBVwGhAjIB
MQFNBAAB/wEAA/8BAAL/AWUBkgGoAf8BRgHFAfAB/wFrAdQB8gH/AY0B4wH0Af8BogHrAfYB/wGCAd8B
9AH/AVABygHwAf8BHgG2Ae0B/wEBAacB6AH/AQEBoQHhAf8BAwGcAdsB/wFGAWsBhgL/AQAD/wEAAv8B
xwGxAaIB/wP+Af8D/gH/Ac0BowGFAf8D/gH/A/4B/wHNAaMBhQH/Af4C/AH/Af0B+gH4Af8BWwGCAfsB
/wH+AvwB/wH9AfcB9AH/AQoBOwHaAf8B+gHqAeAB/wHUAcQBugH/AWMBSQE1Af8UAAMuAUgBHgFqAYsB
/wF3AekB/gH/AS0BRgFNAesDLQFFGAABRAFDAUIBcAHBAY0BbwH/AfkBlgFlAf8B3AGNAWEB/wFnAXQB
SwH/AVABoQExAf8BSgGjASkB/wF8AZIBJwH/AcwBdgFHAf8BagFpAToB/wFYAVUBPAH/AkEBQAFwEAAB
/wEAA/8BAAL/AWgBlQGrAf8BRgHFAfAB/wFrAdQB8gH/AY0B4wH0Af8BogHrAfYB/wGDAd8B9AH/AVEB
ywHwAf8BHgG1Ae0B/wECAacB6AH/AQEBoQHiAf8BBAGcAdoB/wFJAW4BiAL/AQAD/wEAAv8ByQGzAaQB
/wHUAa8BlQH/AcEBmgF+Af8BsgGLAW8B/wHNAaMBhQH/Ab8BlwF6Af8BsgGLAW8B/wHNAaMBhQH/Ab8B
lwF6Af8BegGbAf4B/wFbAYIB+wH/AS8BYAH2Af8BDAFAAecB/wHNAaMBhQH/AcABmQF8Af8BYwFJATUB
/xAAAxsBJQEcAVsBewH/AXwB6wL/AYoB7wL/AWAB0gHlAf8BDQEzAUMB/wI6ATsBYhQAAW4BaAFkAbcB
7QGYAWwB/wHoAZcBaQH/AVwBcAFWAf8BXAGWAUQB/wFaAawBOAH/AZMBoAE5Af8B3gGFAVkB/wHTAX0B
UAH/AUwBaQFDAf8BPwF3ASwB/wFbAVQBTwG3EAAB/wEAA/8BAAL/AWoBmAGuAf8BRgHFAfAB/wFrAdQB
8QH/AY0B4wH0Af8BogHrAfYB/wGDAd8B9AH/AVEBygHwAf8BHgG2Ae0B/wECAagB6QH/AQEBoQHhAf8B
AwGcAdoB/wFLAXABigL/AQAD/wEAAv8BywG1AaUB/wP+Af8D/gH/Ab8BlwF5Af8D/gH/A/4B/wG/AZcB
eQH/A/4B/wP+Af8BvwGXAXkB/wH9AfoB+AH/Af0B9wH0Af8BvwGXAXkB/wH7AfIB6wH/AeAB2AHSAf8B
ZgFNATkB/xAAASMBaAGJAf8BhwHsAfkB/wGbAfMC/wGDAe8C/wGiAfYC/wFtAc0B3gH/AQYBKgFAAf8U
AAGYAYgBfQHqAfsBnQFvAf8BfwF+AVoB/wE6AaEBQQH/AVIBswFCAf8BjQGRAVgB/wHkAZQBagH/AeYB
jgFiAf8B2wGFAVcB/wFfAZ4BJQH/AToBlwEeAf8BZwFTAUUB6hAAAf8BAAP/AQAC/wFtAZsBsAH/AUUB
xgHwAf8BawHUAfIB/wGNAeMB9AH/AaIB6wH2Af8BgwHfAfQB/wFRAcoB8AH/AR4BtgHtAf8BAgGoAegB
/wECAaEB4QH/AQMBnAHaAf8BTgF0AY4C/wEAA/8BAAL/AcwBtgGnAf8D/gH/A/4B/wHNAaMBhQH/A/4B
/wP+Af8BzQGjAYUB/wP+Af8D/gH/Ac0BowGFAf8B/gH8AfsB/wH9AfoB+AH/Ac0BowGFAf8B/QH0AfAB
/wH7AfEB7AH/AWMBSQE1Af8QAAEwAXUBkgH/Aa4B9wL/AYcB4wHvAf8BLgFhAXsB/wGNAeUB8QH/Aa4B
+AL/AQUBQgFfAf8UAAGaAY0BggHqAd4BkwFoAf8BYwGYAVIB/wFAAcUBXwH/AUQByQFqAf8BcwGdAW0B
/wG2AZ8BaQH/AdEBlQFjAf8B5AGMAWAB/wGjAZMBNgH/AUYBoAEjAf8BaAFVAUgB6hAAAf8BAAP/AQAC
/wFwAZ8BswH/AUUBxgHwAf8BaQHUAfEB/wGMAeMB9AH/AaIB6wH2Af8BgwHfAfQB/wFRAcoB8AH/AR4B
tgHtAf8BAgGnAegB/wEBAaEB4QH/AQMBmwHaAf8BUAF3AZAC/wEAA/8BAAL/AeoBqgGLAf8B6gGqAYsB
/wHqAagBhwH/AekBpAGCAf8B6AGgAX0B/wHoAZwBdwH/AeYBlwFwAf8B5QGSAWkB/wHkAY0BYQH/AeMB
iAFaAf8B4gGCAVIB/wHgAX4BSwH/AeABeQFFAf8B3wF0AT8B/wHfAXIBOgH/AaUBYgFBAfIQAAFHAZAB
qQH/AZ8B9QL/Aa4B+gL/AZIB5wHwAf8BsQH6Av8BigHpAfUB/wEEAUoBaAH/FAABcQFsAWgBtwGlAY4B
XAH/AVIBuAFmAf8BWgHWAYEB/wGNAeEBmwH/AYIB4wGeAf8BngHQAZMB/wGoAaMBZgH/Ae0BlQFkAf8B
3wGJAVYB/wFOAZoBKQH/AV8BWAFUAbcQAAH/AQAD/wEAAv8BcQGhAbUB/wFrAdUB9AH/AZoB6AH3Af8B
tQHzAfoB/wHCAfgB/AH/AcMB+AH9Af8BwQH3Af0B/wGvAfAB+wH/AY8B4gH3Af8BagHQAfAB/wE+AbgB
5QH/AVMBegGTAv8BAAP/AQAC/wHqAaoBiwH/Af4B6wHiAf8B/gHrAeEB/wH+AeoB4AH/Af4B6QHeAf8B
/gHoAd0B/wH9AecB3AH/AfkBrwGIAf8B+QGrAYMB/wHzAacBfwH/AfMBpwF/Af8B9AGjAX0B/wH1AaEB
eQH/AfYBowF4Af8B8gGeAXEB/wGqAWYBQQHyEAADIQEwAWkBtgHKAf8BUgGcAbMB/wE5AYABmgH/ASUB
bwGQAf8BGQFqAY4B/wMfASwUAAFFAUQBQwFwAZ0BogF5Af8BNQHHAWIB/wF3Ad8BlgH/AcQB7AG3Af8B
0wHzAcoB/wHrAfcB1QH/AbAB5AGmAf8BggGUAWAB/wHVAZQBQAH/AYABhQE7Af8BQgJBAXAQAAH/AQAD
/wEAAv8BdAGjAbgB/wHFAfkB/QH/AcUB+QH9Af8BxQH5Af0B/wHFAfkB/QH/AcUB+QH9Af8BxQH5Af0B
/wHFAfkB/QH/AcUB+QH9Af8BxQH5Af0B/wHFAfkB/QH/AVUBfQGVAv8BAAP/AQAC/wHqAaoBiwH/AekB
pwGIAf8B6AGkAYMB/wHmAaABfgH/AeQBnAF4Af8B4gGXAXIB/wHgAZIBawH/Ad4BjAFlAf8B2wGHAV0B
/wHZAYEBVwH/AdcBfAFQAf8B1QF3AUoB/wHTAXMBRAH/AdEBbwE/Af8B0AFsAToB/wHPAWkBNwH/QAAD
FgEdAWsBZwFjAbABjgG1AXsB/wF5AdkBhwH/Ab8B7AG2Af8B3gH2AcwB/wF8AakBaAH/AXUB2AGJAf8B
QwGtAWEB/wGRAYMBRAH/AWEBWwFXAbADFgEdEAAB/wEAA/8BAAL/AbcB1wHhAf8BjAG9AcwB/wGdAc8B
2wH/Aa0B3wHoAf8BuQHsAfMB/wHCAfUB+gH/AcIB9QH6Af8BuAHrAfEB/wGpAdoB4wH/AZQBxAHRAf8B
ewGoAbgB/wGpAcUB0QL/AQAD/wEAAv8DZAHNBP8BjwGMAYoF/wNtAeEE/wOABf8DgAX/A3AF/wNjAf8D
/QH/AVgBWQFYAf8D1wH/RAADJwE5AWsBZwFjAbABrQG0AYwB/wGpAc0BkwH/AZoB1gGSAf8BgQHcAZEB
/wFQAb8BbgH/AY0BjwFhAf8BYwFfAVsBsAMnATkUAAH/AQAD/wEAAv8C/gL/AeMB8QH0Af8BuQHXAeEB
/wGVAb4BzAH/AXsBqAG7Af8BbgGbAbAB/wFqAZgBrQH/AXMBoQGzAf8BjAGyAcIB/wGxAc0B1wH/Ad8B
6wHvAf8D/gL/AQAD/wEAAv8EAAEgASUBIAH/AzIBTwEgASUBIAH/Ay4BSAEgASUBIAH/AysBQQEgASUB
IAH/A0QBeAEgASUBIAH/AzwBZAEgASUBIAH/AxwBJwEgASUBIAH/AzgBXANAAXBIAAMWAR0BRQFEAUMB
cAFxAWwBaAG3AZoBjQGCAeoBmAGIAX0B6gFuAWgBZAG3AUQBQwFCAXADFgEdWAAB/wEAA/8BAAP/AQAD
/wEAA/8BAAP/AQAD/wEAA/8BAAP/AQAD/wEAA/8BAAP/AQAD/wEAA/8BAAP/AQAD/wEAAv9AAAH/AQAD
/wEAA/8BAAP/AQAC/wHkAdwB2QH/AbABlAGQAf8BlAFpAWYB/wGBAUwBSwH/AYwBYQFeAf8BpQGHAYIB
/wG4AaQBngL/AQAD/wEAA/8BAAP/AQAD/wEAAv8SAAEDAf8BCgEMAQ0B/wEKAQ0BDgH/AQcBCQEKAf8B
IgEqAS4B/wE+AUwBUAH/AS8BOAE7Af8BKAEzATgB/wEdASUBKQH/ATUBPwFEAf8BAgEDAQQB/wQAAf8B
AAP/AQAD/wEAA/8BAAP/AQAD/wEAA/8BAAP/AQAD/wEAA/8BAAP/AQAD/wEAA/8BAAP/AQAD/wEAA/8B
AAL/CAABaQJdAeABcgJaAe0EAANQAZoBlQFSAVMB/yQAAf8BAAP/AQAC/wHkAdwB2QH/AbYBmgGVAf8B
lwFlAWQB/wGdAmsB/wGlAXYBdwH/Aa4BgQGAAf8BrAF9AXwB/wGhAXEBbwH/AY4BWwFaAf8BjgFbAVoB
/wHkAdwB2QL/AQAD/wEAA/8BAAL/DAABHwEkASUB/wF3AZEBmgH/AWUBiQGWAf8BdQGXAaEB/wFzAZcB
oQH/AXMBlwGjAf8BcgGWAaMB/wFpAYwBmgH/AV0BfQGNAf8BXgF8AYwB/wE/AUwBUQH/CAAB/wEAAv8B
twGiAZMB/wFjAUkBNQH/AWMBSQE1Af8BYwFJATUB/wFjAUkBNQH/AWMBSQE1Af8BYwFJATUB/wFjAUkB
NQH/AWMBSQE1Af8BYwFJATUB/wFjAUkBNQH/AWMBSQE1Af8BYwFJATUB/wFjAUkBNQL/AQAC/wgAAXgB
VgFVAfIBsQFiAWYB/wFwAjwB/wGVAVIBUwH/AXACPAH/JAAB/wEAAv8B5wHfAdwB/wGxAY4BiwH/AZoB
aAFnAf8BrQGCAYMB/wHTAbYBtwH/Ae0B2AHZAf8B3wHLAc4B/wHtAcsBzgH/AdgBrwGxAf8BvgGQAZIB
/wGeAmwB/wGVAWYBZQH/AdgBzwHMAv8BAAP/AQAC/wwAATUBPQFAAf8BkQGwAboB/wGkAcMBywH/AZgB
vQHGAf8BsAHOAdYB/wG/AdgB3wH/AcUB2wHiAf8BwQHYAd8B/wG4AdEB1wH/AWABfwGOAf8BIgEtATEB
/wgAAf8BAAL/AbcBogGTAf8B2QHLAcIB/wHOAb0BsQH/AcsBuQGtAf8ByAG1AakB/wHFAbIBpQH/AcIB
rgGhAf8BvwGsAZ4B/wG9AagBmgH/AbsBpgGXAf8BuQGkAZUB/wG3AaIBkwH/AbcBogGTAf8BYwFJATUC
/wEAAv8BmAFXAVUB/wFxAkMB+QHAAW4BagH/AbsBYQFeAf8BewFdAVwB6gHaAXABbwH/AcQCYwH/AV8C
XAHIAW0BNQE2Af8cAAH/AQAC/wHEAakBpgH/AZoCZwH/AbMCkAH/AdwB1gHVAf8B+QL1Af8B/gL0Af8D
AAH/AfMB3QHeAf8B+gHdAeAB/wGuAZABkQH/AbkBkAGRAf8BngJsAf8BngF2AXMC/wEAA/8BAAL/DAAB
OAFDAUYB/wGMAa8BuQH/AawBzAHSAf8BogHEAcsB/wGjAccByAH/AaEBxAG+Af8BrAHKAcMB/wGzAdIB
1wH/AbgB1AHaAf8BZwGIAZcB/wEhASsBMAH/CAAB/wEAAv8BtwGiAZMB/wP+Af8D/gH/Af0B+wH6Af8B
ywG5Aa0B/wH8AfIB7QH/AfsB7QHkAf8B+gHnAdwB/wG/AasBnQH/AfcB2wHKAf8B9gHVAcAB/wH1Ac8B
twH/AbcBogGTAf8BYwFJATUC/wEAAv8B3AGHAYYB/wHAAXUBdwH/AdwBhwGGAf8BdwJaAfIDRgF/AWMC
XwHQAcQCYwH/AbEBVgFXAf8BsQFWAVcB/xwAAeEB1QHSAf8BogJyAf8BoAF1AXYB/wHuAuUB/wMAAf8D
ogH/Af4C+QH/Af4C9AH/AfwB7QHuAf8B+wHlAecB/wMAAf8BvwGgAaMB/wG+AZABkQH/AY8BWwFcAf8B
yAG6AbUC/wEAAv8MAAFFAVoBYgH/AZABtQG/Af8BdQGjAYwB/wFLAaABNAH/AV4BuQE2Af8BhAHQAToB
/wF2AbYBZwH/AZ0BwwHKAf8BmwG/AccB/wFsAYsBlwH/AQwBDwEQAf8IAAH/AQAC/wG3AaIBkwH/A/4B
/wP+Af8D/gH/Ac4BvAGwAf8B/QH3AfMB/wH8AfIB7AH/AfsB7QHlAf8BwgGuAaEB/wH5AeEB0wH/AfcB
2wHKAf8B9QHVAcAB/wG5AaQBlQH/AWMBSQE1Av8BAAL/AwwBEAHTAYcBhgH/AeABjwGNAf8BagJBAfkD
KAE8AzkBXgHNAm4B/wGxAVYBVwH/AwwBEBwAAdEBuQG2Af8BlgFjAWIB/wHHAq4R/wH+AvoB/wH+AvQB
/wH8AuwB/wH7AeUB5wH/AfsB3QHhAf8B2AGvAbEB/wGhAXIBcQH/AaYBiAGDAv8BAAL/DAABTwFnAXAB
/wGeAb4BxwH/AWABmQFlAf8BUQG3AQAB/wFuAc4BHwH/AYUB3gEiAf8BjQHIAYoB/wGtAc4B2AH/AZ8B
wQHIAf8BcQGSAZ0B/wELAQ4BDwH/CAAB/wEAAv8BtwGiAZMB/wHgAdMBygH/AdcBxgG8Af8B1AHDAbgB
/wHRAcABtQH/Ac4BvQGxAf8BywG5AawB/wHIAbYBqQH/AcUBsgGlAf8BwgGvAaEB/wG/AawBnQH/Ab0B
qQGaAf8BugGmAZcB/wFjAUkBNQL/AQAC/wHdAZABjgH/AeUBpAGmAf8B8AKoAf8BqgFrAW4B/wFiAl0B
3AFtAl8B5QHCAWwBbQH/AbEBVgFXAf8BbQE1ATYB/wFpAl0B4AFyAloB7QQAA1ABmgGVAVIBUwH/CAAB
xgGkAaMB/wGHAVEBUAH/AegC3gH/A+gR/wH+AvoB/wH+AfUB9wH/AfwC7AH/Ae4B2AHaAf8B7QHLAc4B
/wGtAn4B/wGOAWIBYAL/AQAC/wwAAVEBaQFxAf8BrAHIAc8B/wFRAY8BRwH/AWkBvAEyAf8BcgHIATQB
/wFuAckBAAH/AZgByAGZAf8BtAHSAdwB/wGgAcEByQH/AVUBcAF6Af8MAAH/AQAC/wG6AaUBlgH/A/4B
/wP+Af8D/gH/AdUBxAG5Af8D/gH/Af0B+wH6Af8B/AH3AfQB/wHIAbYBqQH/AfsB7gHkAf8B+gHnAdwB
/wH5AeIB0wH/Ab0BqAGaAf8BYwFJATUC/wEAAv8BXgJdAcMBnwJ7AfMBiAJ3AecB7QGpAagB/wHdAYkB
hgH/AdYBfQF3Af8BwgFsAW0B/wHAAnIB/wG9AXIBcwH/AXgBVgFVAfIBsQFiAWYB/wFwAjwB/wGVAVIB
UwH/AXACPAH/CAABwwGaAZkB/wF6AUQBQwH/AfwC+wH/AwAB/wPVCf8DkAH/A8MB/wH+AvoB/wH+AfUB
9gH/AwAB/wHeAcoBzAH/AbABgwGCAf8BgwFQAU8C/wEAAv8JAAEDAQQB/wFmAYIBjgH/Aa8ByAHMAf8B
VQGOAT4B/wFmAaoBOgH/AW0BsgFAAf8BZwG0AQAB/wGxAdMBvgH/AbcB1QHdAf8BmAG6AcMB/wFhAXUB
fQH/DAAB/wEAAv8BvgGpAZoB/wP+Af8D/gH/A/4B/wHXAccBuwH/A/4B/wP+Af8B/QH7AfoB/wHLAbkB
rAH/AfsB8wHtAf8B+gHtAeUB/wH6AecB3AH/Ab8BqwGdAf8BYwFJATUC/wEAAv8IAAGPAXcBeQHrAdsB
nwGeAf8B0AGCAX4B/wHOAX4BegH/AbkBbwFwAf8BmAFXAVUB/wFxAkMB+QHAAW4BagH/AbsBYQFeAf8B
ewFdAVwB6gHaAXABbwH/AcQCYwH/AV8CXAHIAW0BNQE2Af8BzQGrAaoB/wGCAUwBSwH/AeYB3QHcEf8D
xwH/AxMB/wPDAf8B/gL6Af8B/gH1AfYB/wHtAdgB2QH/AagCeAH/AZcBbAFrAv8BAAL/CAABAQEHAQkB
/wF0AZEBnQH/AasBwQHAAf8BFAFaAQAB/wE5AXQBAAH/AUQBgwEAAf8BSAGNAQAB/wG6AdIBygH/AcMB
3gHlAf8BlQG3AcAB/wFSAWQBaQH/DAAB/wEAAv8BwwGuAZ4B/wHkAdgB0AH/Ad0BzgHFAf8B3AHMAcEB
/wHZAckBvwH/AdcBxwG8Af8B1AHEAbgB/wHRAcABtAH/Ac4BvQGxAf8BywG5AawB/wHIAbUBqQH/AcUB
sgGlAf8BwgGuAaAB/wFjAUkBNQL/AQAC/wgAAd0BnAGbAf8DWQG8AwwBEAHOAX4BegH/Ab0BcgFzAf8B
3AGHAYYB/wHAAXUBdwH/AdwBhwGGAf8BdwJaAfIDRgF/AWMCXwHQAcQCYwH/AbEBVgFXAf8BsQFWAVcB
/wHbAcUBwgH/AZQBYQFgAf8BwAGpAacF/wPVDf8DxwH/AxMB/wPDAv8C+gH/AdMCuAH/AaACbgH/AbIB
mAGTAv8BAAL/CQABAwEGAf8BdQGQAZwB/wGzAc4B0gH/AZECsgH/AaABvQG8Af8BtAHMAccB/wG2Ac0B
yQH/AccB3gHhAf8B2AHsAfEB/wGeAbsBxAH/ATkBQQFEAf8MAAH/AQAC/wHIAbIBowH/A/4B/wP+Af8D
/gH/AdsBzAHBAf8D/gH/A/4B/wP+Af8B0QHAAbQB/wH9AfsB+QH/Af0B9wH0Af8B/AHzAe0B/wHFAbIB
pQH/AWMBSQE1Av8BAAL/HAADDAEQAdMBhwGGAf8B4AGPAY0B/wFqAkEB+QMoATwDOQFeAc0CbgH/AbEB
VgFXAf8DDAEQAeoB4AHcAf8BrAF+AX8B/wGRAWUBYwH/AeoC4QH/AwAB/wPsBf8D2gX/A8cB/wMcAf8B
5gHfAeAB/wGuAoUB/wGbAmgB/wHTAcYBwQL/AQAC/wwAAVIBZgFtAf8BjQGyAbsB/wGeAcAByQH/AbsB
1QHcAf8BxwHeAeUB/wHLAeAB5wH/AbkB0wHaAf8BpAHCAcoB/wGeAboBwwH/AToBQwFGAf8MAAH/AQAC
/wHMAbYBpwH/A/4B/wP+Af8D/gH/Ad0BzgHFAf8D/gH/A/4B/wP+Af8B1AHEAbgB/wP+Af8B/QH7AfoB
/wH9AfcB8wH/AcgBtQGoAf8BZAFKATYC/wEAAv8cAAHdAZABjgH/AeUBpAGmAf8B8AKoAf8BqgFrAW4B
/wFiAl0B3AFtAl8B5QHCAWwBbQH/AbEBVgFXAf8BbQE1ATYC/wEAAv8B3AHEAcIB/wGZAmcB/wGiAXwB
ewH/AeoC4Qn/AwAB/wPVBf8B6AHiAeEB/wG1ApIB/wGeAmwB/wG5AZ0BmgL/AQAD/wEAAv8IAAEaAR8B
IAH/AUsBWQFfAf8BOAFNAVkB/wFlAYUBkwH/AXABkAGcAf8BeQGZAaUB/wF/AZ0BqQH/AWcBgwGOAf8B
cQGNAZkB/wGeAbEBtwH/ARkBHAEdAf8MAAH/AQAC/wHqAaoBiwH/AeoBqgGLAf8B6gGqAYsB/wHpAaUB
hAH/AekBnwF6Af8B5wGXAW4B/wHmAY4BYgH/AeUBhgFWAf8B4wF9AUoB/wHjAXYBQAH/AeIBcgE5Af8B
4gFyATkB/wHiAXIBOQH/AcgBYgEvAv8BAAL/HAABXgJdAcMBnwJ7AfMBiAJ3AecB7QGpAagB/wHdAYkB
hgH/AdYBfQF3Af8BwgFsAW0B/wHAAnIB/wG9AXIBcwL/AQAC/wGaAmgB/wFpAS4BLQH/AZoCaAH/AZEB
ZQFjAf8BwAGpAagB/wHnAtwB/wH8AvsB/wHoAd8B3gH/AcgCrwH/AaEBeAF3Af8BnQJrAf8BaQEuAS0B
/wFpAS4BLQL/AQAD/wEAAv8IAAEYARsBHAH/AUIBTAFQAf8BDwESARUB/wENARABEQH/AQYBCAEKAf8B
DwESARQB/wEMAQ8BEQH/AQQCBQH/AQgCCQH/AQABAgEEAf8QAAH/AQAC/wHqAaoBiwL/AcIBogH/Af4B
wAGfAf8B/QG9AZoB/wH8AbkBlgH/AfsBtQGQAf8B+gGwAYsB/wH5AasBhAH/AfgBpwF9Af8B9gGiAXcB
/wH1AZ0BcQH/AfUBmQFqAf8B8wGVAWUB/wHNAWUBMQL/AQAC/yQAAY8BdwF5AesB2wGfAZ4B/wHQAYIB
fgH/Ac4BfgF6Af8BuQFvAXAB/wgAAf8BAAL/AZUBaQFoAf8BzwKnAf8BaQEuAS0B/wGtAX4BfwH/AZQC
YQH/AYMBTQFMAf8BfAJFAf8BigJTAf8BmQJmAf8BpgJ2Af8BaQEuAS0B/wHPAqcB/wFpAS4BLQL/AQAD
/wEAAv9AAAH/AQAC/wHqAaoBiwH/AeoBqgGLAf8B6gGqAYsB/wHqAaoBiwH/AeoBpgGGAf8B6QGhAX8B
/wHoAZsBdgH/AecBlAFsAf8B5gGOAWIB/wHlAYcBWAH/AeQBgQFOAf8B5AF7AUYB/wHjAXYBPgH/AeIB
cgE5Av8BAAL/JAAB3QGcAZsB/wNZAbwDDAEQAc4BfgF6Af8BvQFyAXMB/wgAAf8BAAL/Ae4B5QHiAf8B
lQFpAWgB/wGaAmgC/wEAAv8B3AHFAcIB/wHPAa0BrAH/AWkBLgEtAf8ByAGmAaUB/wHSAbwBuAL/AQAC
/wGoAX0BfgH/AacBfwF9Af8B6wHnAeQC/wEAA/8BAAL/QAAB/wEAA/8BAAP/AQAD/wEAA/8BAAP/AQAD
/wEAA/8BAAP/AQAD/wEAA/8BAAP/AQAD/wEAA/8BAAP/AQAD/wEAAv9AAAH/AQAD/wEAA/8BAAP/AQAD
/wEAA/8BAAL/AYABTgFMAf8BaQEuAS0B/wFpAS4BLQL/AQAD/wEAA/8BAAP/AQAD/wEAA/8BAAP/AQAC
/wFCAU0BPgcAAT4DAAEoAwABQAMAATADAAEBAQABAQUAAYABARYAA/+DAAT/AcABgQQAAv8BgAUAAfwB
fwGABQAB/AE/AYAFAAH8AT8BgAUAAfwBPwGABQAB/AE/AQABAQQAAfgBPwEAAQ8EAAHwAR8BAAEPBAAB
8AEfAQABDwQAAfABHwEAAQ8EAAHwAR8BAAEPBAAB8AEfAQABDwQAAv8BAAEPBAAC/wGAAR8CAAGAAQAC
/wHAAT8C/wIAAv8CAAHwAQECAAHJAf8CAAHgAQMCAAHBAf8CAAHgAQMDAAF/AgAB4AEDAwABfwIAAeAB
AwMAAX8CAAHgAQMDAAETAgAB4AEHAwABAwIAAcABBwIAAcADAAHAAQcCAAHAAwABwAEHAgAB/gMAAeAB
BwIAAf4DAAHAAQcCAAH+AwABwAEPAgAB/wGDAgAC/wIAAf8BgwIAAv8CAAL/AgAL
</value>
</data>
<data name="bottomCenter.Text" xml:space="preserve">
<value> PAT PMT CAT NIT SDT EIT
Sections {0} {1} {2} {3} {4} {5}
CRC Errors {6} {7} {8} {9} {10} {11}
Continuity Errors: {12} Mux. bitrate: {13}
TEI Errors: {14} Last sec.: {15}
Sync losses: {16} In buffer: {17}
Out buffer: {18}</value>
</data>
<metadata name="timer1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>247, 17</value>
</metadata>
</root>

View File

@ -0,0 +1,16 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace skyscraper5.UI
{
internal interface INodeEngine
{
public SkyscraperUiNode EnsureNodeExists(params string[] path);
public void RunOnUiThread(Action action);
public bool TestForNode(params string[] path);
public void SetIcon(SkyscraperUiNode node, int index);
}
}

View File

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<packageRestore>
<add key="enabled" value="True" />
<add key="automatic" value="True" />
</packageRestore>
<bindingRedirects>
<add key="skip" value="False" />
</bindingRedirects>
<packageManagement>
<add key="format" value="0" />
<add key="disabled" value="False" />
</packageManagement>
<packageSources>
<add key="Package source" value="http://utena:8083/v3/index.json" allowInsecureConnections="True" />
<add key="OG Package source" value="https://api.nuget.org/v3/index.json" />
<add key="Microsoft Visual Studio Offline Packages" value="C:\Program Files (x86)\Microsoft SDKs\NuGetPackages\" />
</packageSources>
</configuration>

View File

@ -0,0 +1,456 @@
using Newtonsoft.Json;
using skyscraper5.Docsis;
using skyscraper5.Dvb.DataBroadcasting.SkyscraperVfs;
using skyscraper5.Dvb.Descriptors;
using skyscraper5.Dvb.Psi.Model;
using skyscraper5.Mhp.Si.Model;
using skyscraper5.Mpeg2.Descriptors;
using skyscraper5.Mpeg2.Psi.Model;
using skyscraper5.Scte35;
using skyscraper5.Skyscraper.Net;
using skyscraper5.Skyscraper.Scraper;
using skyscraper5.src.Skyscraper.FrequencyListGenerator;
using skyscraper5.Teletext.Wss;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Linq;
namespace skyscraper5.UI.Overrides
{
internal class Form1UiJunction : ISkyscraperUiJunction
{
private INodeEngine form1;
public Dictionary<uint, string> SdtNames { get; private set; }
public Dictionary<int, uint> PidToPrograms { get; private set; }
private JsonSerializerSettings jsonSerializerSettings;
public Dictionary<int, string> UsageLabels { get; private set; }
public Form1UiJunction(INodeEngine form1)
{
this.form1 = form1;
this.jsonSerializerSettings = new JsonSerializerSettings();
this.jsonSerializerSettings.NullValueHandling = NullValueHandling.Ignore;
this.jsonSerializerSettings.Formatting = Formatting.Indented;
SetPidUsage(0x0000, "PAT");
SetPidUsage(0x0001, "CAT");
SetPidUsage(0x0002, "TSDT");
SetPidUsage(0x0010, "NIT");
SetPidUsage(0x0011, "SDT/BAT");
SetPidUsage(0x0012, "EIT/CIT");
SetPidUsage(0x0013, "RST");
SetPidUsage(0x0014, "TDT/TOT");
SetPidUsage(0x0015, "network synchronization");
SetPidUsage(0x0016, "RNT");
SetPidUsage(0x001c, "link-local inband signalling");
SetPidUsage(0x001d, "measurement");
SetPidUsage(0x001e, "DIT");
SetPidUsage(0x001f, "SIT");
}
private void SetPidUsage(int pid, string name)
{
if (UsageLabels == null)
UsageLabels = new Dictionary<int, string>();
UsageLabels[pid] = name;
}
public void DsmCcModuleAdd(int elementaryPid, ushort moduleInfoModuleId, byte moduleInfoModuleVersion)
{
throw new NotImplementedException();
}
public void DsmCcModuleComplete(int elementaryPid, ushort moduleModuleId, byte moduleModuleVersion)
{
throw new NotImplementedException();
}
public void DsmCcModuleProgress(int elementaryPid, ushort moduleInfoModuleId, byte moduleInfoModuleVersion, double moduleInfoDownloadProgress)
{
throw new NotImplementedException();
}
public void DsmCcVfs(VfsFile vfsFile)
{
SkyscraperUiNode dsmCcNode = form1.EnsureNodeExists("DSM-CC");
form1.SetIcon(dsmCcNode, 1);
string outName = String.Format("DSM-CC\\Object Carousels\\PID 0x{0:X4}\\{1}", vfsFile.SourcePid, vfsFile.Name);
string[] args = outName.Split("\\");
form1.EnsureNodeExists(args);
}
public IEnumerable<HumanReadableService> GetServices()
{
throw new NotImplementedException();
}
public void NotifyAit(AitApplication aitApplication)
{
SkyscraperUiNode applicationNode = form1.EnsureNodeExists("AIT", aitApplication.TryGetName());
form1.SetIcon((SkyscraperUiNode)applicationNode.Parent, 1);
}
private Dictionary<ushort, string> bats;
public void NotifyBat(BatBouquet batBouquet)
{
if (bats == null)
bats = new Dictionary<ushort, string>();
string name = String.Format("{0} ({1})", batBouquet.BouquetId, batBouquet.BouquetName);
if (!bats.ContainsKey(batBouquet.BouquetId))
bats.Add(batBouquet.BouquetId, name);
SkyscraperUiNode bouquetNode = form1.EnsureNodeExists("BAT", name);
form1.SetIcon((SkyscraperUiNode)bouquetNode.Parent, 1);
form1.SetIcon(bouquetNode, 7);
}
public void NotifyBatTs(ushort batBouquetBouquetId, BatTransportStream child)
{
string name = bats[batBouquetBouquetId];
string name2 = String.Format("TS #{0}", child.TransportStreamId);
SkyscraperUiNode batTsNode = form1.EnsureNodeExists("BAT", name, name2);
form1.SetIcon(batTsNode, 4);
}
public void NotifyBlockstreamCarrier()
{
throw new NotImplementedException();
}
public void NotifyCat(CaDescriptor caDescriptor)
{
string systemName = CaSystemNames.GetHumanReadableName(caDescriptor.CaSystemId);
string caName = String.Format("0x{0:X4} ({1})",caDescriptor.CaSystemId,systemName);
SkyscraperUiNode catNode = form1.EnsureNodeExists("CAT", caName);
if (!catNode.FillOutComplete)
{
form1.SetIcon((SkyscraperUiNode)catNode.Parent, 1);
form1.SetIcon(catNode, 6);
catNode.DetailedText = JsonConvert.SerializeObject(caDescriptor, jsonSerializerSettings);
SetPidUsage(caDescriptor.CaPid, String.Format("{0} ECM/EMM", systemName));
catNode.FillOutComplete = true;
}
}
public void NotifyDocsisCarrier(DocsisEnvironment docsisEnvironment)
{
throw new NotImplementedException();
}
public void NotifyDocsisFrequency(uint? frequency, bool isUpstream, object mmm)
{
throw new NotImplementedException();
}
public void NotifyEvent(EitEvent eitEvent)
{
SkyscraperUiNode serviceNode = form1.EnsureNodeExists("EIT", eitEvent.StartTime.ToShortDateString(), eitEvent.ServiceId.ToString());
form1.SetIcon((SkyscraperUiNode)serviceNode.Parent.Parent, 1);
form1.SetIcon((SkyscraperUiNode)serviceNode.Parent, 5);
form1.SetIcon(serviceNode, 8);
}
public void NotifyMpeTraffic(IpTrafficInfo iti, int ipv4PacketLength)
{
throw new NotImplementedException();
}
public void NotifyNit(NitTransportStream transportStream)
{
SkyscraperUiNode nitNode = form1.EnsureNodeExists("NIT", transportStream.RenderForUi());
if (!nitNode.FillOutComplete)
{
nitNode.DetailedText = JsonConvert.SerializeObject(nitNode, jsonSerializerSettings);
nitNode.FillOutComplete = true;
form1.SetIcon((SkyscraperUiNode)nitNode.Parent, 1);
form1.SetIcon(nitNode, 4);
}
}
public void NotifyPatProgram(int pmtPid, ushort programId)
{
string name = String.Format("PMT PID 0x{0:X4} - Program {0}", programId, pmtPid);
SkyscraperUiNode patNode = form1.EnsureNodeExists("PAT", name);
form1.SetIcon((SkyscraperUiNode)patNode.Parent, 1);
}
public void NotifyPmtProgram(ProgramMapping result, int pmtPid)
{
string name = String.Format("PMT PID 0x{0:X4} - Program {0}", result.ProgramNumber,pmtPid);
SkyscraperUiNode programNode = form1.EnsureNodeExists("PAT",name);
if (!programNode.FillOutComplete)
{
form1.RunOnUiThread(() => form1.EnsureNodeExists("PAT").Expand());
if (!programNode.FillOutComplete)
{
programNode.DetailedText = JsonConvert.SerializeObject(result, jsonSerializerSettings);
programNode.FillOutComplete = true;
}
string sdtName = null;
form1.RunOnUiThread(() => sdtName = TrySdtFromPmt(result.ProgramNumber));
if (sdtName != null)
{
form1.EnsureNodeExists("PAT", name, String.Format("SDT: {0}", sdtName));
form1.RunOnUiThread(() => programNode.Expand());
}
foreach (ProgramMappingStream pmtEntry in result.Streams)
{
string name2 = String.Format("PID 0x{0:X4}", pmtEntry.ElementaryPid);
SkyscraperUiNode pidNode = form1.EnsureNodeExists("PAT", name, name2);
form1.SetIcon((SkyscraperUiNode)pidNode.Parent, 8);
pidNode.DetailedText = JsonConvert.SerializeObject(pmtEntry, jsonSerializerSettings);
if (PidToPrograms == null)
PidToPrograms = new Dictionary<int, uint>();
PidToPrograms.Add(pmtEntry.ElementaryPid, result.ProgramNumber);
SetPidUsage(pmtEntry.ElementaryPid, StreamTypeAsString(pmtEntry,result.PrivateDataSpecifier));
}
PidToPrograms.Add(pmtPid, result.ProgramNumber);
SetPidUsage(pmtPid, "PMT");
programNode.FillOutComplete = true;
}
}
private string TrySdtFromPmt(ushort programNumber)
{
if (!form1.TestForNode("SDT"))
return null;
SkyscraperUiNode sdtNode = form1.EnsureNodeExists("SDT");
foreach(TreeNode node in sdtNode.Nodes)
{
string prefix = String.Format("{0} ", programNumber);
if (node.Text.StartsWith(prefix))
{
string result = node.Text.Substring(node.Text.Length);
return result;
}
}
return null;
}
public void NotifyScte35(ushort programNumber, SpliceInsert spliceInsert)
{
throw new NotImplementedException();
}
public void NotifyScte35(ushort programNumber, TimeSignal spliceInsert)
{
throw new NotImplementedException();
}
public void NotifySdtService(SdtService sdtService)
{
string name = String.Format("{0} {1}", sdtService.ServiceId, sdtService.ServiceName);
SkyscraperUiNode node = form1.EnsureNodeExists("SDT", name);
if (!node.FillOutComplete)
{
if (SdtNames == null)
SdtNames = new Dictionary<uint, string>();
SdtNames.Add(sdtService.ServiceId, sdtService.ServiceName);
node.DetailedText = JsonConvert.SerializeObject(sdtService, jsonSerializerSettings);
form1.RunOnUiThread(new Action(() => { TrySdtToPmt(sdtService.ServiceId, sdtService.ServiceName); }));
form1.SetIcon((SkyscraperUiNode)node.Parent, 1);
node.FillOutComplete = true;
}
}
private void TrySdtToPmt(uint programNo, string serviceName)
{
if (!form1.TestForNode("PAT"))
return;
string query = String.Format(" {0}", programNo);
SkyscraperUiNode patNode = form1.EnsureNodeExists("PAT");
foreach(TreeNode node in patNode.Nodes)
{
if (node.Text.EndsWith(query))
{
SkyscraperUiNode childNode = new SkyscraperUiNode();
childNode.Text = String.Format("SDT: {0}", serviceName);
node.Nodes.Add(childNode);
break;
}
}
}
public void NotifyStreamTypeDetection(string contestantTag, int pid)
{
throw new NotImplementedException();
}
public void NotifyTdt(DateTime utcTime)
{
SkyscraperUiNode skyscraperUiNode = form1.EnsureNodeExists("TDT");
form1.SetIcon(skyscraperUiNode, 1);
if (skyscraperUiNode.Nodes.Count == 0)
{
SkyscraperUiNode child = new SkyscraperUiNode();
child.Text = utcTime.ToString();
form1.RunOnUiThread(() =>
{
skyscraperUiNode.Nodes.Add(child);
skyscraperUiNode.Expand();
}
);
form1.SetIcon(child, 3);
}
else
{
SkyscraperUiNode oldChild = (SkyscraperUiNode)skyscraperUiNode.Nodes[0];
form1.RunOnUiThread(() => oldChild.Text = utcTime.ToString());
}
}
public void NotifyTot(DateTime utcTime, LocalTimeOffsetDescriptor ltod)
{
SkyscraperUiNode skyscraperUiNode = form1.EnsureNodeExists("TOT");
form1.SetIcon(skyscraperUiNode, 1);
if (skyscraperUiNode.Nodes.Count == 0)
{
SkyscraperUiNode child = new SkyscraperUiNode();
child.Text = utcTime.ToString();
form1.RunOnUiThread(() =>
{
skyscraperUiNode.Nodes.Add(child);
skyscraperUiNode.Expand();
}
);
if (!child.FillOutComplete)
{
form1.SetIcon(child, 3);
child.DetailedText = JsonConvert.SerializeObject(ltod, jsonSerializerSettings);
}
}
else
{
SkyscraperUiNode oldChild = (SkyscraperUiNode)skyscraperUiNode.Nodes[0];
form1.RunOnUiThread(() => oldChild.Text = utcTime.ToString());
}
}
public void NotifyWss(ushort programNumber, WssDataBlock wssDataBlock)
{
throw new NotImplementedException();
}
public void SetGseMode()
{
throw new NotImplementedException();
}
public void SetMemorySaverMode(bool saveMemory)
{
throw new NotImplementedException();
}
public void ShowFramegrab(int currentNetworkId, int transportStreamId, ushort mappingProgramNumber, int mappingStreamElementaryPid, byte[] imageData)
{
throw new NotImplementedException();
}
private string StreamTypeAsString(ProgramMappingStream stream, uint? parentRegistrationFormatIdentifier)
{
if (stream.StreamType == PmtStreamType.H262)
return "MPEG-2 Video";
if (stream.AvcStillPresent.HasValue)
return "MPEG-4 Video";
if (stream.AudioType.HasValue)
{
switch (stream.AudioType)
{
case AudioType.CleanEffects: return "Audio";
case AudioType.HearingImpaired: return "Audio (for hearing impaired)";
case AudioType.VisualImpairedCommentary: return "Audio (for visually impaired)";
}
}
if (stream.StreamType == PmtStreamType.AvcVideoStream)
{
return "MPEG-4 Video";
}
if (stream.StreamType == PmtStreamType.Iso11172Audio)
{
return "Audio";
}
if (stream.StreamType == PmtStreamType.Iso13818_3Audio)
return "MPEG-2 Audio";
if (stream.StreamType == PmtStreamType.Iso13818_7AudioADTS)
return "AAC Audio";
if (stream.StreamType == PmtStreamType.HevcVideoStream)
return "H.265 Video";
if (stream.StreamType == PmtStreamType.Iso13818_1PesPackets && stream.Ac4ChannelMode.HasValue)
return "Dolby AC-4 Audio";
if (stream.StreamType == PmtStreamType.Iso13818_1PesPackets && stream.BSID.HasValue)
return "Dolby AC-3 Audio";
if (stream.StreamType == PmtStreamType.Iso14496_3Audio && stream.AacProfileAndLevel.HasValue)
return "AAC Audio";
if ((int)stream.StreamType == 0x81 && stream.ComponentType.HasValue)
return "Dolby AC-3 Audio";
if (stream.Teletexts != null)
return "Teletext";
if (stream.Applications != null)
return "Red-button Application";
if (stream.DataBroadcastId == 0x0123)
return "Red-button Application";
if (stream.DataBroadcastId == 0x000a)
return "System Software Update";
if (stream.StreamType == PmtStreamType.Iso13818_1PesPackets && stream.Subtitlings != null && stream.Subtitlings.Length > 0)
return "Subtitle";
if (stream.DataBroadcastId == 0xf0)
return "MHP Application";
if (stream.FormatIdentifier.HasValue && stream.FormatIdentifier == 0x43554549 && (int)stream.StreamType == 0x86)
return "Advertising Metadata";
if ((int)stream.StreamType == 0x86 && parentRegistrationFormatIdentifier.HasValue && parentRegistrationFormatIdentifier.Value == 0x43554549)
return "Advertising Metadata";
if (stream.DataBroadcastId == 0x0007)
return "Object Carousel";
if (stream.StreamType == PmtStreamType.Iso13818_1PesPackets && stream.VbiData != null)
return "Teletext";
if ((byte)stream.StreamType == 0x89 && stream.AncillaryDataDescriptor != null && stream.AncillaryDataDescriptor.RdsOnly)
return "Radio Data Service";
if (stream.DataBroadcastId.HasValue && stream.DataBroadcastId.Value == 0x0005 /*&& stream.StreamType == PmtStreamType.Iso13818_6TypeD*/)
return "Multiprotocol Encapsulation";
if (stream.DataBroadcastId == 0x0106)
return "MHEG-5";
if (stream.DataBroadcastId == 0x000b)
return "IP/MAC Notification";
if (stream.RelatedContentDescriptorPresent.HasValue)
if (stream.RelatedContentDescriptorPresent.Value && stream.StreamType == PmtStreamType.Iso13818_1PrivateSections)
return "Related Content Table Information";
if (stream.NumT2MiStreams.HasValue && stream.StreamType == PmtStreamType.Iso13818_1PesPackets)
return "T2-MI";
return String.Format("??? (Type 0x{0:X2})", (int)stream.StreamType);
}
}
}

View File

@ -0,0 +1,51 @@
using skyscraper5.Mpeg2;
using skyscraper5.src.Mpeg2.PacketFilter;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace skyscraper5.UI.Overrides
{
internal class PacketsPerSecondCounter : IPacketFilter
{
public bool PassPacket(TsPacket packet)
{
DateTime now = DateTime.Now;
if (lastPacket.Second != now.Second)
{
countedPacketLastSecond = countedPacketThisSecond;
countedPacketThisSecond = 0;
Ready = true;
}
lastPacket = now;
countedPacketThisSecond++;
totalPacketsOverall++;
return true;
}
private DateTime lastPacket;
private long countedPacketThisSecond;
private long countedPacketLastSecond;
private ulong totalPacketsOverall;
public long PacketsPerSecond
{
get
{
return countedPacketThisSecond;
}
}
public ulong TotalPacketsOverall
{
get
{
return totalPacketsOverall;
}
}
public bool Ready { get; private set; }
}
}

View File

@ -0,0 +1,32 @@
using skyscraper5.Mpeg2;
using skyscraper5.src.Mpeg2;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace skyscraper5.UI.Overrides
{
internal class PmtCounter : IPsiDecoderTransformer
{
public void Transform(PsiDecoder psiDecoder)
{
psiDecoder.OnCrcError += PsiDecoder_OnCrcError;
psiDecoder.OnValidSection += PsiDecoder_OnValidSection;
}
private void PsiDecoder_OnValidSection(PsiSection section, int pid, long available)
{
ValidSection++;
}
private void PsiDecoder_OnCrcError(PsiSection section, int pid, long available)
{
CrcErrors++;
}
public long CrcErrors { get; private set; }
public long ValidSection { get; private set; }
}
}

View File

@ -0,0 +1,34 @@
using skyscraper5.Mpeg2;
using skyscraper5.src.Mpeg2.PacketFilter;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace skyscraper5.UI.Overrides
{
internal class ScrambleCounter : IPacketFilter
{
public bool PassPacket(TsPacket packet)
{
if (scrambled == null)
scrambled = new byte[0x2000];
if (packet.TSC != 0)
{
if (scrambled[packet.PID] != 255)
scrambled[packet.PID]++;
}
return true;
}
private byte[] scrambled;
public bool IsScrambled(int pid)
{
return scrambled[pid] > 0;
}
}
}

View File

@ -0,0 +1,23 @@
using skyscraper5.Mpeg2;
using skyscraper5.src.Mpeg2.PacketFilter;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace skyscraper5.UI.Overrides
{
internal class TeiCounter : IPacketFilter
{
public bool PassPacket(TsPacket packet)
{
if (packet.TEI)
TransportErrors++;
return true;
}
public long TransportErrors { get; private set; }
}
}

View File

@ -0,0 +1,74 @@
using skyscraper5.UI.Overrides;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace skyscraper5.UI
{
internal class PidListViewItem : ListViewItem
{
public PidListViewItem(int pid)
{
SubItems.Add(new ListViewSubItem());
SubItems.Add(new ListViewSubItem());
SubItems.Add(new ListViewSubItem());
SubItems.Add(new ListViewSubItem());
this.PID = pid;
}
private int _pid;
public int PID
{
get
{
return _pid;
}
set
{
_pid = value;
Text = String.Format("0x{0:X4}", value);
}
}
public ulong PackagesInPid { get; private set; }
public double Percentage { get; private set; }
public string ProgramName
{
get
{
return SubItems[3].Text;
}
set
{
SubItems[3].Text = value;
}
}
public string UsageLabel
{
get
{
return SubItems[4].Text;
}
set
{
SubItems[4].Text = value;
}
}
public void SetPackageStats(ulong packagesInPid, ulong totalPackagesOverall)
{
SubItems[1].Text = packagesInPid.ToString();
this.Percentage = (double)packagesInPid / (double)totalPackagesOverall;
SubItems[2].Text = Math.Round(this.Percentage * 100.0, 2) + "%";
this.PackagesInPid = packagesInPid;
}
}
}

View File

@ -0,0 +1,61 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace skyscraper5.UI
{
internal class PidListViewItemSorter : IComparer
{
public PidListViewItemSorter()
{
SorterInstanceGuid = Guid.NewGuid();
}
public Guid SorterInstanceGuid { get; private set; }
public int SortColumn { get; internal set; }
public SortOrder Order { get; internal set; }
public int Compare(object? x, object? y)
{
PidListViewItem x2 = x as PidListViewItem;
PidListViewItem y2 = y as PidListViewItem;
int value;
switch(SortColumn)
{
case 0: value = x2.PID.CompareTo(y2.PID); break;
case 1: value = x2.PackagesInPid.CompareTo(y2.PackagesInPid); break;
case 2: value = x2.PackagesInPid.CompareTo(y2.PackagesInPid); break;
case 3: value = CompareProgramName(x2.ProgramName,y2.ProgramName,Order); break;
case 4: value = CompareProgramName(x2.UsageLabel, y2.UsageLabel, Order); break;
default:
throw new NotImplementedException(String.Format("{0}, {1}", SortColumn, Order));
}
if (Order == SortOrder.Descending)
value /= -1;
return value;
}
private int CompareProgramName(string x3, string y3, SortOrder sortOrder)
{
if (string.IsNullOrEmpty(x3) && string.IsNullOrEmpty(y3))
return 0;
if (string.IsNullOrEmpty(x3))
return sortOrder == SortOrder.Descending ? -1 : 1;
if (string.IsNullOrEmpty(y3))
return sortOrder == SortOrder.Descending ? 1 : -1;
return x3.CompareTo(y3);
}
}
}

View File

@ -0,0 +1,56 @@
using skyscraper5.UI.StreamAcquisition;
using System.Reflection;
namespace skyscraper5.UI
{
internal static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
List<StreamAcquirerListItem> streamAcquirers;
Assembly assembly = Assembly.GetExecutingAssembly();
streamAcquirers = assembly.GetTypes()
.Where(t => typeof(IStreamAcquirer).IsAssignableFrom(t))
.Where(t => !t.IsInterface)
.Where(t => !t.IsAbstract)
.Select(x => x.GetConstructor(Type.EmptyTypes))
.Select(x => x.Invoke(new object[0]))
.Select(x => new StreamAcquirerListItem((IStreamAcquirer)x))
.ToList();
StreamSource acquiredStream = null;
string[] args = Environment.GetCommandLineArgs();
if (args.Length == 2)
{
foreach (StreamAcquirerListItem possibleStreamer in streamAcquirers)
{
object handle = possibleStreamer.Wrapped.BaseGetHandle(args[1]);
if (handle == null)
continue;
StreamSource stream = possibleStreamer.Wrapped.BaseGetStream(handle);
if (stream == null)
continue;
acquiredStream = stream;
break;
}
}
ApplicationConfiguration.Initialize();
if (acquiredStream == null)
{
StreamAcquirerPickingForm pickingForm = new StreamAcquirerPickingForm(streamAcquirers,args);
pickingForm.ShowDialog();
if (pickingForm.StreamSource == null)
return;
acquiredStream = pickingForm.StreamSource;
}
Application.Run(new Form1(acquiredStream));
}
}
}

View File

@ -0,0 +1,8 @@
{
"profiles": {
"skyscraper5.UI": {
"commandName": "Project",
"commandLineArgs": "\"Z:\\Freebies\\Datasets\\SkyscraperLibrarian\\DVB-C\\Bochum\\114.ts\""
}
}
}

View File

@ -0,0 +1,14 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace skyscraper5.UI
{
internal class SkyscraperUiNode : TreeNode
{
public bool FillOutComplete { get; set; }
public string DetailedText { get; internal set; }
}
}

View File

@ -0,0 +1,46 @@
using skyscraper5.UI.StreamAcquisition;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace skyscraper5.UI.StreamAcquirers
{
[StreamAcquirer("File","Transport Stream File")]
internal class FileStreamAcquirer : StreamAcquisition.AbstractStreamAcquirer<FileInfo>
{
public override FileInfo AskUserForHandle(IWin32Window parent)
{
OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.Filter = "MPEG-2 Transport Stream (*.ts)|*.ts";
openFileDialog.Multiselect = false;
openFileDialog.CheckFileExists = true;
openFileDialog.CheckPathExists = true;
DialogResult dialogResult = openFileDialog.ShowDialog(parent);
switch(dialogResult)
{
case DialogResult.OK:
return new FileInfo(openFileDialog.FileName);
case DialogResult.Cancel:
return null;
default:
throw new NotImplementedException(dialogResult.ToString());
}
}
public override FileInfo GetHandle(string arg)
{
if (File.Exists(arg))
{
return new FileInfo(arg);
}
return null;
}
public override StreamSource GetStream(FileInfo inputHandle)
{
return new StreamSourceIoStreamWrapper(inputHandle.OpenRead(), inputHandle.Name);
}
}
}

View File

@ -0,0 +1,99 @@
using skyscraper5.UI.StreamAcquisition;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace skyscraper5.UI.StreamAcquirers
{
[StreamAcquirer("NULL","Returns only empty frames")]
internal class NullStreamAcquirer : AbstractStreamAcquirer<object>
{
public override object AskUserForHandle(IWin32Window window)
{
return new object();
}
public override object GetHandle(string arg)
{
return null;
}
private BlankTransportStream ts;
public override StreamSource GetStream(object inputHandle)
{
if (ts == null)
ts = new BlankTransportStream();
return new StreamSourceIoStreamWrapper(ts, null);
}
class BlankTransportStream : Stream
{
public int _continuityCounter;
private long _internalPosition;
public override bool CanRead => true;
public override bool CanSeek => false;
public override bool CanWrite => false;
public override long Length => throw new NotImplementedException();
public override long Position
{
get => _internalPosition;
set => throw new NotImplementedException();
}
public override void Flush()
{
throw new NotImplementedException();
}
private byte[] buffer;
public override int Read(byte[] outBuffer, int offset, int count)
{
if (count != 188)
throw new ArgumentOutOfRangeException(nameof(count));
if (buffer == null)
buffer = new byte[188];
buffer[0] = (byte)'G';
buffer[1] = 0x1f;
buffer[2] = 0xff;
buffer[3] = 0;
buffer[3] <<= 2;
buffer[3] += 1;
buffer[3] <<= 2;
buffer[3] += (byte)_continuityCounter;
_continuityCounter++;
if (_continuityCounter > 0xf)
_continuityCounter = 0;
Array.Copy(buffer, 0, outBuffer, offset, count);
return count;
}
public override long Seek(long offset, SeekOrigin origin)
{
throw new NotImplementedException();
}
public override void SetLength(long value)
{
throw new NotImplementedException();
}
public override void Write(byte[] buffer, int offset, int count)
{
throw new NotImplementedException();
}
}
}
}

View File

@ -0,0 +1,41 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace skyscraper5.UI.StreamAcquisition
{
internal interface IStreamAcquirer
{
object BaseGetHandle(string arg);
StreamSource BaseGetStream(object inputHandle);
object BaseAskUserForHandle(IWin32Window parent);
Type HandleType { get; }
}
internal abstract class AbstractStreamAcquirer<T> : IStreamAcquirer
{
public abstract T GetHandle(string arg);
public abstract StreamSource GetStream(T inputHandle);
public abstract T AskUserForHandle(IWin32Window parent);
public object BaseGetHandle(string arg)
{
return (T)GetHandle(arg);
}
public StreamSource BaseGetStream(object inputHandle)
{
return GetStream((T)inputHandle);
}
public object BaseAskUserForHandle(IWin32Window parent)
{
return AskUserForHandle(parent);
}
public Type HandleType { get => typeof(T); }
}
}

View File

@ -0,0 +1,30 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace skyscraper5.UI.StreamAcquisition
{
[AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)]
sealed class StreamAcquirerAttribute : Attribute
{
public StreamAcquirerAttribute(string name, string description)
{
Name = name;
Description = description;
Hidden = false;
}
public StreamAcquirerAttribute(string name, string description, bool hidden)
{
Name = name;
Description = description;
Hidden = hidden;
}
public string Name { get; }
public string Description { get; }
public bool Hidden { get; }
}
}

View File

@ -0,0 +1,52 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
namespace skyscraper5.UI.StreamAcquisition
{
internal class StreamAcquirerListItem : ListViewItem
{
public StreamAcquirerListItem(IStreamAcquirer wrapped)
{
Wrapped = wrapped;
WrappedAttribute = (StreamAcquirerAttribute)Wrapped.GetType().GetCustomAttribute(typeof(StreamAcquirerAttribute));
Text = GetName();
SubItems.Add(GetDescription());
}
public IStreamAcquirer Wrapped { get; }
public StreamAcquirerAttribute WrappedAttribute { get; }
public bool Hidden
{
get
{
if (WrappedAttribute == null)
return true;
return WrappedAttribute.Hidden;
}
}
public string GetName()
{
if (WrappedAttribute == null)
return Wrapped.GetType().Name;
return WrappedAttribute.Name;
}
public string GetDescription()
{
if (WrappedAttribute == null)
return "???";
return WrappedAttribute.Description;
}
}
}

View File

@ -0,0 +1,144 @@
namespace skyscraper5.UI.StreamAcquisition
{
partial class StreamAcquirerPickingForm
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
tableLayoutPanel1 = new TableLayoutPanel();
listView1 = new ListView();
columnHeader1 = new ColumnHeader();
columnHeader2 = new ColumnHeader();
tableLayoutPanel2 = new TableLayoutPanel();
button1 = new Button();
button2 = new Button();
tableLayoutPanel1.SuspendLayout();
tableLayoutPanel2.SuspendLayout();
SuspendLayout();
//
// tableLayoutPanel1
//
tableLayoutPanel1.ColumnCount = 1;
tableLayoutPanel1.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100F));
tableLayoutPanel1.Controls.Add(listView1, 0, 0);
tableLayoutPanel1.Controls.Add(tableLayoutPanel2, 0, 1);
tableLayoutPanel1.Dock = DockStyle.Fill;
tableLayoutPanel1.Location = new Point(0, 0);
tableLayoutPanel1.Name = "tableLayoutPanel1";
tableLayoutPanel1.RowCount = 2;
tableLayoutPanel1.RowStyles.Add(new RowStyle(SizeType.Percent, 90F));
tableLayoutPanel1.RowStyles.Add(new RowStyle(SizeType.Percent, 10F));
tableLayoutPanel1.Size = new Size(514, 392);
tableLayoutPanel1.TabIndex = 0;
//
// listView1
//
listView1.Columns.AddRange(new ColumnHeader[] { columnHeader1, columnHeader2 });
listView1.Dock = DockStyle.Fill;
listView1.FullRowSelect = true;
listView1.Location = new Point(3, 3);
listView1.Name = "listView1";
listView1.Size = new Size(508, 346);
listView1.TabIndex = 0;
listView1.UseCompatibleStateImageBehavior = false;
listView1.View = View.Details;
listView1.SelectedIndexChanged += listView1_SelectedIndexChanged;
listView1.DoubleClick += listView1_DoubleClick;
//
// columnHeader1
//
columnHeader1.Text = "Name";
columnHeader1.Width = 100;
//
// columnHeader2
//
columnHeader2.Text = "Description";
columnHeader2.Width = 400;
//
// tableLayoutPanel2
//
tableLayoutPanel2.ColumnCount = 3;
tableLayoutPanel2.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 65.7894745F));
tableLayoutPanel2.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 17.1052647F));
tableLayoutPanel2.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 17.1052647F));
tableLayoutPanel2.Controls.Add(button1, 1, 0);
tableLayoutPanel2.Controls.Add(button2, 2, 0);
tableLayoutPanel2.Dock = DockStyle.Fill;
tableLayoutPanel2.Location = new Point(3, 355);
tableLayoutPanel2.Name = "tableLayoutPanel2";
tableLayoutPanel2.RowCount = 1;
tableLayoutPanel2.RowStyles.Add(new RowStyle(SizeType.Percent, 100F));
tableLayoutPanel2.Size = new Size(508, 34);
tableLayoutPanel2.TabIndex = 1;
//
// button1
//
button1.Dock = DockStyle.Fill;
button1.Enabled = false;
button1.Location = new Point(337, 3);
button1.Name = "button1";
button1.Size = new Size(80, 28);
button1.TabIndex = 0;
button1.Text = "OK";
button1.UseVisualStyleBackColor = true;
button1.Click += button1_Click;
//
// button2
//
button2.Dock = DockStyle.Fill;
button2.Location = new Point(423, 3);
button2.Name = "button2";
button2.Size = new Size(82, 28);
button2.TabIndex = 1;
button2.Text = "Cancel";
button2.UseVisualStyleBackColor = true;
button2.Click += button2_Click;
//
// StreamAcquirerPickingForm
//
AutoScaleDimensions = new SizeF(7F, 15F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(514, 392);
Controls.Add(tableLayoutPanel1);
FormBorderStyle = FormBorderStyle.FixedToolWindow;
Name = "StreamAcquirerPickingForm";
Text = "StreamAcquirerPickingForm";
tableLayoutPanel1.ResumeLayout(false);
tableLayoutPanel2.ResumeLayout(false);
ResumeLayout(false);
}
#endregion
private TableLayoutPanel tableLayoutPanel1;
private ListView listView1;
private ColumnHeader columnHeader1;
private ColumnHeader columnHeader2;
private TableLayoutPanel tableLayoutPanel2;
private Button button1;
private Button button2;
}
}

View File

@ -0,0 +1,69 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace skyscraper5.UI.StreamAcquisition
{
partial class StreamAcquirerPickingForm : Form
{
public StreamAcquirerPickingForm(List<StreamAcquirerListItem> streamAcquirers, string[] args)
{
InitializeComponent();
Args = args;
foreach (StreamAcquirerListItem streamAcquirer in streamAcquirers)
{
if (streamAcquirer.Hidden)
continue;
listView1.Items.Add(streamAcquirer);
}
}
public string[] Args { get; }
public StreamSource StreamSource { get; private set; }
private void button1_Click(object sender, EventArgs e)
{
ListViewItem lvi = listView1.SelectedItems[0];
StreamAcquirerListItem sali = (StreamAcquirerListItem)lvi;
object o = sali.Wrapped.BaseAskUserForHandle(this);
if (o != null)
{
StreamSource resultStream = sali.Wrapped.BaseGetStream(o);
if (resultStream != null)
{
DialogResult = DialogResult.OK;
StreamSource = resultStream;
Close();
}
}
}
private void listView1_SelectedIndexChanged(object sender, EventArgs e)
{
button1.Enabled = listView1.SelectedItems.Count > 0;
}
private void button2_Click(object sender, EventArgs e)
{
DialogResult = DialogResult.Cancel;
Close();
}
private void listView1_DoubleClick(object sender, EventArgs e)
{
if (listView1.SelectedItems.Count != 1)
return;
button1_Click(sender, e);
}
}
}

View File

@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

Some files were not shown because too many files have changed in this diff Show More