public void Save()
{
try
{
CharacterDTO character = DeepCopy();
SaveResult insertResult = DAOFactory.CharacterDAO.InsertOrUpdate(ref character); // unused variable, check for success?
// wait for any exchange to be finished
while (IsExchanging)
{
// do nothing and wait until Exchange has been finished
}
if (Inventory != null)
{
// be sure that noone tries to edit while saving is currently editing
lock (Inventory)
{
// load and concat inventory with equipment
List<ItemInstance> inventories = Inventory.GetAllItems();
IList<Guid> currentlySavedInventoryIds = DAOFactory.ItemInstanceDAO.LoadSlotAndTypeByCharacterId(CharacterId);
// remove all which are saved but not in our current enumerable
foreach (var inventoryToDeleteId in currentlySavedInventoryIds.Except(inventories.Select(i => i.Id)))
{
DAOFactory.ItemInstanceDAO.Delete(inventoryToDeleteId);
}
// create or update all which are new or do still exist
foreach (ItemInstance itemInstance in inventories)
{
DAOFactory.ItemInstanceDAO.InsertOrUpdate(itemInstance);
}
}
}
if (Skills != null)
{
IEnumerable<Guid> currentlySavedCharacterSkills = DAOFactory.CharacterSkillDAO.LoadKeysByCharacterId(CharacterId).ToList();
foreach (Guid characterSkillToDeleteId in currentlySavedCharacterSkills.Except(Skills.GetAllItems().Select(s => s.Id)))
{
DAOFactory.CharacterSkillDAO.Delete(characterSkillToDeleteId);
}
foreach (CharacterSkill characterSkill in Skills.GetAllItems())
{
DAOFactory.CharacterSkillDAO.InsertOrUpdate(characterSkill);
}
}
IEnumerable<QuicklistEntryDTO> quickListEntriesToInsertOrUpdate = QuicklistEntries.ToList();
IEnumerable<Guid> currentlySavedQuicklistEntries = DAOFactory.QuicklistEntryDAO.LoadKeysByCharacterId(CharacterId).ToList();
foreach (Guid quicklistEntryToDelete in currentlySavedQuicklistEntries.Except(QuicklistEntries.Select(s => s.Id)))
{
DAOFactory.QuicklistEntryDAO.Delete(quicklistEntryToDelete);
}
foreach (QuicklistEntryDTO quicklistEntry in quickListEntriesToInsertOrUpdate)
{
DAOFactory.QuicklistEntryDAO.InsertOrUpdate(quicklistEntry);
}
foreach (GeneralLogDTO general in Session.Account.GeneralLogs)
{
if (!DAOFactory.GeneralLogDAO.IdAlreadySet(general.LogId))
{
DAOFactory.GeneralLogDAO.Insert(general);
}
}
foreach (PenaltyLogDTO penalty in Session.Account.PenaltyLogs)
{
if (!DAOFactory.PenaltyLogDAO.IdAlreadySet(penalty.PenaltyLogId))
{
DAOFactory.PenaltyLogDAO.Insert(penalty);
}
else
{
DAOFactory.PenaltyLogDAO.Update(penalty);
}
}
foreach (RespawnDTO Resp in Respawns)
{
RespawnDTO res = Resp;
if (Resp.MapId != 0 && Resp.X != 0 && Resp.Y != 0)
{
DAOFactory.RespawnDAO.InsertOrUpdate(ref res);
}
}
}
catch (Exception e)
{
Logger.Log.Error("Save Character failed. SessionId: " + Session.SessionId, e);
}
}