| Su | Mo | Tu | We | Th | Fr | Sa |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | ||||
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |
前のエントリの続き。
MovableTypeのデータの格納にはPostgreSQLを使っている。pgAdmin(GUIなPostgreSQL管理ツール)でデータベースの中身を覗いてみると、確かにmt_fileinfoなんていうテーブルは作成されていない。とりあえずmt_fileinfoを作ってみるという方針にする。拡張子がpmだのcgiだのになってるファイルに片端からgrepを掛けると、アップグレード版のアーカイブに入っているmt-upgrade31.cgiの中に、mt_fileinfoを作成するコードが見つかった。
mt-upgrade31.cgiでは、設定されているデータベースの種類($mt->{cfg}->ObjectDriver)によって処理を切り分けて、データベースに対してテーブルの追加やインデックスの作成をし、スキーマを新しいバージョンのものに対応させる処理をしている。PostgreSQLに対する処理は110行目から153行目までにある。
elsif ($mt->{cfg}->ObjectDriver =~ /postgres/) {
print "hoge";
@stmts = add_once(\@stmts, $dbh, 'mt_blog', 'blog_ping_technorati', 'smallint')
unless has_column($dbh, 'mt_blog', 'blog_ping_technorati');
@stmts = add_once(\@stmts, $dbh, 'mt_blog', 'blog_children_modified_on', 'timestamp')
unless has_column($dbh, 'mt_blog', 'blog_children_modified_on');
push @stmts, ('alter table mt_blog add blog_custom_dynamic_templates varchar(25)',
"update mt_blog set blog_custom_dynamic_templates = 'none'")
unless has_column($dbh, 'mt_blog', 'blog_custom_dynamic_template');
@stmts = add_once(\@stmts, $dbh, 'mt_template', 'template_created_on', 'timestamp');
@stmts = add_once(\@stmts, $dbh, 'mt_template', 'template_modified_on', 'timestamp');
@stmts = add_once(\@stmts, $dbh, 'mt_template', 'template_created_by', 'integer');
@stmts = add_once(\@stmts, $dbh, 'mt_template', 'template_modified_by', 'integer');
push @stmts, ('alter table mt_template add template_build_dynamic smallint')
unless has_column($dbh, 'mt_template', 'template_build_dynamic');
push @stmts, ('update mt_template set template_build_dynamic = 0 where template_build_dynamic <> 1 or template_build_dynamic is null',
'alter table mt_template alter column template_build_dynamic set not null');
push @stmts, ('alter table mt_category add category_parent integer',
'update mt_category set category_parent = 0',
'alter table mt_category alter column category_parent set not null')
unless has_column($dbh, 'mt_category', 'category_parent');
push @stmts, ("update mt_entry set entry_basename = '' where entry_basename is null",
'alter table mt_entry alter column entry_basename set not null');
unless (has_column($dbh, 'mt_fileinfo', 'fileinfo_id')) {
push @stmts, <<FILEINFO;
create table mt_fileinfo (
fileinfo_id integer primary key,
fileinfo_blog_id integer not null,
fileinfo_entry_id integer,
fileinfo_url varchar(255),
fileinfo_file_path text,
fileinfo_template_id integer,
fileinfo_templatemap_id integer,
fileinfo_archive_type varchar(255),
fileinfo_category_id integer,
fileinfo_startdate varchar(80),
fileinfo_virtual smallint
)
FILEINFO
push @stmts, ("create sequence mt_fileinfo_id",
"create index mt_fileinfo_blog_id on mt_fileinfo (fileinfo_blog_id)",
"create index mt_fileinfo_entry_id on mt_fileinfo (fileinfo_entry_id)",
"create index mt_fileinfo_url on mt_fileinfo (fileinfo_url)");
}
}
ここで、@stmtsにpushされている文字列が、PostgreSQLに対して実行されるSQL文となっている。これを手作業で打ち込んで、mt_fileinfoテーブルを作ったり何だりしてやると、とりあえず動くようになった。いい加減な処置なので、まだどこかにエラーの種が残っているかもしれないけど。
PostgreSQLにはコマンドベースの管理ツール"psql"が付属している。これを下のように起動してやる。-Uでユーザ名、-dでデータベース名を指定する。
#psql -U postgres -d mt
で、あとはひたすらSQL文をこぴぺこぴぺ。

