Как вставить целочисленные значения в rocksdb как uint64_t? - PullRequest
0 голосов
/ 18 апреля 2019

Я протестировал следующий код для вставки целочисленных значений, таких как uint64_t, в базу данных rockdb с помощью приведения.Это правильный подход?

#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?

Ответы [ 2 ]

0 голосов
/ 20 апреля 2019

Ваш подход не переносим. Что вы делаете, это просто дамп целочисленного представления в двоичном поле. Если код десериализации вашего int имеет другое понимание int, это не сработает. Вы должны использовать библиотеку сериализации, чтобы получить стабильное двоичное представление int, например, Protobuf / flatbuffers.

Какова вероятность того, что это взорвется на вашем лице? Я не знаю, зависит от вашей системы. Обратите внимание, что внутри rockdb используются сериализованные представления для всех целочисленных типов: util / coding.h

0 голосов
/ 18 апреля 2019

Существует одно существенное различие между ссылками и вашим собственным кодом: они используют sizeof, а вы используете strlen. strlen ищет в памяти нулевой байт. Это имеет смысл, только если у вас действительно строка символов с нулевым символом в конце.

Здесь вы хотите сохранить целочисленные данные, независимо от того, содержат ли они нулевые байты или нет. Поэтому вы должны объявить размер этих данных равным sizeof(int):

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