当前位置:首页>网络学院>程序开发>CGI/Perl教程>文章内容

尝试用sql查询语句操纵普通文本数据库

[ 来源: | 作者: | 时间:2007-07-16 | 收藏 | 推荐 ] 【


use lib "."; # If NT,use lib "path-to-jtdb_directory";
use JTDB "1.01";
$main::split = ","; # Notice!, It's necessary! must be $main::split,
# Records split by ","
my $db = "<path-to>/dbname";
@main::recordNames = &db_connect($db); # Necessary! must be @main::recordNames,
# Get RecordNames from db-info file
my $sqlStr = "SELECT * FROM $db";
my @resoult = &executeStr($sqlStr);
my $line;
foreach $line (@resoult)
{
my $keys;
foreach $keys (keys %$line)
{
print $keys." : ".$line->{$keys}." ";
}
print "<br>\n";
}

http://www.it55.com/

---------------------------

免费资源www.it55.com

用这样简单的方式操作文本数据,其实也不是难事儿,看看这个模块吧。。

http://www.it55.com/

http://ub4k91.chinaw3.com/download/jtdb.htm

免费资源www.it55.com

JTDB v1.01
IT资讯之家 www.it55.com

#-------------------------------------------------------------------
package JTDB; http://www.it55.com/

# ----------------------------------------------------------------------
# 程序名称:平面文本SQL查询模块,JTDB V1.01
#
# 作者:阿恩 (Aren.Liu) / 成都金想网络技术有限公司
#
# 电话:028-4290153
#
# 传呼:96968-223046
#
# 一妹:boyaren@sina.com
#
# 主叶:http://www.justake.com http://jtbbs.nt.souying.com
#
# -----------------------------------------------------------------------
# 版权所有 成都金想网络技术有限公司 来趣山庄
# Copyright (C) 2000 Justake.com, JinXiang Co.,Ltd. All Rights Reserved
# -----------------------------------------------------------------------
# V 1.01 2000/12/27
# 实现 create_db功能
# V 1.00 2000/12/26

www.it55.com


# 设想并实现平面文本数据库SQL查询最基本功能
# 可实现 select,insert,delete,update 基本功能
# ------------------------------------------- 请保留以上版权 ------------ http://www.it55.com/

require 5.002;

sflj www.it55.com kg^&fgd

use strict;
use vars qw(@ISA @EXPORT $VERSION);
use Exporter;

www.it55.com在线教程

$VERSION = '1.01';
$main::txt = ".txt"; vd;k;l www.it55.com rdfg

@ISA = qw(Exporter);

www.it55.com

@EXPORT = qw
(
&db_connect
&create_db
&executeStr
&readtxtfile
&writetxtfile
);
#------------------------------------------------
sub create_db
{
my ($jtdb,$recordNames) = @_; IT资讯之家 www.it55.com

my $jtdb_info = $jtdb."_info".$main::txt;
my $dbname = $jtdb.$main::txt; it55.com

?ify("数据库已经存在,请选择其他数据库,数据库创建失败!",1) if (-e $dbname);

45398 www.it55.com it55学习IT知识,享受IT生活 4dfkjn

open (JTDB,">$dbname");
close(JTDB);

it55.com

open (JTDBINFO,">$jtdb_info");
print JTDBINFO $recordNames."\n";
close(JTDBINFO); vd;k;l www.it55.com rdfg

return (1);
}
#------------------------------------------------
sub db_connect
{
#my $dbname = substr($_[0],0,length($_[0])-4);
my $dbname = $_[0];
?ify("不能找到数据库信息文件,数据库连接失败!",1) if (!(-e $dbname."_info".$main::txt));
my @jtdb_info = &readtxtfile($dbname."_info".$main::txt);
chomp(@jtdb_info);
?ify("数据库信息文件已经损坏或丢失,连接数据库失败!",1) if ($jtdb_info[0] eq "");

www.it55.com在线教程

my @keys = split(/$main::split/,$jtdb_info[0]);
my $key;
foreach $key (@keys)
{
$key =~ s/^\s+//g;
$key =~ s/\s+$//g;
}
return @keys;
}
#------------------------------------------------
sub db_save
{
my ($jtdb,@toSave) = @_; 45398 www.it55.com it55学习IT知识,享受IT生活 4dfkjn

my $dbname = $jtdb.$main::txt;
my $just = $jtdb.".lock";

IT资讯之家 www.it55.com

while(-f $just)
{select(undef,undef,undef,0.1);} #锁文件
open(LOCKFILE,">$just"); it55.com

open (FD,">$dbname");
my $line;
foreach $line (@toSave)
{
foreach (@main::recordNames)
{
print FD $line->{$_}.$main::split;
}
print FD "\n";
}
close(FD); sflj www.it55.com kg^&fgd

close(LOCKFILE);
unlink($just);
return (1);
}
#------------------------------------------------
sub executeStr
{
my @sqlcmds;
my $sqlcmd;

www.it55.com在线教程

grep{/\s*(\S+)\s+(.*)/ and $sqlcmd = lc($1);} @_;

it55.com

if ($sqlcmd eq "select")
{
grep{/\s*(SELECT)\s+(\S+\s*(\s*\,+?\s*\S+)*)\s+FROM\s+(\S+)((\s+WHERE\s+(.*)\s*)*)/i and $sqlcmd = lc($1);@sqlcmds = ($2,$4,$7);} @_;
&sql_select(@sqlcmds);
}
elsif ($sqlcmd eq "insert")
{
grep{/\s*(INSERT)\s+INTO\s+(\S+)((\s+\((\s*\S+\s*(\s*\,+?\s*\S+)*\s*)+?\))*?)\s+VALUES\s*\((.*)\)\s*/i and $sqlcmd = lc($1);@sqlcmds = ($2,$5,$7);} @_;
&sql_insert(@sqlcmds);
}
elsif ($sqlcmd eq "delete")
{
grep{/\s*(DELETE)\s+FROM\s+(\S+)\s+WHERE\s+(.*)\s*/i and $sqlcmd = lc($1);@sqlcmds = ($2,$3);} @_;
&sql_delete(@sqlcmds);
}
elsif ($sqlcmd eq "update")
{
grep{/\s*(UPDATE)\s+(\S+)\s+SET\s+(.*)\s+WHERE\s+(.*)\s*/i and $sqlcmd = lc($1);@sqlcmds = ($2,$3,$4);} @_;
&sql_update(@sqlcmds);
}
else
{?ify("你输入的数据库操作语句不正确,或目前的版本尚未支持,请检查!");}
} IT资讯之家 www.it55.com
#------------------------------------------------
sub sql_update
{
my ($jtdb,$set,$where) = @_;

it55.com

my @resoult = &executeStr("SELECT * FROM $jtdb"); vd;k;l www.it55.com rdfg

if ($where ne "")
{
my $key = '';
foreach $key (@main::recordNames)
{
$where =~ s/$key/\$_->{'$key'}/ig;
}
}else {?ify("你没有提供修改条件,请用 WHERE 语句提供!");} 免费资源www.it55.com

if ($set ne "")
{
my $key = '';
foreach $key (@main::recordNames)
{
$set =~ s/$key\s*\=\s*(\'+?|\"+?)(.*)(\'+?|\"+?)\s*(\,*?)/\$_->{'$key'}\=$1$2$3\;/ig;
}
}else {?ify("你没有提供修改项目,请用 SET 语句提供!");} 45398 www.it55.com it55学习IT知识,享受IT生活 4dfkjn

foreach (@resoult)
{
if (eval($where))
{
eval($set);
}
}

vd;k;l www.it55.com rdfg

&db_save($jtdb,@resoult);

http://www.it55.com/

return (1);
}
#------------------------------------------------
sub sql_delete
{
my ($jtdb,$where) = @_; 免费资源www.it55.com

my @resoult = &executeStr("SELECT * FROM $jtdb");

vd;k;l www.it55.com rdfg

if ($where ne "")
{
my $key = '';
foreach $key (@main::recordNames)
{
$where =~ s/$key/\$_->{'$key'}/ig;
}
}else {?ify("你没有提供删除条件,请用 WHERE 语句提供!");} vd;k;l www.it55.com rdfg

my @return = grep(eval($where)==0,@resoult);

45398 www.it55.com it55学习IT知识,享受IT生活 4dfkjn

&db_save($jtdb,@return); IT资讯之家 www.it55.com

#my $just = $jtdb.".lock";

IT资讯之家 www.it55.com

#while(-f $just)
#{select(undef,undef,undef,0.1);} #锁文件
#open(LOCKFILE,">$just"); it55.com

#open (FD,">$jtdb");
#my $line;
#foreach $line (@return)
#{
# foreach (@main::recordNames)
# {
# print FD $line->{$_}.$main::split;
# }
# print FD "\n";
#}
#close(FD);

vd;k;l www.it55.com rdfg

#close(LOCKFILE);
#unlink($just); www.it55.com

return (1);
}
#------------------------------------------------
sub sql_insert
{
my ($jtdb,$keys,$values) = @_;

vd;k;l www.it55.com rdfg

?ify("找不到要操作的数据库,操作失败!") if (!(-e $jtdb));

sflj www.it55.com kg^&fgd

my @values = split(/\,/,$values);
my $addLine;
if ($keys ne "")
{
#my @main::recordNames = split(/$main::split/,$main::recordNames);
my @keys = split(/\,/,$keys);
my $i;
my @addLine;
for ($i=0;$i<@main::recordNames ;$i++)
{
my $n;
for ($n=0;$n<@keys;$n++)
{
if ($keys[$n] eq $main::recordNames[$i])
{
$addLine[$i] = $values[$n];
last;
}
}
}
$addLine = join($main::split,@addLine);
}
else
{
?ify("你输入的语句有错误!如果不指定插入字段,VALUES 值必须和数据库字段相对应,并且数量相等。") if(@values != @main::recordNames);
$addLine = join($main::split,@values);
}
&writetxtfile($jtdb,$addLine.$main::split."\n");
return (1);
}
#------------------------------------------------
sub sql_select
{
my ($select,$from,$where) = @_;

it55.com

if ($where ne "")
{
#my @keys = split(/$main::split/,$main::recordNames);
my $key = '';
foreach $key (@main::recordNames)
{
#$key =~ s/^\s+//g;
#$key =~ s/\s+$//g;
$where =~ s/$key/\$record->{'$key'}/ig;
}
}else {$where = 1}

vd;k;l www.it55.com rdfg

my $dbinfo = &dbHoH($from);

45398 www.it55.com it55学习IT知识,享受IT生活 4dfkjn

my ($key,$record,$recordName,$return)=('','','',[]);
foreach $key (keys %$dbinfo)
{
my $record = $dbinfo->{$key};
my @select = split(/\,/,$select);
@select = @main::recordNames if ($select =~ /\s*\*\s*/);

it55.com

my $lineHash = {};
foreach $recordName (@select)
{
$recordName =~ s/^\s+//g;
$recordName =~ s/\s+$//g; it55.com

$lineHash->{$recordName} = $record->{$recordName} if (eval($where));
}
push(@$return, $lineHash);
}
return @$return; #返回查询结果,存储在 $return 中,Array of Array
}
#------------------------------------------------
sub dbHoH #得到数据结构 Hash of Hash
{
my $jtdb = $_[0].$main::txt;
my @database = &readtxtfile($jtdb);
chomp(@database);
#my $main::recordNames = shift(@database); #get @col_names at the first line of txt_db,shift it
#my $keys = &getKeys($main::recordNames);
my $keys = &getKeys(@main::recordNames);
my ($line,$return) = ('',{});
foreach $line (@database)
{
my $keysHash = &getRef($line,$keys);
$return->{$keysHash->{id}} = $keysHash;
}
return $return;
}
#------------------------------------------------
sub getKeys #得到关键字,BOOK<Perl 5 Complete>(中文) page(226)
{
#my $line = $_[0];

it55.com

#my @keys = split(/$main::split/,$line);
my @keys = @_;
my ($key,$return,$i) = ('',{},0);
foreach $key (@keys)
{
#$key =~ s/^\s+//g;
#$key =~ s/\s+$//g;
$return->{$i++} = $key;
}
return $return;
}
#------------------------------------------------
sub getRef #得到关键字对应元素,BOOK<Perl 5 Complete>(中文) page(227)
{
my ($line,$keys) = @_;
my ($element,@elements) = @_;
my $return = {};
my $i;
@elements = split(/$main::split/,$line);
for ($i=0;$i<@elements ;$i++)
{
$element = $elements[$i];
$element =~ s/^\s+//g;
$element =~ s/\s+$//g;
$return->{$keys->{$i}}=$element;
}
return $return;
}
#------------------------------------------------
sub readtxtfile
{
my $just = $_[0].".lock"; www.it55.com

while(-f $just)
{select(undef,undef,undef,0.1);}
open(LOCKFILE,">$just"); www.it55.com在线教程

open(READTXTFILE,"$_[0]");
my @readtxtfile=<READTXTFILE>;
close(READTXTFILE);

www.it55.com在线教程

close(LOCKFILE);
unlink($just); sflj www.it55.com kg^&fgd

return @readtxtfile;
}
#------------------------------------------------
sub writetxtfile
{
my $just = $_[0].".lock";

免费资源www.it55.com

while(-f $just)
{select(undef,undef,undef,0.1);}
open(LOCKFILE,">$just"); 45398 www.it55.com it55学习IT知识,享受IT生活 4dfkjn

if ($_[2] == 1)
{open (WRITETXTFILE,">$_[0]");}
else{open (WRITETXTFILE,">>$_[0]");}
print WRITETXTFILE $_[1];
close(WRITETXTFILE); it55.com

close(LOCKFILE);
unlink($just); www.it55.com

return(1);
}
#------------------------------------------------
sub notify
{
use CGI;
my $query = new CGI;
print $query->header() if ($_[1] == 1);
print $_[0];
exit;
}
#------------------------------------------------

sflj www.it55.com kg^&fgd

1;

45398 www.it55.com it55学习IT知识,享受IT生活 4dfkjn

__END__

www.it55.com在线教程

=head1 NAME http://www.it55.com/

JTDB -- A modules of control a txt-database width SQL-words

45398 www.it55.com it55学习IT知识,享受IT生活 4dfkjn

=head1 SYNOPSIS

www.it55.com

use lib "."; # If NT,use lib "path-to-jtdb_directory";
use JTDB "1.01";

45398 www.it55.com it55学习IT知识,享受IT生活 4dfkjn

$main::split = ","; # Notice!, It's necessary! must be $main::split,
# Records split by "," it55.com

my $db = "<path-to>/dbname";

vd;k;l www.it55.com rdfg

@main::recordNames = &db_connect($db); # Necessary! must be @main::recordNames,
# Get RecordNames from db-info file IT资讯之家 www.it55.com

my $sqlStr = "SELECT * FROM $db";
my @resoult = &executeStr($sqlStr);

45398 www.it55.com it55学习IT知识,享受IT生活 4dfkjn

my $line;
foreach $line (@resoult)
{
my $keys;
foreach $keys (keys %$line)
{
print $keys." : ".$line->{$keys}." ";
}
print "<br>\n";
} it55.com

=head1 DESCRIPTION

This modules, JTDB.pm, is a tool of control txt-database width SQL-words.
For now,only SELECT,INSERT,DELETE,UPDATE can be used in this script,and It's
very simple. IT资讯之家 www.it55.com

It is only opening-words, and I think some one will make it fullness and
mightiness one day! So,you can modify it at will! and I hope you tell us
the headway of this modules and share it width everybody. at last, I hope
you do not remove my copyright,if u will...

http://www.it55.com/

Enjoy it! 免费资源www.it55.com

=item db_connect

www.it55.com在线教程

open dbname_info.txt and get @recordNames 免费资源www.it55.com

=item executeStr www.it55.com在线教程

Execute sql-script,and return a Array of Array

sflj www.it55.com kg^&fgd

my @resoult = &executeStr($sqlStr);

45398 www.it55.com it55学习IT知识,享受IT生活 4dfkjn

my $line;
foreach $line (@resoult)
{
print $line->{'id'}."\n";
print $line->{'name'}."\n";
}

www.it55.com在线教程

=item create_db it55.com

usage:

vd;k;l www.it55.com rdfg

my $ids = "id,name,pass,lover"; # Now,$main::split = "," www.it55.com

# If $ids = "id||name||pass||lover" then $main::split = "||"
my $dbname = "jtdatabase";
create_db("<path-to>/".$dbname,$ids);

# Then,<path-to>/jtdatabase.txt and <path-to>/jtdatabase_info.txt has been
# created ! IT资讯之家 www.it55.com

=head2 SQL-String it55.com

select id,name from $db where id>6
select * from from $db where name=~ m"Aren"i and email ne ""

it55.com

notices: at the block of WHERE ,u can use a-short-perl-code !!
--------------------------------------------------------------

vd;k;l www.it55.com rdfg

INSERT INTO $db (id,name) values(2009,Aren)
insert into $db values ( 2009,Aren,12345,mylover)

vd;k;l www.it55.com rdfg

notices: do not use ' or " at values-list sflj www.it55.com kg^&fgd

insert into $db values ( '2009','Aren','12345','mylover')
will set id="'2009'" and name="'Aren'" and ...
--------------------------------------------------------------

免费资源www.it55.com

DELETE FROM $db WHERE id =~ /J/
--------------------------------------------------------------

http://www.it55.com/

update $db set name='jack',pass=\"123\",lover='jack\"lover' where id = 3

IT资讯之家 www.it55.com

=head1 BUGS www.it55.com在线教程


Author Aren <boyaren@sina.com> http://www.justake.com www.it55.com在线教程

=cut 45398 www.it55.com it55学习IT知识,享受IT生活 4dfkjn


(编辑:IT资讯之家 www.it55.com

返回顶部
 

网友评论

[以下评论为网友观点,不代表本站。请自觉遵守互联网相关政策法规,所有连带责任均有评论者自负。]
[不超过250字]

图片文章