Change binhelper to avoid stupid user errors; now grows the buffer on demand for the specific # of bytes; fix bugs in get_data_dirs/0 (driver and erlang caller)
This commit is contained in:
parent
3b9ba443f1
commit
45606ddf56
|
@ -122,7 +122,7 @@ static TPool* G_TPOOL_TXNS;
|
||||||
|
|
||||||
#define RETURN_INT(val, outbuf) { \
|
#define RETURN_INT(val, outbuf) { \
|
||||||
BinHelper bh; \
|
BinHelper bh; \
|
||||||
bin_helper_init(&bh, 4); \
|
bin_helper_init(&bh); \
|
||||||
bin_helper_push_int32(&bh, val); \
|
bin_helper_push_int32(&bh, val); \
|
||||||
RETURN_BH(bh, outbuf); }
|
RETURN_BH(bh, outbuf); }
|
||||||
|
|
||||||
|
@ -351,7 +351,7 @@ static int bdberl_drv_control(ErlDrvData handle, unsigned int cmd,
|
||||||
// Pack the status and dbref (or errno) into a binary and return it
|
// Pack the status and dbref (or errno) into a binary and return it
|
||||||
// Outbuf is: <<Status:8, DbRef:32>>
|
// Outbuf is: <<Status:8, DbRef:32>>
|
||||||
BinHelper bh;
|
BinHelper bh;
|
||||||
bin_helper_init(&bh, 5);
|
bin_helper_init(&bh);
|
||||||
bin_helper_push_byte(&bh, status);
|
bin_helper_push_byte(&bh, status);
|
||||||
bin_helper_push_int32(&bh, dbref);
|
bin_helper_push_int32(&bh, dbref);
|
||||||
RETURN_BH(bh, outbuf);
|
RETURN_BH(bh, outbuf);
|
||||||
|
@ -748,6 +748,7 @@ static int delete_database(const char* name)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Good, database doesn't seem to be open -- attempt the delete
|
// Good, database doesn't seem to be open -- attempt the delete
|
||||||
|
DBG("Attempting to delete database: %s\n", name);
|
||||||
int rc = G_DB_ENV->dbremove(G_DB_ENV, 0, name, 0, DB_AUTO_COMMIT);
|
int rc = G_DB_ENV->dbremove(G_DB_ENV, 0, name, 0, DB_AUTO_COMMIT);
|
||||||
WRITE_UNLOCK(G_DATABASES_RWLOCK);
|
WRITE_UNLOCK(G_DATABASES_RWLOCK);
|
||||||
return rc;
|
return rc;
|
||||||
|
@ -766,7 +767,7 @@ static void tune_system(int target, void* values, BinHelper* bh)
|
||||||
unsigned int bytes = 0;
|
unsigned int bytes = 0;
|
||||||
int caches = 0;
|
int caches = 0;
|
||||||
int rc = G_DB_ENV->get_cachesize(G_DB_ENV, &gbytes, &bytes, &caches);
|
int rc = G_DB_ENV->get_cachesize(G_DB_ENV, &gbytes, &bytes, &caches);
|
||||||
bin_helper_init(bh, 16);
|
bin_helper_init(bh);
|
||||||
bin_helper_push_int32(bh, rc);
|
bin_helper_push_int32(bh, rc);
|
||||||
bin_helper_push_int32(bh, gbytes);
|
bin_helper_push_int32(bh, gbytes);
|
||||||
bin_helper_push_int32(bh, bytes);
|
bin_helper_push_int32(bh, bytes);
|
||||||
|
@ -777,7 +778,7 @@ static void tune_system(int target, void* values, BinHelper* bh)
|
||||||
{
|
{
|
||||||
unsigned int timeout = UNPACK_INT(values, 0);
|
unsigned int timeout = UNPACK_INT(values, 0);
|
||||||
int rc = G_DB_ENV->set_timeout(G_DB_ENV, timeout, DB_SET_TXN_TIMEOUT);
|
int rc = G_DB_ENV->set_timeout(G_DB_ENV, timeout, DB_SET_TXN_TIMEOUT);
|
||||||
bin_helper_init(bh, 4);
|
bin_helper_init(bh);
|
||||||
bin_helper_push_int32(bh, rc);
|
bin_helper_push_int32(bh, rc);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -785,7 +786,7 @@ static void tune_system(int target, void* values, BinHelper* bh)
|
||||||
{
|
{
|
||||||
unsigned int timeout = 0;
|
unsigned int timeout = 0;
|
||||||
int rc = G_DB_ENV->get_timeout(G_DB_ENV, &timeout, DB_SET_TXN_TIMEOUT);
|
int rc = G_DB_ENV->get_timeout(G_DB_ENV, &timeout, DB_SET_TXN_TIMEOUT);
|
||||||
bin_helper_init(bh, 8);
|
bin_helper_init(bh);
|
||||||
bin_helper_push_int32(bh, rc);
|
bin_helper_push_int32(bh, rc);
|
||||||
bin_helper_push_int32(bh, timeout);
|
bin_helper_push_int32(bh, timeout);
|
||||||
break;
|
break;
|
||||||
|
@ -794,17 +795,13 @@ static void tune_system(int target, void* values, BinHelper* bh)
|
||||||
{
|
{
|
||||||
const char** dirs = 0;
|
const char** dirs = 0;
|
||||||
int rc = G_DB_ENV->get_data_dirs(G_DB_ENV, &dirs);
|
int rc = G_DB_ENV->get_data_dirs(G_DB_ENV, &dirs);
|
||||||
printf("DATA DIR: %d\n", rc);
|
bin_helper_init(bh);
|
||||||
bin_helper_init(bh, 64);
|
|
||||||
bin_helper_push_int32(bh, rc);
|
bin_helper_push_int32(bh, rc);
|
||||||
if (dirs)
|
while (dirs && *dirs)
|
||||||
{
|
|
||||||
while (*dirs != 0)
|
|
||||||
{
|
{
|
||||||
bin_helper_push_string(bh, *dirs);
|
bin_helper_push_string(bh, *dirs);
|
||||||
dirs++;
|
dirs++;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,15 +12,19 @@
|
||||||
|
|
||||||
static void bin_helper_check_size(BinHelper* bh, int space_needed)
|
static void bin_helper_check_size(BinHelper* bh, int space_needed)
|
||||||
{
|
{
|
||||||
if (bh->offset + space_needed > bh->bin->orig_size)
|
if (bh->bin && (bh->offset + space_needed > bh->bin->orig_size))
|
||||||
{
|
{
|
||||||
bh->bin = driver_realloc_binary(bh->bin, bh->offset + space_needed);
|
bh->bin = driver_realloc_binary(bh->bin, bh->offset + space_needed);
|
||||||
}
|
}
|
||||||
|
else if (!bh->bin)
|
||||||
|
{
|
||||||
|
bh->bin = driver_alloc_binary(space_needed);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void bin_helper_init(BinHelper* bh, unsigned int size)
|
void bin_helper_init(BinHelper* bh)
|
||||||
{
|
{
|
||||||
bh->bin = driver_alloc_binary(size);
|
bh->bin = 0;
|
||||||
bh->offset = 0;
|
bh->offset = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -15,7 +15,7 @@ typedef struct
|
||||||
unsigned int offset;
|
unsigned int offset;
|
||||||
} BinHelper;
|
} BinHelper;
|
||||||
|
|
||||||
void bin_helper_init(BinHelper* bh, unsigned int size);
|
void bin_helper_init(BinHelper* bh);
|
||||||
void bin_helper_push_byte(BinHelper* bh, int value);
|
void bin_helper_push_byte(BinHelper* bh, int value);
|
||||||
void bin_helper_push_int32(BinHelper* bh, int value);
|
void bin_helper_push_int32(BinHelper* bh, int value);
|
||||||
void bin_helper_push_string(BinHelper* bh, const char* string);
|
void bin_helper_push_string(BinHelper* bh, const char* string);
|
||||||
|
|
|
@ -239,7 +239,7 @@ cursor_close() ->
|
||||||
end.
|
end.
|
||||||
|
|
||||||
delete_database(Filename) ->
|
delete_database(Filename) ->
|
||||||
Cmd = list_to_binary(Filename),
|
Cmd = <<(list_to_binary(Filename))/binary, 0:8>>,
|
||||||
<<Rc:32/native-signed>> = erlang:port_control(get_port(), ?CMD_REMOVE_DB, Cmd),
|
<<Rc:32/native-signed>> = erlang:port_control(get_port(), ?CMD_REMOVE_DB, Cmd),
|
||||||
case decode_rc(Rc) of
|
case decode_rc(Rc) of
|
||||||
ok ->
|
ok ->
|
||||||
|
|
|
@ -30,9 +30,11 @@ all() ->
|
||||||
delete_should_remove_file,
|
delete_should_remove_file,
|
||||||
delete_should_fail_if_db_inuse].
|
delete_should_fail_if_db_inuse].
|
||||||
|
|
||||||
|
|
||||||
dbconfig(Config) ->
|
dbconfig(Config) ->
|
||||||
Cfg = [{set_data_dir, ?config(priv_dir, Config)},
|
Cfg = [{set_data_dir, ?config(priv_dir, Config)},
|
||||||
{set_flags, 'DB_TXN_NOSYNC'}],
|
{set_flags, 'DB_TXN_NOSYNC'},
|
||||||
|
{set_log_config, 'DB_LOG_IN_MEMORY'}],
|
||||||
list_to_binary(lists:flatten([io_lib:format("~s ~s\n", [K,V]) || {K, V} <- Cfg])).
|
list_to_binary(lists:flatten([io_lib:format("~s ~s\n", [K,V]) || {K, V} <- Cfg])).
|
||||||
|
|
||||||
|
|
||||||
|
@ -45,7 +47,8 @@ init_per_suite(Config) ->
|
||||||
end_per_suite(_Config) ->
|
end_per_suite(_Config) ->
|
||||||
ok.
|
ok.
|
||||||
|
|
||||||
init_per_testcase(_TestCase, Config) ->
|
init_per_testcase(TestCase, Config) ->
|
||||||
|
ct:print("~p", [TestCase]),
|
||||||
{ok, Db} = bdberl:open("api_test.db", btree, [create, exclusive]),
|
{ok, Db} = bdberl:open("api_test.db", btree, [create, exclusive]),
|
||||||
[{db, Db}|Config].
|
[{db, Db}|Config].
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue