public void PushExecuter(CSCommon.Data.PlayerDataEx roleId, ServerFrame.DB.AsyncExecuter exec) { PlayerSaver saver = null; PlayerSaverThread thread = null; Int32 mincount = Int32.MaxValue; foreach (var i in mSaveThreads) { int count = i.GetPlayerCount(); if (count < mincount) { mincount = count; thread = i; } saver = i.FindPlayerSaver(roleId); if (saver != null) { break; } } if (saver == null) { saver = thread.AddPlayer(roleId); } ServerFrame.DB.DBOperator sqlAtom = new ServerFrame.DB.DBOperator(); sqlAtom.Executer = exec; saver.Push(sqlAtom); saver.mWaitRemove = false;//只要有数据重新要存储,说明他又登陆进来了,不需要remove了 }
public void PushSave(CSCommon.Data.PlayerDataEx roleId, string SqlCode, SqlExeType ExeType) { PlayerSaver saver = AddPlayer(roleId); ServerFrame.DB.DBOperator sqlAtom = new ServerFrame.DB.DBOperator(); sqlAtom.SqlCode = SqlCode; sqlAtom.ExeType = ExeType; saver.Push(sqlAtom); saver.mWaitRemove = false;//只要有数据重新要存储,说明他又登陆进来了,不需要remove了 }
public void DelMail(ulong roleId, ulong mailId) { var pd = mPlayerManager.FindPlayerData(roleId); if (pd == null) { return; } string condition = "MailId = " + mailId; ServerFrame.DB.DBOperator dbOp = ServerFrame.DB.DBConnect.DestroyData(condition, new CSCommon.Data.MailData()); Thread.DBConnectManager.Instance.PushSave(pd, dbOp); }
public sbyte DeleteRole(ushort planesId, string roleName) { roleName = ServerFrame.DB.DBConnect.SqlSafeString(roleName); //Thread.PlayerEnterThread.Instance.DBConnect.CallSqlSP("DestoryRoleInfo", roleName, 1); string condition = "RoleName=" + "\'" + roleName + "\'" + " and " + "PlanesId=" + "\'" + planesId.ToString() + "\'"; ServerFrame.DB.DBOperator dbOp = ServerFrame.DB.DBConnect.DelData(condition, new CSCommon.Data.RoleDetail()); if (false == Thread.PlayerEnterThread.Instance.DBConnect._ExecuteDelete(dbOp)) { Log.Log.Login.Print("delete name is exist"); return(-1); } return(1); }
public sbyte UpdateItem(ulong roleId, CSCommon.Data.ItemData item) { var pd = this.PlayerManager.FindPlayerData(roleId); if (pd == null) { return(-1); } string condition = "ItemId = " + item.ItemId; ServerFrame.DB.DBOperator dbOp = ServerFrame.DB.DBConnect.ReplaceData(condition, item, true); Thread.DBConnectManager.Instance.PushSave(pd, dbOp); return(1); }
public bool _ExecuteDestroy(DBOperator dbOp) { try { mDataAdapter.DeleteCommand = dbOp.ToSqlCommand(mConnection); mDataAdapter.DeleteCommand.ExecuteNonQuery(); } catch (System.Exception e) { Log.Log.Common.Print(e.ToString()); Log.Log.Common.Print(dbOp.SqlCode); return(false); } return(true); }
public void Push(ServerFrame.DB.DBOperator saver) { if (saver == null) { if (mPlayerDataEx != null) { Log.Log.Common.Print("不能压入null存盘" + mPlayerDataEx.RoleDetail.RoleName); } } lock (this) { mIsEmpty = false; } mQueues.Enqueue(saver); }
public static DBOperator DelData(string condition, object obj) { DBOperator dbOp = new DBOperator(); dbOp.ExeType = SqlExeType.Delete; Type objType = obj.GetType(); object[] propsTab = objType.GetCustomAttributes(typeof(DBBindTable), false); if (propsTab == null) { return(null); } DBBindTable bindTab = propsTab[0] as DBBindTable; dbOp.SqlCode = "update " + bindTab.Table + " set Deleted=1 where " + condition; //return "update " + bindTab.Table + " set Deleted=1 where " + condition; return(dbOp); }
public void _ExecuteUpdate(DBOperator dbOp) { if (dbOp == null) { return; } try { mDataAdapter.UpdateCommand = dbOp.ToSqlCommand(mConnection); mDataAdapter.UpdateCommand.ExecuteNonQuery(); mDataAdapter.UpdateCommand = null; } catch (System.Exception e) { Log.Log.Common.Print(e.ToString()); Log.Log.Common.Print(dbOp.SqlCode); } }
//重载select函数 public static DBOperator SelectData(string condition, object obj, string prefix, string aszAfter) { DBOperator dbOp = new DBOperator(); dbOp.ExeType = SqlExeType.Select; string result = ""; Type objType = obj.GetType(); object[] propsTab = objType.GetCustomAttributes(typeof(DBBindTable), false); if (propsTab == null) { return(null); } DBBindTable bindTab = propsTab[0] as DBBindTable; var clsDesc = RPC.IAutoSLClassDescManager.Instance.GetDBClassDesc(objType); bool first = true; foreach (var dbBind in clsDesc.Fields) { if (first) { result += dbBind.Field; first = false; } else { result += "," + dbBind.Field; } } if (string.IsNullOrEmpty(condition)) { //return "select " + prefix + result + " from " + bindTab.Table + " where Deleted=0" + EndLine; dbOp.SqlCode = "select " + prefix + result + " from " + bindTab.Table + " where Deleted=0" + " " + aszAfter + EndLine; } else { //return "select " + prefix + result + " from " + bindTab.Table + " where Deleted=0 and " + condition + EndLine; dbOp.SqlCode = "select " + prefix + result + " from " + bindTab.Table + " where Deleted=0 and " + condition + " " + aszAfter + EndLine; } return(dbOp); }
public void PushSave(CSCommon.Data.PlayerDataEx roleId, ServerFrame.DB.DBOperator dbOp) { if (dbOp == null) { return; } if (roleId == null) { //走到这里说明DataServer已经重启过了,之前的在线玩家需要存盘,放到一个特殊线程处理就好了 switch (dbOp.ExeType) { case SqlExeType.Update: { PlayerEnterThread.Instance.DBConnect._ExecuteUpdate(dbOp); } break; case SqlExeType.Insert: { PlayerEnterThread.Instance.DBConnect._ExecuteInsert(dbOp); } break; case SqlExeType.Delete: { PlayerEnterThread.Instance.DBConnect._ExecuteDelete(dbOp); } break; case SqlExeType.Destroy: { PlayerEnterThread.Instance.DBConnect._ExecuteDestroy(dbOp); } break; } return; } PlayerSaver saver = AddPlayer(roleId); saver.Push(dbOp); saver.mWaitRemove = false;//只要有数据重新要存储,说明他又登陆进来了,不需要remove了 }
public System.Data.DataTable _ExecuteSelect(DBOperator dbOp, string tabName) { System.Data.DataSet result = new System.Data.DataSet(); try { mDataAdapter.SelectCommand = dbOp.ToSqlCommand(mConnection); //System.Data.SqlClient.SqlCommandBuilder myCB = new System.Data.SqlClient.SqlCommandBuilder(mDataAdapter); //int iRet = mDataAdapter.SelectCommand.ExecuteReader() mDataAdapter.Fill(result, tabName); mDataAdapter.SelectCommand = null; } catch (System.Exception e) { Log.Log.Common.Print(e.ToString()); Log.Log.Common.Print(e.StackTrace.ToString()); return(null); } return(result.Tables[0]); }
public System.Data.DataTable _ExecuteSql(string sql, string tabName) { System.Data.DataSet result = new System.Data.DataSet(); try { DBOperator dbOp = new DBOperator(); dbOp.ExeType = SqlExeType.Select; dbOp.SqlCode = sql; mDataAdapter.SelectCommand = dbOp.ToSqlCommand(mConnection); mDataAdapter.Fill(result, tabName); mDataAdapter.SelectCommand = null; } catch (System.Exception e) { Log.Log.Common.Print(e.ToString()); Log.Log.Common.Print(e.StackTrace.ToString()); return(null); } return(result.Tables[0]); }
public void DelItem(ulong roleId, ulong itemId, sbyte bDestroy) { var pd = this.PlayerManager.FindPlayerData(roleId); if (pd == null) { return; } if (bDestroy > 0) { string condition = "ItemId = " + itemId; ServerFrame.DB.DBOperator dbOp = ServerFrame.DB.DBConnect.DestroyData(condition, new CSCommon.Data.ItemData()); Thread.DBConnectManager.Instance.PushSave(pd, dbOp); } else { string condition = "ItemId = " + itemId; ServerFrame.DB.DBOperator dbOp = ServerFrame.DB.DBConnect.DelData(condition, new CSCommon.Data.ItemData()); Thread.DBConnectManager.Instance.PushSave(pd, dbOp); } }
public bool _ExecuteInsert(DBOperator dbOp) { try { mDataAdapter.InsertCommand = dbOp.ToSqlCommand(mConnection); mDataAdapter.InsertCommand.ExecuteNonQuery(); mDataAdapter.InsertCommand = null; } catch (System.Exception e) { if (e.ToString().Contains("for key")) //包含主键或唯一键值 { return(false); } Log.Log.Common.Print(e.ToString()); Log.Log.Common.Print(dbOp.SqlCode); return(false); } return(true); }
public void GetRoleDetailByName(ushort planesId, string roleName, Iocp.NetConnection connect, RPC.RPCForwardInfo fwd) { roleName = ServerFrame.DB.DBConnect.SqlSafeString(roleName); UInt16 returnSerialId = fwd.ReturnSerialId; AsyncExecuteThreadManager.Instance.AsyncExe(true).Exec = delegate() { RPC.PackageWriter retPkg = new RPC.PackageWriter(); var acInfo = mPlayerManager.FindPlayerData(planesId, roleName); if (acInfo != null) { retPkg.Write((SByte)1); retPkg.Write(acInfo.RoleDetail); retPkg.DoReturnCommand2(connect, returnSerialId); } else { CSCommon.Data.RoleDetail rd = new CSCommon.Data.RoleDetail(); string condition = "RoleName = \'" + roleName + "\'"; ServerFrame.DB.DBOperator dbOp = ServerFrame.DB.DBConnect.SelectData(condition, rd, null); System.Data.DataTable tab = DBLoaderConnect._ExecuteSelect(dbOp, "RoleInfo"); if (tab == null || tab.Rows.Count != 1) { retPkg.Write((SByte)(-1)); retPkg.DoReturnCommand2(connect, returnSerialId); } else { ServerFrame.DB.DBConnect.FillObject(rd, tab.Rows[0]); retPkg.Write((SByte)1); retPkg.Write(rd); retPkg.DoReturnCommand2(connect, returnSerialId); } } }; }
public static DBOperator InsertData(string keyCondition, object obj, bool existUpdate) { DBOperator dbOp = new DBOperator(); dbOp.ExeType = SqlExeType.Insert; Type objType = obj.GetType(); object[] propsTab = objType.GetCustomAttributes(typeof(DBBindTable), false); if (propsTab == null) { return(null); } DBBindTable bindTab = propsTab[0] as DBBindTable; string fieldStr = ""; string valueStr = ""; string setStr = ""; bool first = true; var clsDesc = RPC.IAutoSLClassDescManager.Instance.GetDBClassDesc(objType); foreach (var dbBind in clsDesc.Fields) { System.Reflection.PropertyInfo p = dbBind.Property; object v = p.GetValue(obj, null); string valueSql; bool needStringFlag = true; if (p.PropertyType.IsEnum) { valueSql = System.Convert.ToInt32(v).ToString(); } else if (p.PropertyType == typeof(System.DateTime)) { valueSql = System.String.Format("\'{0}\'", v.ToString()); needStringFlag = false; } else if (p.PropertyType == typeof(System.Guid)) { //valueSql = System.String.Format("convert(uniqueidentifier,\'{0}\')", v.ToString()); valueSql = string.Format("\'{0}\'", ((System.Guid)v).ToString("N")); needStringFlag = false; } else if (p.PropertyType == typeof(byte[])) { valueSql = System.String.Format("@{0}", dbBind.Field); needStringFlag = false; var param = new MySql.Data.MySqlClient.MySqlParameter(valueSql, v); dbOp.SqlParameters.Add(param); } else { if (v != null) { valueSql = v.ToString(); } else { valueSql = ""; } //valueSql这个地方要处理数据库攻击,SQL注入 valueSql = SqlSafeString(valueSql); } if (first) { fieldStr += dbBind.Field; if (needStringFlag) { valueStr += "\'" + valueSql + "\'"; } else { valueStr += valueSql; } if (needStringFlag) { setStr += " set " + dbBind.Field + "= \'" + valueSql + "\'"; } else { setStr += " set " + dbBind.Field + "= " + valueSql; } first = false; } else { fieldStr += "," + dbBind.Field; if (needStringFlag) { valueStr += ",\'" + valueSql + "\'"; } else { valueStr += "," + valueSql; } if (needStringFlag) { setStr += "," + dbBind.Field + "=\'" + valueSql + "\'"; } else { setStr += "," + dbBind.Field + "=" + valueSql; } } } string finalStr = "insert into " + bindTab.Table + " (" + fieldStr + ") values (" + valueStr + ")\r\n"; dbOp.SqlCode = finalStr; return(dbOp); }
public static DBOperator UpdateData(string condition, object obj, object templateobj) { DBOperator dbOp = new DBOperator(); dbOp.ExeType = SqlExeType.Update; if (templateobj != null && obj.GetType() != templateobj.GetType()) { return(null); } Type objType = obj.GetType(); object[] propsTab = objType.GetCustomAttributes(typeof(DBBindTable), false); if (propsTab == null) { return(null); } DBBindTable bindTab = propsTab[0] as DBBindTable; var clsDesc = RPC.IAutoSLClassDescManager.Instance.GetDBClassDesc(objType); bool first = true; string result = ""; foreach (var dbBind in clsDesc.Fields) { System.Reflection.PropertyInfo p = dbBind.Property; object fv = p.GetValue(obj, null); if (fv == null) { continue; } if (templateobj != null && fv.Equals(p.GetValue(templateobj, null))) { continue; } string valueSql; bool needStringFlag = true; if (p.PropertyType.IsEnum) { valueSql = System.Convert.ToInt32(fv).ToString(); } else if (p.PropertyType == typeof(System.DateTime)) { valueSql = System.String.Format("\'{0}\'", fv.ToString()); needStringFlag = false; } else if (p.PropertyType == typeof(System.Guid)) { //valueSql = System.String.Format("convert(uniqueidentifier,\'{0}\')", fv.ToString()); valueSql = System.String.Format("\'{0}\'", ((System.Guid)fv).ToString("N")); needStringFlag = false; } else if (p.PropertyType == typeof(byte[])) { valueSql = System.String.Format("@{0}", dbBind.Field); needStringFlag = false; //string sql = "update T_Employee set ImageLogo=@ImageLogo where EmpId=@EmpId"; //byte[] imgSourse = new byte[100]; var param = new MySql.Data.MySqlClient.MySqlParameter(valueSql, fv); dbOp.SqlParameters.Add(param); } else { valueSql = fv.ToString(); //防止SQL注入处理 valueSql = SqlSafeString(valueSql); } if (first) { if (needStringFlag) { result += " set " + dbBind.Field + " = \'" + valueSql + "\'"; } else { result += " set " + dbBind.Field + " = " + valueSql; } first = false; } else { if (needStringFlag) { result += "," + dbBind.Field + " = \'" + valueSql + "\'"; } else { result += "," + dbBind.Field + " = " + valueSql; } } } if (result == "") { return(null); } dbOp.SqlCode = "update " + bindTab.Table + "\r\n" + result + "\r\n where " + condition; return(dbOp); }
public void Tick(ServerFrame.DB.DBConnect dbConnect) { try {//这里之所以要try住,是因为存盘的过程中,如果发生了Clear,丢弃之前的存储指令,有可能触发迭代过程异常,但是这个异常不会影响到什么东西 if (mQueues.Count == 0) { lock (this) { mIsEmpty = true; } return; } ServerFrame.DB.DBOperator saver = mQueues.Dequeue(); if (saver == null) { Log.Log.Common.Print("见鬼了,居然还有null存盘" + mPlayerDataEx.RoleDetail.RoleName); return; } while (saver != null) { try { if (saver.Executer != null) { if (saver.Executer.Exec != null) { saver.Executer.Exec(); } } else if (saver.ExeType == SqlExeType.Update) { dbConnect._ExecuteUpdate(saver); } else if (saver.ExeType == SqlExeType.Insert) { dbConnect._ExecuteInsert(saver); } else if (saver.ExeType == SqlExeType.Delete) { dbConnect._ExecuteDelete(saver); } else if (saver.ExeType == SqlExeType.Destroy) { dbConnect._ExecuteDestroy(saver); } } catch (System.Exception ex) { Log.Log.Common.Print(ex.ToString()); System.Diagnostics.Debug.WriteLine(ex.ToString()); } if (mQueues.Count == 0) { lock (this) { mIsEmpty = true; } break;//减少异常的概率做的努力,虽然这个异常没啥,但是log压力也还是要考虑的 } saver = mQueues.Dequeue(); } } catch (System.Exception ex) { Log.Log.Common.Print(ex.ToString()); System.Diagnostics.Debug.WriteLine(ex.ToString()); } }