我已经测试了以下代码,使用cast将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;
}
答案 0 :(得分:0)
链接的帖子和您自己的代码之间有一个主要区别:您使用sizeof
时,他们使用strlen
。 strlen
在内存中搜索一个空字节。仅当您确实有一个以空终止的字符串时,才有意义。
在这里要存储整数数据,无论它是否包含null字节。因此,您必须声明该数据的大小为sizeof(int)
:
rocksdb_put(db,writeoptions,key,sizeof(int),value,sizeof(int),&err);
答案 1 :(得分:0)
您的方法不可移植。您要做的只是将整数表示形式转储到二进制字段中。如果对int
进行反序列化的代码对int
的理解不同,则此方法将无效。您应该使用序列化库来获取int
的稳定二进制表示形式,例如protobuf / flatbuffers。
这在您的脸上炸毁的可能性有多大?我不知道,取决于您的系统。请注意,rocksdb内部使用所有整数类型的序列化表示形式:util/coding.h