gyn

Win32下的Perl,无用的select,停滞的Tk,结束吧....

sqlite远程连接示例

Sqlite 是一个只有几百 k 大小的、 优秀的嵌入式数据库,本身不带有远程连接的功能。由于其身材小,速度快并且为众多的语言支持,所以在单机领域得到了广泛的使用。但由于天然不支持服务 / 客户端的模式,使其在遇到小型规模数据库远程连接的情况时不得不借助于附加的编程。

单位有三百多人,作为网管每天要接到很多电话,有很多一时无法想起对应的名字,翻查通讯录不仅速度慢而且容易漏过。为了方便起见,在 sqlite 上建立了一个通讯录数据表,然后用 perl 编写了一个查询脚本。效果不错的同时,也有同事希望可以得到一份拷贝。但是这时遇到一个问题,如何保证通讯录在不同人手中保持版本的统一性。最好的办法是建立一个服务 / 客户端的模式,在本机上维护一个数据库,而其它人通过连接数据库得到相关的查询结果。

具体的解决方法是这样的:在本机上维护一个到 sqlite 数据库的连接并建立一个来自于客户端的 socket 的监听,接受远程查询条件并回复查询结果;客户端志负责发送和接受这些最简单的任务。

客户端的代码:

use strict;
my $in_buffer = undef;
my $PF_INET = 2;
my $port = 2345;
my $remote_addr = pack('SnC4x8',$PF_INET,$port,192,168,138,228);
my $SOCK_DGRAM = 2;
socket(UDP_CLIENT, $PF_INET, $SOCK_DGRAM, getprotobyname('udp'));
while(1){
       print("
输入名字或号码: ");
       my $out_buffer=<STDIN>;
       chomp($out_buffer);
       if($out_buffer eq "exit"){last;}
       send(UDP_CLIENT, $out_buffer, 0, $remote_addr);
       print("waiting for reply...\n");
       recv(UDP_CLIENT, $in_buffer, 100, 0);
       chomp($in_buffer);
       print("$in_buffer\n");
}
close(UDP_CLIENT);

       服务器端的代码:

BEGIN{
       if( $^O eq 'MSWin32' ){
              require Win32::Console;
              Win32::Console::Free();
       }
}

use strict;
use DBI;

#database parameters
my $db_path = 'd:/src/cc/phones.db';
my $dbh = DBI->connect("dbi:SQLite:$db_path", {PrintError => 0}) or die $DBI::errstr;
my $sth = undef;

#socket server parameters
my $in_buffer = undef;
my $out_buffer = undef;
my $PF_INET = 2;
my $port = 2345;
my $local_addr = pack('SnC4x8',$PF_INET,$port,192,168,138,228);
my $SOCK_DGRAM = 2;
socket(UDP_SERVER, $PF_INET,$SOCK_DGRAM, getprotobyname('udp')) or die("$!");
bind(UDP_SERVER, $local_addr) or die("$!");
listen(UDP_SERVER, 10);

while(1){
       #receive query then send result
       last unless my $remote_addr = recv(UDP_SERVER,$in_buffer,100,0);
       chomp($in_buffer);
       if($in_buffer =~ /^[0-9]{6}$/){
              $sth = $dbh->prepare("select * from phones where number = $in_buffer");
              PROCEDURE:
              $sth->execute();
              my @items = $sth->fetchrow_array();
              if(scalar(@items)){
                     $out_buffer = $items[0].'
的虚拟网号码是 '.$items[1];
              }else{
                     $out_buffer = '
查无此人 ';
              }
       }else{
              $sth = $dbh->prepare("select * from phones where name = '$in_buffer'");
              goto PROCEDURE;
       }
      
send(UDP_SERVER,$out_buffer,0,$remote_addr);
}

#disconnect from sqlite
$dbh->disconnect();  

posted on 2006-12-14 09:29 gyn_tadao 阅读(5873) 评论(5)  编辑 收藏 引用 所属分类: perlDatabase

评论

# re: sqlite远程连接示例 2006-12-15 18:55 我的求职信

已阅,飘过...已阅,飘过...已阅,飘过...已阅,飘过...已阅,飘过...已阅,飘过...已阅,飘过...已阅,飘过...已阅,飘过...已阅,飘过...已阅,飘过...已阅,飘过...已阅,飘过...  回复  更多评论   

# re: sqlite远程连接示例 2009-12-30 20:03 飘客

我左飘过,右飘过,上飘过,下飘过,中飘过,东飘过,南飘过,西飘过,北飘过..........  回复  更多评论   

# re: sqlite远程连接示例 2010-06-05 12:53 gad

my god!
06年的。。
竟然和我的需求这么相似,
我也用SQLITE,不过不准备用PERL.
我也是一网管  回复  更多评论   

# re: sqlite远程连接示例 2010-06-07 16:48 gyn

@gad
可惜我不是网管  回复  更多评论   

# re: sqlite远程连接示例 2011-01-15 18:51 小杨

学习之!  回复  更多评论   

只有注册用户登录后才能发表评论。
<2020年9月>
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910

导航

统计

常用链接

留言簿(14)

随笔分类(126)

随笔档案(108)

相册

搜索

最新评论

阅读排行榜

评论排行榜