using System; using System.Collections.Generic; using System.Data; using Npgsql; using NpgsqlTypes; using skyscraper5.Dvb.Psi.Model; using skyscraper5.Dvb.TvAnytime; using skyscraper5.Skyscraper.Headless; using skyscraper8.DvbNip; using skyscraper8.Skyscraper.Scraper.Storage; namespace skyscraper5.Data.PostgreSql { public partial class PostgresqlDataStore : DataStorage { public PostgresqlDataStore(NpgsqlConnectionStringBuilder stringBuilder) { connectionStringBuilder = stringBuilder; } internal NpgsqlConnectionStringBuilder connectionStringBuilder; 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(); } } private PostgresqlToken pluginToken; public object[] GetPluginConnector() { if (pluginToken == null) { pluginToken = new PostgresqlToken(this); } return new object[] { pluginToken }; } public void InsertUiBlindscanSettingHistory(int settingsWindowBlScanTunerSelection, int multitunerMode, int settingsWindowSetFilterTunerSelection, int settingsWindowDiseqc, bool settingsWindowCollectIqGraphs, bool settingsWindowCollectRfSpectrum, bool settingsWindowCaptureFile, int settingsWindowSatellite, int settingsWindowLnb, int dish, bool settingsWindowScanHorizontalLow, bool settingsWindowScanHorizontalHigh, bool settingsWindowScanVerticalLow, bool settingsWindowScanVerticalHigh) { using (NpgsqlConnection connection = new NpgsqlConnection(connectionStringBuilder.ToString())) { connection.Open(); NpgsqlCommand command = connection.CreateCommand(); command.CommandText = "INSERT INTO ui_blindscan_setting_history VALUES (DEFAULT,@bstselection,@ustfsfilter,@sftselection,@diseqc,@cigraphs,@crspectrum,@cfilters,@satellite,@lnb,@dish,@hl,@hh,@vl,@vh);"; command.Parameters.AddWithValue("@bstselection", NpgsqlDbType.Integer, settingsWindowBlScanTunerSelection); command.Parameters.AddWithValue("@ustfsfilter", NpgsqlDbType.Integer, multitunerMode); command.Parameters.AddWithValue("@sftselection", NpgsqlDbType.Integer, settingsWindowSetFilterTunerSelection); command.Parameters.AddWithValue("@diseqc", NpgsqlDbType.Integer, settingsWindowDiseqc); command.Parameters.AddWithValue("@cigraphs", NpgsqlDbType.Boolean, settingsWindowCollectIqGraphs); command.Parameters.AddWithValue("@crspectrum", NpgsqlDbType.Boolean, settingsWindowCollectRfSpectrum); command.Parameters.AddWithValue("@cfilters", NpgsqlDbType.Boolean, settingsWindowCaptureFile); command.Parameters.AddWithValue("@satellite", NpgsqlDbType.Integer, settingsWindowSatellite); command.Parameters.AddWithValue("@lnb", NpgsqlDbType.Integer, settingsWindowLnb); command.Parameters.AddWithValue("@dish", NpgsqlDbType.Integer, dish); command.Parameters.AddWithValue("@hl", NpgsqlDbType.Boolean, settingsWindowScanHorizontalLow); command.Parameters.AddWithValue("@hh", NpgsqlDbType.Boolean, settingsWindowScanHorizontalHigh); command.Parameters.AddWithValue("@vl", NpgsqlDbType.Boolean, settingsWindowScanVerticalLow); command.Parameters.AddWithValue("@vh", NpgsqlDbType.Boolean, settingsWindowScanVerticalHigh); command.ExecuteNonQuery(); connection.Close(); } } public object[] GetLastUiBlindscanSettings() { using (NpgsqlConnection connection = new NpgsqlConnection(connectionStringBuilder.ToString())) { connection.Open(); NpgsqlCommand command = connection.CreateCommand(); command.CommandText = "SELECT * FROM ui_blindscan_setting_history WHERE dateadded = (SELECT MAX(dateadded) FROM ui_blindscan_setting_history)"; NpgsqlDataReader dataReader = command.ExecuteReader(); object[] result = null; if (dataReader.Read()) { int fields = dataReader.FieldCount; result = new object[fields]; for (int i = 0; i < fields; i++) { result[i] = dataReader.GetValue(i); } } dataReader.Close(); command.Dispose(); connection.Close(); return result; } } } }