private void ReleaseDatabase(ManagedLocalDb managedLocalDb) { _reservedDatabases.Remove(managedLocalDb.Name); Task.Run(() => { EmptyOutDatase(managedLocalDb.Name); _managerConnection.ExecuteNonQuery( $"update {ManagerTableSchema.TableName} set {ManagerTableSchema.IsFree} = 1, {ManagerTableSchema.IsClean} = 1 where {ManagerTableSchema.DatabaseName} = '{managedLocalDb.Name}'"); } ); }
private bool TryReserveDatabase(out ManagedLocalDb databaseName) { databaseName = null; var freeDbs = GetDatabases().Where(db => db.IsFree).ToList(); if (freeDbs.Any()) { databaseName = freeDbs.First(); ReserveDatabase(databaseName.Name); return(true); } return(false); }
public string CreateOrGetLocalDb(string requestedDbName) { Contract.Assert(!_disposed, "Attempt to use disposed object"); ManagedLocalDb dbName; if (!_reservedDatabases.TryGetValue(requestedDbName, out dbName)) { using (var transaction = new TransactionScope()) { if (TryReserveDatabase(out dbName)) { _reservedDatabases.Add(requestedDbName, dbName); } else { // ReSharper disable once AssignNullToNotNullAttribute var newDBName = $"TemporaryLocalDbManager_{Guid.NewGuid()}.mdf"; dbName = new ManagedLocalDb(newDBName, isEmpty: true, isFree: false, reservationDate: DateTime.UtcNow, connectionString: ConnectionStringForDbNamed(newDBName)); using (new TransactionScope(TransactionScopeOption.Suppress)) { _masterConnection.ExecuteNonQuery($"CREATE DATABASE [{dbName.Name}]"); } InsertDatabase(dbName.Name); _reservedDatabases.Add(requestedDbName, dbName); } transaction.Complete(); } } if (!dbName.IsEmpty) { EmptyOutDatase(dbName.Name); } return(_reservedDatabases[requestedDbName].ConnectionString); }
public string CreateOrGetLocalDb(string requestedDbName) { Contract.Assert(!_disposed, "Attempt to use disposed object"); ManagedLocalDb dbName; if(!_reservedDatabases.TryGetValue(requestedDbName, out dbName)) { using(var transaction = new TransactionScope()) { if(TryReserveDatabase(out dbName)) { _reservedDatabases.Add(requestedDbName,dbName); } else { // ReSharper disable once AssignNullToNotNullAttribute var newDBName = $"TemporaryLocalDbManager_{Guid.NewGuid()}.mdf"; dbName = new ManagedLocalDb(newDBName, isEmpty:true, isFree:false, reservationDate:DateTime.UtcNow, connectionString: ConnectionStringForDbNamed(newDBName)); using(new TransactionScope(TransactionScopeOption.Suppress)) { _masterConnection.ExecuteNonQuery($"CREATE DATABASE [{dbName.Name}]"); } InsertDatabase(dbName.Name); _reservedDatabases.Add(requestedDbName,dbName); } transaction.Complete(); } } if(!dbName.IsEmpty) { EmptyOutDatase(dbName.Name); } return _reservedDatabases[requestedDbName].ConnectionString; }
private bool TryReserveDatabase(out ManagedLocalDb databaseName) { databaseName = null; var freeDbs = GetDatabases().Where(db => db.IsFree).ToList(); if(freeDbs.Any()) { databaseName = freeDbs.First(); ReserveDatabase(databaseName.Name); return true; } return false; }