DBI風インタフェースの簡易DBをperlで実装したい

最近、perlCGIを作ってファイル入出力することが多くて、データが複雑になってくるとDB使った方が楽なので使いたいんだけど、サーバーによっては使えないところもあるので悩ましい。使えないほうにあわせてファイルI/Oで作りこんでおいても、やっぱり後でデータが増えてきたときに、DB使えるサーバーに移っても同じプログラムを使えたらいいな。
ということで、DBIと同じインタフェースの簡易DBをperl実装で作っちゃおうかと思ってます。

仕様は、次のような感じ。

  • 使えるSQL文(下記のシンタックス通りの文のみ)
    • CREATE TABLE テーブル (カラム 型, カラム 型, ...)
    • SELECT * FROM テーブル
    • SELECT * FROM テーブル WHERE カラム=値
    • SELECT * FROM テーブル WHERE カラム BETWEEN 値 AND 値
    • INSERT INTO テーブル VALUES (値, 値, ...)
    • UPDATE テーブル SET カラム=値,カラム=値,... WHERE カラム=値
    • DELETE FROM テーブル
    • DELETE FROM テーブル WHERE カラム=値
  • 使える関数
    • DBI->connect
    • $dbh->prepare
    • $sth->execute
    • $sth->rows
    • $sth->fetchrow_array
    • $sth->finish
  • 制限事項
    • WHEREで指定できるのは、第1カラムのみ。
    • SQLは必ずprepareしてから実行。
    • SQLで指定する値は必ずプレースホルダとし、executeで与える。

最低限、下記のテストコードが動くものにします。

use DBIverysimple;

my $dbh = DBIverysimple->connect("data", "inutch", "xxxxxxxx");
if(!defined($dbh)){
  print "connect error.\n";
  exit;
}

my $sql;
my $sth;

$sql = "CREATE TABLE test(time timestamp, title varchar, text varchar)";
print $sql . "\n";
$sth = $dbh->prepare($sql);
if(defined($sth)){ $sth->execute(); }

$sql = "INSERT INTO test VALUES(?, ?, ?)";
print $sql . "\n";
$sth = $dbh->prepare($sql);
if(defined($sth)){ $sth->execute("2008/01/01 08:00:00", "1111", "テスト1"); }
if(defined($sth)){ $sth->execute("2008/01/03 10:05:01", "3333", "テスト3"); }
if(defined($sth)){ $sth->execute("2008/01/02 22:30:25", "2222", "テスト2"); }

$sql = "UPDATE test SET title=?,text=? WHERE time=?";
print $sql . "\n";
$sth = $dbh->prepare($sql);
if(defined($sth)){ $sth->execute("2222B", "テスト2B", "2008/01/02 22:30:25"); }

$sql = "SELECT * FROM test WHERE time=?";
print $sql . "\n";
$sth = $dbh->prepare($sql);
if(defined($sth)){
  $sth->execute("2008/01/03 10:05:01");
  my $n = $sth->rows();
  for(my $i=0; $i<$n; $i++){
    my @a = $sth->fetchrow_array();
    print @a . "\n";
  }
}

$sql = "SELECT * FROM test WHERE time BETWEEN ? AND ?";
print $sql . "\n";
$sth = $dbh->prepare($sql);
if(defined($sth)){
  $sth->execute("2008/01/01 00:00:00", "2008/01/02 23:59:59");
  my $n = $sth->rows();
  for(my $i=0; $i<$n; $i++){
    my @a = $sth->fetchrow_array();
    print @a . "\n";
  }
}

$sql = "DELETE FROM test WHERE time=?";
print $sql . "\n";
$sth = $dbh->prepare($sql);
if(defined($sth)){ $sth->execute("2008/01/02 22:30:25"); }

$sql = "SELECT * FROM test";
print $sql . "\n";
$sth = $dbh->prepare($sql);
if(defined($sth)){
  $sth->execute();
  my $n = $sth->rows();
  for(my $i=0; $i<$n; $i++){
    my @a = $sth->fetchrow_array();
    print @a . "\n";
  }
}