Как получить все записи из Беркли БД в Ruby - PullRequest
2 голосов
/ 23 февраля 2009

Я бы хотел получить все значения ключей, хранящиеся в БД Berkeley, используя привязки Ruby из http://github.com/mattbauer/bdb/tree/master, но я не уверен, как поступить Любые указатели будут оценены.

UPDATE

Вот небольшой скрипт, который перебирает ключи и печатает их. На основании ответа Пакс:

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

Ответы [ 2 ]

2 голосов
/ 26 февраля 2009

Вам нужно использовать курсоры в Berkeley DB, чтобы пробегать все пространство ключ / значение.

В самой Berkeley DB вы должны создать курсор, а затем использовать его с флагом DB_FIRST, за которым следует несколько вызовов с флагом DB_NEXT, пока у вас не кончатся пары ключ / значение. Вы можете упростить код, используя только DB_NEXT, поскольку, если вы сделаете это для вновь созданного курсора, это то же самое, что и DB_FIRST.

При связывании с Ruby это, кажется, делается (основываясь на моих очень элементарных знаниях Ruby - вы должны быть в состоянии это исправить):

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()
1 голос
/ 21 марта 2010

Это работает для меня :

require 'bdb'
db=BDB::Hash.open("test.db")
keyvalues=db.to_hash
...