朔のキャッシュ構造
新月では手元のキャッシュは暗号化されていません。 テキストビューワなどで読むことができます。 実装によってファイルの格納形式が違うのですが、 ここでは朔の場合について説明します。
ディレクトリ
インストールした場合には指定したディレクトリにキャッシュが保存されます。 インストールしないで実行する場合には、 朔のディレクトリにcacheディレクトリができます。
命名規則
1つのスレッドやリスト、 ノートは内部的には1つのファイルと呼ばれます。 1つの書き込み(レス)がレコードと呼ばれます。 この場合のファイルはOS上のファイルとは直接の関係がありません。 ここではOS上のファイルを物理ファイル、 新月のファイルを仮想ファイルと呼んで区別することにします。
スレッド名が「ぬるぽ」だったとします。 それをUTF-8で表現し、 文字コードを16進数にすると「E381ACE3828BE381BD」となります。 これにスレッドを表わすプレフィクス「thread_」をつけた「thread_E381ACE3828BE381BD」が、スレッド「ぬるぽ」に対応する仮想ファイルの名前です。
1つの仮想ファイルに対応する1つのディレクトリ
仮想ファイルはキャッシュの中では1つのディレクトリになります。 「cache/thread_E381ACE3828BE381BD」がスレッド「ぬるぽ」になります。 この中には3つのディレクトリと3つの物理ファイルがあります。
- attach/
- 添付ファイルを保存する。
- record/
- レコードを保存する。いわば「本体」。
- removed/
- 削除したレコードを一時的に保存する。
- body.cache
- 各レコードから添付ファイル部分を削除し、連結したもの。
- size.stat
- レコードのサイズの合計。
- stamp.stat
- スレッドの最終書き込み時刻。
サブディレクトリ
まずは「本体」であるrecordから。 書き込み(レス)1つにつき1つの物理ファイルとして保存します。 新月プロトコルでは個々のレコードをリクエストすることができますので、 レコードは1つの物理ファイルにまとめるよりも、分割しておいた方が便利です。 物理ファイル名は「<書き込み時刻>_<MD5チェックサム>」、 中身はUTF-8のプレインテキストです。
レコードが削除されるとremovedに移動します。 削除したレコードを再取得しないために、 未取得なのか削除済みなのかを区別する必要があるからです。
スレッドのレコードには添付ファイルのフィールドがあります。 これは添付ファイルをBase64エンコードしたものです。 ゲートウェイからの要求の度にデコードしていては手間がかかりますので、 予めデコードし、attachディレクトリに保存します。 物理ファイル名は 「<書き込み時刻>_<MD5チェックサム>.<拡張子>」です。
仮想ファイルのディレクトリ直下の物理ファイル
添付ファイルと同様の発想ですが、 ゲートウェイからのアクセスの度に 各レコードの物理ファイルを開いていたら大変です。 スレッドを表示するには添付ファイル部分は不要なので、 それを取り除き、連結したものをbody.cacheに保存します。
リストの表示では、 各リンク先のレコード数や仮想ファイルのサイズが必要になります。 そこでそれらをstamp.statやsize.statに保存しておきます。
利用方法
OSの検索機能を使えば、 キャッシュや添付ファイルに対して全文検索をかけることができます。 また添付ファイルは拡張子を保存してますので、 画像であればそのまま画像ビューワで見ることができたりします。