本文描述的修改在 FireBird 2.5 和 2.6 上均可使用.
修改代码由 Haohmaru 于 98 年 9月12日 在水木清华站开发并运行.
版主在进行区段删除时如果断线, 或者同时有多个版主在同一版进行区段删除,
将可能导致区段删除错误, 版面上出现一堆空文章, 而且以后该版将不能再进行区段删除.
需要系统维护人员手工消除该版的错误, 版主今后才能继续进行区段删除操作.
具体说, 区段删除的时候, 版面目录下生成了 .tmpfile 和 .deleted 两个临时文件.
删除完成, 这两个文件会消失. 但是删除中如果另外一个进程也进行区段删除,
检测到这两个文件的存在, 则另外一个进程的操作将失败.
而如果删除中断线, 这两个文件就一直存在, 以后在这个版因此就不再能进行区段删除.
而且, 部分已经删除的文章, 在文章列表中也没有去掉(当临时文件消失时才更新列表),
因此导致了空文章的出现.
消除错误, 只要在版面对应的目录下删除两个临时文件就可以了.
现修改代码, 当出现上述错误时, 系统显示类似下面的样子:
区域删除
首篇文章编号: 1
末篇文章编号: 4
确定删除 (Y/N)? [N]: y
本版的上一次区段删除操作发生了错误.
如果想消除此错误,请务必确定目前没有任何人(版主或站长)在本板执行区段删操作.
确定之后进行错误消除才安全,否则将丢失文章.是否现在修复错误? (Y/N)? [N]:
如果版主能确定上述提示的信息, 版主这个时候就可以回答 Y 以便自行消除错误.
之后该版就可以继续进行区段删除了, 比如删掉那些空文章.
如果不能确定, 必须回答 N, 不进行任何消除错误的操作. 否则可能丢失文章的!
之后请和可能在该版进行区段删除的人联系并确认其当前没有进行区段删除操作.
然后就可以再次通过 D 命令回到上述画面, 回答 Y 进行错误消除.
=============================================================================
代码修改:
bbs_src/bbs.c 的 del_range 函数:
1. 添加变量定义: int result;
char fullpath[STRLEN];
2. delete_range(direct,inum1,inum2);
>改成
result = delete_range(direct,inum1,inum2);
3. prints("删除完成\n");
pressreturn() ;
return DIRCHANGED ;
>改成
prints("删除%s\n", result ? "失败!" : "完成") ; /* Leeward: 97.12.15 */
if (result) { /* Haohmaru,修复区段删除错误,98.9.12 */
*num = 0;
move(6,0);
prints("本版的上一次区段删除操作发生了错误. \n如果想消除此错误,^[[1m
^[[31m请务必确定目前没有任何人(版主或站长)在本板执行区段删操作.^[[0m");
getdata(8,0,"^[[1m^[[31m确定之后进行错误消除才安全,否则将丢失文章.^[[5m
是否现在修复错误?^[[0m (Y/N)? [N]: ",num,6,DOECHO,NULL,YEA) ;
if (*num == 'Y' ||*num == 'y') {
sprintf(fullpath,"boards/%s/.tmpfile",currboard);
unlink(fullpath);
sprintf(fullpath,"boards/%s/.deleted",currboard);
unlink(fullpath);
prints("\n错误已经消除,请重新执行区段删除!");
}
else prints("\n不能确认,错误没有被消除.");
}
pressreturn() ;
return DIRCHANGED ;
特别说明两点:
1. ^[[1m 的输入方式是(在 vi 中):Esc i Ctrl-V Ctrl-[ [ 1 m 一共七次击键
2. 上面代码中 3 的 move(6,0) 下面的 prints 和 getdata 中,
字符串应该写在一行上, 是连续的.
--
修改:Leeward FROM 202.112.58.200
FROM 202.112.58.200