【 以下文字转载自 FreeDevelop 讨论区 】
发信人: Dieken (风催草低 - 明月何尝不照人), 信区: FreeDevelop
标 题: abbs-200080721
发信站: 水木社区 (Mon Jul 21 10:02:06 2008), 站内
三个月前就开始写这东西,写了几天断掉了,现在简化了当初的一些想法,目前
只有版面服务器的一个很粗糙的原型,还没有客户端。
编译
====
依赖 libev, inotify(Linux 上新版 glibc 自带), scons,如果不想用 scons
编译可以看看 SConstruct 内容,很容易转成 Makefile。
运行
====
mkdir -p for_test/t && cd for_test &&
LD_LIBRARY_PATH=.. ../boardd myboard t
boardd 会在 for_test 下创建版面文章数据库文件 myboard.d 和 myboard.i,
并用 inotify 监视 t/ 下新增的文件。
发文:写个文件,第一行会被当作标题,然后 ln -s 到 t/ 下面,目标符号链接
名字必须是 n 开头的,注意如果用相对路径,那么是相对于 t/ 的。
改文:同上,只是符号链接名叫 e-id,id 是要修改的文章 id,第一帖的 id
是 1.
回文:同上,只是符号链接名叫 f-id, id 是要回复文章的 id。
目前只实现这么多,没客户端,暂时用 less 看数据库内容...
三个操作成功后符号链接和其目标被删除。
实现
====
.d, .i 表示一个只添加型数据库,只添加的意思是说 .d 文件只是添加
数据,不修改、删除前面的内容,.i 是固定长度的索引记录文件。
发文:.d, .i 中各添加数据。
改文:.d 中添加数据, .i 中修改对应索引。
删文: .d 不变,.i 中修改对应索引,设置删除标记,保留索引。
对于 boardd 用的数据库,索引内容在 .d 中有一份旧的。
以后会实现对 .d 做垃圾回收的功能,当 .d 增大到一定程度后重新写
一个 .d 文件,原先那个 .d 文件被删除。
构思
====
* 客户端只读方式打开并 mmap .d, .i,服务端读写并添加方式打开
.d, .i,服务端用 mmap 只读映射 .d,可写映射 .i,这样保证 .d
文件已写入部分不会被改掉。
* 客户端发文类似 mail server,将文章,编辑指令写入一个临时目录,
服务端监视这个目录,接收指令来修改 .d, .i,这样避免在读进程
和写进程之间加锁互斥。
--
修改:Dieken FROM 211.157.41.*
FROM 211.157.41.*
附件(14.1KB) abbs-20080721093532.tar.gz