~ ~ 灿烂微笑的Perl世界 ~ ~   灿烂微笑的Perl世界
http://www.skybamboo.com/perl 加入收藏
 
= 我的Perl作品 =

PowerTools建站工具1.3
  released 2001-02-18

   { 访问统计 }
   { 讨论板 }
   { Session }
   { CSV导入导出 }
   { 数据库管理核心 }
   历史更新
   版权声明
   已知的Bug
   新版下载

PAB通讯录 1.0
  released 2000-11-24
   历史更新
   版权声明
   已知的Bug
   新版下载

· Classguest留言簿 4.1
  released 2000-08-11
   历史更新

交流园地

·大家都来讨论
·订阅本站的新闻
·Contect Me

 
灿烂微笑的Perl世界 -> 我的作品 -> PowerTools -> 数据库管理核心

PowerTools -> DBM数据库管理核心

用dbm文件实现关系型数据库,函数调用参数类似SQL语言,每一段代码都是精心编制,二次开发方便快速。

使用说明

########### MDBSQL
########### 如果失败,返回(undef,原因字串)

建立新表

用法: &MDBSQL('NEWTABLE',<表名>,<结构列表的引用>);
说明: ID域自动添加,可以不在结构列表中指定
例子: &MDBSQL('NEWTABLE','table1',['name','age']); #建立新表‘table1’,含name和age域

删除表

用法: &MDBSQL('DELETABLE',<表名>);

改变表结构

用法: &MDBSQL('STRUCTURE',<表名>,<结构列表的引用>);
说明: ID域自动添加,可以不在结构列表中指定
表的内容会随着新的结构作相应的改变
域的删除将会是永久的
例子: &MDBSQL('STRUCTURE','table1',['name','hobby','age']); #在表“table1”中添加“age”域

取所有表的结构

用法: &MDBSQL('GETLIST');
说明: 返回值为HASH表的引用,key是表名,value是表结构的引用。

添加或更新记录

用法: &MDBSQL('INSERT',<表名>,['AUTOUPDATE' | 'ONLYUPDATE' | 'NOUPDATE' | 同名ID处理函数的引用],<插入/更新记录的结构表引用>,<记录数据的引用>,[记录数据的引用],...);
说明: 插入/更新记录的结构表引用中必须要指定ID域
'AUTOUPDATE':如果ID相同的记录存在,覆盖它,缺省值
'ONLYUPDATE':仅仅更新记录,如果没有ID相同的记录存在,不添加
'NOUPDATE' :仅仅添加记录,不进行记录更新,如果有ID相同的记录存在,不更新
同名ID处理函数的引用:见例子
插入/更新记录的结构表引用 和 记录数据的引用 必须对应
例子: &MDBSQL('INSERT','table1',undef,['ID','name','age'],[61099116,'rny',18]); # 在‘table1’中插入记录, 如果存在则更新
&MDBSQL('INSERT','table1','AUTOUPDATE',['ID','name','age'],[61099116,'rny',18]); # 同上
例子: $if_exists=sub if_exists {
my ($existIDref)=@_;
${$existIDref}++; # try ID number +1, IMPORTANT: only for number ID
return 1; # try the new ID
# return undef; # or insert failed return a error message
}
&MDBSQL('INSERT','table1',$if_exists,['ID','name','age'],[61099116,'rny',18]); # insert a record to table 'table1', if 61099116 exists try 61099117, and so on...
例子: &MDBSQL('INSERT','table1',$if_exists,['ID','name','age'],[61099101,'rny',18],[61099201,'wx',19],[61099224,'longman',15]); # add three record one time, more efficiently than MDBSQL func three times
例子: @data=(['ID','name','age'],[61099101,'rny',18],[61099201,'wx',19],[61099224,'longman',15]);
&MDBSQL('INSERT','table1',$if_exists,@data); # same as above, another way to write

选取记录(也可更新或删除记录)

用法: &MDBSQL('SELECT',<表名>,<选取的域列表引用>,[排序/筛选函数引用],[选取记录添加到返回列表的函数引用],[排序/选择函数参数],[选取记录添加到返回列表的函数参数]);
说明: 通过SELECT调用,可以对表实现各种复杂的操作,甚至包括删除指定的记录。
SELECT调用返回一个列表的引用,其列表的每一个元素是一个HASH表的引用,该HASH表包含了记录的数据
如果 排序/筛选函数 或 选取记录添加到返回列表的函数 是undef,它们将使用缺省的函数:
当使用缺省的函数时,
排序/筛选函数参数 格式为:(['sort'|'reverse'],<开始的记录号>,<选取的记录数>,[排序关键字段列表],[第一个关键字的排序函数引用],[第二个关键字的排序函数引用]...)
选取的记录数 若为-1则选取其后所有的。
例:['reverse',($page-1)*$perpage,$perpage,['age','ID'],sub {@_[0] <=> @_[1]}] #排序函数若为undef,将按字符排序
指定排序的方向:['sort'|'reverse']
选取记录添加到返回列表的函数参数 格式是:[正则表达式,正则表达式...]
正则表达式的顺序应和 选取的域列表引用 相匹配,满足正则表达式的记录将被选取
排序/筛选函数 和 选取记录添加到返回列表的函数 也可由用户自定义,先介绍一个有用的函数“filldata”
“filldata”用法:&filldata(<记录的字串_记录的内部形式>,[需要选取的域列表]);
“filldata”将记录字串解析为HASH表,并返回其引用,该HASH表中含有 需要选取的域列表 所制订的域,缺省时所有的域
自定义排序/筛选函数 参数:(<数据表的引用>,<“filldata”函数的引用>,<排序/筛选函数参数>)
返回值:经过排序或筛选的ID值的列表
选取记录添加到返回列表的函数 参数:(<记录号>,<记录的ID>,<数据表的引用>,<“filldata”函数的引用>,<选取的域列表>,<记录的字串引用>,<选取记录添加到返回列表的函数参数>)
返回值:无
例子:
User defined Sort : The user's SORT function is MDBSQLed like: function_name($DATAref,$filldataref,@other_arguments);
: see--> function_name(<a data HASH reference>,<the reference of 'filldata' function mentioned just now>,[other arguments import in 'MDBSQL' function])
: And should return a list of sorted IDs;
Function Example1 : sub mysort1 { #simply sort the ID
: my ($DATAref,$filldataref,@other_arguments)=@_;
: return sort keys %$DATAref;
: }
Function Example2 :
:
User defined Select: The user's SELECT function is MDBSQLed like: function_name&$whichref( $i, $IDs[$i], \%DATA, \&filldata, $fieldref, \@RECORD, @whichref_arguments );
: see--> function_name(<line number>,<ID>,<the data HASH reference>,<the reference of 'filldata' function >,<the reference of the required field list>,<reference to a list which Content Result>,[other arguments import in 'MDBSQL' function])
Function Example1 : sub myselect1 { #simply select all record
: my ( $i, $ID, $DATAref, $filldataref, $fieldref, $RECORDref, @whichref_arguments )=@_;
: my $FIELDref=&$filldataref(\${$DATAref}{$ID},$fieldref);
: ${$FIELDref}{'ID'}=$ID;
: push (@$RECORDref,$FIELDref) if(!defined(@other_arguments) or (@other_arguments[0]<=$i && @other_arguments[1]>=$i) );
: }
Function Example2 : my $sortref=sub {
: my ($DATAref,$filldataref,$sortparam)=@_;
: if(exists ${$DATAref}{$sortparam}) {
: return ($sortparam);
: }else {
: return ();
: }
: };
: my @data=@{ &MDBSQL('SELECT',$sessiontable,['ip','lastvisit','key'],$sortref,undef,$sid,undef ) };
: return 0 unless(@data); #find required data, return 0 if not found
_____________________________
Example : @data=@{ &MDBSQL('SELECT','table2',['name','hobby']) }; # get name and hobby from all records, sorted by ID (it is default sort)
or : @data=@{ &MDBSQL('SELECT','table2',['name','hobby'],\&mysort1,\&myselect1) }; #of course the two sub 'mysort1' and 'myselect1' should be included
: #then simply print @data
: while (scalar(@data)) {
: while(($ID,$value)=each(%{@data[0]})) {
: print $ID.'->'.$value."\n";
: }
: shift(@data);
: }
Example :

删除表的记录

用法: &MDBSQL('DELETE',<表名>,[要删除的ID值的列表引用],...);
例子: &MDBSQL('DELETE','table1',[61099116,61099117,61099213]); # 删除ID值为61099116,61099117,61099213的三条记录
&MDBSQL('DELETE','table1',[61099116],[61099117,61099213]); # 同上

统计表中的记录个数

用法: &MDBSQL('COUNT',<表名>);
例子: $recordscount=&MDBSQL('COUNT','table'); # 统计表中的记录个数

根据ID判断记录是否存在

用法: &MDBSQL('EXISTS',<表名>);
例子: if(&MDBSQL('COUNT','table1','name1')) {print "exist";}; # 如果ID:'name1'在表'table1'中存在,打印 "exists"

取遍表中所有记录

用法: &MDBSQL('GETALL',<表名>,<处理函数的引用>);
说明: 处理函数的参数:(<ID>,<记录字串>)
例子: &MDBSQL('GETALL','table2',sub {print "${@_[0]}->${@_[1]}\n";}); #打印表的内容

例子:

Copyright© RNY Studio 2000-2001. All rights reserved. Revised: 2001-05-04.