如何像uint64_t一样将整数值插入rocksdb?

时间:2019-04-18 12:08:09

标签: c leveldb rocksdb uint64

我已经测试了以下代码,使用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;
}

我已引用以下参考文献Can integer keys / values be stored in LevelDB?

2 个答案:

答案 0 :(得分:0)

链接的帖子和您自己的代码之间有一个主要区别:您使用sizeof时,他们使用strlenstrlen在内存中搜索一个空字节。仅当您确实有一个以空终止的字符串时,才有意义。

在这里要存储整数数据,无论它是否包含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