C语言 如何像uint64_t一样将整数值插入 rocksdb



我已经测试了以下代码,用于使用强制转换将整数值(如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而您使用strlenstrlen在内存中搜索空字节。只有当您确实有一个以 null 结尾的字符串时,它才有意义。

在这里,您要存储一个整数数据,无论它是否包含 not 的空字节。因此,您必须声明要sizeof(int)的数据的大小:

rocksdb_put(db,writeoptions,key,sizeof(int),value,sizeof(int),&err);

相关内容

最新更新