bsddb et base de données reprepro (berkeley)
-
14-10-2019 - |
Question
Je suis en train de lire les fichiers de base de données créés par reprepro
. Je ne l'ai pas beaucoup d'expérience avec BdB, donc je pourrais être confondu ici, mais il semble que la base de données en couches d'une certaine façon.
Si je fais simplement btopen('path/to/packages.db', 'r')
, je reçois l'objet de base de données avec des contenus tels que:
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')]
Cependant, les salons db4.6_dump:
VERSION=3
format=bytevalue
database=local-lenny|main|sparc
type=btree
db_pagesize=4096
HEADER=END
<loads of data>
Le fichier lui-même est identifié comme:. /var/packages/db/packages.db: Berkeley DB (Btree, version 9, native byte-order)
par file
Comment puis-je arriver à ce contenu? Si je comprends bien, je suis arrivé que les noms des bases de données réelles dans keys()
. Comment puis-je obtenir le contenu de ces dbs maintenant?
La solution
Et la réponse semble être que la version « belle » de l'interface bsddb
ne supporte pas les tables multi btree dans un seul fichier. Vous pouvez ouvrir un tel tableau explicitement via bsddb.db, en utilisant:
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)