こんにちは、バズー株式会社、開発チームリーダーの清水です。
セレブスタイルのシステムはPHPで構築されています。ただ、CMS機能はMovable Typeのほうがよくできているので、Movable TypeとPHPを連携する必要があります。
そこで問題になるのがデータベース。いろいろ問題があってMovable Type 4が使えず、Movable Type3と連携する必要があったのですが、Movable Type3はDB4というデータベースを使っています。DB4は、MySQLやPostgreSQLのようにSQLを扱うことができません。
Movable Type3のデータは以下の図のようになっています。

解説するとこんな感じです。
====
SERG/4バイト/接頭辞
キーの長さ/4バイト
キー/任意バイト
データの長さ/4バイト
データ/任意バイト
:
:
以下キー、データの連続
====
PHPでDB4のデータを読み込むサンプルです。dba_xxx 関数を使うためにはPHPのDBA拡張機能がインストールされている必要があります。
====
<?php
// MTのデータベース(DB4)を解析する
function _thaw_mt_1($frozen) {
$thawed = array();
$len = strlen($frozen);
$pos = 4;
while ($pos < $len) {
$slen = unpack('N', substr($frozen, $pos, 4));
$col = $slen['1'] ? substr($frozen, $pos+4, $slen['1']) : '';
$pos += 4 + $slen['1'];
$slen = unpack('N', substr($frozen, $pos, 4));
$col_val = substr($frozen, $pos+4, $slen['1']);
$pos += 4 + $slen['1'];
$thawed[$col] = mb_convert_encoding($col_val, "SJIS-win", "UTF-8");
}
return $thawed;
}
// インポート開始
function execute_import() {
// リミッター解除
ini_set('memory_limit','-1');
// データベースを開く
$id = dba_open("/somewhere/entry.db", "r", "db4");
// エラーチェック
if (!$id) {
echo "dba_open failed\n";
exit;
}
// データ一覧
$entries = array();
// 最初のキーを取得
$key = dba_firstkey($id);
$entry = _thaw_mt_1(dba_fetch($key, $id));
if ($entry['blog_id'] == 2 || $entry['blog_id'] == 3 || $entry['blog_id'] == 4) {
$entries[] = $entry;
}
// キーをすべて取得
while ($key != false) {
if (true) {
// エントリーを取得
$entry = _thaw_mt_1(dba_fetch($key, $id));
if ($entry['blog_id'] == 2 || $entry['blog_id'] == 3 || $entry['blog_id'] == 4) {
$entries[] = $entry;
}
}
$key = dba_nextkey($id);
}
// データベースを閉じる
dba_close($id);
// エントリー一覧を表示
print_r($entries);
}
execute_import();
====
実行するとエントリー一覧が表示されます。
1つのエントリーは以下のような構成になっています。
author_id・・・著者管理ID
text・・・本文
title・・・件名
allow_comments・・・コメント許可?
basename・・・不明
allow_pings・・・PING許可?
modified_on・・・変更日時
blog_id・・・ブログ管理ID
to_ping_urls・・・PING送信先?
excerpt・・・不明
status・・・詳細不明
convert_breaks・・・行末の改行の扱い?
created_on・・・作成日時
id・・・エントリー管理ID
text_more・・・本文の続き
アクセスの度にエントリー一覧を取得すると、パフォーマンスが悪いので、バッチで取得して他のデータベースに格納するのが現実的だと思います。




















コメントする