2013-09-09 7 views
2

Как я могу получить диапазон данных, таких как 10 < key < 20 из Berkeley DB? Я не мог найти ничего путем поиска.Извлечение данных из Berkeley DB

+0

Какой язык программирования вы используете? – pts

+0

Я использую python, но, похоже, мне придется использовать C/C++ по другим причинам. Так или работает. – xcorat

+0

- другие причины, являющиеся библиотекой python bsddb3, похоже, не поддерживают целые ключи/значения для структур данных BTREE и HASH. – xcorat

ответ

1

Я взял быстрый взгляд на http://pybsddb.sourceforge.net/bsddb3.html, а следующая идея выглядит многообещающей: создать объект DBCursor, вызовите метод .set найти ключ 10, а затем вызвать его метод .next, пока не достигнет 20.

Я не знаю деталей API C, но я бы попробовал ту же идею: попытайтесь создать курсор и вызовите функции, названные как set и next на курсор.

+0

Thx, это сработает. Просто подумал, что будет прямой путь, как в Монго. – xcorat

0

Возможно, этот код вам поможет. Он извлекает записи с ключом < = ключ < = key2, но может быть изменен для вашего состояния. Я использую первый флаг DB_SET_RANGE для поиска key => key1, а затем флаг DB_NEXT для получения следующих значений и проверки: < = key2.

void get(DB *dbp, int key1, int key2){ 
    DBC *curs; 
    DBT k,v; 
    int fl; 

    // Get a cursor 
    dbp->cursor(dbp, NULL, &curs, 0); 
    if (!curs) _dberr("can't get a cursor"); 

    // Set DBT for 1st key and value 
    memset(&v, 0, sizeof(DBT)); 
    memset(&k, 0, sizeof(DBT)); 
    k.data = &key1; 
    k.size = sizeof(key1); 

    fl = DB_SET_RANGE; // first key will be >=key1 
    while (curs->c_get(curs, &k, &v, fl)==0 && 
     key2 >= *(int *)k.data){ 
    fl = DB_NEXT; 
    // use v.data 
    } 
} 
Смежные вопросы