База данных bsddb и preppro (Беркли) - PullRequest
2 голосов
/ 30 декабря 2010

Я пытаюсь прочитать файлы базы данных, созданные 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>

Сам файл обозначается как: /var/packages/db/packages.db: Berkeley DB (Btree, version 9, native byte-order) file.

Какмне добраться до этого содержания?Если я правильно понимаю, я получил только имена реальных баз данных в keys().Как мне теперь добраться до содержимого этих БД?

1 Ответ

2 голосов
/ 30 декабря 2010

И, похоже, ответ таков: «хорошая» версия интерфейса bsddb не поддерживает таблицы multi btree внутри одного файла.Вы можете открыть такую ​​таблицу явно через 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)
...