









[diary]
[ML]
[todo]
[CVS]
[bug]
[apache log]
[swiki log]
[statistics]
[map]
[man]
[info]
[アンテナ]
tDiary:PgsqlIO
tDiary:PgsqlIOは、1.5.2向けのテスト版になります。今は、tDiary:dbi_ioが熱い(使える方)です。

始めに
PgsqlIOとは、tDiaryのバックエンドとしてPostgreSQLを使用するtDiaryIOクラス
の一つになります。
なぜこのようなものを作成したかという詳細な経緯は
「hnsからtDiaryの移行に関して(格闘編)」を参照して下さい。
まだまだ、バグやら、速度向上やら改善点はあるかと思いますがとりあえず動きます。
PgsqlIOは、PgsqlIOという名称からして、PostgreSQL専用のように思われますが、
実際には、DBI/DBDを使用していますので、DBI/DBDがサポートしているDB
であれば、なんでも使えるはずです。
また、幸運にも私自身が標準的なSQLしか知らないので(笑)、DB依存性の
強いSQLもありません。
これらは何を言わんとしているのかと言いますと、ぶっちゃけDBがどこにあっても
, MySQLやOracleであっても、OKだということを言っています。なので、DBだけ別サーバーにしたり、
レプリケーション張って障害に強くしたり、DBを複数用意して、高負荷にも
絶え得るものを作ることも(ある意味)可能であるということを言っています。
(まあ個人の日記サイトに求めるべき内容のものでもないですけど。
私自身は、tDiaryの潜在は結構あると考えています。
ちょっと手を入れれば、バグトラッキングシステムになりそうですし、
「突っ込み」に手を入れれば、コメント付き投票CGIみたいなものにもたやすく
改造できるはずです。そういったときに、上記のような応用例も出てきてもいいかと
思っています)
(なお、私がこれを実装した本来の目的は、単に「hnsからの移行をしやすくする
ため」だったりするという後ろ向きな動機に関しては、そっとしておいてあげて下さい。)

必要なもの
下記は、必須になります。
- DB
- 当然必須です。PerlのDBI/DBDでは確かCSVファイル向けのもあったので、Ruby用のものでも、そういうのがあるかも知れません(未確認情報です)。もしそういうのがあったら、DB自体も不要です。
- Ruby DBI
- tDiary 1.5系
- しか確認してません。IOクラスが使えれば、いけます。

DB仕様
- DB名
- 標準は、tDiaryDBです。tdiary.confで設定できるので、実際には何でもいいです。
- DB User
- 適当に作って下さい。後述のテーブル操作が可能なように権限を与えておくことを忘れないように。

テーブル仕様
- まだ適当感があります。
- DiaryData
- 日記データを保存するテーブルです。日付文字列(8桁)をprimary keyにしています。
CREATE TABLE "DiaryData" (
"diary_id" varchar(8) NOT NULL,
"year" varchar(4) NOT NULL,
"month" varchar(2) NOT NULL,
"day" varchar(2) NOT NULL,
"title" varchar,
"last_modified" varchar NOT NULL,
"visible" bool NOT NULL,
"body" varchar NOT NULL,
CONSTRAINT "DiaryData_pkey" PRIMARY KEY ("diary_id")
);
CREATE TABLE "CommentData" (
"diary_id" varchar(8) NOT NULL,
"name" varchar,
"mail" varchar,
"last_modified" varchar NOT NULL,
"visible" bool NOT NULL,
"no" varchar NOT NULL,
"comment" varchar
);
CREATE TABLE "RefererData" (
"diary_id" varchar(8) NOT NULL,
"count" int8 NOT NULL,
"ref" varchar NOT NULL,
"no" varchar
);

インストール方法
(1) 上記の設定で、DB, Tableを作成します。
(2) PgsqlIO.rbをtdiary/tdiaryの下に適切なパーミションをつけて配置します。
(3) tdiary/tdiary.confの設定を変更します。(以下を参照)
(tdiary.confの抜粋です)
#
#
# 日記保存形式の指定【オプション】
# 日記の保存形式を標準から変更する場合には、必要な設定をしなければなり
# ません。何も指定しない場合にはtDiary2形式(テキスト)になります。
# 何を指定するかは、その保存形式用プログラムの説明に従ってください。
# 以下の2行のコメント(#)をはずすと、tDiary1形式(バイナリ)になります。
#require 'tdiary/pstoreio'
#@io_class = TDiary::PStoreIO
require 'tdiary/PgsqlIO'
@io_class = TDiary::PgsqlIO
#– PgsqlIOの場合の設定 –
@pgsql_driver_url = 'dbi:Pg:tDiaryDB' # URLを設定します。
@pgsql_user = 'xxxxxxxxxxxx' # DBのアカウント
@pgsql_passwd = 'xxxxxxxxxxxx' # DBのパスワード
(4) cacheは削除して下さい。
以上です。

ダウンロード先
- ここです。
- PgsqlIO以下が、それになります。
- Ma2takHnf2Tdは、適当に作ったhnfからの変換ツールになります。
- ダウンロードの仕方は、「CvsWeb簡単な使い方」をみてください。

今後のTodo
- TABLEの修正
- まず、カラムのデータ型をちゃんとしよう。
- INDEXをつけよう。
- マルチユーザにも対応しよう。
- 名称を変更する。
- UPDATEしてからINSERTするようにする。

バグ報告&連絡先
- ここにバグ報告してもらえるとうれしいです。
- 日記に突っ込んでもらってもいいです。
- 下に追加してもらってもいいです

- MoonWolf(2003/02/03 12:19):
- storeメソッドでSELECTしてからINSERT/UPDATEよりも、UPDATEして結果が0件ならINSERTする方がシンプルだし速いと思います。
- なるほど。(恥ずかしながら、DBあんまし知らないもので...)
CSV用DBIはありませんが、SQLiteに対応しています。
サーバ不要なのでCSV並の気軽さで使えます。
CommentData,RefererDataのdiary_idにインデクス作ったほうが良くないですか。
あとno,last_modifiedもvarcharじゃなくてintがいいでしょう。
MoonWolf: noがvarcharだと'10''2'になります。10個以上コメントがあるとおかしくなりますね。
- そうですね。インデックス張った方が、速くなりそうですね。
- noとか、countとかもintにした方が、速くなりそうですね。
- (実はどんな値が入るのか不安だったんで、なんでもかんでもとりあえず varcharにしてました)

Links to this Page
- 公開CVSリポジトリ last edited on 3 April 2004 at 4:26 pm
- tDiary last edited on 5 February 2003 at 12:06 pm