Решил использовать при своей работе онную базу данных для 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