示例#1
0
        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了
        }
示例#2
0
        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了
        }
示例#3
0
        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);
        }
示例#4
0
        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);
        }
示例#5
0
        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);
        }
示例#6
0
 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);
 }
示例#7
0
        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);
        }
示例#8
0
        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);
        }
示例#9
0
        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);
            }
        }
示例#10
0
        //重载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);
        }
示例#11
0
        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了
        }
示例#12
0
        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]);
        }
示例#13
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]);
 }
示例#14
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);
            }
        }
示例#15
0
        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);
        }
示例#16
0
        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);
                    }
                }
            };
        }
示例#17
0
        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);
        }
示例#18
0
        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);
        }
示例#19
0
        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());
            }
        }