using System;
using System.Data;
using System.Diagnostics;
using System.Diagnostics.CodeAnalysis;
using JetBrains.Annotations;
using SDA.DataProvider.Core;
namespace SDA.DataProvider
{
///
/// Adatbázis-kapcsolat
///
public class SDAConnection : IDisposable /*, IDbConnection */
{
[NotNull]
internal SDAConnectionWrapper Connection;
///
/// Előállít egy új adatbázis-kapcsolat példányt.
///
public SDAConnection()
{
if (SDAFactory.Instance == null)
{
throw new InvalidOperationException("SDAFactory.Instance");
}
Connection = SDAFactory.Instance.CreateConnection();
}
///
/// Előállít egy új adatbázis-kapcsolat példányt.
///
/// Az adatbázis-kapcsolat paramétereit leíró karakterlánc
public SDAConnection([CanBeNull] string connectionString)
{
if (SDAFactory.Instance == null)
{
throw new InvalidOperationException("SDAFactory.Instance");
}
Connection = SDAFactory.Instance.CreateConnection();
Connection.ConnectionString = connectionString;
}
///
/// Előállít egy új adatbázis-kapcsolat példányt.
///
/// Az adatbázis típusa.
/// Az adatbázis-kapcsolat paramétereit leíró karakterlánc.
public SDAConnection(DatabaseType databaseType, [CanBeNull] string connectionString) : this(databaseType, connectionString, null)
{
}
///
/// Előállít egy új adatbázis-kapcsolat példányt.
///
/// Az adatbázis típusa.
/// Az adatbázis-kapcsolat paramétereit leíró karakterlánc.
/// Command timeout-ja.
public SDAConnection(DatabaseType databaseType, [CanBeNull] string connectionString, int? commandTimeout)
{
var factory = SDAFactory.GetByDatabaseType(databaseType, commandTimeout);
Debug.Assert(factory != null, "factory != null");
Connection = factory.CreateConnection();
Debug.Assert(Connection != null, "Connection != null");
Connection.ConnectionString = connectionString;
}
///
/// Megnyitja az adatbázis-kapcsolatot.
///
public void Open()
{
OpenWithRetry(0);
}
///
/// Lezárja az adatbáziskapcsolatot.
///
public void Close()
{
Connection.Close();
}
///
/// Létrehoz egy - az adatbázis-kapcsolathoz tartozó - adatbázis-parancs objektumot
///
/// Egy adatbázis-parancs objektum
[NotNull]
public SDACommand CreateCommand()
{
return new SDACommand(Connection.CreateCommand());
}
///
/// Létrehoz egy - az adatbázis-kapcsolathoz tartozó - adatbázis-parancs objektumot
///
/// A parancs objektum szövege
/// Egy adatbázis-parancs objektum
[NotNull]
[SuppressMessage("ReSharper", "UseObjectOrCollectionInitializer")]
public SDACommand CreateCommand([CanBeNull] string commandText)
{
SDACommandWrapper command = null;
SDACommand result = null;
try
{
command = Connection.CreateCommand();
result = new SDACommand(command);
result.CommandText = commandText;
return result;
}
catch
{
command?.Dispose();
result?.Dispose();
throw;
}
}
///
/// Adatbázis ügyletet kezdeményez.
///
/// Egy adatbázis-ügylet objektum
[NotNull]
public SDATransaction BeginTransaction()
{
return new SDATransaction(Connection.BeginTransaction());
}
///
/// Adatbázis ügyletet kezdeményez.
///
/// Elválasztás szintje
/// Egy adatbázis-ügylet objektum
[NotNull]
public SDATransaction BeginTransaction(IsolationLevel isolationLevel)
{
return new SDATransaction(Connection.BeginTransaction(isolationLevel));
}
///
/// Létrehoz egy -t nagyon gyors
/// adatbeszúrásokhoz.
///
///
/// Opcionális objektum, ha nincs megadva,
/// akkor a bulk művelet _nem_ fut tranzakcióban, azaz ha megáll egy
/// hiba miatt, akkor a már beszúrt sorok nem görgetődnek vissza!
/// Viszont ha a kapcsolaton már van aktív tranzakció, akkor azt
/// kötelező megadni a bulk insertnek is.
///
///
/// Egy új .
///
[NotNull]
public SDABulkAdapter CreateBulkAdapter(SDATransaction transaction = null)
{
return Connection.CreateBulkAdapter(transaction);
}
///
/// Üresre törli az adatbázis-szerver connection pool-ját.
///
///
/// True érték esetén az összes pool-t alaphelyzetbe hozza,
/// False érték esetén csak az adott kapcsolathoz tartozót.
///
public void ResetConnectionPool(bool all = false)
{
Connection.ResetConnectionPool(all);
}
///
/// Az adatbázis-kapcsolat paramétereit leíró karakterlánc.
///
[CanBeNull]
public string ConnectionString
{
get
{
return Connection.ConnectionString;
}
set
{
Connection.ConnectionString = value;
}
}
///
/// Az adatbázis-kapcsolat állapota.
///
public ConnectionState State => Connection.State;
bool _disposed;
///
/// Explicit destruktor.
///
/// Programozott felszabadítás?
protected virtual void Dispose(bool disposing)
{
if (_disposed)
{
return;
}
if (disposing)
{
Connection.Dispose();
SDAConnectionDiagnostics.DecrementActiveConnections();
}
_disposed = true;
}
///
/// Eldobja az objektumot.
///
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
//#region IDbConnection Members
//public void ChangeDatabase(string databaseName)
//{
//}
//IDbTransaction IDbConnection.BeginTransaction(System.Data.IsolationLevel il)
//{
// return BeginTransaction(il);
//}
//IDbTransaction IDbConnection.BeginTransaction()
//{
// return BeginTransaction();
//}
//IDbCommand IDbConnection.CreateCommand()
//{
// throw new NotImplementedException();
// return CreateCommand();
//}
//public string Database
//{
// get { return m_Connection.Database; }
//}
//public int ConnectionTimeout
//{
// get { return m_Connection.ConnectionTimeout; }
//}
//#endregion
#region Újrapróbálkozás
void OpenWithRetry(int tries)
{
try
{
Connection.Open();
SDAConnectionDiagnostics.IncrementActiveConnections();
}
catch (SDADataProviderException exception)
{
if ((exception.MustRetry) && (tries < Configuration.MaxTries))
{
OpenWithRetry(tries + 1);
}
else
{
throw;
}
}
}
#endregion
}
}