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

78 lines
3.3 KiB
C#

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();
}
}
}
}