Import
This commit is contained in:
commit
ef86554f9a
108
.gitignore
vendored
Normal file
108
.gitignore
vendored
Normal 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
|
||||
244
BlobStorages/skyscraper5.Data.Minio/MinioObjectStorage.cs
Normal file
244
BlobStorages/skyscraper5.Data.Minio/MinioObjectStorage.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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>
|
||||
279
DataTableStorages/skyscraper5.Data.MySql/Ait.cs
Normal file
279
DataTableStorages/skyscraper5.Data.MySql/Ait.cs
Normal 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);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
337
DataTableStorages/skyscraper5.Data.MySql/Bat.cs
Normal file
337
DataTableStorages/skyscraper5.Data.MySql/Bat.cs
Normal 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);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
83
DataTableStorages/skyscraper5.Data.MySql/Cat.cs
Normal file
83
DataTableStorages/skyscraper5.Data.MySql/Cat.cs
Normal 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);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
40
DataTableStorages/skyscraper5.Data.MySql/Docsis.cs
Normal file
40
DataTableStorages/skyscraper5.Data.MySql/Docsis.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
40
DataTableStorages/skyscraper5.Data.MySql/DsmCc.cs
Normal file
40
DataTableStorages/skyscraper5.Data.MySql/DsmCc.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
57
DataTableStorages/skyscraper5.Data.MySql/DsmCcEvent.cs
Normal file
57
DataTableStorages/skyscraper5.Data.MySql/DsmCcEvent.cs
Normal 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();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
434
DataTableStorages/skyscraper5.Data.MySql/Eit.cs
Normal file
434
DataTableStorages/skyscraper5.Data.MySql/Eit.cs
Normal 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;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
24
DataTableStorages/skyscraper5.Data.MySql/Int.cs
Normal file
24
DataTableStorages/skyscraper5.Data.MySql/Int.cs
Normal 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();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
232
DataTableStorages/skyscraper5.Data.MySql/Linkages.cs
Normal file
232
DataTableStorages/skyscraper5.Data.MySql/Linkages.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
518
DataTableStorages/skyscraper5.Data.MySql/MySqlDataStorage.cs
Normal file
518
DataTableStorages/skyscraper5.Data.MySql/MySqlDataStorage.cs
Normal 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();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
999
DataTableStorages/skyscraper5.Data.MySql/Nit.cs
Normal file
999
DataTableStorages/skyscraper5.Data.MySql/Nit.cs
Normal 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();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
58
DataTableStorages/skyscraper5.Data.MySql/Pat.cs
Normal file
58
DataTableStorages/skyscraper5.Data.MySql/Pat.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
557
DataTableStorages/skyscraper5.Data.MySql/Pmt.cs
Normal file
557
DataTableStorages/skyscraper5.Data.MySql/Pmt.cs
Normal 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;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
365
DataTableStorages/skyscraper5.Data.MySql/Scte35.cs
Normal file
365
DataTableStorages/skyscraper5.Data.MySql/Scte35.cs
Normal 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();
|
||||
}
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
362
DataTableStorages/skyscraper5.Data.MySql/Sdt.cs
Normal file
362
DataTableStorages/skyscraper5.Data.MySql/Sdt.cs
Normal 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);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
122
DataTableStorages/skyscraper5.Data.MySql/Skyscraper.cs
Normal file
122
DataTableStorages/skyscraper5.Data.MySql/Skyscraper.cs
Normal 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
693
DataTableStorages/skyscraper5.Data.MySql/Speedhacks.cs
Normal file
693
DataTableStorages/skyscraper5.Data.MySql/Speedhacks.cs
Normal 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
124
DataTableStorages/skyscraper5.Data.MySql/Tdt.cs
Normal file
124
DataTableStorages/skyscraper5.Data.MySql/Tdt.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
60
DataTableStorages/skyscraper5.Data.MySql/Teletext.cs
Normal file
60
DataTableStorages/skyscraper5.Data.MySql/Teletext.cs
Normal 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();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
157
DataTableStorages/skyscraper5.Data.MySql/Tot.cs
Normal file
157
DataTableStorages/skyscraper5.Data.MySql/Tot.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
102
DataTableStorages/skyscraper5.Data.MySql/Tsdt.cs
Normal file
102
DataTableStorages/skyscraper5.Data.MySql/Tsdt.cs
Normal 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;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
341
DataTableStorages/skyscraper5.Data.MySql/Unt.cs
Normal file
341
DataTableStorages/skyscraper5.Data.MySql/Unt.cs
Normal 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();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
51
DataTableStorages/skyscraper5.Data.MySql/Utilities.cs
Normal file
51
DataTableStorages/skyscraper5.Data.MySql/Utilities.cs
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
3395
DataTableStorages/skyscraper5.Data.MySql/setup.sql
Normal file
3395
DataTableStorages/skyscraper5.Data.MySql/setup.sql
Normal file
File diff suppressed because it is too large
Load Diff
@ -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>
|
||||
268
DataTableStorages/skyscraper5.Data.PostgreSql/Ait.cs
Normal file
268
DataTableStorages/skyscraper5.Data.PostgreSql/Ait.cs
Normal 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();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
454
DataTableStorages/skyscraper5.Data.PostgreSql/Bat.cs
Normal file
454
DataTableStorages/skyscraper5.Data.PostgreSql/Bat.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
173
DataTableStorages/skyscraper5.Data.PostgreSql/Beams.cs
Normal file
173
DataTableStorages/skyscraper5.Data.PostgreSql/Beams.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
572
DataTableStorages/skyscraper5.Data.PostgreSql/BlindscanJobs.cs
Normal file
572
DataTableStorages/skyscraper5.Data.PostgreSql/BlindscanJobs.cs
Normal 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
84
DataTableStorages/skyscraper5.Data.PostgreSql/Cat.cs
Normal file
84
DataTableStorages/skyscraper5.Data.PostgreSql/Cat.cs
Normal 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
286
DataTableStorages/skyscraper5.Data.PostgreSql/Dns.cs
Normal file
286
DataTableStorages/skyscraper5.Data.PostgreSql/Dns.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
283
DataTableStorages/skyscraper5.Data.PostgreSql/Docsis.cs
Normal file
283
DataTableStorages/skyscraper5.Data.PostgreSql/Docsis.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
479
DataTableStorages/skyscraper5.Data.PostgreSql/Eit.cs
Normal file
479
DataTableStorages/skyscraper5.Data.PostgreSql/Eit.cs
Normal 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();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
71
DataTableStorages/skyscraper5.Data.PostgreSql/ImportFiles.cs
Normal file
71
DataTableStorages/skyscraper5.Data.PostgreSql/ImportFiles.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
82
DataTableStorages/skyscraper5.Data.PostgreSql/Int.cs
Normal file
82
DataTableStorages/skyscraper5.Data.PostgreSql/Int.cs
Normal 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
724
DataTableStorages/skyscraper5.Data.PostgreSql/Nit.cs
Normal file
724
DataTableStorages/skyscraper5.Data.PostgreSql/Nit.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
77
DataTableStorages/skyscraper5.Data.PostgreSql/Pat.cs
Normal file
77
DataTableStorages/skyscraper5.Data.PostgreSql/Pat.cs
Normal 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
587
DataTableStorages/skyscraper5.Data.PostgreSql/Pmt.cs
Normal file
587
DataTableStorages/skyscraper5.Data.PostgreSql/Pmt.cs
Normal 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();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
@ -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 };
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
73
DataTableStorages/skyscraper5.Data.PostgreSql/Rst.cs
Normal file
73
DataTableStorages/skyscraper5.Data.PostgreSql/Rst.cs
Normal 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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)
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
||||
355
DataTableStorages/skyscraper5.Data.PostgreSql/Scte35.cs
Normal file
355
DataTableStorages/skyscraper5.Data.PostgreSql/Scte35.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
575
DataTableStorages/skyscraper5.Data.PostgreSql/Sdt.cs
Normal file
575
DataTableStorages/skyscraper5.Data.PostgreSql/Sdt.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
177
DataTableStorages/skyscraper5.Data.PostgreSql/T2MI.cs
Normal file
177
DataTableStorages/skyscraper5.Data.PostgreSql/T2MI.cs
Normal 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
98
DataTableStorages/skyscraper5.Data.PostgreSql/Tdt.cs
Normal file
98
DataTableStorages/skyscraper5.Data.PostgreSql/Tdt.cs
Normal 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;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
65
DataTableStorages/skyscraper5.Data.PostgreSql/Teletext.cs
Normal file
65
DataTableStorages/skyscraper5.Data.PostgreSql/Teletext.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
149
DataTableStorages/skyscraper5.Data.PostgreSql/Tot.cs
Normal file
149
DataTableStorages/skyscraper5.Data.PostgreSql/Tot.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
123
DataTableStorages/skyscraper5.Data.PostgreSql/Tsdt.cs
Normal file
123
DataTableStorages/skyscraper5.Data.PostgreSql/Tsdt.cs
Normal 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
297
DataTableStorages/skyscraper5.Data.PostgreSql/UiEntities.cs
Normal file
297
DataTableStorages/skyscraper5.Data.PostgreSql/UiEntities.cs
Normal 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();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
257
DataTableStorages/skyscraper5.Data.PostgreSql/Unt.cs
Normal file
257
DataTableStorages/skyscraper5.Data.PostgreSql/Unt.cs
Normal 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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
40
Documentation/16660841.cs
Normal 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
52
Documentation/68725547.r
Normal 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
140
Documentation/TODO.md
Normal 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?)
|
||||
6
Documentation/TSDuck-Samples/sophnet-test/pat.xml
Normal file
6
Documentation/TSDuck-Samples/sophnet-test/pat.xml
Normal 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>
|
||||
25
Documentation/TSDuck-Samples/sophnet-test/pmt.xml
Normal file
25
Documentation/TSDuck-Samples/sophnet-test/pmt.xml
Normal 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>
|
||||
8
Documentation/TSDuck-Samples/sophnet-test/sdt.xml
Normal file
8
Documentation/TSDuck-Samples/sophnet-test/sdt.xml
Normal 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>
|
||||
23
Documentation/TSDuck-Samples/sophnet-test/sophnet.bat
Normal file
23
Documentation/TSDuck-Samples/sophnet-test/sophnet.bat
Normal 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
|
||||
4
Documentation/TSDuck-Samples/sophnet-test/tdt.xml
Normal file
4
Documentation/TSDuck-Samples/sophnet-test/tdt.xml
Normal file
@ -0,0 +1,4 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<tsduck>
|
||||
<TDT UTC_time="1984-01-01 00:13:37"/>
|
||||
</tsduck>
|
||||
58
Documentation/code_sample_cable_receive.txt
Normal file
58
Documentation/code_sample_cable_receive.txt
Normal 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();
|
||||
58
Documentation/code_sample_sat_receive.txt
Normal file
58
Documentation/code_sample_sat_receive.txt
Normal 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();
|
||||
35
Documentation/sophia-net-signalling.md
Normal file
35
Documentation/sophia-net-signalling.md
Normal 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.
|
||||
@ -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; }
|
||||
}
|
||||
}
|
||||
@ -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>
|
||||
@ -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; }
|
||||
}
|
||||
}
|
||||
@ -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
7
GUIs/skyscraper5.UI/.gitignore
vendored
Normal 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
352
GUIs/skyscraper5.UI/Form1.Designer.cs
generated
Normal 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;
|
||||
}
|
||||
}
|
||||
392
GUIs/skyscraper5.UI/Form1.cs
Normal file
392
GUIs/skyscraper5.UI/Form1.cs
Normal 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;
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
363
GUIs/skyscraper5.UI/Form1.resx
Normal file
363
GUIs/skyscraper5.UI/Form1.resx
Normal 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>
|
||||
16
GUIs/skyscraper5.UI/INodeEngine.cs
Normal file
16
GUIs/skyscraper5.UI/INodeEngine.cs
Normal 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);
|
||||
}
|
||||
}
|
||||
19
GUIs/skyscraper5.UI/NuGet.Config
Normal file
19
GUIs/skyscraper5.UI/NuGet.Config
Normal 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>
|
||||
456
GUIs/skyscraper5.UI/Overrides/Form1UiJunction.cs
Normal file
456
GUIs/skyscraper5.UI/Overrides/Form1UiJunction.cs
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
51
GUIs/skyscraper5.UI/Overrides/PacketsPerSecondCounter.cs
Normal file
51
GUIs/skyscraper5.UI/Overrides/PacketsPerSecondCounter.cs
Normal 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; }
|
||||
}
|
||||
}
|
||||
32
GUIs/skyscraper5.UI/Overrides/PmtCounter.cs
Normal file
32
GUIs/skyscraper5.UI/Overrides/PmtCounter.cs
Normal 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; }
|
||||
}
|
||||
}
|
||||
34
GUIs/skyscraper5.UI/Overrides/ScrambleCounter.cs
Normal file
34
GUIs/skyscraper5.UI/Overrides/ScrambleCounter.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
23
GUIs/skyscraper5.UI/Overrides/TeiCounter.cs
Normal file
23
GUIs/skyscraper5.UI/Overrides/TeiCounter.cs
Normal 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; }
|
||||
}
|
||||
}
|
||||
74
GUIs/skyscraper5.UI/PidListViewItem.cs
Normal file
74
GUIs/skyscraper5.UI/PidListViewItem.cs
Normal 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;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
61
GUIs/skyscraper5.UI/PidListViewItemSorter.cs
Normal file
61
GUIs/skyscraper5.UI/PidListViewItemSorter.cs
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
56
GUIs/skyscraper5.UI/Program.cs
Normal file
56
GUIs/skyscraper5.UI/Program.cs
Normal 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));
|
||||
}
|
||||
}
|
||||
}
|
||||
8
GUIs/skyscraper5.UI/Properties/launchSettings.json
Normal file
8
GUIs/skyscraper5.UI/Properties/launchSettings.json
Normal file
@ -0,0 +1,8 @@
|
||||
{
|
||||
"profiles": {
|
||||
"skyscraper5.UI": {
|
||||
"commandName": "Project",
|
||||
"commandLineArgs": "\"Z:\\Freebies\\Datasets\\SkyscraperLibrarian\\DVB-C\\Bochum\\114.ts\""
|
||||
}
|
||||
}
|
||||
}
|
||||
14
GUIs/skyscraper5.UI/SkyscraperUiNode.cs
Normal file
14
GUIs/skyscraper5.UI/SkyscraperUiNode.cs
Normal 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; }
|
||||
}
|
||||
}
|
||||
46
GUIs/skyscraper5.UI/StreamAcquirers/FileStreamAcquirer.cs
Normal file
46
GUIs/skyscraper5.UI/StreamAcquirers/FileStreamAcquirer.cs
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
99
GUIs/skyscraper5.UI/StreamAcquirers/NullStreamAcquirer.cs
Normal file
99
GUIs/skyscraper5.UI/StreamAcquirers/NullStreamAcquirer.cs
Normal 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
41
GUIs/skyscraper5.UI/StreamAcquisition/IStreamAcquirer.cs
Normal file
41
GUIs/skyscraper5.UI/StreamAcquisition/IStreamAcquirer.cs
Normal 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); }
|
||||
}
|
||||
}
|
||||
@ -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; }
|
||||
}
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
144
GUIs/skyscraper5.UI/StreamAcquisition/StreamAcquirerPickingForm.Designer.cs
generated
Normal file
144
GUIs/skyscraper5.UI/StreamAcquisition/StreamAcquirerPickingForm.Designer.cs
generated
Normal 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;
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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
Loading…
x
Reference in New Issue
Block a user