Решил использовать при своей работе онную базу данных для 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
Здравствуйте, hotdox, Вы писали:
H>Решил использовать при своей работе онную базу данных для c++.
H>Для начала написал легкий пример словарь (Слово <-> uint)
Попробыйте
SQLite. С ней так же просто работать, как с Berkeley DB, в том смысле, что это одна библиотека, которая линкуется к программе, и все запчасти базы она держит просто в файле, но при этом она SQL, а с SQL базой работать намного удобнее. У Berkeley DB слишком уж низкоуровневый интерфейс. Например, если информация, которую Вы ищете по ключу, представляет собой "структуру", содержащую сколько-то чисел и сколько-то строк, с BDB Вам придется думать, как ее упаковывать/распаковывать в записи, а с SQLite Вы просто раскидаете свою структуру по колонкам таблицы. И потом, при необходимости, сможете добавить новые колонки или новые таблицы, без необходимости перегенерить всю базу.
P.S. SQLite есть и для UNIX и для Windows.
Здравствуйте, Pzz, Вы писали:
Pzz>Попробыйте SQLite. С ней так же просто работать, как с Berkeley DB, в том смысле, что это одна библиотека, которая линкуется к программе, и все запчасти базы она держит просто в файле, но при этом она SQL, а с SQL базой работать намного удобнее.
Pzz>P.S. SQLite есть и для UNIX и для Windows.
Нет, такой ответ не интересный, т.к. масштабы не те для SQL (потеря производительности не радует в случае использования оного), задачи как раз подходят для berkeley db
Если код смотреть всем лень так и скажите, не буду и надеятся на ответ.
P.S. MySQL в своем ядре пользует berkeley db