1
代码的唯一区别就是数据的初始化。这工作:Berkeley DB不能用不同的Dbt初始化设置值
Dbt key, data(&b, sizeof(int));
key.set_data(&a);
key.set_ulen(sizeof(int));
data.set_flags(DB_DBT_USERMEM);
但这并不:
Dbt key, data;
key.set_data(&a);
key.set_ulen(sizeof(int));
data.set_data(&b);
data.set_ulen(sizeof(int));
data.set_flags(DB_DBT_USERMEM);
我https://docs.oracle.com/cd/E17076_04/html/api_reference/CXX/dbt.html读文件,我没有看到这两种方式的区别。这很混乱。
完整的代码和结果如下:
$ cat db.cpp
#include <db.h>
#include <db_cxx.h>
#include <exception>
#include <iostream>
using namespace std;
int main() {
Db db(NULL, 0);
u_int32_t oFlags = DB_CREATE | DB_TRUNCATE;
try {
db.open(NULL, "test.db", NULL, DB_HASH, oFlags, 0);
} catch (DbException &e) {
cout << "DbException" << endl;
} catch (std::exception &e) {
}
int a = 5, b = 6, c = 0, result[1]= {-1};
Dbt key, data(&b, sizeof(int));
key.set_data(&a);
key.set_ulen(sizeof(int));
data.set_flags(DB_DBT_USERMEM);
cout << (db.get(NULL, &key, &data, 0) == DB_NOTFOUND) << endl;
cout << c << endl;
db.put(NULL, &key, &data, 0);
key.set_data(&a);
data.set_data(result);
data.set_ulen(sizeof(int));
cout << (db.get(NULL, &key, &data, 0))<< endl;
cout << *((int *) data.get_data()) << endl;
cout << result[0] << endl;
return 0;
}
$ rm test.db ; g++ db.cpp -ldb_cxx-5.1; ./a.out
1
0
0
6
6
$ cat db.cpp
#include <db.h>
#include <db_cxx.h>
#include <exception>
#include <iostream>
using namespace std;
int main() {
Db db(NULL, 0);
u_int32_t oFlags = DB_CREATE | DB_TRUNCATE;
try {
db.open(NULL, "test.db", NULL, DB_HASH, oFlags, 0);
} catch (DbException &e) {
cout << "DbException" << endl;
} catch (std::exception &e) {
}
int a = 5, b = 6, c = 0, result[1]= {-1};
Dbt key, data;
key.set_data(&a);
key.set_ulen(sizeof(int));
data.set_data(&b);
data.set_ulen(sizeof(int));
data.set_flags(DB_DBT_USERMEM);
cout << (db.get(NULL, &key, &data, 0) == DB_NOTFOUND) << endl;
cout << c << endl;
db.put(NULL, &key, &data, 0);
key.set_data(&a);
data.set_data(result);
data.set_ulen(sizeof(int));
cout << (db.get(NULL, &key, &data, 0))<< endl;
cout << *((int *) data.get_data()) << endl;
cout << result[0] << endl;
return 0;
}
$ rm test.db ; g++ db.cpp -ldb_cxx-5.1; ./a.out
1
0
0
-1
-1
非常感谢!你真的很有帮助。 – user3458198