firebird 2000中同主题的判断是按照title来的,效率低下.
所以很有必要引入id/reid
说明一下:
id : 版内帖子的唯一标识, 值为帖子的发表时间.
你可以这样理解: id = atoi&(filename[2])
reid : 或者叫topic_id or group_id,就是同主题第一篇帖子的id
对于第一篇主题帖子,id == reid
(如果不是web对层次结构的需要,我们不用详细区分reid 和 gid, tid)
第一步, 我们要给bbsd加入id/reid..
1) bbsd : 添加的方法很简单,直接修改 struct.h中的 fileheader 结构
(注意对齐,不要超出了)
在bbs.c中加入 int current_article_reid = 0; 作为全局变量
read_post函数中,加入 current_article_reid = fileinfo->reid;
post_article函数中加入
postfile.id = now;
if (mailid == NULL) // 对信件不好处理,就作为一个单独的主题吧
postfile.reid = now;
else
postfile.reid = current_article_reid;
post_cross函数中加入
postfile.id = now;
postfile.reid = now; // 肯定是新帖
2) webbbs (nju 0.9 系列)
BBSLIB.inc中
post_article(...., int reid)
然后判断一下 if (reid <= 0) reid = id;
在bbspst.c中,引入<input type='hidden' name='reid' value='xxxx'>
当然bbstcon.c中,也要加入reid来确认主题
3)mail2bbs, getnews 都设置id==reid把~
4)innbbsd, 这个比较麻烦
我想了几个办法
由bbsd维护一个/boards/%s/.GROUP的文件
存储(id, ent, title)三元组, 只是主题帖子才存入.GROUP
ent是该帖子在.DIR中的相对参考位置(由于del文章,实际位置<=这个数值) 以后可能用到
修改很简单,在receive_article.c 中
加个unsigned int get_reid(char *board, char *the_title, int default_id)函数
从.GROUP文件中搜索match the_title的reid, 没有找到则return default_id,且把
(default_id, the_title加入 .GROUP)
查找是个大问题, 虽然.GROUP保存的只是主题帖,但是搜索还是要讲究策略的
a)直接来,从第一个开始顺序搜索
b)把.GROUP按title排序,这里二分查找
c)只搜索.GROUP最后的n篇(不可靠解)
(这里大家有什么好办法?)
第二步,我们已经确认每篇帖子都有id/reid属性了,现在我们拿他们来改善bbs
1)全局上,丢弃那些 if (strncmp(title, "Re: ", 4) == 0) 之类的恶心代码把~ //sigh
2)修改bbs.c 找到那个特别寒的 readdoent, 大刀阔斧的改吧~
丢弃setqtitle(),ReadPost, ReadReply, 改成reply_reid吧
3)修改thread.c 现在可以出现相同标题,但不同主题的帖子了:)
4)修改read.c 主题阅读更准确了,而且提高了速度
不过那个search_articles的参数看起来太BT了,慢慢改把~~
PS: 对于mail不好解决, 所以我暂时还是保留的按照标题来同主题阅读, 上下搜索
不知道各位大虾有何看法?
--
FROM Heaven