次の Perl コードを検討してください。
#!/usr/env/ perl
use strict;
use warnings;
use DBI;
my $filename = 'moo.sqlite';
my $dbh = DBI->connect("dbi:SQLite:dbname=$filename","","");
my $sql = 'INSERT into moo values (1)';
my $sth = $dbh->prepare( $sql );
my $rv = $sth->execute();
print $rv;
実行すると次のエラーが発生します。
DBD::SQLite::db prepare failed: disk I/O error at test.pl line 16.
Can't call method "execute" on an undefined value at test.pl line 18.
SQLite ファイルは、SMBFS/CIFS ネットワークにマウントされた共有にあります。
いくつかのトレースを行ったところ、ファイルをロックしようとしたときにエラーが発生したようです。
open("moo.sqlite\0", 0x202, 0x1A4) = 3 0
fcntl(0x3, 0x1, 0x0) = 0 0
fcntl(0x3, 0x2, 0x1) = 0 0
ネットワーク ロックに問題があることは理解していますが、'sqlite3' バイナリを対話的に実行すると同じ問題が発生しませんか? 現在、問題なくファイルを操作できます。
これは DBI が原因ですか?
ご参考までに:
- OS X 10.6.8
- SQLite バージョン 3.7.13
- パール 5.12.4
- DBI 1.622
- DBD::SQLite 1.37