关于浮动索引的Berkeley DB c++查询
Berkeley DB C++ query on floating index
我在OSX上使用Berkeley DB c++ API 6.0。我的应用程序创建了一个包含以下表的数据库:
主表:(int, myStruct) -> myStruct是一个buffer
二级索引:(float, myStruct) -> float键是我在myStruct缓冲区中通过以下回调获取的信息。
int meanExtractor(Db *sdbp,
const Dbt *pkey,
const Dbt *pdata,
Dbt *skey)
{
Dbt data = *pdata;
feature<float> f;
restoreDescriptor(f, data);
void* mean = malloc( sizeof(float) );
memcpy( mean, &f.mean, sizeof(float) );
skey->set_data(mean);
skey->set_size(sizeof(float));
skey->set_flags( DB_DBT_APPMALLOC );
return 0;
}
当我遍历二级索引并打印键/数据对时,浮点键被很好地存储了。我的问题是我不能查询这个表。我想执行以下SQL查询:
SELECT * FROM secondary index WHERE keys > 1.5 && keys < 3.4
我的表中有50000个键,范围在0.001到49.999之间。问题是当我使用这个方法时例如:
I assume the Db and the table are already opened
float i = 0.05;
Dbt key = Dbt(&i, sizeof(float));
Dbc* dbc;
db->cursor( txn, &dbc, 0 );
int ret;
ret = dbc->get( key, &vald, DB_SET_RANGE));
检索到这个键:0.275。它应该检索0.05(因为它存在)或至少0.051。对于Dbt键中的其他浮动值,它会给我一些愚蠢的值。如果我放上DB_SET标志,它就找不到任何键。我的想法是将光标设置为大于或等于我的键的最小键,然后使用标志DB_NEXT进行迭代,直到到达我的范围的末尾。这必须来自BerkeleyDB的搜索算法,但我看到了一些(有用但不够)的例子,做我所需要的,但与Java API,所以它证明这是可能的…
我被这个问题困住了,所以如果有人以前遇到过这个问题,谢谢你的帮助。如果有必要,我可以把我的代码的其他部分
我在二级索引上使用了一个自定义的bt_compare函数,现在它工作得很好。
相关文章:
- 制作时出错,C++"db.c:2127:错误:在"||"标记之前应使用";"
- OLE DB 大容量复制操作始终将 true 加载到位列中
- 优化使用 C++ 查询 SQLite DB 中超过 5000 万条数据记录的方式
- POST Arduino 传感器值通过 Flask API 发送到本地 Sqlite db
- ATL OLE DB Consumer Templates 与 Microsoft OLE DB Driver for
- Poco c++ 如何从PostgreSQL DB读取"text"数据类型?
- 任何用于PostgreSQL的OLE DB提供商/消费者
- C PTHREAD_MUTEX在DB访问中无法正常工作
- 如何在mongo db上从gmlib存储mpz_t
- 在运行Visual Studio中用C 编写的Oracle DB客户端时,我会收到错误32104
- PostgreSQL在DB服务器中消耗更多内存,以进行长期运行的连接
- 在标头中声明 sqlite::d atabase db( ":memory:" ) 会给出错误
- 如何在Oracle DB中编写C 中的UDF
- 插入MySQL DB中的表之后,错误消息
- 伯克利数据库 Db->get 使用自定义比较函数时不起作用
- 如何更改*.db的默认位置?
- 将CPP类成员设置为SQLite DB中的列
- 在QT列表中存储DB的查询结果的更好方法
- SourcePro DB可以使用PKI连接到Oracle吗?
- 无法创建或打开 *.VS 2015 中的 VC.db 文件(桌面快速版)更新 3RC