bsddb与reprepro(伯克利)数据库

2 投票
1 回答
730 浏览
提问于 2025-04-16 09:13

我正在尝试读取由 reprepro 创建的数据库文件。我对 bdb 的了解不多,所以可能会有些困惑,但看起来这个数据库是以某种方式分层的。

如果我简单地使用 btopen('path/to/packages.db', 'r'),我会得到一个数据库对象,里面的内容像这样:

In [4]: packages.items()
Out[4]: 
[('local-lenny|main|amd64', '\x00\x00\x00\x04'),
 ('local-lenny|main|i386', '\x00\x00\x00\x02'),
 ('local-lenny|main|powerpc', '\x00\x00\x00\x14'),
 ('local-lenny|main|source', '\x00\x00\x00\x06'),
 ('local-lenny|main|sparc', '\x00\x00\x00\x12')]

但是 db4.6_dump 显示的是:

VERSION=3
format=bytevalue
database=local-lenny|main|sparc
type=btree
db_pagesize=4096
HEADER=END
 <loads of data>

这个文件本身被 file 命令识别为:/var/packages/db/packages.db: Berkeley DB (Btree, version 9, native byte-order)

我该如何获取这些内容呢?如果我理解得没错,我在 keys() 中只得到了实际数据库的名称。现在我该如何访问这些数据库的内容呢?

1 个回答

2

答案似乎是,bsddb 接口的“友好”版本不支持在一个文件中使用多个 B 树表。你可以通过 bsddb.db 来显式打开这样的表,使用以下代码:

env = db.DBEnv()
env.open(None, db.DB_CREATE | db.DB_INIT_MPOOL)
internal_db = db.DB(env)
internal_db.open("the filename", "the internal db name", db.DB_BTREE, db.DB_RDONLY)

撰写回答