public override Biota GetBiota(uint id) { if (ObjectGuid.IsPlayer(id)) { var context = new ShardDbContext(); var biota = GetBiota(context, id); if (biota != null) { BiotaContexts.Add(biota, context); } return(biota); } using (var context = new ShardDbContext()) { context.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking; return(GetBiota(context, id)); } }
public override bool RemoveBiota(Biota biota, ReaderWriterLockSlim rwLock) { if (BiotaContexts.TryGetValue(biota, out var cachedContext)) { BiotaContexts.Remove(biota); rwLock.EnterReadLock(); try { cachedContext.Biota.Remove(biota); Exception firstException = null; retry: try { cachedContext.SaveChanges(); if (firstException != null) { log.Debug($"[DATABASE] RemoveBiota 0x{biota.Id:X8}:{biota.GetProperty(PropertyString.Name)} retry succeeded after initial exception of: {firstException.GetFullMessage()}"); } return(true); } catch (Exception ex) { if (firstException == null) { firstException = ex; goto retry; } // Character name might be in use or some other fault log.Error($"[DATABASE] RemoveBiota 0x{biota.Id:X8}:{biota.GetProperty(PropertyString.Name)} failed first attempt with exception: {firstException}"); log.Error($"[DATABASE] RemoveBiota 0x{biota.Id:X8}:{biota.GetProperty(PropertyString.Name)} failed second attempt with exception: {ex}"); return(false); } } finally { rwLock.ExitReadLock(); cachedContext.Dispose(); } } if (!ObjectGuid.IsPlayer(biota.Id)) { using (var context = new ShardDbContext()) { var existingBiota = context.Biota .AsNoTracking() .FirstOrDefault(r => r.Id == biota.Id); if (existingBiota == null) { return(true); } rwLock.EnterWriteLock(); try { context.Biota.Remove(biota); Exception firstException = null; retry: try { context.SaveChanges(); if (firstException != null) { log.Debug($"[DATABASE] RemoveBiota 0x{biota.Id:X8}:{biota.GetProperty(PropertyString.Name)} retry succeeded after initial exception of: {firstException.GetFullMessage()}"); } return(true); } catch (Exception ex) { if (firstException == null) { firstException = ex; goto retry; } // Character name might be in use or some other fault log.Error($"[DATABASE] RemoveBiota 0x{biota.Id:X8}:{biota.GetProperty(PropertyString.Name)} failed first attempt with exception: {firstException}"); log.Error($"[DATABASE] RemoveBiota 0x{biota.Id:X8}:{biota.GetProperty(PropertyString.Name)} failed second attempt with exception: {ex}"); return(false); } } finally { rwLock.ExitWriteLock(); } } } // If we got here, the biota didn't come from the database through this class. // Most likely, it doesn't exist in the database, so, no need to remove. return(true); }
public override bool SaveBiota(Biota biota, ReaderWriterLockSlim rwLock) { if (BiotaContexts.TryGetValue(biota, out var cachedContext)) { rwLock.EnterReadLock(); try { SetBiotaPopulatedCollections(biota); Exception firstException = null; retry: try { cachedContext.SaveChanges(); if (firstException != null) { log.Debug($"[DATABASE] SaveBiota 0x{biota.Id:X8}:{biota.GetProperty(PropertyString.Name)} retry succeeded after initial exception of: {firstException.GetFullMessage()}"); } return(true); } catch (Exception ex) { if (firstException == null) { firstException = ex; goto retry; } // Character name might be in use or some other fault log.Error($"[DATABASE] SaveBiota 0x{biota.Id:X8}:{biota.GetProperty(PropertyString.Name)} failed first attempt with exception: {firstException}"); log.Error($"[DATABASE] SaveBiota 0x{biota.Id:X8}:{biota.GetProperty(PropertyString.Name)} failed second attempt with exception: {ex}"); return(false); } } finally { rwLock.ExitReadLock(); } } if (ObjectGuid.IsPlayer(biota.Id)) { var context = new ShardDbContext(); BiotaContexts.Add(biota, context); rwLock.EnterReadLock(); try { SetBiotaPopulatedCollections(biota); context.Biota.Add(biota); Exception firstException = null; retry: try { context.SaveChanges(); if (firstException != null) { log.Debug($"[DATABASE] SaveBiota 0x{biota.Id:X8}:{biota.GetProperty(PropertyString.Name)} retry succeeded after initial exception of: {firstException.GetFullMessage()}"); } return(true); } catch (Exception ex) { if (firstException == null) { firstException = ex; goto retry; } // Character name might be in use or some other fault log.Error($"[DATABASE] SaveBiota 0x{biota.Id:X8}:{biota.GetProperty(PropertyString.Name)} failed first attempt with exception: {firstException}"); log.Error($"[DATABASE] SaveBiota 0x{biota.Id:X8}:{biota.GetProperty(PropertyString.Name)} failed second attempt with exception: {ex}"); return(false); } } finally { rwLock.ExitReadLock(); } } using (var context = new ShardDbContext()) { var existingBiota = GetBiota(context, biota.Id); rwLock.EnterReadLock(); try { SetBiotaPopulatedCollections(biota); if (existingBiota == null) { context.Biota.Add(biota); } else { UpdateBiota(context, existingBiota, biota); } Exception firstException = null; retry: try { context.SaveChanges(); if (firstException != null) { log.Debug($"[DATABASE] SaveBiota 0x{biota.Id:X8}:{biota.GetProperty(PropertyString.Name)} retry succeeded after initial exception of: {firstException.GetFullMessage()}"); } return(true); } catch (Exception ex) { if (firstException == null) { firstException = ex; goto retry; } // Character name might be in use or some other fault log.Error($"[DATABASE] SaveBiota 0x{biota.Id:X8}:{biota.GetProperty(PropertyString.Name)} failed first attempt with exception: {firstException}"); log.Error($"[DATABASE] SaveBiota 0x{biota.Id:X8}:{biota.GetProperty(PropertyString.Name)} failed second attempt with exception: {ex}"); return(false); } } finally { rwLock.ExitReadLock(); } } }