■15696 / inTopicNo.1) |
Child Tree のツリー崩れについて
|
□投稿者/ maki -(2004/01/01(Thu) 17:31:58)
| はじめまして、りゅういち様、child tree を利用させていただいております。 どこまで踏み込んで書いて良いものか、ここに書き込んでよいのかよくわかっておらず、 失礼なこともあるかと思いますがご容赦ください。
現在、過去記事 ■13625, ■13636 などと笹様が質問されていたのと同じ現象で悩んでおります。
できれば、ツリーをメインで使いたいので、勝手ながら CGI のソースを解析させていただきました。
[問題となるツリー表示] test1 / foo (04/01/01(Thu) 03:42) #1 ├ test1-1 / foo (04/01/01(Thu) 03:43) #2 └ test2 / foo (04/01/01(Thu) 03:43) #4 └ test1-1-1 / foo (04/01/01(Thu) 03:43) #3
[期待しているツリー表示] test1 / foo (04/01/01(Thu) 03:42) #1 ├ test1-1 / foo (04/01/01(Thu) 03:43) #2 │ └ test1-1-1 / foo (04/01/01(Thu) 03:43) #3 └ test2 / foo (04/01/01(Thu) 03:43) #4
[再現方法] (1) test1 を「新規作成」し「送信」する (2) test1 に対する「返信」test1-1 を「送信」する (3) test1 に対する「返信」test2 を書く (4) test1-1 に対する「返信」を 3. とは別に書き「送信」する (5) (3) で書いておいた「返信」を「送信」する
[サンプル] http://team86.nest.jp/maki/cgi/cbbs/cbbs.cgi?H=T&no=0
[CGIの動作] (ソースから読みとったのですが、まちがっていたらもうしわけありません) ・ツリーの順は記録ファイルを作成するときに決定される。 (表示側の関数(one_)は、記録ファイルの内容を逆順に表示する) ・(3) で「返信」を準備するときに、返信記事を挿入する位置(=記事Xの後ろ)を計算する。 ・(5) で「送信」するときに、(3) で計算した挿入位置を 'N' という名前のパラメタ として cbbs.cgi に渡す。(cbbs.cgi 586行目) ・記録ファイルを出力する関数(wri_)は、送信された記事を番号 'N' の後ろに挿入する。 ('N' という名前のパラメタが渡されているときのみ)
[問題が発生する原因] ・返信を書きはじめてから記事の送信が行なわれるまでの間にタイムラグがあるとき、 新たな投稿によってツリーが更新され、挿入すべき位置が変わることがある。 ・上の例では - (3) の段階では N=2 - (4) が実行された段階で、挿入位置は N=3 (test1-1-1 の後ろ) となるべき - (5) では、(3) の計算結果が有効なので N=2 として test2 を「送信」する。 - 関数 wri_ は、test2 を test1-1 (N=2) の後ろに挿入してしまう。
[解決案] 効率は悪くなると思いますが、関数 wri_ の中で、挿入位置を親記事の番号から 再計算するようにするというのはいかがでしょうか?
|
|