我已经测试了以下代码,用于使用强制转换将整数值(如uint64_t(插入 rocksdb 数据库。这是一个正确的方法吗?
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<assert.h>
#include<unistd.h>
#include<stdint.h>
const char DBPath[] = "/tmp/test_sample";
#include "rocksdb/c.h"
int main(int argc, char **argv){
// Intialize basic parameters
rocksdb_t *db;
rocksdb_options_t *options = rocksdb_options_create();
// Create the database if it's not already present
rocksdb_options_set_create_if_missing(options,1);
// Open database
char *err = NULL;
db = rocksdb_open(options,DBPath,&err);
assert(!err);
//Put key value
//Insert insert value to the database
rocksdb_writeoptions_t *writeoptions = rocksdb_writeoptions_create();
int intKey = 256;
int intValue = 256*256;
const char* key;
const char* value;
//Convert integer value to char array
key = (char*)&intKey;
value = (char*)&intValue ;
rocksdb_put(db,writeoptions,key,strlen(key),value,strlen(value) + 1,&err);
assert(!err);
//Cleanup
rocksdb_writeoptions_destroy(writeoptions);
rocksdb_options_destroy(options);
rocksdb_close(db);
return 0;
}
我参考了以下参考整数键/值可以存储在 LevelDB 中吗?
您的方法不可移植。您要做的就是将整数表示形式转储到二进制字段中。如果反序列化int
的代码对int
有不同的理解,这将不起作用。你应该使用序列化库来获得int
的稳定二进制表示,例如protobuf/flatbuffers。
这有多大可能在你的脸上爆炸?我不知道,取决于你的系统。请注意,rocksdb 内部对所有整数类型使用序列化表示:util/coding.h
链接的帖子和您自己的代码之间有一个主要区别:它们使用sizeof
而您使用strlen
。 strlen
在内存中搜索空字节。只有当您确实有一个以 null 结尾的字符串时,它才有意义。
在这里,您要存储一个整数数据,无论它是否包含 not 的空字节。因此,您必须声明要sizeof(int)
的数据的大小:
rocksdb_put(db,writeoptions,key,sizeof(int),value,sizeof(int),&err);