Frage

Ich möchte in der Lage sein, alle Schlüsselwerte in einer Berkeley DB mit den Ruby-Bindungen von http://github.com/mattbauer/bdb/tree/master aber ich bin nicht sicher, wie es weitergeht. Alle Hinweise werden geschätzt.

UPDATE

Hier ist ein kleines Skript, das die Tasten Schleifen über und druckt sie. Basierend auf Pax‘Antwort:

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
War es hilfreich?

Lösung

Sie müssen Cursor in Berkeley DB verwenden, um durch den gesamten Schlüssel / Wert-Raum zu laufen.

In Berkeley DB selbst, würden Sie einen Cursor erstellen dann mit dem DB_FIRST Flag verwenden es durch mehrere Aufrufe mit der DB_NEXT Flagge gefolgt, bis Sie aus Schlüssel / Wert-Paare laufen. Sie können den Code vereinfachen, indem sie da nur DB_NEXT verwenden, wenn Sie zu einem neu erstellten Cursor tun, es ist das gleiche wie DB_FIRST verwendet wird.

Mit den Ruby-Bindungen scheint dies mit durchgeführt werden (basierend auf meine sehr rudimentäre Kenntnisse von Ruby - Sie sollten in der Lage sein, dies zu bereinigen):

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

Andere Tipps

Dies funktioniert für mich :

require 'bdb'
db=BDB::Hash.open("test.db")
keyvalues=db.to_hash
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top