2009-02-23 4 views
2

J'aimerais pouvoir obtenir toutes les paires valeur/clé stockées dans une BD de Berkeley en utilisant les liens Ruby de http://github.com/mattbauer/bdb/tree/master mais je ne suis pas sûr de savoir comment procéder. Tout pointeur sera apprécié.Comment récupérer tous les enregistrements d'une BD de Berkeley dans Ruby

MISE À JOUR

Voici un petit script qui passe en boucle sur les touches et les imprime. Basé sur la réponse Pax:

require 'rubygems' 
require 'bdb' 

env = Bdb::Env.new(0) 
env.open('foo', Bdb::DB_CREATE,0) 

db = env.db 
db.open(nil, 'db1.db', nil, Bdb::Db::BTREE, Bdb::DB_CREATE,0) 

db.put(nil, 'key', 'value', 0) 
db.put(nil, 'key1', 'value1', 0) 
db.put(nil, 'key2', 'value2', 0) 

dbc = db.cursor(nil,0) 
key,val = dbc.get(nil,nil,Bdb::DB_FIRST) 
while key 
    p key,val 
    key,val = dbc.get(nil,nil,Bdb::DB_NEXT) 
end 
dbc.close 
db.close(0) 
env.close 

Répondre

2

Vous devez utiliser des curseurs dans Berkeley DB pour parcourir l'espace clé/valeur entier. Dans Berkeley DB lui-même, vous devez créer un curseur puis l'utiliser avec l'indicateur DB_FIRST suivi de plusieurs invocations avec le drapeau DB_NEXT jusqu'à ce que vous manquiez de paires clé/valeur. Vous pouvez simplifier le code en utilisant seulement DB_NEXT puisque, si vous faites cela à un curseur nouvellement créé, c'est la même chose que d'utiliser DB_FIRST.

Avec les liaisons Ruby, cela semble être fait avec (basé sur mon très connaissance rudimentaire de Ruby - vous devriez être en mesure de nettoyer ce haut):

dbc = db.cursor(nil,0) 
key,val = dbc.get(nil,nil,Bdb::DB_FIRST) 
while key != nil do 
    # Process key and val as needed. 
    key,val = dbc.get(nil,nil,Bdb::DB_NEXT) 
    # or possibly .. (key,val,Bdb::DB_NEXT) 
end 
dbc.close()