  
- UID
- 1
- 威望
- 1240 点
- 金钱
- 24019 金币
- 点卡
- 317 点
|
1#
发表于 2005-8-25 19:11
| 只看该作者
尝试用sql查询语句操纵普通文本数据库
作者:Aren.Liu
日期:2000-12-27 9:00:24
尝试用sql查询语句操纵普通文本数据库!使用简单的select就可以实现文本的索引访问,用update……- 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://ub4k91.chinaw3.com/download/jtdb.htm
JTDB v1.01- #-------------------------------------------------------------------
- package JTDB;
- # ----------------------------------------------------------------------
- # 程序名称:平面文本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
- # 设想并实现平面文本数据库SQL查询最基本功能
- # 可实现 select,insert,delete,update 基本功能
- # ------------------------------------------- 请保留以上版权 ------------
- require 5.002;
- use strict;
- use vars qw(@ISA @EXPORT $VERSION);
- use Exporter;
- $VERSION = ';1.01';;
- $main::txt = ".txt";
- @ISA = qw(Exporter);
- @EXPORT = qw
- (
- &db_connect
- &create_db
- &executeStr
- &readtxtfile
- &writetxtfile
- );
- #------------------------------------------------
- sub create_db
- {
- my ($jtdb,$recordNames) = @_;
- my $jtdb_info = $jtdb."_info".$main::txt;
- my $dbname = $jtdb.$main::txt;
- ¬ify("数据库已经存在,请选择其他数据库,数据库创建失败!",1) if (-e $dbname);
- open (JTDB,">$dbname");
- close(JTDB);
- open (JTDBINFO,">$jtdb_info");
- print JTDBINFO $recordNames."\n";
- close(JTDBINFO);
- 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 "");
- 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) = @_;
- my $dbname = $jtdb.$main::txt;
- my $just = $jtdb.".lock";
- while(-f $just)
- {select(undef,undef,undef,0.1);} #锁文件
- open(LOCKFILE,">$just");
- open (FD,">$dbname");
- my $line;
- foreach $line (@toSave)
- {
- foreach (@main::recordNames)
- {
- print FD $line->{$_}.$main::split;
- }
- print FD "\n";
- }
- close(FD);
- close(LOCKFILE);
- unlink($just);
- return (1);
- }
- #------------------------------------------------
- sub executeStr
- {
- my @sqlcmds;
- my $sqlcmd;
- grep{/\s*(\S+)\s+(.*)/ and $sqlcmd = lc($1);} @_;
- 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("你输入的数据库操作语句不正确,或目前的版本尚未支持,请检查!");}
- }
- #------------------------------------------------
- sub sql_update
- {
- my ($jtdb,$set,$where) = @_;
- my @resoult = &executeStr("SELECT * FROM $jtdb");
- if ($where ne "")
- {
- my $key = ';';;
- foreach $key (@main::recordNames)
- {
- $where =~ s/$key/\$_->{';$key';}/ig;
- }
- }else {¬ify("你没有提供修改条件,请用 WHERE 语句提供!");}
- if ($set ne "")
- {
- my $key = ';';;
- foreach $key (@main::recordNames)
- {
- $set =~ s/$key\s*\=\s*(\';+?|\"+?)(.*)(\';+?|\"+?)\s*(\,*?)/\$_->{';$key';}\=$1$2$3\;/ig;
- }
- }else {¬ify("你没有提供修改项目,请用 SET 语句提供!");}
- foreach (@resoult)
- {
- if (eval($where))
- {
- eval($set);
- }
- }
- &db_save($jtdb,@resoult);
- return (1);
- }
- #------------------------------------------------
- sub sql_delete
- {
- my ($jtdb,$where) = @_;
- my @resoult = &executeStr("SELECT * FROM $jtdb");
- if ($where ne "")
- {
- my $key = ';';;
- foreach $key (@main::recordNames)
- {
- $where =~ s/$key/\$_->{';$key';}/ig;
- }
- }else {¬ify("你没有提供删除条件,请用 WHERE 语句提供!");}
- my @return = grep(eval($where)==0,@resoult);
- &db_save($jtdb,@return);
- #my $just = $jtdb.".lock";
- #while(-f $just)
- #{select(undef,undef,undef,0.1);} #锁文件
- #open(LOCKFILE,">$just");
- #open (FD,">$jtdb");
- #my $line;
- #foreach $line (@return)
- #{
- #foreach (@main::recordNames)
- #{
- #print FD $line->{$_}.$main::split;
- # }
- # print FD "\n";
- #}
- #close(FD);
- #close(LOCKFILE);
- #unlink($just);
- return (1);
- }
- #------------------------------------------------
- sub sql_insert
- {
- my ($jtdb,$keys,$values) = @_;
- ¬ify("找不到要操作的数据库,操作失败!") if (!(-e $jtdb));
- 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) = @_;
- 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}
- my $dbinfo = &dbHoH($from);
- my ($key,$record,$recordName,$return)=(';';,';';,';';,[]);
- foreach $key (keys %$dbinfo)
- {
- my $record = $dbinfo->{$key};
- my @select = split(/\,/,$select);
- @select = @main::recordNames if ($select =~ /\s*\*\s*/);
- my $lineHash = {};
- foreach $recordName (@select)
- {
- $recordName =~ s/^\s+//g;
- $recordName =~ s/\s+$//g;
- $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];
- #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";
- while(-f $just)
- {select(undef,undef,undef,0.1);}
- open(LOCKFILE,">$just");
- open(READTXTFILE,"$_[0]");
- my @readtxtfile=<READTXTFILE>;
- close(READTXTFILE);
- close(LOCKFILE);
- unlink($just);
- return @readtxtfile;
- }
- #------------------------------------------------
- sub writetxtfile
- {
- my $just = $_[0].".lock";
- while(-f $just)
- {select(undef,undef,undef,0.1);}
- open(LOCKFILE,">$just");
- if ($_[2] == 1)
- {open (WRITETXTFILE,">$_[0]");}
- else{open (WRITETXTFILE,">>$_[0]");}
- print WRITETXTFILE $_[1];
- close(WRITETXTFILE);
- close(LOCKFILE);
- unlink($just);
- return(1);
- }
- #------------------------------------------------
- sub notify
- {
- use CGI;
- my $query = new CGI;
- print $query->header() if ($_[1] == 1);
- print $_[0];
- exit;
- }
- #------------------------------------------------
- 1;
- __END__
- =head1 NAME
- JTDB -- A modules of control a txt-database width SQL-words
- =head1 SYNOPSIS
- 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";
- }
- =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 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...
- Enjoy it!
- =item db_connect
- open dbname_info.txt and get @recordNames
- =item executeStr
- Execute sql-script,and return a Array of Array
- my @resoult = &executeStr($sqlStr);
- my $line;
- foreach $line (@resoult)
- {
- print $line->{';id';}."\n";
- print $line->{';name';}."\n";
- }
- =item create_db
- usage:
- my $ids = "id,name,pass,lover"; # Now,$main::split = ","
- # 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 !
- =head2 SQL-String
- select id,name from $db where id>6
- select * from from $db where name=~ m"Aren"i and email ne ""
- notices: at the block of WHERE ,u can use a-short-perl-code !!
- --------------------------------------------------------------
- INSERT INTO $db (id,name) values(2009,Aren)
- insert into $db values ( 2009,Aren,12345,mylover)
- notices: do not use '; or " at values-list
- insert into $db values ( ';2009';,';Aren';,';12345';,';mylover';)
- will set id="';2009';" and name="';Aren';" and ...
- --------------------------------------------------------------
- DELETE FROM $db WHERE id =~ /J/
- --------------------------------------------------------------
- update $db set name=';jack';,pass=\"123\",lover=';jack\"lover'; where id = 3
- =head1 BUGS
- Author Aren <boyaren@sina.com> http://www.justake.com
- =cut
复制代码 |
我是一个呼吸着现在的空气而生活在过去的人
这样的注定孤独,孤独的身处闹市却犹如置身于荒漠
我已习惯了孤独,爱上孤独
他让我看清了自我,还原了自我
让我再静静的沉思中得到快乐和满足
再孤独的世界里我一遍又一遍
不厌其烦的改写着自己的过去
延伸到现在与未来
然而那只是泡沫般的美梦
产生的时刻又伴随着破灭的到来
在灰飞烟灭的瞬间我看到的是过程的美丽
而不是结果的悲哀。。。
|
|