Implement DatabaseConnectionInfo

Co-authored-by: Qstick <qstick@gmail.com>
pull/3118/merge
Bogdan 6 months ago
parent 89f3d8167b
commit 5ed13b942b

@ -9,9 +9,9 @@ namespace NzbDrone.Core.Datastore
{ {
public interface IConnectionStringFactory public interface IConnectionStringFactory
{ {
string MainDbConnectionString { get; } DatabaseConnectionInfo MainDbConnection { get; }
string LogDbConnectionString { get; } DatabaseConnectionInfo LogDbConnection { get; }
string CacheDbConnectionString { get; } DatabaseConnectionInfo CacheDbConnection { get; }
string GetDatabasePath(string connectionString); string GetDatabasePath(string connectionString);
} }
@ -23,19 +23,19 @@ namespace NzbDrone.Core.Datastore
{ {
_configFileProvider = configFileProvider; _configFileProvider = configFileProvider;
MainDbConnectionString = _configFileProvider.PostgresHost.IsNotNullOrWhiteSpace() ? GetPostgresConnectionString(_configFileProvider.PostgresMainDb) : MainDbConnection = _configFileProvider.PostgresHost.IsNotNullOrWhiteSpace() ? GetPostgresConnectionString(_configFileProvider.PostgresMainDb) :
GetConnectionString(appFolderInfo.GetDatabase()); GetConnectionString(appFolderInfo.GetDatabase());
LogDbConnectionString = _configFileProvider.PostgresHost.IsNotNullOrWhiteSpace() ? GetPostgresConnectionString(_configFileProvider.PostgresLogDb) : LogDbConnection = _configFileProvider.PostgresHost.IsNotNullOrWhiteSpace() ? GetPostgresConnectionString(_configFileProvider.PostgresLogDb) :
GetConnectionString(appFolderInfo.GetLogDatabase()); GetConnectionString(appFolderInfo.GetLogDatabase());
CacheDbConnectionString = _configFileProvider.PostgresHost.IsNotNullOrWhiteSpace() ? GetPostgresConnectionString(_configFileProvider.PostgresCacheDb) : CacheDbConnection = _configFileProvider.PostgresHost.IsNotNullOrWhiteSpace() ? GetPostgresConnectionString(_configFileProvider.PostgresCacheDb) :
GetConnectionString(appFolderInfo.GetCacheDatabase()); GetConnectionString(appFolderInfo.GetCacheDatabase());
} }
public string MainDbConnectionString { get; private set; } public DatabaseConnectionInfo MainDbConnection { get; private set; }
public string LogDbConnectionString { get; private set; } public DatabaseConnectionInfo LogDbConnection { get; private set; }
public string CacheDbConnectionString { get; private set; } public DatabaseConnectionInfo CacheDbConnection { get; private set; }
public string GetDatabasePath(string connectionString) public string GetDatabasePath(string connectionString)
{ {
@ -44,7 +44,7 @@ namespace NzbDrone.Core.Datastore
return connectionBuilder.DataSource; return connectionBuilder.DataSource;
} }
private static string GetConnectionString(string dbPath) private static DatabaseConnectionInfo GetConnectionString(string dbPath)
{ {
var connectionBuilder = new SQLiteConnectionStringBuilder var connectionBuilder = new SQLiteConnectionStringBuilder
{ {
@ -62,21 +62,22 @@ namespace NzbDrone.Core.Datastore
connectionBuilder.Add("Full FSync", true); connectionBuilder.Add("Full FSync", true);
} }
return connectionBuilder.ConnectionString; return new DatabaseConnectionInfo(DatabaseType.SQLite, connectionBuilder.ConnectionString);
} }
private string GetPostgresConnectionString(string dbName) private DatabaseConnectionInfo GetPostgresConnectionString(string dbName)
{ {
var connectionBuilder = new NpgsqlConnectionStringBuilder(); var connectionBuilder = new NpgsqlConnectionStringBuilder
{
connectionBuilder.Database = dbName; Database = dbName,
connectionBuilder.Host = _configFileProvider.PostgresHost; Host = _configFileProvider.PostgresHost,
connectionBuilder.Username = _configFileProvider.PostgresUser; Username = _configFileProvider.PostgresUser,
connectionBuilder.Password = _configFileProvider.PostgresPassword; Password = _configFileProvider.PostgresPassword,
connectionBuilder.Port = _configFileProvider.PostgresPort; Port = _configFileProvider.PostgresPort,
connectionBuilder.Enlist = false; Enlist = false
};
return connectionBuilder.ConnectionString; return new DatabaseConnectionInfo(DatabaseType.PostgreSQL, connectionBuilder.ConnectionString);
} }
} }
} }

@ -0,0 +1,14 @@
namespace NzbDrone.Core.Datastore
{
public class DatabaseConnectionInfo
{
public DatabaseConnectionInfo(DatabaseType databaseType, string connectionString)
{
DatabaseType = databaseType;
ConnectionString = connectionString;
}
public DatabaseType DatabaseType { get; internal set; }
public string ConnectionString { get; internal set; }
}
}

@ -2,6 +2,7 @@ using System;
using System.Data.Common; using System.Data.Common;
using System.Data.SQLite; using System.Data.SQLite;
using System.Net.Sockets; using System.Net.Sockets;
using System.Threading;
using NLog; using NLog;
using Npgsql; using Npgsql;
using NzbDrone.Common.Disk; using NzbDrone.Common.Disk;
@ -59,30 +60,30 @@ namespace NzbDrone.Core.Datastore
public IDatabase Create(MigrationContext migrationContext) public IDatabase Create(MigrationContext migrationContext)
{ {
string connectionString; DatabaseConnectionInfo connectionInfo;
switch (migrationContext.MigrationType) switch (migrationContext.MigrationType)
{ {
case MigrationType.Main: case MigrationType.Main:
{ {
connectionString = _connectionStringFactory.MainDbConnectionString; connectionInfo = _connectionStringFactory.MainDbConnection;
CreateMain(connectionString, migrationContext); CreateMain(connectionInfo.ConnectionString, migrationContext);
break; break;
} }
case MigrationType.Log: case MigrationType.Log:
{ {
connectionString = _connectionStringFactory.LogDbConnectionString; connectionInfo = _connectionStringFactory.LogDbConnection;
CreateLog(connectionString, migrationContext); CreateLog(connectionInfo.ConnectionString, migrationContext);
break; break;
} }
case MigrationType.Cache: case MigrationType.Cache:
{ {
connectionString = _connectionStringFactory.CacheDbConnectionString; connectionInfo = _connectionStringFactory.CacheDbConnection;
CreateLog(connectionString, migrationContext); CreateLog(connectionInfo.ConnectionString, migrationContext);
break; break;
} }
@ -97,14 +98,14 @@ namespace NzbDrone.Core.Datastore
{ {
DbConnection conn; DbConnection conn;
if (connectionString.Contains(".db")) if (connectionInfo.DatabaseType == DatabaseType.SQLite)
{ {
conn = SQLiteFactory.Instance.CreateConnection(); conn = SQLiteFactory.Instance.CreateConnection();
conn.ConnectionString = connectionString; conn.ConnectionString = connectionInfo.ConnectionString;
} }
else else
{ {
conn = new NpgsqlConnection(connectionString); conn = new NpgsqlConnection(connectionInfo.ConnectionString);
} }
conn.Open(); conn.Open();
@ -142,15 +143,17 @@ namespace NzbDrone.Core.Datastore
{ {
Logger.Error(e, "Failure to connect to Postgres DB, {0} retries remaining", retryCount); Logger.Error(e, "Failure to connect to Postgres DB, {0} retries remaining", retryCount);
Thread.Sleep(5000);
try try
{ {
_migrationController.Migrate(connectionString, migrationContext); _migrationController.Migrate(connectionString, migrationContext);
return;
} }
catch (Exception ex) catch (Exception ex)
{ {
if (--retryCount > 0) if (--retryCount > 0)
{ {
System.Threading.Thread.Sleep(5000);
continue; continue;
} }

@ -85,16 +85,15 @@ namespace NzbDrone.Core.Instrumentation
log.Level = logEvent.Level.Name; log.Level = logEvent.Level.Name;
var connectionString = _connectionStringFactory.LogDbConnectionString; var connectionInfo = _connectionStringFactory.LogDbConnection;
//TODO: Probably need more robust way to differentiate what's being used if (connectionInfo.DatabaseType == DatabaseType.SQLite)
if (connectionString.Contains(".db"))
{ {
WriteSqliteLog(log, connectionString); WriteSqliteLog(log, connectionInfo.ConnectionString);
} }
else else
{ {
WritePostgresLog(log, connectionString); WritePostgresLog(log, connectionInfo.ConnectionString);
} }
} }
catch (SQLiteException ex) catch (SQLiteException ex)

Loading…
Cancel
Save