2009-02-23 78 views
2

我希望能够使用来自http://github.com/mattbauer/bdb/tree/master的Ruby绑定来获取存储在Berkeley DB中的所有键值,但我不知道如何继续。任何指针将不胜感激。如何从Ruby中的伯克利数据库检索所有记录

UPDATE

这里有一个小脚本,遍历键和打印它们。基于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 

回答

2

您需要使用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

This works for me

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