Berkeley DB: невозможно получить данные, используя вторичные индексы

Я пытаюсь пример кода для получения данных с использованием вторичных индексов
Я связал первичный ключ со вторичным ключом, но когда я пытаюсь извлечь данные, используя метод pget, он выдает мне «DB_NOTFOUND, не найдено ни одной подходящей пары ключ / значение».
Пожалуйста, найдите код ниже

class test
{

public:

int m_id;
int m_value;
string m_name;
test() {};
test(int id, int value, string name) :m_id(id), m_value(value), m_name(name)
{

}
};int getvalue(DB *secondary, const DBT *pkey, const DBT *pdata, DBT *skey)

{

memset(skey, 0, sizeof(DBT));
std::string s = std::to_string(((test *)pdata->data)->m_value);
skey->data = (char *)s.c_str();
skey->size = s.length();
return (0);
}int main()
{DB *dbp,*sdbp;
DBT key, data, data1,skey;
int ret, t_ret;
int ret1;
string s, s1;
string keystr, replacement_data;
vector<test> preset;

for (int m = 0;m <= 10;m++)
{
preset.push_back(test(m, m + 10, "test"));
}if ((ret = db_create(&dbp, NULL, 0)) != 0)
{
cerr << "db_create:" << db_strerror(ret) << endl;
exit(1);
}

if ((ret = dbp->open(dbp, NULL, kDatabaseName, "", DB_BTREE, DB_CREATE, 0664)) != 0)
{
dbp->err(dbp, ret, "%s", kDatabaseName);
}if ((ret = db_create(&sdbp, NULL, 0)) != 0)
cout << "error in secondary dbp";
if ((ret = sdbp->set_flags(sdbp, DB_DUP | DB_DUPSORT)) != 0)
cout << "error in secondary dbp SET FLAGS";
if ((ret = sdbp->open(sdbp, NULL,
"new225.db", "", DB_BTREE, DB_CREATE, 0644)) != 0)
cout << "error in secondary dbp OPEN DB";

/* Associate the secondary with the primary. */
if ((ret = dbp->associate(dbp, NULL, sdbp, getvalue,0) != 0))
{
cout << "error in secondary dbp associate";
}for (int n = 0;n < preset.size();n++)
{
memset(&key, 0, sizeof(key));
memset(&data, 0, sizeof(data));

std::string s = std::to_string(preset[n].m_id);

key.data = (char *)s.c_str();
key.size = s.length();
data.data = &preset[n];
data.size = sizeof(preset[n]);
if ((ret = dbp->put(dbp, NULL, &key, &data, 0)) == 0)
cout << "db:" << (char*)key.data << endl;
else
{
dbp->err(dbp, ret, "DB->put");

}

}
DBT pkey;
/* Associate the secondary with the primary. */
for (int n = 0;n < preset.size();n++)
{
memset(&key, 0, sizeof(DBT));
memset(&pkey, 0, sizeof(DBT));
memset(&data1, 0, sizeof(DBT));
std::string s = std::to_string(preset[n].m_value);
key.data = (char *)s.c_str();
key.size =s.length();

if ((ret = sdbp->pget(sdbp, NULL, &key,&pkey, &data1, 0)) == 0)
{

cout << "db:" << (char*)key.data << " :key retrieved :data was:" << ((test *)data1.data)->m_value << endl;
}
else
{
sdbp->err(dbp, ret, "DB->get");
}

}
if ((ret = dbp->close(dbp, 0)) != 0)
dbp->err(dbp, ret, "DBcursor->close");

if ((ret = sdbp->close(sdbp, 0)) != 0)
dbp->err(dbp, ret, "DBcursor->close");}

Это действительно? Пожалуйста, дайте мне знать ваши комментарии

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …