読者です 読者をやめる 読者になる 読者になる

Perl - CPAN - DBD::mysqlパッケージ

ここに掲載するものは、塚本さんにパッケージ化して頂いているZaurus用Perl 5.6.1に追加でインストールするPerlライブラリのDBD::mysqlである。
ソースはここからダウンロードし、dev-img-1.3でセルフコンパイルした。

download:lib-perl-dbd-mysql_3.0002-1_arm.ipk

このパッケージとDBIパッケージMySQL 3.23.49Zaurusにインストールすれば、Perlによってデータベースにアクセスすることが可能になる。
現時点の最新DBD::mysqlは4.006だが、最近のものはテストが正常に動作しないため、動作するバージョンで一番新しいものを採用した。

ただし、/usr/lib/libmysqlclient.soが/usr/sbin/mysqldとの通信に使用するソケットを/var/run/mysqld/mysqld.sockに固定しているため、以下のようにここの設定を変更する必要がある。

  • /etc/mysql/my.cnfを以下のように変更。
[client]
socket = /tmp/mysql.sock
    ↓
socket = /var/run/mysqld/mysqld.sock

[mysqld]
socket = /tmp/mysql.sock
    ↓
socket = /var/run/mysqld/mysqld.sock
  • /etc/rc.d/init.d/mysqlを以下のように変更。
pid_file=/var/lib/mysql/mysqld.pid
    ↓
# 上記行の下に追加した内容(/usr/bin/safe_mysqldからのコピー)を変更
socket=/var/run/mysqld/mysqld.sock
if [ -r /etc/mysql/my.cnf ]; then
  tmp=`grep '^pid-file' /etc/mysql/my.cnf | sed 's/.*=[\t ]*//'`
  if [ -n "$tmp" ]; then
    pid_file=$tmp
  fi
  tmp=`grep '^socket' /etc/mysql/my.cnf | sed 's/.*=[\t ]*//'`
  tmp=`echo $tmp | sed 's/ .*//'`
  if [ -n "$tmp" ]; then
    socket=$tmp
  fi
fi
sockdir=`dirname $socket`

# Start daemon
    ↓
# 上記行の下に追加(/var/run→/dev/shmがRAMディスクで揮発するため)
mkdir -p $sockdir
chmod 777 $sockdir
chown daemon:daemon $sockdir


また、このパッケージをビルドするときに必要なmysql_configコマンドやヘッダファイルがMySQL 3.23.49には付属していないため、MySQL 3.23.58のソースからヘッダファイルを取り出し、ダミーのmysql_configコマンドを作成した。

download:mysql-conf-hdr_0.1-1_arm.ipk


手始めの使い方は以下の通りである。

# "ID<TAB>名前<TAB>年齢"のテキストをデータベースに登録
use DBI;
$dbh = DBI->connect("dbi:mysql:dbname=test");
$tbl_name = "test2";
$create_tbl =<<__CREATE_TBL__;
    create table $tbl_name (
        id int,
        name varchar(40),
        age int
    )
__CREATE_TBL__
@tables = $dbh->tables;
$exist = 0;
foreach $name (@tables) {
    if ($name =~ /$tbl_name/) {
        $exist = 1;
        last;
    }
}
if (!$exist) {
    $dbh->do($create_tbl) or die;
}
while (<>) {
    chomp;
    ($id, $name, $age) = split(/\t/);
        $id = int($id);
        $name = substr($name, 0, 40);
        $age = int($age);
    $insert = "insert into $tbl_name values ($id, '$name', $age)";
    $dbh->do($insert) or die;
}
END {
    $dbh->disconnect if $dbh;
}


DBD::mysqlの詳細は以下をご覧頂きたい。

英語:http://search.cpan.org/~capttofu/DBD-mysql-3.0002/lib/DBD/mysql.pm
日本語:http://perldoc.jp/docs/modules/DBD-mysql-2.1026/DBD/mysql.pod