frei

旧「anney's room」からブログ「frei」だけ引っ越し&残しました

DBM。

今日のテーマは DBM。

調べてみたら、PHPで使えるようなんで

よくわからんけど素直にWindows 用拡張モジュールのインストールに従い

ローカル上のWindowsphpphp.ini 中の…

  extension=php_dba.dll

…とコメントアウトをはずした次第。

それから、phpinfo() してみた結果、

dba の「Supported handlers」には…

  cdb cdb_make db3 inifile flatfile

…と書いてあって、本番サーバーの方でも…

  gdbm dbm ndbm cdb cdb_make inifile flatfile

…との事だったので、どっちも使えるcdbを使ってみたものの。

なんか書き込めたんだか、書き込めたのに読み込めないんだか

訳わからん動きしかしてくれない(^^;

そしたら、

PHP-TECH」のPHP逆引きリファレンスでも

同じような事がちょこっと書かれていたので、cdbは断念し、

しょうがないので、適当に flatfile を使って成功。

って訳で、一番下に書いたようなクラスを作って

DBMを管理する方向で調整中ー。

おまけ。

Berkeley DB 覚書き for C,Java,Perl,Ruby

サンプルスクリプトがいっぱいだー。

Storable for perl

perlモジュール。Data::Dumperより容量が少なくて済むらしいので興味津々。

Storable for PHP

上記のモジュールをPHPに移植したらしい。

PHP::Session - PHPセッションファイルの読み書き for perl

perl用モジュールでありながら、

PHPとのセッションと共有出来るらしい。すんばらしい。

str_repeat関数 for PHP

文字列を反復する関数。ガーンそんな関数標準であったのか。

Unterstützte Dateitypen by geocities.de

ドイツ版ジオシティーズでアップ可能なファイル形式一覧

アップロードできるファイルの種類 by geocities.jp

日本版ジオシティーズでアップ可能なファイル形式一覧

クラス

<?

class DBA {

var $err = "";

var $con = "";

var $file = "";

var $handler = "";

function DBA( $file, $handler = "flatfile" ) {

$this->file = $file;

$this->handler = $handler;

}

function open( $mode ) {

$this->err = "";

if ( !$this->con = dba_open( $this->file, $mode, $this->handler ) ) {

$this->err = "接続に失敗しました";

return false;

}

return true;

}

function optimize() {

if ( dba_optimize( $this->con ) === false ) {

$this->err = "最適化に失敗しました";

return false;

}

return true;

}

function close() {

dba_close( $this->con );

return true;

}

function put( $param ) {

$this->err = "";

if ( $this->open( "n" ) === false ) return false;

foreach( $param as $key => $value ) {

$value = gzcompress( serialize( $value ) );

if ( dba_replace( $key, $value, $this->con ) === false ) {

$this->err = $key."の書き込みに失敗しました";

$this->close();

return false;

}

}

if ( $this->optimize() === false ) return false;

$this->close();

if ( chmod( $this->file, 0744 ) === false ) {

$this->err = $file."のファイルモード変更に失敗しました";

return false;

}

return true;

}

function get() {

$this->err = "";

if ( $this->open( "r" ) === false ) return false;

$key = dba_firstkey( $this->con );

while ( $key != false ) {

$param[$key] = unserialize( gzuncompress( dba_fetch( $key, $this->con ) ) );

$key = dba_nextkey( $this->con );

}

$this->close();

return $param;

}

function delete( $key ) {

$this->err = "";

if ( $this->open( "w" ) === false ) return false;

if ( dba_delete( $key, $this->con ) === false ) {

$this->close();

$this->err = $key."の削除に失敗しました";

return false;

}

if ( $this->optimize() === false ) return false;

$this->close();

return true;

}

function destruct() {

unset( $this );

return true;

}

}

?>

そのクラスを使う側

<?

// インクルード

require_once( "./common/cp_dba.php" );

// DBファイルの在り処

define( DBA_DB_FILE_PATH, "./test.db" );

// DBに保存するデータ

$param['20050502'] = array( "update" => time(), "title" => "タイトル1", "text" => "テキスト1" );

$param['20050503'] = array( "update" => time(), "title" => "タイトル2", "text" => "テキスト2" );

// インスタンス

$objDBA = new DBA( DBA_DB_FILE_PATH );

// DBに保存

if ( !$objDBA->put( $param ) ) {

echo $objDBA->err;

exit;

}

// DBから値を取得

if ( !$param = $objDBA->get() ) {

echo $objDBA->err;

exit;

}

// DBの値を削除

if ( !$objDBA->delete( "20050503" ) ) {

echo $objDBA->err;

exit;

}

$objDBA->destruct();

// サンプルで出力

echo nl2br( print_r( $param, true ) );

echo $param['20050502']['title'];

?>