Berkeley DB
От: hotdox  
Дата: 21.02.08 16:39
Оценка:
Решил использовать при своей работе онную базу данных для c++.
Для начала написал легкий пример словарь (Слово <-> uint)

Привожу код
#include <db_cxx.h>
#include <iostream>
#include <string>

const std::string size_str    =    "__";
int main()
{
    Db db(NULL,0);
    db.open(NULL,"dict_db",NULL,DB_HASH,DB_CREATE,0);
    Dbt key,value;
    unsigned long int    dict_size(0),
                        buffer_uint,
                        *buffer_ptr;
    //reading dict size
    //key.set_data(dynamic_cast<void *>(size_str.c_str()));
    //key.set_size(size_str.length()+1);

    key.set_data(const_cast<char *>(size_str.c_str()));
    key.set_size(size_str.size());

    value.set_data(&buffer_uint);
    value.set_ulen(sizeof(unsigned long int));
    value.set_flags(DB_DBT_USERMEM);

    if(db.get(NULL,&key,&value,0)!=0)
    {
        //no size record
        buffer_uint    =    0;
        db.put(NULL, &key, &value, DB_NOOVERWRITE);
    }
    else
    {
        buffer_ptr    =    (unsigned long int*)(value.get_data());
        dict_size    =    *buffer_ptr;
    }
    //we have dict_size
    std::cout<<"current dict size "<<dict_size<<'\n';
//    size_t    input_str_size;
    std::string input_str("");
    char *buffer_char(NULL);
    while(input_str!="exit")
    {
        std::cin>>input_str;
        if(input_str!="exit")
        {
            //key.set_data(input_str.data());
            if(buffer_char)
            {
                delete buffer_char;
            }

            //correct converting
            key.set_data(const_cast<char *>(input_str.c_str()));
            key.set_size(input_str.size());

            value.set_data(&buffer_uint);
            value.set_ulen(sizeof(unsigned long int));
            value.set_flags(DB_DBT_USERMEM);

            if(db.get(NULL,&key,&value,0)!=0)
            {
                //no record for this word
                ++dict_size;
                buffer_uint    =    dict_size;
                db.put(NULL, &key, &value, DB_NOOVERWRITE);
                std::cout<<"new item "<<buffer_uint<<'\n';
            }
            else
            {
                std::cout<<"existing item "<<*(unsigned long int *)value.get_data()<<'\n';
            }            
        }
    }
    //stop adding record
    //save size
    

    key.set_data(const_cast<char *>(size_str.c_str()));
    key.set_size(size_str.size());

    //db.del(NULL,&key,0);

    buffer_uint    =    dict_size;
    value.set_data(&buffer_uint);
    value.set_ulen(sizeof(unsigned long int));
    value.set_flags(DB_DBT_USERMEM);

    db.put(NULL, &key, &value, 0);


    db.close(0);
    return 0;
}


Вроде всё делаю правильно по Tutorial. Все компилируется и работает, но не правильно.
После db.get() в value ничего не попадает, остается предыдущее значение хранимое там.
Подскажите plzzz, что я делаю не так.
Парметры db v 4.6.21 для Microsoft Visual Studio 2003 и 2005