Domanda

Mi piacerebbe essere in grado di ottenere tutti i valori-chiave memorizzati in un Berkeley DB utilizzando le associazioni di Ruby da http://github.com/mattbauer/bdb/tree/master ma non sono sicuro di come procedere. saranno apprezzati tutti gli indicatori.

Aggiorna

Ecco un piccolo script che loop le chiavi e li stampa. In base alla risposta 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
È stato utile?

Soluzione

È necessario utilizzare i cursori a Berkeley DB a correre attraverso l'intero spazio chiave / valore.

In Berkeley DB per sé, si potrebbe creare un cursore quindi utilizzarlo con la bandiera DB_FIRST seguito da più invocazioni con la bandiera DB_NEXT fino ad esaurimento delle coppie chiave / valore. È possibile semplificare il codice utilizzando solo DB_NEXT dal momento che, se lo fai in un cursore di recente creazione, è lo stesso che utilizza DB_FIRST.

Con le associazioni di Ruby, questo sembra essere fatto con (in base alla mia molto conoscenza rudimentale di Ruby - si dovrebbe essere in grado di pulire questo in su):

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

Altri suggerimenti

Questo funziona per me :

require 'bdb'
db=BDB::Hash.open("test.db")
keyvalues=db.to_hash
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top