//-------------------------------------------------------------------------------------------------------------------------- // 供外部直接调用的方法,实际执行线程是调用线程。 //-------------------------------------------------------------------------------------------------------------------------- internal void DSPSaveCreateUser(AccountInfo ai, string nickname, ulong userGuid) { try { TableAccount dataAccount = new TableAccount(); dataAccount.AccountId = ai.AccountId; //dataAccount.IsBanned = ai.IsBanned; //dataAccount.UserGuid = ai.UserGuid; Msg_LD_Save msg = new Msg_LD_Save(); msg.MsgId = (int)DataEnum.TableAccount; msg.PrimaryKeys.Add(dataAccount.AccountId); msg.Data = DbDataSerializer.Encode(dataAccount); DispatchAction(DSSaveInternal, msg); TableNicknameInfo dataNickname = new TableNicknameInfo(); dataNickname.Nickname = nickname; dataNickname.UserGuid = userGuid; Msg_LD_Save msgNickname = new Msg_LD_Save(); msgNickname.MsgId = (int)DataEnum.TableNicknameInfo; msgNickname.PrimaryKeys.Add(dataNickname.Nickname); msgNickname.Data = DbDataSerializer.Encode(dataNickname); DispatchAction(DSSaveInternal, msgNickname); } catch (Exception e) { LogSys.Log(LOG_TYPE.ERROR, "DataCache Save ERROR. Msg:DSP_CreateUser, Key:{0}, Error:{1},\nStacktrace:{2}", ai.AccountId, e.Message, e.StackTrace); } }
internal void SaveMail(List <TableMailInfoWrap> mailList, int saveCount) { try { foreach (var mailInfo in mailList) { if (!mailInfo.Modified) { continue; } TableMailInfo dataMail = mailInfo.ToProto(); List <int> itemIds = new List <int>(); List <int> itemNums = new List <int>(); foreach (var item in mailInfo.m_Items) { itemIds.Add(item.m_ItemId); itemNums.Add(item.m_ItemNum); } dataMail.ItemIds = Converter.IntList2String(itemIds); dataMail.ItemNumbers = Converter.IntList2String(itemNums); Msg_LD_Save msg = new Msg_LD_Save(); msg.MsgId = (int)DataEnum.TableMailInfo; msg.PrimaryKeys.Add(dataMail.Guid.ToString()); msg.Data = DbDataSerializer.Encode(dataMail); DispatchAction(SaveInternal, msg); } } catch (Exception e) { LogSys.Log(LOG_TYPE.ERROR, "DataCache Save ERROR:{0}, Stacktrace:{1}", e.Message, e.StackTrace); } }
internal void RequestSave(Msg_LD_Save msg, MyAction <Msg_DL_SaveResult> callback = null) { lock (m_SaveRequestQueuesLock) { msg.SerialNo = GenNextSerialNo(); KeyString key = KeyString.Wrap(msg.PrimaryKeys); ConcurrentDictionary <KeyString, ConcurrentQueue <SaveRequestInfo> > dict; if (!m_SaveRequestQueues.TryGetValue(msg.MsgId, out dict)) { dict = m_SaveRequestQueues.AddOrUpdate(msg.MsgId, new ConcurrentDictionary <KeyString, ConcurrentQueue <SaveRequestInfo> >(), (k, v) => v); } ConcurrentQueue <SaveRequestInfo> queue; if (!dict.TryGetValue(key, out queue)) { queue = dict.AddOrUpdate(key, new ConcurrentQueue <SaveRequestInfo>(), (k, v) => v); } SaveRequestInfo info = m_SaveRequestPool.Alloc(); info.m_Request = msg; info.m_Callback = callback; if (queue.Count == 0) { //当前队列为空时直接发送消息 info.m_LastSendTime = TimeUtility.GetLocalMilliseconds(); m_DataStoreChannel.Send(msg); } queue.Enqueue(info); } }
internal int DeleteGlobalData(string key) { try { Msg_LD_Save msg = new Msg_LD_Save(); msg.MsgId = (int)DataEnum.TableGlobalData; msg.PrimaryKeys.Add(key); msg.ForeignKeys.Clear(); msg.Data = null; RequestSave(msg); return(0); } catch (Exception e) { LogSys.Log(LOG_TYPE.ERROR, "DataCache Save ERROR:{0}, Stacktrace:{1}", e.Message, e.StackTrace); return(0); } }
internal int SaveGlobalData(TableGlobalData data) { try { Msg_LD_Save msg = new Msg_LD_Save(); msg.MsgId = (int)DataEnum.TableGlobalData; msg.PrimaryKeys.Add(data.Key); msg.ForeignKeys.Clear(); msg.Data = DbDataSerializer.Encode(data); RequestSave(msg); return(0); } catch (Exception e) { LogSys.Log(LOG_TYPE.ERROR, "DataCache Save ERROR:{0}, Stacktrace:{1}", e.Message, e.StackTrace); return(0); } }
internal void SaveGuid(string guidType, ulong guidValue) { try { TableGuid dataGuid = new TableGuid(); dataGuid.GuidType = guidType; dataGuid.GuidValue = guidValue; Msg_LD_Save msg = new Msg_LD_Save(); msg.MsgId = (int)DataEnum.TableGuid; msg.PrimaryKeys.Add(dataGuid.GuidType); msg.Data = DbDataSerializer.Encode(dataGuid); DispatchAction(SaveInternal, msg); } catch (Exception e) { LogSys.Log(LOG_TYPE.ERROR, "DataCache Save ERROR:{0}, Stacktrace:{1}", e.Message, e.StackTrace); } }
internal int DSGSaveNickname(TableNicknameInfo nick) { try { Msg_LD_Save msg = new Msg_LD_Save(); msg.MsgId = (int)DataEnum.TableNicknameInfo; msg.PrimaryKeys.Add(nick.Nickname); msg.ForeignKeys.Clear(); msg.Data = DbDataSerializer.Encode(nick); RequestSave(msg); return(0); } catch (Exception e) { LogSys.Log(LOG_TYPE.ERROR, "DataCache Save ERROR:{0}, Stacktrace:{1}", e.Message, e.StackTrace); return(0); } }
internal void SaveGuid(List <GuidInfo> guidList, int saveCount) { try { foreach (var guidinfo in guidList) { TableGuid dataGuid = new TableGuid(); dataGuid.GuidType = guidinfo.GuidType; dataGuid.GuidValue = (ulong)guidinfo.NextGuid; Msg_LD_Save msg = new Msg_LD_Save(); msg.MsgId = (int)DataEnum.TableGuid; msg.PrimaryKeys.Add(dataGuid.GuidType); msg.Data = DbDataSerializer.Encode(dataGuid); DispatchAction(SaveInternal, msg); } } catch (Exception e) { LogSys.Log(LOG_TYPE.ERROR, "DataCache Save ERROR:{0}, Stacktrace:{1}", e.Message, e.StackTrace); } }
internal void SaveDeletedMail(List <TableMailInfoWrap> mailList, int saveCount) { try { foreach (var mailInfo in mailList) { if (!mailInfo.Deleted) { continue; } Msg_LD_Save msg = new Msg_LD_Save(); msg.MsgId = (int)DataEnum.TableMailInfo; msg.PrimaryKeys.Add(mailInfo.Guid.ToString()); msg.Data = null; DispatchAction(SaveInternal, msg); } } catch (Exception e) { LogSys.Log(LOG_TYPE.ERROR, "DataCache Save ERROR:{0}, Stacktrace:{1}", e.Message, e.StackTrace); } }
//-------------------------------------------------------------------------------------------------------------------------- //供内部通过DispatchAction(调用的方法,实际执行线程是DataCacheThread。 //-------------------------------------------------------------------------------------------------------------------------- private void DSSaveInternal(Msg_LD_Save msg) { try { RequestSave(msg, (ret) => { KeyString primaryKey = KeyString.Wrap(msg.PrimaryKeys); if (ret.ErrorNo == Msg_DL_SaveResult.ErrorNoEnum.Success) { LogSys.Log(LOG_TYPE.INFO, "Save data success. MsgId:{0}, SerialNo:{1}, Key:{2}", msg.MsgId, msg.SerialNo, primaryKey); } else { LogSys.Log(LOG_TYPE.ERROR, "Save data failed. MsgId:{0}, SerialNo:{1}, Key:{2}, Error:{3}, ErrorInfo:{4}", msg.MsgId, msg.SerialNo, primaryKey, ret.ErrorNo, ret.ErrorInfo); } }); } catch (Exception e) { LogSys.Log(LOG_TYPE.ERROR, "DataCache Save ERROR:{0}, Stacktrace:{1}", e.Message, e.StackTrace); } }
internal void DSPSaveUser(UserInfo ui, int saveCount) { try { ulong userGuid = ui.Guid; string key = userGuid.ToString(); if (ui.Modified) { Msg_LD_Save msg = new Msg_LD_Save(); msg.MsgId = (int)DataEnum.TableUserInfo; msg.PrimaryKeys.AddRange(ui.PrimaryKeys); msg.ForeignKeys.AddRange(ui.ForeignKeys); msg.Data = DbDataSerializer.Encode(ui.ToProto()); DispatchAction(DSSaveInternal, msg); ui.Modified = false; } ui.CurrentUserSaveCount = saveCount; } catch (Exception e) { LogSys.Log(LOG_TYPE.ERROR, "DataCache Save ERROR. Msg:DSP_User, Key:{0}, SaveCount:{1}, Error:{2},\nStacktrace:{3}", ui.Guid, saveCount, e.Message, e.StackTrace); } }
private void DSSaveHandler(Msg_LD_Save msg, PBChannel channel, int handle, uint seq) { var saveResult = new Msg_DL_SaveResult(); saveResult.MsgId = msg.MsgId; saveResult.PrimaryKeys.AddRange(msg.PrimaryKeys); saveResult.SerialNo = msg.SerialNo; saveResult.ErrorNo = Msg_DL_SaveResult.ErrorNoEnum.Success; saveResult.ErrorInfo = string.Empty; try { //写入数据缓存 //TODO:是否将byte[]解析出protobuf对象? 提前反序列化成对象的好处:1.若数据有错误,反序列化失败,可反馈给lobby;2.protobuf对象可重用? //TODO:解析primaryKey和foreignKey DataCacheSystem.Instance.SaveActionQueue.QueueAction(DataCacheSystem.Instance.Save, msg.MsgId, msg.PrimaryKeys, msg.ForeignKeys, msg.Data, msg.SerialNo); } catch (Exception e) { saveResult.ErrorNo = Msg_DL_SaveResult.ErrorNoEnum.PostError; saveResult.ErrorInfo = e.Message; LogSys.Log(LOG_TYPE.ERROR, "Save data ERROR: MsgId:{0}, Key:{1}, Error:{2}, Detail:{3}", msg.MsgId, msg.PrimaryKeys, e.Message, e.StackTrace); } channel.Send(saveResult); }
internal void SaveUser(UserInfo ui, int saveCount) { try { ulong userGuid = ui.Guid; string key = userGuid.ToString(); if (ui.Modified) { Msg_LD_Save msg = new Msg_LD_Save(); msg.MsgId = (int)DataEnum.TableUserInfo; msg.PrimaryKeys.AddRange(ui.PrimaryKeys); msg.ForeignKeys.AddRange(ui.ForeignKeys); msg.Data = DbDataSerializer.Encode(ui.ToProto()); DispatchAction(SaveInternal, msg); ui.Modified = false; } foreach (var pair in ui.MailStateInfo.WholeMailStates) { var mi = pair.Value; if (mi.Modified) { Msg_LD_Save msg = new Msg_LD_Save(); msg.MsgId = (int)DataEnum.TableMailStateInfo; msg.PrimaryKeys.AddRange(mi.PrimaryKeys); msg.ForeignKeys.AddRange(mi.ForeignKeys); msg.Data = DbDataSerializer.Encode(mi.ToProto()); DispatchAction(SaveInternal, msg); mi.Modified = false; } } foreach (var mi in ui.MailStateInfo.DeletedWholeMailStates) { if (mi.Deleted) { Msg_LD_Save msg = new Msg_LD_Save(); msg.MsgId = (int)DataEnum.TableMailStateInfo; msg.PrimaryKeys.AddRange(mi.PrimaryKeys); msg.ForeignKeys.AddRange(mi.ForeignKeys); msg.Data = null; DispatchAction(SaveInternal, msg); mi.Deleted = false; } } ui.MailStateInfo.DeletedWholeMailStates.Clear(); foreach (var mi in ui.MemberInfos) { if (mi.Modified) { Msg_LD_Save msg = new Msg_LD_Save(); msg.MsgId = (int)DataEnum.TableMemberInfo; msg.PrimaryKeys.AddRange(mi.PrimaryKeys); msg.ForeignKeys.AddRange(mi.ForeignKeys); msg.Data = DbDataSerializer.Encode(mi.ToProto()); DispatchAction(SaveInternal, msg); mi.Modified = false; } } foreach (var mi in ui.DeletedMemberInfos) { if (mi.Deleted) { Msg_LD_Save msg = new Msg_LD_Save(); msg.MsgId = (int)DataEnum.TableMemberInfo; msg.PrimaryKeys.AddRange(mi.PrimaryKeys); msg.ForeignKeys.AddRange(mi.ForeignKeys); msg.Data = null; DispatchAction(SaveInternal, msg); mi.Deleted = false; } } ui.DeletedMemberInfos.Clear(); foreach (var ii in ui.ItemBag.ItemInfos) { if (ii.Modified) { Msg_LD_Save msg = new Msg_LD_Save(); msg.MsgId = (int)DataEnum.TableItemInfo; msg.PrimaryKeys.AddRange(ii.PrimaryKeys); msg.ForeignKeys.AddRange(ii.ForeignKeys); msg.Data = DbDataSerializer.Encode(ii.ToProto()); DispatchAction(SaveInternal, msg); ii.Modified = false; } } foreach (var ii in ui.ItemBag.DeletedItemInfos) { if (ii.Deleted) { Msg_LD_Save msg = new Msg_LD_Save(); msg.MsgId = (int)DataEnum.TableItemInfo; msg.PrimaryKeys.AddRange(ii.PrimaryKeys); msg.ForeignKeys.AddRange(ii.ForeignKeys); msg.Data = null; DispatchAction(SaveInternal, msg); ii.Deleted = false; } } ui.ItemBag.DeletedItemInfos.Clear(); foreach (var fi in ui.FriendInfos) { if (fi.Modified) { Msg_LD_Save msg = new Msg_LD_Save(); msg.MsgId = (int)DataEnum.TableFriendInfo; msg.PrimaryKeys.AddRange(fi.PrimaryKeys); msg.ForeignKeys.AddRange(fi.ForeignKeys); msg.Data = DbDataSerializer.Encode(fi.ToProto()); DispatchAction(SaveInternal, msg); fi.Modified = false; } } foreach (var fi in ui.DeletedFriendInfos) { if (fi.Deleted) { Msg_LD_Save msg = new Msg_LD_Save(); msg.MsgId = (int)DataEnum.TableFriendInfo; msg.PrimaryKeys.AddRange(fi.PrimaryKeys); msg.ForeignKeys.AddRange(fi.ForeignKeys); msg.Data = DbDataSerializer.Encode(fi.ToProto()); DispatchAction(SaveInternal, msg); fi.Deleted = false; } } ui.DeletedFriendInfos.Clear(); ui.CurrentUserSaveCount = saveCount; } catch (Exception e) { LogSys.Log(LOG_TYPE.ERROR, "DataCache Save ERROR. Msg:SaveUser, Key:{0}, SaveCount:{1}, Error:{2},\nStacktrace:{3}", ui.Guid, saveCount, e.Message, e.StackTrace); } }