Pergunta

Eu gostaria de ser capaz de obter todos os valores-chave armazenados em um Berkeley DB usando as ligações Ruby a partir de http://github.com/mattbauer/bdb/tree/master mas não tenho certeza de como proceder. Os ponteiros será apreciado.

Atualizar

Aqui está um pequeno script que faz um loop sobre as teclas e os imprime. Com base na resposta 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
Foi útil?

Solução

Você precisa usar cursores em Berkeley DB para executar através de todo o espaço de chave / valor.

Em Berkeley DB em si, você criaria um cursor, em seguida, usá-lo com a bandeira DB_FIRST seguida por várias chamadas com a bandeira DB_NEXT até que você correr para fora de pares de chave / valor. Você pode simplificar o código, usando apenas DB_NEXT uma vez que, se você fizer isso para um cursor recém-criado, é o mesmo que usar DB_FIRST.

Com as ligações Ruby, este parece ser feito com (baseado no meu muito conhecimento rudimentar da Ruby - você deve ser capaz de limpar isso):

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()

Outras dicas

isso funciona para mim :

require 'bdb'
db=BDB::Hash.open("test.db")
keyvalues=db.to_hash
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top