游戏服务器后台的快速开发三

     这一节主要说一下配置文件(xml),它是这一切的关键,它描述了你的DB Server都有那些通讯协议,以及都需要的访问那些数据库,还有就是你的每个网络消息都要对应到数据中的那些表和字段上去。下面对这几部分进行一下说明:

第一部分:

 <ProtoFile>
  <FileItem Title="测试消息协议文件" FileName= "DBStudent.proto" /> //协议文件,你可以在这添加多个协议文件。
 </ProtoFile>

我想这个大家都能看明白,就是列举一下服务都需要那些Proto文件,当然例子中只提供了一个DBStudent.proto文件,实际上这没什么好多说的,唯一需要说的就是Title可以为空。这只是给写配置文件的人看的。

第二部分:

 <DBCfg>
  <DBItem Title="DB标题1" KeyIdx="1"       DBName= "test" DSN="test"  UserName= "test" Password = "test" SqlConnectCount="0" />
  <DBItem Title="DB标题2" KeyIdx="11"      DBName= "test" DSN="test"  UserName= "test" Password = "test" SqlConnectCount="128" />
 </DBCfg>

这部分是配置你的服务都需要访问那些数据库。就本例来说,这个是需要你在odbc上配置的。当然这里面列出的两个数据库实际上指向的是一个。SqlConnectCount="128" 是服务联接到数据库的联接数,如果你服务的并发数很大的时候最好也将这个数设置的大一些。当然写零的话,程序为有默认的联接数。 KeyIdx =1 这是给当前的数据库联接分配一个整形的索引数值,这个数为什么是手动写的,而不是程序自动分配的,等下一个版本出现后,你就会明白这个手动配置的重要性了。  这部分同样可讲的不多,当然在下一个版本里面,还会有Redis服务器的联接信息区段。

 

第三部分

 <MsgList> 
 </MsgList> 

这里面就是具体的消息处理过程了,共有select、update、Insert、delete和存储过程共五种类型,他包括了访问数据库的最常用几种方式,下面分别来说一下。

 

1、select语句

  <MsgItem ID= "123" MsgName="Msg123" AckID="8123" ProtoMsgName="GetStudent" AckMsgName="AckStudent" ResultAckField="Result" MainKeyIdx="-1"  SubKeyIdx="-1" > //ResultAckField="Result" 结果应答字段  将本次操作成功与否写入应答消息的这个字段,必须int32类型,可选项  
   <DBIdx>1</DBIdx>
   <OperType>1</OperType>      // 1 Select;2 Insert;3 update; 4 delete ; 5存储过程 ;
   <TableName>Achievement</TableName> 
   <ColInfo ColName="StudentName"   DataType="string" DataSize="20" WhereStr=""      AckIdx="6" AckSubIdx="1" /> //
   <ColInfo ColName="sum(Mark) as sumMark" DataType="int"    DataSize="8"  WhereStr=""   AckIdx="6" AckSubIdx="2" />  

                   //WhereStr 简单条件  MsgIdx为收到的Proto消息序字段号索引  AckIdx 为应答内容应写入的索引 AckSubIdx 为应答时的重复字段
   <WhereInfo WhereStr="and RecTime >= '%s' " MsgValueIdx= "2"/> //MsgValueIdx 消息变量的索引,将其按类型拼成Where条件,变量会自动转成字符串
   <WhereInfo WhereStr="and CurriculumID = %s " MsgValueIdx= "1"/> //MsgValueIdx 消息变量的索引,将其按类型拼成Where条件,变量会自动转成字符串
   <GroupInfo>StudentName</GroupInfo>
   <OrderInfo>sumMark desc</OrderInfo>
  </MsgItem>   
 

     Select语句是最复杂的,如果把他看明白了,后面的语句就是很轻松的了。当然在看这个配置的时候,还是要对照着proto协议。建议大家在用这个动态库的时候,先准备好表结构和定议好proto协议后在来配置这个XML文件。

      MsgItem ID= "123"  这是你消息的ID号,本质上来说,你只要所有的消息不重就可以。没有其它的规则,但我想你的服务一定会对消息号的区段有整体规划。这里的数值123是十进制的。

     MsgName="Msg123"  消息名称,这个写不写无所谓。

     AckID="8123"       应答的消息ID号,

     ProtoMsgName="GetStudent"     请求消息体的名字,这个配置就要具体看你的DBStudent.proto文件了,这个名称就是告诉服务来一段数据,他的解码协议是那个。如果协议中消息名修改了,这里也一定要做相应的修改。

    AckMsgName="AckStudent"   应答消息体的名字,

    ResultAckField="Result" 结果应答字段  将本次操作成功与否写入应答消息的这个字段,必须int32类型,可选项  

   以上的几个信息就是描述你发来的消息ID是那个,发来消息应当用什么协议去解析,查询的结果要按照什么协议格式去赋值,服务应当返回什么样的应答ID。

   MainKeyIdx="-1"  SubKeyIdx="-1"      这两项现在未用,他会在下一个版本中使用。

   <DBIdx>1</DBIdx>     这项指明这个操作要在那个数据库上进行参见,这里的是<DBItem Title="DB标题1" KeyIdx="1"    /.>       与KeyIdx="1"对应。
   <OperType>1</OperType>      操作类型 取值为 1 Select;2 Insert;3 update; 4 delete ; 5存储过程 ;  这里设为1 表明现在要做的是个查询
   <TableName>Achievement</TableName>        Achievement 要查询的表名 在这一项里,可以是几个表的表名及别名。如

        <TableName>Achievement a ,Curriculum b</TableName>  。这就是我们要关联查询两张表,并为每个表都取了一个别名。分别叫a和b.。当然在下面的的列信息中,列名前就要加上a或b了。 (如果你的表名有架构名的话,也一定要在表名前把它加上) 看下面列信息这行。

   <ColInfo ColName="a.StudentName"    DataType="string" DataSize="20" WhereStr=""  AckIdx="6" AckSubIdx="1" />
   ColName 这项就是你数据库里面那一列的名字,前面是否要加别名,刚才以经说过了,要看你的表名是如何写的。当然这一项也可以写统计函数什么的,如

   <ColInfo ColName="sum(Mark) as sumMark" DataType="int"    DataSize="8"  WhereStr=""   AckIdx="6" AckSubIdx="2" >   

总之一句话,他是你select 关键字 后面用豆号分开的每一列。而Tablename是from和Where关键字中间部分。

下面正式讲列信息

   <ColInfo ColName="sum(Mark) as sumMark" DataType="int"    DataSize="8"  WhereStr=""   AckIdx="6" AckSubIdx="2" >  

 ColName前面说了, DataType="int"  指定这一列是什么数据类型的  DataSize="8" 指定这类型多长,当然对 int指定长度没意议,主要针对的是DataType="string" 也就是字符串类型。 WhereStr=""  针对这列的条件字段,可以为空,条件在下面集中写也是可以的。

AckIdx="6" AckSubIdx="2"    这要和proto协议一起看了。这段指定,从数据库中查出的数据(这一列)。要写到那个proto字段中。看下协议

message StudentRecData
{
 optional string StudentName = 1 ;
 optional int32 Mark = 2 ;
 optional string CurriculumName =3 ; //学科名 
}

message AckStudentRec
{
 optional int32 Ret = 3 ;
 repeated StudentRecData DataItems = 6 ; 
}

AckIdx="6"  指明把数据写到 AckStudentRec的  DataItems 项  .AckSubIdx="2" 标明写到optional int32 Mark = 2 ;  这是个proto的嵌套协议。  当然如果不是嵌套的  AckSubIdx项不用填。

 

   <WhereInfo WhereStr="and RecTime >= '%s' " MsgValueIdx= "2"/> 
   <WhereInfo WhereStr="and a.CurriculumID <=%s  and a.CurriculumID = b.CurriculumID " MsgValueIdx= "1"/> 

  所有的WhereStr会联起来,组合成一个条件语句,即使只有一行条件,前面也要以 and 关键字开头,因为系统默认前面有个 1=1 。MsgValueIdx 消息变量的索引,将其按类型拼成Where条件,变量会自动转成字符串。也就是说,将请求消息转成字符串,并替换 WhereStr 串中的 %S

   <GroupInfo>StudentName</GroupInfo>  有些select语句是要按一些字段进行分组的,这些分组信息就写在这里。当然如果你是多个表关联查询的话,还要指出表名或者别名。多字段以逗号分开。

每一个消息中,只能存在一个GroupInfo OrderInfo 也是一样的。

   <OrderInfo>a.CurriculumID , a.Mark desc</OrderInfo>   这里列出查询结果是按那几个字段进行排序。

 

这章会把xml讲完,待 续.....


 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值