在数据库中检索数据和向拨号上网用户分配ip地址的方法

文档序号:6586016阅读:256来源:国知局
专利名称:在数据库中检索数据和向拨号上网用户分配ip地址的方法
所属领域本发明涉及一种在数据库中快速检索数据和向拨号上网用户快速分配IP地址的方法,确切地说,涉及一种在数据库中使用链表检索数据的方法,以及如何向拨号上网的用户快速分配空闲的IP地址的方法,属于数据库的应用技术领域。
例如,呼叫管理中心(CMC)是一用于对拨号上网的端口进行批发、管理的系统,其中有一功能是动态分配IP地址,以及把所有的IP地址统一管理起来,在用户上网时动态地分配一个IP地址给其使用。此时,如要检索数据(即IP地址)时,必须满足以下两点1、检索的条件是没有被占用的IP地址,且每次只需检索出一个IP地址,即一条记录;而当该IP地址被检索出来以后,将被分配给用户使用,就不再符合被检索的条件。这符合上面所说的前一种情况。由于呼叫管理中心希望能够实时分配空闲的IP地址给用户使用,所以其对检索的速度要求较高;如采用游标,肯定不能满足要求。2、由于线路延迟等多种不确定的因素,当一个IP地址被释放后,并不能确实保证该IP地址已经没有用户在使用,即其真正处于空闲状态,而此时如将该IP地址再次被分配出去,将不能正常工作,故应尽可能地分配空闲时间最长的IP地址。这也是使用游标时不能实现的。
本发明的另一目的是提供一种向拨号上网的用户快速分配空闲的IP地址的方法,以使呼叫管理中心对于拨号上网的用户和空闲的IP地址的管理更加高效。
本发明在数据库中使用链表检索数据的方法是这样实现的包括有下列步骤(1)首先,根据符合条件的数据(或记录)的状况生成两个数据库表链表和节点表,以建立链表结构;其中链表的结构是由下述四个字段所组成主键表示该一条链的代号,链表头表示该链的第一个节点的编号,链表尾表示该链的最后一个节点的编号,本链表的节点数表示该链所拥有的节点总数;其中节点表的结构是由下述四个字段所组成本节点编号表示该节点的编号,下一个节点表示该节点之后的下一个节点的编号,本节点所属链表示该节点属于哪一条链的代号,数据表示该节点的数据数值;(2)检索数据时,只需取出链表头节点即可,同时,执行下列操作修改链表,将链表头改为原来的第二个节点,即将第一个节点从链表中去掉,并将链表的节点总数减1;(3)当有满足条件的数据需要加入该链表时,则将其插入链表尾,具体操作是在节点表中是将链表尾节点从指向空改为指向新插入的数据所处于的节点编号,在链表中是取出链表尾,将该链表尾改为指向上述新插入的数据所处于的节点;再将链表的节点总数加1。
上述两个数据库表中,除了链表中的“本链表的节点数”中的数据为包括整数类型和浮点类型的数值类型以外,其余各字段可以为任何数据类型。
上述两个数据库表中的8个组成部分均为不允许空值的数据。
当上述被检索的数据,还需在之后重新加入到原数据库时,可将上述(2)、(3)两个步骤合并成一个步骤(2)取出当前的链表头,同时更新链表,将链表头(first)改为原来的第二个节点,并将取出的该链表头移至链表尾。
本发明向拨号上网的用户快速分配空闲的IP地址的方法是这样实现的包括有下列步骤(1)首先,生成两个数据库表IP地址段信息表和地址项信息表,以建立链表结构;其中IP地址段信息表的结构是由下述四个字段所组成本IP地址段的编号表示该IP地址段的代号,空闲地址链表头表示该IP地址段的第一个空闲地址的编号,空闲地址链表尾表示该IP地址段的最后一个空闲地址的编号,本IP地址段尚未分配出去的IP地址的数量表示该IP地址段所拥有的尚未分配出去的空闲IP地址的总数;其中地址项信息表的结构是由下述三个字段所组成本IP地址所属地址段的编号,空闲的IP地址,下一个空闲的IP地址。
(2)用户在拨号上网时,需要一个ip地址,在检索该ip地址时,只需取出链表头节点即可,同时,执行下列操作修改链表,将链表头改为原来的第二个节点,即将第一个节点从链表中去掉,并将链表的节点总数减1;(3)当用户下网时,将其所使用的该ip地址释放,并将该ip地址插入链表尾,具体操作是在节点表中,将链表尾节点从指向空改为指向新插入的ip地址所处于的节点编号;在链表中取出链表尾,并将该链表尾改为指向上述新插入的ip地址所处于的节点;再将链表的节点总数加1。
上述IP地址段信息表中的“本IP地址段的编号”与地址项信息表中的“本IP地址所属地址段的编号”两者的字母代号是完全相同的,以标明上述两个表之间是属于同一个链表的主从关系。
上述两个数据库表中的“本IP地址段的编号(bLock_id)”和“本IP地址段尚未分配出去的IP地址的数量(remain_ip)”的数据类型均为整数,其余的5个组成部分的数据类型均为4比特的二进制数。
上述两个数据库表中的7个组成部分均为不允许空值的数据。
“链表”是一种在程序设计中经常使用的数据结构,本发明的方法是在数据库中利用该“链表”数据结构,把符合相关检索条件的各个数据进行顺序排列而连成一条数据“链”。当检索数据时,只需从该链表头取出所在的数据,之后再把处理过的数据或其他满足相关条件的数据或记录重新放回到链表尾,这样既可以迅速定位一条数据或记录,又可实现顺序检索;避免了使用效率较低的游标,提高了查找效率。所以,本发明使用链表在数据库中检索数据是一种颇有成效的快速检索方法。
利用本发明“链表”结构的方法,可以在数据库中迅速定位空闲的IP地址,并能将用户释放的IP地址放回到链表尾,实现顺序检索,保证拨号上网用户的及时应用,满足了CMC系统的要求。
图2是本发明的链表结构中节点表的示意图。
图3是应用本发明的链表进行检索的实施例示意图。
图4是利用链表结构动态分配IP地址所需建立的地址段信息表的示意图。
图5是利用链表结构动态分配IP地址所需建立的地址项信息表的示意图。
上述两个数据库表中,除了链表中的“本链表的节点数”中的数据可为包括整数类型和浮点类型的数值类型以外,其余各字段可以为任何数据类型。而且,该两个数据库表中的8个组成部分均为不允许空值的数据。
下面结合图3介绍本发明的一个实施例。
首先,假设初始状态有三条记录符合检索条件,将其生成一条链表,具体操作的程序语句如下insert tbl_chain(chain_id,first,last,notenum)values(1,1,3,3)注解在链表(父表)中插入一条记录,表示一条链表,该链表的编号为1,第一个节点的编号为1,最后一个节点的编号为3,总共有3个节点。insert tbl_chainote(note_id,next,chain_id,data)values(1,2,1,100)
注解在节点表(子表)中插入第1个节点,编号为1,下一个节点的编号为2,从属于编号为1的链表,数据值为100。insert tbl_chainnote(note_id,next,chain_id,data)values(2,3,1,100)注解在节点表(子表)中插入第2个节点,编号为2,下一个节点的编号为3,从属于编号为1的链表,数据值为100。insert tbl_chainnote(note_id,next,chain_id,data)values(3,null,1,100)注解在节点表(子表)中插入第3个节点,编号为1,下一个节点的编号为空,即没有下一个节点,从属于编号为1的链表,数据值为100,上面的null表示空。
在检索数据时,只需取出链表头节点即可假设该链表的编号(id)为1,所要执行的sql语句为修改父表将链表头(first)改为原来的第二个节点,并将链表的节点总数(notenum)减1declare @first int/*定义一个变量@first,用于保存被检索出来的数据*/select @first=first from tbl_chain where chain_id=1/*取出当前的链表头*/update tbl_chain set first=(select next from tbl_chainnote wherenote_id=@first),notenum=notenum-1 where chain_id=1/*并将父表中的链表头指向第二个节点,即将第一个节点从链表中去掉,并将节点数减1*/return @first/*返回检索出来的数据,即将该数据传送给调用者*/假设该被检索的数据项已经使用完毕,如需重新将其插入链表尾时,则进行下列操作假设该链表的编号(id)为1,要插入的节点的编号(id)为4,数据为100,则将子表中的链表尾节点由指向空改为指向新插入的第4个节点,并将父表中的链表尾(last)也指向第4个节点,以及将该链表的节点总数(notenum)加1declare @last int/*定义一个变量@last,用于保存当前的链表尾*/select @last=last from tbl_chain where chain_id=1/*取出当前的链表尾*/update tbl_chain set last=4,notenum=notenum+1 where chain_id=1/*并将父表中的链表尾(last)也指向第4个节点,以及将该链表的节点总数(notenum)加1*/update tbl_chainnote set next=4 where note_id=@last/*将子表中的链表尾节点由指向空改为指向新插入的第4个节点*/上述使用链表检索数据的方法步骤中有一从链中增加、删除链表节点的过程,是适用于下列情况当数据项被检索后,暂时不符合相关的检索条件,故先将其从链表中去掉,待到该数据项符合条件时再添加上。如果该数据项被检索后,还是符合相关的检索条件时,则可将上面(2)、(3)两个步骤合二为一,不需要从链中将该检索到的数据所在的节点删除,只需将该节点从链表头移到链表尾即可。其主要是省略了对链表节点数作±1的操作,具体操作步骤如下(2)取出当前的链表头,同时更新链表,将链表头(first)改为原来的第二个节点,并将取出的该链表头移至链表尾。declare @first int,@last int/*定义两个变量@first和@last,前者用于保存被检索出来的数据,后者用于保存当前的链表尾*/select @first=first,@last=last from tbl_chain where chain_id=1/*取出当前的链表头,更新链表,将链表头移至链表尾*/update tbl_chain set first=(select next from tbl_chainnote wherenote_id=@first),last=@first where chain_id=1/*更新链表头为第二个节点,并将父表中的链表尾(last)也指向原来的第1个节点*/update tbl_chainnote set next=@first where note_id=@lastreturn @first/*将子表中的链表尾节点由指向空改为指向原来的第1个节点*/通过上述方法,可以在数据库中建立链表,快速地检索数据,并实现顺序检索。
本发明又是一种向拨号上网的用户快速分配空闲的IP地址的方法,包括有下列步骤(1)首先,生成两个数据库表IP地址段信息表(又称父表,参见图4)和地址项信息表(又称子表,参见图5),以建立链表结构;其中IP地址段信息表的结构是由下述四个部分所组成本IP地址段的编号(列名block_id)表示该IP地址段的代号,空闲地址链表头(列名first_ip)表示该IP地址段的第一个空闲地址的编号,空闲地址链表尾(列名last_ip)表示该IP地址段的最后一个空闲地址的编号,本IP地址段尚未分配出去的IP地址的数量(列名remain_ip)表示该IP地址段所拥有的尚未分配出去的空闲IP地址的总数;其中地址项信息表的结构是由下述三个部分所组成本IP地址所属地址段的编号(列名block_id),空闲的IP地址(列名ip_addr),下一个空闲的IP地址(列名next_id);(2)用户在拨号上网时,需要一个ip地址,在检索该ip地址时,只需取出链表头节点即可,同时,执行下列操作修改链表,将链表头改为原来的第二个节点,即将第一个节点从链表中去掉,并将链表的节点总数减1;(3)当用户下网时,将其所使用的该ip地址释放,并将该ip地址插入链表尾,具体操作是在节点表中,将链表尾节点从指向空改为指向新插入的ip地址所处于的节点编号;在链表中取出链表尾,并将该链表尾改为指向上述新插入的ip地址所处于的节点;再将链表的节点总数加1。
需要说明的是,上述IP地址段信息表中的“本IP地址段的编号”(列名block_id)与地址项信息表中的“本IP地址所属地址段的编号”(列名block_id)两者的字母代号是完全相同的,通过该block_id标明上述两个表之间是属于同一个链表的主从关系,也指明了两者共同表示的链表的编号。
上述两个数据库表中的“本IP地址段的编号(block_id)”和“本IP地址段尚未分配出去的IP地址的数量(remain_ip)”的数据类型均为整数(int),其余的5个组成部分的数据类型均为4字节的二进制数(binary(4))。且两个数据库表中的7个组成部分均为不允许空值的数据。
在IP地址段信息表(tbl_ipblock)中,每一条记录都是表示一个地址段,相当于一条链表。该链表所对应的所有IP地址(节点),均在地址项信息表(tbl_iplist)中,且由于空闲的IP地址(ip_addr)本身即为该节点的数据值,故与前述的链表结构比较,可以省去data字段。
下面介绍应用该方法快速检索IP地址的一个实施例,以便更好地说明之初始化时,先将该地址段的所有地址都添加到IP地址段信息表(父表,tbl_ipblock)中,并建好一条链表。
1、当用户申请IP地址时,只要将链表头从第一个地址分离出来即可。假设该地址段的编号(block_id)是1,所执行的操作为取出链表中的第一个地址,修改父表中的链表头为第二个地址,将本地址段信息表tbl_ipblock中尚未分配出去的ip地址数目(remain_ip)减1declare @first_ip binary(4)/*定义一个变量@first_ip,用于保存被检索出来的ip地址*/select @first_ip=first_ip from tbl_ipblock where block_id=1/*取出链表中的第一个地址,保存在变量@first_ip中*/update tbl_ipblock set first_ip=(select next_ip from tbl_iplist whereblock_id=@first_ip),remain_ip=remain_ip-1 where block_id=1/*修改父表中的链表头为第二个地址,将本地址段信息表tbl_ipblock中尚未分配出去的ip地址数目(remain_ip)减1*/2、当用户下网而释放ip地址时,因为该地址在IP地址段信息表(tbl_ipblock)中已经存在,只需将其追加到链表尾即可。假设该地址段的block_id是1,新释放的的ip地址为0x11111111,所执行的操作为原来的链表尾所指向的下一个地址为空,即没有下一个地址,现在将其下一个地址指向新释放的ip地址,而新释放的ip地址所指向的下一个地址为空,并且将父表中的链表尾指向新释放的ip地址;再将本地址段信息表tbl_ipblock中尚未分配出去的ip地址数目(remain_ip)加1declare @last_ip binary(4)/*定义一个变量@last_ip,用于保存该链表中当前链表尾的ip地址*/select @last_ip=last_ip from tbl_ipblock where block_id=1/*取出该链表中当前链表尾的ip地址,保存在变量@last_ip中*/update tbl_ipblock set last_ip=0x11111111,remain_ip=remain_ip+1 whereblock_id=1/*将父表中的链表尾(last_ip)指向新释放的ip地址;将尚未分配出去的ip地址数目(remain_ip)加1*/update tbl_iplist set next_ip=0x11111111 where ipaddr=@last_ip/*将子表中的下一个空闲的ip地址(next_ip)改为新释放的ip地址*/这样,就可实现IP地址的快速检索,并且满足呼叫管理中心CMC系统的有关要求。
本发明的方法已经在申请人的接入服务器中作了长时间的试验运行,完全实现了发明目的,运行效果良好。
权利要求
1.一种在数据库中使用链表检索数据的方法,其特征在于包括有下列步骤(1)首先,根据符合条件的数据的状况生成两个数据库表链表和节点表,以建立链表结构;其中链表的结构是由下述四个字段所组成主键表示该一条链的代号,链表头表示该链的第一个节点的编号,链表尾表示该链的最后一个节点的编号,本链表的节点数表示该链所拥有的节点总数;其中节点表的结构是由下述四个字段所组成本节点编号表示该节点的编号,下一个节点表示该节点之后的下一个节点的编号,本节点所属链表示该节点属于哪一条链的代号,数据表示该节点的数据数值;(2)检索数据时,只需取出链表头节点即可,同时,执行下列操作修改链表,将链表头改为原来的第二个节点,即将第一个节点从链表中去掉,并将链表的节点总数减1;(3)当有满足条件的数据需要加入该链表时,则将其插入链表尾,具体操作是在节点表中将链表尾节点从指向空改为指向新插入的数据所处于的节点编号,在链表中是取出链表尾,将该链表尾改为指向上述新插入的数据所处于的节点;再将链表的节点总数加1。
2.根据权利要求1所述的在数据库中使用链表检索数据的方法,其特征在于上述两个数据库表中,除了链表中的“本链表的节点数”中的数据为包括整数类型和浮点类型的数值类型以外,其余各字段可以为任何数据类型。
3.根据权利要求1所述的在数据库中使用链表检索数据的方法,其特征在于上述两个数据库表中的8个组成部分均为不允许空值的数据或记录。
4.根据权利要求1所述的在数据库中使用链表检索数据的方法,其特征在于当上述被检索的数据,还需在之后重新加入到原数据库时,可将上述(2)、(3)两个步骤合并成一个步骤(2)取出当前的链表头,同时更新链表,将链表头改为原来的第二个节点,并将取出的该链表头移至链表尾。
5.一种向拨号上网的用户快速分配空闲的IP地址的方法,其特征在于包括有下列步骤(1)首先,生成两个数据库表IP地址段信息表和地址项信息表,以建立链表结构;其中IP地址段信息表的结构是由下述四个字段所组成本IP地址段的编号表示该IP地址段的代号,空闲地址链表头表示该IP地址段的第一个空闲地址的编号,空闲地址链表尾表示该IP地址段的最后一个空闲地址的编号,本IP地址段尚未分配出去的IP地址的数量表示该IP地址段所拥有的尚未分配出去的空闲IP地址的总数;其中地址项信息表的结构是由下述三个字段所组成本IP地址所属地址段的编号,空闲的IP地址,下一个空闲的IP地址;(2)用户在拨号上网时,需要一个ip地址,在检索该ip地址时,只需取出链表头节点即可,同时,执行下列操作修改链表,将链表头改为原来的第二个节点,即将第一个节点从链表中去掉,并将链表的节点总数减1;(3)当用户下网时,将其所使用的该ip地址释放,并将该ip地址插入链表尾,具体操作是在节点表中,将链表尾节点从指向空改为指向新插入的ip地址所处于的节点编号;在链表中取出链表尾,并将该链表尾改为指向上述新插入的ip地址所处于的节点;再将链表的节点总数加1。
6.根据权利要求5所述的向拨号上网的用户快速分配空闲的IP地址的方法,其特征在于上述IP地址段信息表中的“本IP地址段的编号”与地址项信息表中的“本IP地址所属地址段的编号”两者的字母代号是完全相同的,以标明上述两个表之间是属于同一个链表的主从关系。
7.根据权利要求5所述的向拨号上网的用户快速分配空闲的IP地址的方法,其特征在于上述两个数据库表中的“本IP地址段的编号”和“本IP地址段尚未分配出去的IP地址的数量”的数据类型均为整数,其余的5个组成部分的数据类型均为4比特的二进制数。
8.根据权利要求5所述的向拨号上网的用户快速分配空闲的IP地址的方法,其特征在于上述两个数据库表中的7个组成部分均为不允许空值的数据。
全文摘要
一种在数据库中检索数据和向拨号上网用户分配IP地址的方法,其步骤为先将符合条件的数据生成两个数据库表链表和节点表,建立链表结构;其中链表由四个字段组成表示该一条链的代号的主键,表示该链第一个节点的链表头,表示该链最后一个节点的链表尾,表示该链所有节点总数的本链表的节点数;节点表也由四个字段组成本节点编号,下一个节点,本节点所属链,数据。检索数据时,只需取出链表头节点即可,同时,修改链表将链表头改为原来的第二个节点,将链表的节点总数减1。有数据要加入该链表时,则将其插入链表尾,将链表尾改为指向新插入数据所处的节点;再将链表的节点总数加1。该方法可用于快速分配IP地址,供用户拨号上网时使用。
文档编号G06F17/30GK1400549SQ01123949
公开日2003年3月5日 申请日期2001年8月7日 优先权日2001年8月7日
发明者李传峰, 苏玉涛 申请人:华为技术有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1