分段错误 - 在 C 中的 LMDB 中获取行值
Segmentation error - get a row value in LMDB in C
如何从 LMDB 数据库中获取数据?
这是图书馆 - github.com/LMDB/lmdb/tree/mdb.master/libraries/liblmdb, and here is the lmdb file - github.com/LMDB/lmdb/blob/mdb.master/libraries/liblmdb/lmdb.h
这是我的代码,但它不起作用,出现分段错误:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "lmdb.h"
#define E(expr) CHECK((rc = (expr)) == MDB_SUCCESS, #expr)
#define CHECK(test, msg) ((test) ? (void)0 : ((void)fprintf(stderr, \
"%s:%d: %s: %s\n", __FILE__, __LINE__, msg, mdb_strerror(rc)), abort()))
#define DBDIR "./testdb"
/* Put to db */
int putdb(char *, char *);
/* Get from db */
int getdb(char *);
int main()
{
putdb("key", "value");
getdb("key");
return 0;
}
/* Put to db */
int putdb(char *keyvalue, char *value) {
int rc;
MDB_env *env;
MDB_dbi dbi;
MDB_txn *txn;
MDB_val key, data, rdata;
MDB_cursor *cursor;
char sval[32];
printf("put %s %s\n",keyvalue, value);
E(mdb_env_create(&env));
E(mdb_env_open(env, DBDIR, 0, 0664));
/* Put some data */
E(mdb_txn_begin(env, NULL, 0, &txn));
E(mdb_dbi_open(txn, NULL, 0, &dbi));
key.mv_data = keyvalue;
key.mv_size = strlen(keyvalue);
data.mv_data = value;
data.mv_size = strlen(value);
E(mdb_put(txn, dbi, &key, &data, 0));
E(mdb_txn_commit(txn));
mdb_dbi_close(env, dbi);
mdb_env_close(env);
return 0;
}
/* Get from lmdb */
int getdb(char *thekey) {
int rc;
MDB_env *env;
MDB_dbi dbi;
MDB_txn *txn;
MDB_val key, data, rdata;
MDB_cursor *cursor;
printf("get %s\n", thekey);
E(mdb_env_create(&env));
//E(mdb_env_open(env, DBDIR, 0, 0664));
/* Get some data */
E(mdb_txn_begin(env, NULL, 0, &txn));
E(mdb_dbi_open(txn, NULL, 0, &dbi));
key.mv_data = thekey;
key.mv_size = strlen(thekey);
//data.mv_data = &somedata;
//data.mv_size = sizeof(somedata);
mdb_get(txn, dbi, &key, &data);
printf("%s %d, %s %d\n", (char *) key.mv_data, key.mv_size, (char *)data.mv_data, data.mv_size);
E(mdb_txn_commit(txn));
mdb_dbi_close(env, dbi);
mdb_env_close(env);
return 0;
}
怎么了?也许我需要初始化 data.mv_data 和 data.mv_size 但是在获取值之前我怎么知道大小。
我找不到任何包含此类代码的示例。
这至少很奇怪:
key.mv_data = &keyvalue;
key.mv_size = strlen(keyvalue);
data.mv_data = value;
data.mv_size = strlen(value);
keyvalue
和 value
都是 char *
所以 data
在其 mv_data
成员中得到一个 char *
而 key
得到一个char **
(一个间接级别)。
如何从 LMDB 数据库中获取数据? 这是图书馆 - github.com/LMDB/lmdb/tree/mdb.master/libraries/liblmdb, and here is the lmdb file - github.com/LMDB/lmdb/blob/mdb.master/libraries/liblmdb/lmdb.h
这是我的代码,但它不起作用,出现分段错误:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "lmdb.h"
#define E(expr) CHECK((rc = (expr)) == MDB_SUCCESS, #expr)
#define CHECK(test, msg) ((test) ? (void)0 : ((void)fprintf(stderr, \
"%s:%d: %s: %s\n", __FILE__, __LINE__, msg, mdb_strerror(rc)), abort()))
#define DBDIR "./testdb"
/* Put to db */
int putdb(char *, char *);
/* Get from db */
int getdb(char *);
int main()
{
putdb("key", "value");
getdb("key");
return 0;
}
/* Put to db */
int putdb(char *keyvalue, char *value) {
int rc;
MDB_env *env;
MDB_dbi dbi;
MDB_txn *txn;
MDB_val key, data, rdata;
MDB_cursor *cursor;
char sval[32];
printf("put %s %s\n",keyvalue, value);
E(mdb_env_create(&env));
E(mdb_env_open(env, DBDIR, 0, 0664));
/* Put some data */
E(mdb_txn_begin(env, NULL, 0, &txn));
E(mdb_dbi_open(txn, NULL, 0, &dbi));
key.mv_data = keyvalue;
key.mv_size = strlen(keyvalue);
data.mv_data = value;
data.mv_size = strlen(value);
E(mdb_put(txn, dbi, &key, &data, 0));
E(mdb_txn_commit(txn));
mdb_dbi_close(env, dbi);
mdb_env_close(env);
return 0;
}
/* Get from lmdb */
int getdb(char *thekey) {
int rc;
MDB_env *env;
MDB_dbi dbi;
MDB_txn *txn;
MDB_val key, data, rdata;
MDB_cursor *cursor;
printf("get %s\n", thekey);
E(mdb_env_create(&env));
//E(mdb_env_open(env, DBDIR, 0, 0664));
/* Get some data */
E(mdb_txn_begin(env, NULL, 0, &txn));
E(mdb_dbi_open(txn, NULL, 0, &dbi));
key.mv_data = thekey;
key.mv_size = strlen(thekey);
//data.mv_data = &somedata;
//data.mv_size = sizeof(somedata);
mdb_get(txn, dbi, &key, &data);
printf("%s %d, %s %d\n", (char *) key.mv_data, key.mv_size, (char *)data.mv_data, data.mv_size);
E(mdb_txn_commit(txn));
mdb_dbi_close(env, dbi);
mdb_env_close(env);
return 0;
}
怎么了?也许我需要初始化 data.mv_data 和 data.mv_size 但是在获取值之前我怎么知道大小。
我找不到任何包含此类代码的示例。
这至少很奇怪:
key.mv_data = &keyvalue;
key.mv_size = strlen(keyvalue);
data.mv_data = value;
data.mv_size = strlen(value);
keyvalue
和 value
都是 char *
所以 data
在其 mv_data
成员中得到一个 char *
而 key
得到一个char **
(一个间接级别)。