class BDB::Env
Public Class Methods
allocate()
click to toggle source
static VALUE
bdb_env_s_alloc(VALUE obj)
{
VALUE res;
bdb_ENV *envst;
res = Data_Make_Struct(obj, bdb_ENV, bdb_env_mark, bdb_env_free, envst);
envst->options |= BDB_ENV_NOT_OPEN;
return res;
}
create(*args)
click to toggle source
static VALUE
bdb_env_s_new(int argc, VALUE *argv, VALUE obj)
{
bdb_ENV *envst;
VALUE res;
int flags = 0;
#ifdef HAVE_RB_DEFINE_ALLOC_FUNC
res = rb_obj_alloc(obj);
#else
res = rb_funcall2(obj, rb_intern("allocate"), 0, 0);
#endif
Data_Get_Struct(res, bdb_ENV, envst);
#if ! HAVE_DB_ENV_CREATE
envst->envp = ALLOC(DB_ENV);
MEMZERO(envst->envp, DB_ENV, 1);
envst->envp->db_errpfx = "BDB::";
envst->envp->db_errcall = bdb_env_errcall;
#else
if (argc && TYPE(argv[argc - 1]) == T_HASH) {
rb_iterate(rb_each, argv[argc - 1], bdb_env_s_i_options, (VALUE)&flags);
}
bdb_test_error(db_env_create(&(envst->envp), flags));
envst->envp->set_errpfx(envst->envp, "BDB::");
envst->envp->set_errcall(envst->envp, bdb_env_errcall);
#if HAVE_ST_DB_ENV_SET_ALLOC
bdb_test_error(envst->envp->set_alloc(envst->envp, malloc, realloc, free));
#endif
#if HAVE_ST_DB_ENV_SET_ENV_NOTIFY
if (argc && TYPE(argv[argc - 1]) == T_HASH) {
VALUE value = Qnil;
rb_iterate(rb_each, argv[argc - 1], bdb_env_s_j_options, (VALUE)&value);
if (!NIL_P(value)) {
if (!rb_respond_to(value, bdb_id_call)) {
rb_raise(bdb_eFatal, "arg must respond to #call");
}
envst->event_notify = value;
envst->envp->set_event_notify(envst->envp, bdb_env_event_notify);
}
}
#endif
#endif
rb_obj_call_init(res, argc, argv);
return res;
}
new(p1, p2 = v2, p3 = v3)
click to toggle source
VALUE
bdb_env_init(int argc, VALUE *argv, VALUE obj)
{
DB_ENV *envp;
bdb_ENV *envst;
VALUE a, c, d;
char *db_home, **db_config;
int ret, mode, flags;
VALUE st_config;
VALUE envid;
envid = 0;
st_config = 0;
db_config = 0;
mode = flags = 0;
if (!RDATA(obj)->dmark) {
RDATA(obj)->dmark = (RUBY_DATA_FUNC)bdb_env_mark;
}
Data_Get_Struct(obj, bdb_ENV, envst);
#if HAVE_ST_DB_ENV_SET_ERRCALL
envst->envp->set_errcall(envst->envp, bdb_env_errcall);
#endif
envp = envst->envp;
#if HAVE_ST_DB_ENV_SET_ENCRYPT
if (rb_const_defined(CLASS_OF(obj), rb_intern("BDB_ENCRYPT"))) {
char *passwd;
int flags = DB_ENCRYPT_AES;
VALUE value = rb_const_get(CLASS_OF(obj), rb_intern("BDB_ENCRYPT"));
if (TYPE(value) == T_ARRAY) {
if (RARRAY_LEN(value) != 2) {
rb_raise(bdb_eFatal, "Expected an Array with 2 values");
}
passwd = StringValuePtr(RARRAY_PTR(value)[0]);
flags = NUM2INT(RARRAY_PTR(value)[1]);
}
else {
passwd = StringValuePtr(value);
}
bdb_test_error(envp->set_encrypt(envp, passwd, flags));
envst->options |= BDB_ENV_ENCRYPT;
}
#endif
if (argc && TYPE(argv[argc - 1]) == T_HASH) {
int i;
VALUE db_stobj;
struct db_stoptions *db_st;
st_config = rb_ary_new();
db_stobj = Data_Make_Struct(rb_cObject, struct db_stoptions, 0, free, db_st);
db_st->env = envst;
db_st->config = st_config;
bdb_env_each_options(argv[argc - 1], db_stobj);
if (RARRAY_LEN(st_config) > 0) {
db_config = ALLOCA_N(char *, RARRAY_LEN(st_config) + 1);
for (i = 0; i < RARRAY_LEN(st_config); i++) {
db_config[i] = StringValuePtr(RARRAY_PTR(st_config)[i]);
}
db_config[RARRAY_LEN(st_config)] = 0;
}
argc--;
}
rb_scan_args(argc, argv, "12", &a, &c, &d);
SafeStringValue(a);
db_home = StringValuePtr(a);
switch (argc) {
case 3:
mode = NUM2INT(d);
case 2:
flags = NUM2INT(c);
break;
}
if (flags & DB_CREATE) {
rb_secure(4);
}
if (flags & DB_USE_ENVIRON) {
rb_secure(1);
}
#ifndef BDB_NO_THREAD_COMPILE
if (!(envst->options & BDB_NO_THREAD)) {
bdb_set_func(envst);
flags |= DB_THREAD;
}
#endif
#if HAVE_DB_APPINIT
if ((ret = db_appinit(db_home, db_config, envp, flags)) != 0) {
if (envst->envp) {
free(envst->envp);
}
envst->envp = NULL;
if (bdb_errcall) {
bdb_errcall = 0;
rb_raise(bdb_eFatal, "%s -- %s", StringValuePtr(bdb_errstr), db_strerror(ret));
}
else
rb_raise(bdb_eFatal, "%s", db_strerror(ret));
}
#else
#if HAVE_ST_DB_ENV_SET_EVENT_NOTIFY
if (envst->event_notify == 0 && rb_respond_to(obj, id_event_notify) == Qtrue) {
envp->set_event_notify(envp, bdb_env_event_notify);
}
#endif
#if HAVE_ST_DB_ENV_SET_REP_TRANSPORT || HAVE_ST_DB_ENV_REP_SET_TRANSPORT
if (envst->rep_transport == 0 && rb_respond_to(obj, rb_intern("bdb_rep_transport")) == Qtrue) {
if (!rb_const_defined(CLASS_OF(obj), rb_intern("ENVID"))) {
rb_raise(bdb_eFatal, "ENVID must be defined to use rep_transport");
}
envid = rb_const_get(CLASS_OF(obj), rb_intern("ENVID"));
#if HAVE_ST_DB_ENV_REP_SET_TRANSPORT
bdb_test_error(envp->rep_set_transport(envp, NUM2INT(envid),
bdb_env_rep_transport));
#else
bdb_test_error(envp->set_rep_transport(envp, NUM2INT(envid),
bdb_env_rep_transport));
#endif
envst->options |= BDB_REP_TRANSPORT;
}
#endif
#if HAVE_ST_DB_ENV_SET_FEEDBACK
if (envst->feedback == 0 && rb_respond_to(obj, id_feedback) == Qtrue) {
envp->set_feedback(envp, bdb_env_feedback);
envst->options |= BDB_FEEDBACK;
}
#endif
#if HAVE_ST_DB_ENV_SET_APP_DISPATCH
if (envst->app_dispatch == 0 && rb_respond_to(obj, id_app_dispatch) == Qtrue) {
envp->set_app_dispatch(envp, bdb_env_app_dispatch);
envst->options |= BDB_APP_DISPATCH;
}
#endif
#if HAVE_ST_DB_ENV_SET_MSGCALL
if (envst->msgcall == 0 && rb_respond_to(obj, id_msgcall) == Qtrue) {
envp->set_msgcall(envp, bdb_env_msgcall);
}
#endif
#if HAVE_ST_DB_ENV_SET_THREAD_ID
if (envst->thread_id == 0 && rb_respond_to(obj, id_thread_id) == Qtrue) {
envp->set_thread_id(envp, bdb_env_thread_id);
}
#endif
#if HAVE_ST_DB_ENV_SET_THREAD_ID_STRING
if (envst->thread_id_string == 0 && rb_respond_to(obj, id_thread_id_string) == Qtrue) {
envp->set_thread_id_string(envp, bdb_env_thread_id_string);
}
#endif
#if HAVE_ST_DB_ENV_SET_ISALIVE
if (envst->isalive == 0 && rb_respond_to(obj, id_isalive) == Qtrue) {
envp->set_isalive(envp, bdb_env_isalive);
}
#endif
#if HAVE_ENV_OPEN_DB_CONFIG
if ((ret = envp->open(envp, db_home, db_config, flags, mode)) != 0)
#else
if ((ret = envp->open(envp, db_home, flags, mode)) != 0)
#endif
{
envp->close(envp, 0);
envst->envp = NULL;
if (bdb_errcall) {
bdb_errcall = 0;
rb_raise(bdb_eFatal, "%s -- %s", StringValuePtr(bdb_errstr), db_strerror(ret));
}
else
rb_raise(bdb_eFatal, "%s", db_strerror(ret));
}
#endif
envst->options &= ~BDB_ENV_NOT_OPEN;
if (flags & DB_INIT_LOCK) {
envst->options |= BDB_INIT_LOCK;
}
#if HAVE_CONST_DB_AUTO_COMMIT
if (flags & DB_INIT_TXN) {
envst->options |= BDB_AUTO_COMMIT;
}
#endif
envst->home = rb_tainted_str_new2(db_home);
OBJ_FREEZE(envst->home);
#if HAVE_CONST_DB_INIT_REP
if (flags & DB_INIT_REP) {
envst->options |= BDB_REP_TRANSPORT;
}
#endif
if (envst->options & BDB_NEED_ENV_CURRENT) {
rb_thread_local_aset(rb_thread_current(), bdb_id_current_env, obj);
}
return obj;
}
open(*args)
click to toggle source
static VALUE
bdb_env_s_open(int argc, VALUE *argv, VALUE obj)
{
VALUE res = rb_funcall2(obj, rb_intern("new"), argc, argv);
if (rb_block_given_p()) {
return rb_ensure(rb_yield, res, bdb_env_internal_close, res);
}
return res;
}
remove(p1, p2 = v2)
click to toggle source
static VALUE
bdb_env_s_remove(int argc, VALUE *argv, VALUE obj)
{
DB_ENV *envp;
VALUE a, b;
char *db_home;
int flag = 0;
rb_secure(2);
if (rb_scan_args(argc, argv, "11", &a, &b) == 2) {
flag = NUM2INT(b);
}
db_home = StringValuePtr(a);
#if ! HAVE_DB_ENV_CREATE
envp = ALLOCA_N(DB_ENV, 1);
MEMZERO(envp, DB_ENV, 1);
envp->db_errpfx = "BDB::";
envp->db_errcall = bdb_env_errcall;
if (lock_unlink(db_home, flag, envp) == EBUSY) {
rb_raise(bdb_eFatal, "The shared memory region was in use");
}
if (log_unlink(db_home, flag, envp) == EBUSY) {
rb_raise(bdb_eFatal, "The shared memory region was in use");
}
if (memp_unlink(db_home, flag, envp) == EBUSY) {
rb_raise(bdb_eFatal, "The shared memory region was in use");
}
if (txn_unlink(db_home, flag, envp) == EBUSY) {
rb_raise(bdb_eFatal, "The shared memory region was in use");
}
#else
bdb_test_error(db_env_create(&envp, 0));
envp->set_errpfx(envp, "BDB::");
envp->set_errcall(envp, bdb_env_errcall);
#if HAVE_ENV_REMOVE_4
bdb_test_error(envp->remove(envp, db_home, NULL, flag));
#else
bdb_test_error(envp->remove(envp, db_home, flag));
#endif
#endif
return Qtrue;
}
unlink(p1, p2 = v2)
click to toggle source
static VALUE
bdb_env_s_remove(int argc, VALUE *argv, VALUE obj)
{
DB_ENV *envp;
VALUE a, b;
char *db_home;
int flag = 0;
rb_secure(2);
if (rb_scan_args(argc, argv, "11", &a, &b) == 2) {
flag = NUM2INT(b);
}
db_home = StringValuePtr(a);
#if ! HAVE_DB_ENV_CREATE
envp = ALLOCA_N(DB_ENV, 1);
MEMZERO(envp, DB_ENV, 1);
envp->db_errpfx = "BDB::";
envp->db_errcall = bdb_env_errcall;
if (lock_unlink(db_home, flag, envp) == EBUSY) {
rb_raise(bdb_eFatal, "The shared memory region was in use");
}
if (log_unlink(db_home, flag, envp) == EBUSY) {
rb_raise(bdb_eFatal, "The shared memory region was in use");
}
if (memp_unlink(db_home, flag, envp) == EBUSY) {
rb_raise(bdb_eFatal, "The shared memory region was in use");
}
if (txn_unlink(db_home, flag, envp) == EBUSY) {
rb_raise(bdb_eFatal, "The shared memory region was in use");
}
#else
bdb_test_error(db_env_create(&envp, 0));
envp->set_errpfx(envp, "BDB::");
envp->set_errcall(envp, bdb_env_errcall);
#if HAVE_ENV_REMOVE_4
bdb_test_error(envp->remove(envp, db_home, NULL, flag));
#else
bdb_test_error(envp->remove(envp, db_home, flag));
#endif
#endif
return Qtrue;
}
Public Instance Methods
close()
click to toggle source
static VALUE
bdb_env_close(VALUE obj)
{
bdb_ENV *envst;
if (!OBJ_TAINTED(obj) && rb_safe_level() >= 4) {
rb_raise(rb_eSecurityError, "Insecure: can't close the environnement");
}
GetEnvDB(obj, envst);
bdb_final(envst);
RDATA(obj)->dfree = free;
return Qnil;
}
conf(*args)
click to toggle source
static VALUE
bdb_env_conf(int argc, VALUE *argv, VALUE obj)
{
int i, state;
VALUE res, val;
struct optst opt;
if (argc > 1) {
rb_raise(rb_eArgError, "invalid number of arguments (%d for 1)", argc);
}
if (argc == 1) {
return bdb_env_i_conf(obj, argv[0]);
}
res = rb_hash_new();
opt.obj = obj;
for (i = 0; options[i] != NULL; i++) {
opt.str = rb_str_new2(options[i]);
val = rb_protect((VALUE (*)(ANYARGS))bdb_env_intern_conf, (VALUE)&opt, &state);
if (state == 0) {
rb_hash_aset(res, opt.str, val);
}
}
return res;
}
configuration(*args)
click to toggle source
static VALUE
bdb_env_conf(int argc, VALUE *argv, VALUE obj)
{
int i, state;
VALUE res, val;
struct optst opt;
if (argc > 1) {
rb_raise(rb_eArgError, "invalid number of arguments (%d for 1)", argc);
}
if (argc == 1) {
return bdb_env_i_conf(obj, argv[0]);
}
res = rb_hash_new();
opt.obj = obj;
for (i = 0; options[i] != NULL; i++) {
opt.str = rb_str_new2(options[i]);
val = rb_protect((VALUE (*)(ANYARGS))bdb_env_intern_conf, (VALUE)&opt, &state);
if (state == 0) {
rb_hash_aset(res, opt.str, val);
}
}
return res;
}
elect(p1, p2 = v2)
click to toggle source
static VALUE
bdb_env_rep_elect(int argc, VALUE *argv, VALUE env)
{
VALUE nb, pri, ti, nvo;
bdb_ENV *envst;
int envid = 0, nvotes = 0;
GetEnvDB(env, envst);
#if (HAVE_DB_ENV_REP_ELECT_5 && !HAVE_DB_ENV_REP_ELECT_PRIO) || HAVE_DB_ENV_REP_ELECT_7
pri = ti = 0;
if (rb_scan_args(argc, argv, "11", &nb, &nvo) == 2) {
nvotes = NUM2INT(nvo);
}
#else
if (rb_scan_args(argc, argv, "31", &nb, &pri, &ti, &nvo) == 4) {
nvotes = NUM2INT(nvo);
}
#endif
#if HAVE_DB_ENV_REP_ELECT_4
bdb_test_error(envst->envp->rep_elect(envst->envp, NUM2INT(nb), nvotes, 0));
#elif HAVE_DB_ENV_REP_ELECT_5
#if HAVE_DB_ENV_REP_ELECT_PRIO
bdb_test_error(envst->envp->rep_elect(envst->envp, NUM2INT(nb),
NUM2INT(pri), NUM2INT(ti), &envid));
#else
bdb_test_error(envst->envp->rep_elect(envst->envp, NUM2INT(nb), nvotes, &envid, 0));
#endif
#elif HAVE_DB_ENV_REP_ELECT_7
bdb_test_error(envst->envp->rep_elect(envst->envp, NUM2INT(nb), nvotes,
NUM2INT(pri), NUM2INT(ti), &envid, 0));
#endif
return INT2NUM(envid);
}
event_notify=(p1)
click to toggle source
static VALUE
bdb_env_set_notify(VALUE obj, VALUE a)
{
bdb_ENV *envst;
GetEnvDB(obj, envst);
if (!NIL_P(a)) {
if (!rb_respond_to(a, bdb_id_call)) {
rb_raise(rb_eArgError, "object must respond to #call");
}
envst->envp->set_event_notify(envst->envp, bdb_env_event_notify);
}
envst->event_notify = a;
return a;
}
failcheck(p1 = v1)
click to toggle source
static VALUE
bdb_env_failcheck(int argc, VALUE *argv, VALUE obj)
{
bdb_ENV *envst;
int flags = 0;
VALUE a;
GetEnvDB(obj, envst);
if (rb_scan_args(argc, argv, "01", &a)) {
flags = NUM2INT(a);
}
bdb_test_error(flags = envst->envp->failchk(envst->envp, flags));
return INT2NUM(flags);
}
feedback=(p1)
click to toggle source
static VALUE
bdb_env_feedback_set(VALUE obj, VALUE a)
{
bdb_ENV *envst;
GetEnvDB(obj, envst);
if (NIL_P(a)) {
envst->feedback = a;
}
else {
if (!rb_respond_to(a, bdb_id_call)) {
rb_raise(bdb_eFatal, "arg must respond to #call");
}
envst->feedback = a;
if (!(envst->options & BDB_NEED_ENV_CURRENT)) {
envst->options |= BDB_FEEDBACK;
rb_thread_local_aset(rb_thread_current(), bdb_id_current_env, obj);
}
}
return a;
}
fileid_reset(p1, p2 = v2)
click to toggle source
static VALUE
bdb_env_fileid_reset(int argc, VALUE *argv, VALUE obj)
{
char *file;
int flags;
VALUE a, b;
bdb_ENV *envst;
GetEnvDB(obj, envst);
flags = 0;
if (rb_scan_args(argc, argv, "11", &a, &b) == 2) {
flags = NUM2INT(b);
}
file = StringValuePtr(a);
bdb_test_error(envst->envp->fileid_reset(envst->envp, file, flags));
return obj;
}
home()
click to toggle source
static VALUE
bdb_env_home(VALUE obj)
{
bdb_ENV *envst;
GetEnvDB(obj, envst);
return envst->home;
}
intermediate_dir_mode()
click to toggle source
static VALUE
bdb_env_dir_mode(VALUE obj)
{
bdb_ENV *envst;
const char *dir;
GetEnvDB(obj, envst);
if (envst->envp->get_intermediate_dir_mode(envst->envp, &dir)) {
rb_raise(rb_eArgError, "invalid environment");
}
return rb_tainted_str_new2(dir);
}
isalive=(p1)
click to toggle source
static VALUE
bdb_env_set_isalive(VALUE obj, VALUE a)
{
bdb_ENV *envst;
GetEnvDB(obj, envst);
if (!rb_respond_to(a, bdb_id_call)) {
rb_raise(rb_eArgError, "object must respond to #call");
}
if (!RTEST(envst->isalive)) {
envst->envp->set_isalive(envst->envp, bdb_env_isalive);
}
envst->isalive = a;
return obj;
}
log_config(p1)
click to toggle source
static VALUE
bdb_env_log_config(VALUE obj, VALUE a)
{
bdb_ENV *envst;
int onoff;
GetEnvDB(obj, envst);
if (envst->envp->log_get_config(envst->envp, NUM2INT(a), &onoff)) {
rb_raise(rb_eArgError, "invalid argument");
}
if (onoff) {
return Qtrue;
}
return Qfalse;
}
log_set_config(p1, p2)
click to toggle source
static VALUE
bdb_env_log_set_config(VALUE obj, VALUE a, VALUE b)
{
bdb_ENV *envst;
int onoff;
GetEnvDB(obj, envst);
onoff = RTEST(b)?1:0;
if (envst->envp->log_set_config(envst->envp, NUM2INT(a), onoff)) {
rb_raise(rb_eArgError, "invalid argument");
}
return obj;
}
lsn_reset(p1, p2 = v2)
click to toggle source
static VALUE
bdb_env_lsn_reset(int argc, VALUE *argv, VALUE obj)
{
char *file;
int flags;
VALUE a, b;
bdb_ENV *envst;
GetEnvDB(obj, envst);
flags = 0;
if (rb_scan_args(argc, argv, "11", &a, &b) == 2) {
flags = NUM2INT(b);
}
file = StringValuePtr(a);
bdb_test_error(envst->envp->lsn_reset(envst->envp, file, flags));
return obj;
}
msgcall=(p1)
click to toggle source
static VALUE
bdb_env_set_msgcall(VALUE obj, VALUE a)
{
bdb_ENV *envst;
GetEnvDB(obj, envst);
if (NIL_P(a)) {
envst->msgcall = Qnil;
envst->envp->set_msgcall(envst->envp, NULL);
return obj;
}
if (!rb_respond_to(a, bdb_id_call)) {
rb_raise(rb_eArgError, "object must respond to #call");
}
if (!RTEST(envst->msgcall)) {
envst->envp->set_msgcall(envst->envp, bdb_env_msgcall);
}
envst->msgcall = a;
return obj;
}
open_db(*args)
click to toggle source
VALUE
bdb_env_open_db(int argc, VALUE *argv, VALUE obj)
{
VALUE cl;
if (argc < 1)
rb_raise(bdb_eFatal, "Invalid number of arguments");
cl = argv[0];
if (FIXNUM_P(cl)) {
switch (NUM2INT(cl)) {
case DB_BTREE: cl = bdb_cBtree; break;
case DB_HASH: cl = bdb_cHash; break;
case DB_RECNO: cl = bdb_cRecno; break;
#if HAVE_CONST_DB_QUEUE
case DB_QUEUE: cl = bdb_cQueue; break;
#endif
case DB_UNKNOWN: cl = bdb_cUnknown; break;
default: rb_raise(bdb_eFatal, "Unknown database type");
}
}
else if (TYPE(cl) != T_CLASS) {
cl = CLASS_OF(cl);
}
MEMCPY(argv, argv + 1, VALUE, argc - 1);
if (argc > 1 && TYPE(argv[argc - 2]) == T_HASH) {
argc--;
}
else {
argv[argc - 1] = rb_hash_new();
}
if (rb_obj_is_kind_of(obj, bdb_cEnv)) {
rb_hash_aset(argv[argc - 1], rb_tainted_str_new2("env"), obj);
}
else {
rb_hash_aset(argv[argc - 1], rb_tainted_str_new2("txn"), obj);
}
return rb_funcall2(cl, rb_intern("new"), argc, argv);
}
process_message(p1, p2, p3)
click to toggle source
static VALUE
bdb_env_rep_process_message(VALUE env, VALUE av, VALUE bv, VALUE ev)
{
bdb_ENV *envst;
DBT control, rec;
int ret, envid;
VALUE result;
#if HAVE_DB_ENV_REP_PROCESS_MESSAGE_5
VALUE lsn;
struct dblsnst *lsnst;
#endif
GetEnvDB(env, envst);
av = rb_str_to_str(av);
bv = rb_str_to_str(bv);
MEMZERO(&control, DBT, 1);
MEMZERO(&rec, DBT, 1);
control.size = RSTRING_LEN(av);
control.data = StringValuePtr(av);
rec.size = RSTRING_LEN(bv);
rec.data = StringValuePtr(bv);
envid = NUM2INT(ev);
#if HAVE_DB_ENV_REP_PROCESS_MESSAGE_5
lsn = bdb_makelsn(env);
Data_Get_Struct(lsn, struct dblsnst, lsnst);
#if HAVE_DB_ENV_REP_PROCESS_MESSAGE_ENVID
ret = envst->envp->rep_process_message(envst->envp, &control, &rec,
envid, lsnst->lsn);
#else
ret = envst->envp->rep_process_message(envst->envp, &control, &rec,
&envid, lsnst->lsn);
#endif
#else
ret = envst->envp->rep_process_message(envst->envp, &control, &rec,
&envid);
#endif
if (ret == DB_RUNRECOVERY) {
bdb_test_error(ret);
}
result = rb_ary_new();
rb_ary_push(result, INT2NUM(ret));
rb_ary_push(result, rb_str_new(rec.data, rec.size));
rb_ary_push(result, INT2NUM(envid));
#if DB_RET_NOTPERM || DB_RET_ISPERM
if (ret == DB_REP_NOTPERM || ret == DB_REP_ISPERM) {
rb_ary_push(result, lsn);
}
#endif
return result;
}
rep_clockskew()
click to toggle source
static VALUE
bdb_env_rep_get_clockskew(VALUE obj, VALUE a)
{
bdb_ENV *envst;
u_int32_t fast, slow;
GetEnvDB(obj, envst);
bdb_test_error(envst->envp->rep_get_clockskew(envst->envp, &fast, &slow));
return rb_assoc_new(INT2NUM(fast), INT2NUM(slow));
}
rep_elect(p1, p2 = v2)
click to toggle source
static VALUE
bdb_env_rep_elect(int argc, VALUE *argv, VALUE env)
{
VALUE nb, pri, ti, nvo;
bdb_ENV *envst;
int envid = 0, nvotes = 0;
GetEnvDB(env, envst);
#if (HAVE_DB_ENV_REP_ELECT_5 && !HAVE_DB_ENV_REP_ELECT_PRIO) || HAVE_DB_ENV_REP_ELECT_7
pri = ti = 0;
if (rb_scan_args(argc, argv, "11", &nb, &nvo) == 2) {
nvotes = NUM2INT(nvo);
}
#else
if (rb_scan_args(argc, argv, "31", &nb, &pri, &ti, &nvo) == 4) {
nvotes = NUM2INT(nvo);
}
#endif
#if HAVE_DB_ENV_REP_ELECT_4
bdb_test_error(envst->envp->rep_elect(envst->envp, NUM2INT(nb), nvotes, 0));
#elif HAVE_DB_ENV_REP_ELECT_5
#if HAVE_DB_ENV_REP_ELECT_PRIO
bdb_test_error(envst->envp->rep_elect(envst->envp, NUM2INT(nb),
NUM2INT(pri), NUM2INT(ti), &envid));
#else
bdb_test_error(envst->envp->rep_elect(envst->envp, NUM2INT(nb), nvotes, &envid, 0));
#endif
#elif HAVE_DB_ENV_REP_ELECT_7
bdb_test_error(envst->envp->rep_elect(envst->envp, NUM2INT(nb), nvotes,
NUM2INT(pri), NUM2INT(ti), &envid, 0));
#endif
return INT2NUM(envid);
}
rep_get_clockskew()
click to toggle source
static VALUE
bdb_env_rep_get_clockskew(VALUE obj, VALUE a)
{
bdb_ENV *envst;
u_int32_t fast, slow;
GetEnvDB(obj, envst);
bdb_test_error(envst->envp->rep_get_clockskew(envst->envp, &fast, &slow));
return rb_assoc_new(INT2NUM(fast), INT2NUM(slow));
}
rep_get_config(p1)
click to toggle source
static VALUE
bdb_env_rep_get_config(VALUE obj, VALUE a)
{
bdb_ENV *envst;
int offon;
GetEnvDB(obj, envst);
bdb_test_error(envst->envp->rep_get_config(envst->envp, NUM2UINT(a), &offon));
if (offon) {
return Qtrue;
}
return Qfalse;
}
rep_get_limit()
click to toggle source
static VALUE
bdb_env_rep_get_limit(VALUE obj)
{
bdb_ENV *envst;
u_int32_t gbytes, bytes;
VALUE res;
GetEnvDB(obj, envst);
#if HAVE_ST_DB_ENV_REP_SET_LIMIT
bdb_test_error(envst->envp->rep_get_limit(envst->envp, &gbytes, &bytes));
#else
bdb_test_error(envst->envp->get_rep_limit(envst->envp, &gbytes, &bytes));
#endif
res = rb_ary_new2(2);
rb_ary_push(res, INT2NUM(gbytes));
rb_ary_push(res, INT2NUM(bytes));
return res;
}
rep_get_nsites()
click to toggle source
static VALUE
bdb_env_rep_get_nsites(VALUE obj, VALUE a)
{
bdb_ENV *envst;
int offon;
GetEnvDB(obj, envst);
bdb_test_error(envst->envp->rep_get_nsites(envst->envp, &offon));
return INT2NUM(offon);
}
rep_get_priority()
click to toggle source
static VALUE
bdb_env_rep_get_priority(VALUE obj, VALUE a)
{
bdb_ENV *envst;
int offon;
GetEnvDB(obj, envst);
bdb_test_error(envst->envp->rep_get_priority(envst->envp, &offon));
return INT2NUM(offon);
}
rep_get_request()
click to toggle source
static VALUE
bdb_env_rep_get_request(VALUE obj, VALUE a)
{
bdb_ENV *envst;
u_int32_t frmin, frmax;
GetEnvDB(obj, envst);
bdb_test_error(envst->envp->rep_get_request(envst->envp, &frmin, &frmax));
return rb_assoc_new(INT2NUM(frmin), INT2NUM(frmax));
}
rep_get_timeout(p1)
click to toggle source
static VALUE
bdb_env_rep_get_timeout(VALUE obj, VALUE a)
{
bdb_ENV *envst;
u_int32_t offon;
GetEnvDB(obj, envst);
bdb_test_error(envst->envp->rep_get_timeout(envst->envp, NUM2UINT(a), &offon));
return INT2NUM(offon);
}
rep_limit()
click to toggle source
static VALUE
bdb_env_rep_get_limit(VALUE obj)
{
bdb_ENV *envst;
u_int32_t gbytes, bytes;
VALUE res;
GetEnvDB(obj, envst);
#if HAVE_ST_DB_ENV_REP_SET_LIMIT
bdb_test_error(envst->envp->rep_get_limit(envst->envp, &gbytes, &bytes));
#else
bdb_test_error(envst->envp->get_rep_limit(envst->envp, &gbytes, &bytes));
#endif
res = rb_ary_new2(2);
rb_ary_push(res, INT2NUM(gbytes));
rb_ary_push(res, INT2NUM(bytes));
return res;
}
rep_limit=(p1, p2 = v2)
click to toggle source
static VALUE
bdb_env_rep_limit(int argc, VALUE *argv, VALUE obj)
{
bdb_ENV *envst;
VALUE a, b;
u_int32_t gbytes, bytes;
GetEnvDB(obj, envst);
gbytes = bytes = 0;
switch(rb_scan_args(argc, argv, "11", &a, &b)) {
case 1:
if (TYPE(a) == T_ARRAY) {
if (RARRAY_LEN(a) != 2) {
rb_raise(bdb_eFatal, "Expected an Array with 2 values");
}
gbytes = NUM2UINT(RARRAY_PTR(a)[0]);
bytes = NUM2UINT(RARRAY_PTR(a)[1]);
}
else {
bytes = NUM2UINT(RARRAY_PTR(a)[1]);
}
break;
case 2:
gbytes = NUM2UINT(a);
bytes = NUM2UINT(b);
break;
}
#if HAVE_ST_DB_ENV_REP_SET_LIMIT
bdb_test_error(envst->envp->rep_set_limit(envst->envp, gbytes, bytes));
#else
bdb_test_error(envst->envp->set_rep_limit(envst->envp, gbytes, bytes));
#endif
return obj;
}
rep_nsites()
click to toggle source
static VALUE
bdb_env_rep_get_nsites(VALUE obj, VALUE a)
{
bdb_ENV *envst;
int offon;
GetEnvDB(obj, envst);
bdb_test_error(envst->envp->rep_get_nsites(envst->envp, &offon));
return INT2NUM(offon);
}
rep_nsites=(p1)
click to toggle source
static VALUE
bdb_env_rep_set_nsites(VALUE obj, VALUE a)
{
bdb_ENV *envst;
GetEnvDB(obj, envst);
bdb_test_error(envst->envp->rep_set_nsites(envst->envp, NUM2UINT(a)));
return a;
}
rep_priority()
click to toggle source
static VALUE
bdb_env_rep_get_priority(VALUE obj, VALUE a)
{
bdb_ENV *envst;
int offon;
GetEnvDB(obj, envst);
bdb_test_error(envst->envp->rep_get_priority(envst->envp, &offon));
return INT2NUM(offon);
}
rep_priority=(p1)
click to toggle source
static VALUE
bdb_env_rep_set_priority(VALUE obj, VALUE a)
{
bdb_ENV *envst;
GetEnvDB(obj, envst);
bdb_test_error(envst->envp->rep_set_priority(envst->envp, NUM2UINT(a)));
return a;
}
rep_process_message(p1, p2, p3)
click to toggle source
static VALUE
bdb_env_rep_process_message(VALUE env, VALUE av, VALUE bv, VALUE ev)
{
bdb_ENV *envst;
DBT control, rec;
int ret, envid;
VALUE result;
#if HAVE_DB_ENV_REP_PROCESS_MESSAGE_5
VALUE lsn;
struct dblsnst *lsnst;
#endif
GetEnvDB(env, envst);
av = rb_str_to_str(av);
bv = rb_str_to_str(bv);
MEMZERO(&control, DBT, 1);
MEMZERO(&rec, DBT, 1);
control.size = RSTRING_LEN(av);
control.data = StringValuePtr(av);
rec.size = RSTRING_LEN(bv);
rec.data = StringValuePtr(bv);
envid = NUM2INT(ev);
#if HAVE_DB_ENV_REP_PROCESS_MESSAGE_5
lsn = bdb_makelsn(env);
Data_Get_Struct(lsn, struct dblsnst, lsnst);
#if HAVE_DB_ENV_REP_PROCESS_MESSAGE_ENVID
ret = envst->envp->rep_process_message(envst->envp, &control, &rec,
envid, lsnst->lsn);
#else
ret = envst->envp->rep_process_message(envst->envp, &control, &rec,
&envid, lsnst->lsn);
#endif
#else
ret = envst->envp->rep_process_message(envst->envp, &control, &rec,
&envid);
#endif
if (ret == DB_RUNRECOVERY) {
bdb_test_error(ret);
}
result = rb_ary_new();
rb_ary_push(result, INT2NUM(ret));
rb_ary_push(result, rb_str_new(rec.data, rec.size));
rb_ary_push(result, INT2NUM(envid));
#if DB_RET_NOTPERM || DB_RET_ISPERM
if (ret == DB_REP_NOTPERM || ret == DB_REP_ISPERM) {
rb_ary_push(result, lsn);
}
#endif
return result;
}
rep_request()
click to toggle source
static VALUE
bdb_env_rep_get_request(VALUE obj, VALUE a)
{
bdb_ENV *envst;
u_int32_t frmin, frmax;
GetEnvDB(obj, envst);
bdb_test_error(envst->envp->rep_get_request(envst->envp, &frmin, &frmax));
return rb_assoc_new(INT2NUM(frmin), INT2NUM(frmax));
}
rep_set_clockskew(p1, p2)
click to toggle source
static VALUE
bdb_env_rep_set_clockskew(VALUE obj, VALUE a, VALUE b)
{
bdb_ENV *envst;
GetEnvDB(obj, envst);
bdb_test_error(envst->envp->rep_set_clockskew(envst->envp,
NUM2UINT(a),
NUM2INT(b)));
return obj;
}
rep_set_config(p1, p2)
click to toggle source
static VALUE
bdb_env_rep_set_config(VALUE obj, VALUE a, VALUE b)
{
bdb_ENV *envst;
int onoff = 0;
if (b == Qtrue) {
onoff = 1;
}
else if (b == Qfalse || b == Qnil) {
onoff = 0;
}
else {
onoff = NUM2INT(b);
}
GetEnvDB(obj, envst);
bdb_test_error(envst->envp->rep_set_config(envst->envp, NUM2UINT(a), onoff));
return obj;
}
rep_set_nsites(p1)
click to toggle source
static VALUE
bdb_env_rep_set_nsites(VALUE obj, VALUE a)
{
bdb_ENV *envst;
GetEnvDB(obj, envst);
bdb_test_error(envst->envp->rep_set_nsites(envst->envp, NUM2UINT(a)));
return a;
}
rep_set_priority(p1)
click to toggle source
static VALUE
bdb_env_rep_set_priority(VALUE obj, VALUE a)
{
bdb_ENV *envst;
GetEnvDB(obj, envst);
bdb_test_error(envst->envp->rep_set_priority(envst->envp, NUM2UINT(a)));
return a;
}
rep_set_request(p1, p2)
click to toggle source
static VALUE
bdb_env_rep_set_request(VALUE obj, VALUE a, VALUE b)
{
bdb_ENV *envst;
GetEnvDB(obj, envst);
bdb_test_error(envst->envp->rep_set_request(envst->envp,
NUM2UINT(a),
NUM2INT(b)));
return obj;
}
rep_set_timeout(p1, p2)
click to toggle source
static VALUE
bdb_env_rep_set_timeout(VALUE obj, VALUE a, VALUE b)
{
bdb_ENV *envst;
GetEnvDB(obj, envst);
bdb_test_error(envst->envp->rep_set_timeout(envst->envp,
NUM2UINT(a),
NUM2INT(b)));
return obj;
}
rep_set_transport(p1, p2)
click to toggle source
static VALUE bdb_env_rep_set_transport(VALUE obj, VALUE a, VALUE b)
{
bdb_ENV *envst;
GetEnvDB(obj, envst);
if (!FIXNUM_P(a)) {
rb_raise(bdb_eFatal, "expected a Fixnum for the 1st arg of set_rep_transport");
}
if (!rb_respond_to(b, bdb_id_call)) {
rb_raise(bdb_eFatal, "2nd arg must respond to #call");
}
envst->rep_transport = b;
#if HAVE_ST_DB_ENV_REP_SET_TRANSPORT
bdb_test_error(envst->envp->rep_set_transport(envst->envp, NUM2INT(a),
bdb_env_rep_transport));
#else
bdb_test_error(envst->envp->set_rep_transport(envst->envp, NUM2INT(a),
bdb_env_rep_transport));
#endif
return obj;
}
rep_start(p1, p2)
click to toggle source
static VALUE
bdb_env_rep_start(VALUE env, VALUE ident, VALUE flags)
{
bdb_ENV *envst;
DBT cdata;
GetEnvDB(env, envst);
if (!NIL_P(ident)) {
ident = rb_str_to_str(ident);
MEMZERO(&cdata, DBT, 1);
cdata.size = RSTRING_LEN(ident);
cdata.data = StringValuePtr(ident);
}
bdb_test_error(envst->envp->rep_start(envst->envp,
NIL_P(ident)?NULL:&cdata,
NUM2INT(flags)));
return Qnil;
}
rep_stat()
click to toggle source
static VALUE
bdb_env_rep_stat(int argc, VALUE *argv, VALUE obj)
{
bdb_ENV *envst;
VALUE a, lsn;
int flags;
struct dblsnst *lsnst;
DB_REP_STAT *bs;
flags = 0;
if (rb_scan_args(argc, argv, "01", &a) == 1) {
flags = NUM2INT(a);
}
GetEnvDB(obj, envst);
bdb_test_error(envst->envp->rep_stat(envst->envp, &bs, flags));
a = rb_hash_new();
#if HAVE_ST_DB_REP_STAT_ST_BULK_FILLS
rb_hash_aset(a, rb_tainted_str_new2("st_bulk_fills"), INT2NUM(bs->st_bulk_fills));
#endif
#if HAVE_ST_DB_REP_STAT_ST_BULK_OVERFLOWS
rb_hash_aset(a, rb_tainted_str_new2("st_bulk_overflows"), INT2NUM(bs->st_bulk_overflows));
#endif
#if HAVE_ST_DB_REP_STAT_ST_BULK_RECORDS
rb_hash_aset(a, rb_tainted_str_new2("st_bulk_records"), INT2NUM(bs->st_bulk_records));
#endif
#if HAVE_ST_DB_REP_STAT_ST_BULK_TRANSFERS
rb_hash_aset(a, rb_tainted_str_new2("st_bulk_transfers"), INT2NUM(bs->st_bulk_transfers));
#endif
#if HAVE_ST_DB_REP_STAT_ST_CLIENT_REREQUESTS
rb_hash_aset(a, rb_tainted_str_new2("st_client_rerequests"), INT2NUM(bs->st_client_rerequests));
#endif
#if HAVE_ST_DB_REP_STAT_ST_CLIENT_SVC_MISS
rb_hash_aset(a, rb_tainted_str_new2("st_client_svc_miss"), INT2NUM(bs->st_client_svc_miss));
#endif
#if HAVE_ST_DB_REP_STAT_ST_CLIENT_SVC_REQ
rb_hash_aset(a, rb_tainted_str_new2("st_client_svc_req"), INT2NUM(bs->st_client_svc_req));
#endif
rb_hash_aset(a, rb_tainted_str_new2("st_dupmasters"), INT2NUM(bs->st_dupmasters));
#if HAVE_ST_DB_REP_STAT_ST_EGEN
rb_hash_aset(a, rb_tainted_str_new2("st_egen"), INT2NUM(bs->st_egen));
#endif
rb_hash_aset(a, rb_tainted_str_new2("st_election_cur_winner"), INT2NUM(bs->st_election_cur_winner));
rb_hash_aset(a, rb_tainted_str_new2("st_election_gen"), INT2NUM(bs->st_election_gen));
lsn = bdb_makelsn(obj);
Data_Get_Struct(lsn, struct dblsnst, lsnst);
MEMCPY(lsnst->lsn, &bs->st_election_lsn, DB_LSN, 1);
rb_hash_aset(a, rb_tainted_str_new2("st_election_lsn"), lsn);
rb_hash_aset(a, rb_tainted_str_new2("st_election_nsites"), INT2NUM(bs->st_election_nsites));
#if HAVE_ST_DB_REP_STAT_ST_ELECTION_NVOTES
rb_hash_aset(a, rb_tainted_str_new2("st_election_nvotes"), INT2NUM(bs->st_election_nvotes));
#endif
rb_hash_aset(a, rb_tainted_str_new2("st_election_priority"), INT2NUM(bs->st_election_priority));
#if HAVE_ST_DB_REP_STAT_ST_ELECTION_SEC
rb_hash_aset(a, rb_tainted_str_new2("st_election_sec"), INT2NUM(bs->st_election_sec));
#endif
rb_hash_aset(a, rb_tainted_str_new2("st_election_status"), INT2NUM(bs->st_election_status));
rb_hash_aset(a, rb_tainted_str_new2("st_election_tiebreaker"), INT2NUM(bs->st_election_tiebreaker));
#if HAVE_ST_DB_REP_STAT_ST_ELECTION_USEC
rb_hash_aset(a, rb_tainted_str_new2("st_election_usec"), INT2NUM(bs->st_election_usec));
#endif
rb_hash_aset(a, rb_tainted_str_new2("st_election_votes"), INT2NUM(bs->st_election_votes));
rb_hash_aset(a, rb_tainted_str_new2("st_elections"), INT2NUM(bs->st_elections));
rb_hash_aset(a, rb_tainted_str_new2("st_elections_won"), INT2NUM(bs->st_elections_won));
rb_hash_aset(a, rb_tainted_str_new2("st_env_id"), INT2NUM(bs->st_env_id));
rb_hash_aset(a, rb_tainted_str_new2("st_env_priority"), INT2NUM(bs->st_env_priority));
rb_hash_aset(a, rb_tainted_str_new2("st_gen"), INT2NUM(bs->st_gen));
rb_hash_aset(a, rb_tainted_str_new2("st_log_duplicated"), INT2NUM(bs->st_log_duplicated));
rb_hash_aset(a, rb_tainted_str_new2("st_log_queued"), INT2NUM(bs->st_log_queued));
rb_hash_aset(a, rb_tainted_str_new2("st_log_queued_max"), INT2NUM(bs->st_log_queued_max));
rb_hash_aset(a, rb_tainted_str_new2("st_log_queued_total"), INT2NUM(bs->st_log_queued_total));
rb_hash_aset(a, rb_tainted_str_new2("st_log_records"), INT2NUM(bs->st_log_records));
rb_hash_aset(a, rb_tainted_str_new2("st_log_requested"), INT2NUM(bs->st_log_requested));
rb_hash_aset(a, rb_tainted_str_new2("st_master"), INT2NUM(bs->st_master));
rb_hash_aset(a, rb_tainted_str_new2("st_master_changes"), INT2NUM(bs->st_master_changes));
rb_hash_aset(a, rb_tainted_str_new2("st_msgs_badgen"), INT2NUM(bs->st_msgs_badgen));
rb_hash_aset(a, rb_tainted_str_new2("st_msgs_processed"), INT2NUM(bs->st_msgs_processed));
rb_hash_aset(a, rb_tainted_str_new2("st_msgs_recover"), INT2NUM(bs->st_msgs_recover));
rb_hash_aset(a, rb_tainted_str_new2("st_msgs_send_failures"), INT2NUM(bs->st_msgs_send_failures));
rb_hash_aset(a, rb_tainted_str_new2("st_msgs_sent"), INT2NUM(bs->st_msgs_sent));
rb_hash_aset(a, rb_tainted_str_new2("st_newsites"), INT2NUM(bs->st_newsites));
lsn = bdb_makelsn(obj);
Data_Get_Struct(lsn, struct dblsnst, lsnst);
MEMCPY(lsnst->lsn, &bs->st_next_lsn, DB_LSN, 1);
rb_hash_aset(a, rb_tainted_str_new2("st_next_lsn"), lsn);
#if HAVE_ST_DB_REP_STAT_ST_NEXT_PG
rb_hash_aset(a, rb_tainted_str_new2("st_next_pg"), INT2NUM(bs->st_next_pg));
#endif
rb_hash_aset(a, rb_tainted_str_new2("st_nsites"), INT2NUM(bs->st_nsites));
rb_hash_aset(a, rb_tainted_str_new2("st_nthrottles"), INT2NUM(bs->st_nthrottles));
rb_hash_aset(a, rb_tainted_str_new2("st_outdated"), INT2NUM(bs->st_outdated));
#if HAVE_ST_DB_REP_STAT_ST_PG_DUPLICATED
rb_hash_aset(a, rb_tainted_str_new2("st_pg_duplicated"), INT2NUM(bs->st_pg_duplicated));
#endif
#if HAVE_ST_DB_REP_STAT_ST_PG_RECORDS
rb_hash_aset(a, rb_tainted_str_new2("st_pg_records"), INT2NUM(bs->st_pg_records));
#endif
#if HAVE_ST_DB_REP_STAT_ST_PG_REQUESTED
rb_hash_aset(a, rb_tainted_str_new2("st_pg_requested"), INT2NUM(bs->st_pg_requested));
#endif
#if HAVE_ST_DB_REP_STAT_ST_STARTUP_COMPLETE
rb_hash_aset(a, rb_tainted_str_new2("st_startup_complete"), INT2NUM(bs->st_startup_complete));
#endif
rb_hash_aset(a, rb_tainted_str_new2("st_status"), INT2NUM(bs->st_status));
rb_hash_aset(a, rb_tainted_str_new2("st_txns_applied"), INT2NUM(bs->st_txns_applied));
lsn = bdb_makelsn(obj);
Data_Get_Struct(lsn, struct dblsnst, lsnst);
MEMCPY(lsnst->lsn, &bs->st_waiting_lsn, DB_LSN, 1);
rb_hash_aset(a, rb_tainted_str_new2("st_waiting_lsn"), lsn);
#if HAVE_ST_DB_REP_STAT_ST_WAITING_PG
rb_hash_aset(a, rb_tainted_str_new2("st_waiting_pg"), INT2NUM(bs->st_waiting_pg));
#endif
free(bs);
return a;
}
rep_sync(p1 = v1)
click to toggle source
static VALUE
bdb_env_rep_sync(int argc, VALUE *argv, VALUE obj)
{
bdb_ENV *envst;
VALUE a;
int flags;
flags = 0;
if (rb_scan_args(argc, argv, "01", &a) == 1) {
flags = NUM2INT(a);
}
GetEnvDB(obj, envst);
bdb_test_error(envst->envp->rep_sync(envst->envp, flags));
return obj;
}
repmgr_ack_policy()
click to toggle source
static VALUE
bdb_env_repmgr_get_ack_policy(VALUE obj)
{
bdb_ENV *envst;
int policy;
GetEnvDB(obj, envst);
bdb_test_error(envst->envp->repmgr_get_ack_policy(envst->envp, &policy));
return INT2NUM(policy);
}
repmgr_ack_policy=(p1)
click to toggle source
static VALUE
bdb_env_repmgr_set_ack_policy(VALUE obj, VALUE a)
{
bdb_ENV *envst;
GetEnvDB(obj, envst);
bdb_test_error(envst->envp->repmgr_set_ack_policy(envst->envp,
NUM2UINT(a)));
return a;
}
repmgr_add_remote_site(p1, p2, p3 = v3)
click to toggle source
static VALUE
bdb_env_repmgr_add_remote(int argc, VALUE *argv, VALUE obj)
{
bdb_ENV *envst;
VALUE a, b, c;
int eid, flags;
flags = 0;
if (rb_scan_args(argc, argv, "21", &a, &b, &c) == 3) {
flags = NUM2INT(c);
}
GetEnvDB(obj, envst);
bdb_test_error(envst->envp->repmgr_add_remote_site(envst->envp,
StringValuePtr(a),
NUM2UINT(b),
&eid, flags));
return INT2NUM(eid);
}
repmgr_get_ack_policy()
click to toggle source
static VALUE
bdb_env_repmgr_get_ack_policy(VALUE obj)
{
bdb_ENV *envst;
int policy;
GetEnvDB(obj, envst);
bdb_test_error(envst->envp->repmgr_get_ack_policy(envst->envp, &policy));
return INT2NUM(policy);
}
repmgr_set_ack_policy(p1)
click to toggle source
static VALUE
bdb_env_repmgr_set_ack_policy(VALUE obj, VALUE a)
{
bdb_ENV *envst;
GetEnvDB(obj, envst);
bdb_test_error(envst->envp->repmgr_set_ack_policy(envst->envp,
NUM2UINT(a)));
return a;
}
repmgr_set_local_site(p1, p2, p3 = v3)
click to toggle source
static VALUE
bdb_env_repmgr_set_local_site(int argc, VALUE *argv, VALUE obj)
{
bdb_ENV *envst;
VALUE a, b, c;
int flags;
flags = 0;
if (rb_scan_args(argc, argv, "21", &a, &b, &c) == 3) {
flags = NUM2INT(c);
}
GetEnvDB(obj, envst);
bdb_test_error(envst->envp->repmgr_set_local_site(envst->envp,
StringValuePtr(a),
NUM2UINT(b),
flags));
return obj;
}
repmgr_site_list()
click to toggle source
static VALUE
bdb_env_repmgr_site_list(VALUE obj)
{
bdb_ENV *envst;
VALUE res, tmp;
u_int count, i;
DB_REPMGR_SITE *list;
GetEnvDB(obj, envst);
bdb_test_error(envst->envp->repmgr_site_list(envst->envp,
&count, &list));
res = rb_ary_new();
for (i = 0; i < count; i++) {
tmp = rb_hash_new();
rb_hash_aset(tmp, rb_tainted_str_new2("eid"), INT2NUM(list[i].eid));
rb_hash_aset(tmp, rb_tainted_str_new2("host"), rb_tainted_str_new2(list[i].host));
rb_hash_aset(tmp, rb_tainted_str_new2("port"), INT2NUM(list[i].port));
rb_hash_aset(tmp, rb_tainted_str_new2("status"), INT2NUM(list[i].status));
rb_ary_push(res, tmp);
}
free(list);
return res;
}
repmgr_start(p1, p2)
click to toggle source
static VALUE
bdb_env_repmgr_start(VALUE obj, VALUE a, VALUE b)
{
bdb_ENV *envst;
GetEnvDB(obj, envst);
bdb_test_error(envst->envp->repmgr_start(envst->envp, NUM2INT(a), NUM2INT(b)));
return obj;
}
set_flags(p1, p2 = v2)
click to toggle source
static VALUE
bdb_env_set_flags(int argc, VALUE *argv, VALUE obj)
{
#if HAVE_ST_DB_ENV_SET_FLAGS
bdb_ENV *envst;
VALUE opt, flag;
int state = 1;
GetEnvDB(obj, envst);
if (rb_scan_args(argc, argv, "11", &flag, &opt)) {
switch (TYPE(opt)) {
case T_TRUE:
state = 1;
break;
case T_FALSE:
state = 0;
break;
case T_FIXNUM:
state = NUM2INT(opt);
break;
default:
rb_raise(bdb_eFatal, "invalid value for onoff");
}
}
bdb_test_error(envst->envp->set_flags(envst->envp, NUM2INT(flag), state));
#endif
return Qnil;
}
set_log_config(p1, p2)
click to toggle source
static VALUE
bdb_env_log_set_config(VALUE obj, VALUE a, VALUE b)
{
bdb_ENV *envst;
int onoff;
GetEnvDB(obj, envst);
onoff = RTEST(b)?1:0;
if (envst->envp->log_set_config(envst->envp, NUM2INT(a), onoff)) {
rb_raise(rb_eArgError, "invalid argument");
}
return obj;
}
thread_id=(p1)
click to toggle source
static VALUE
bdb_env_set_thread_id(VALUE obj, VALUE a)
{
bdb_ENV *envst;
GetEnvDB(obj, envst);
if (!rb_respond_to(a, bdb_id_call)) {
rb_raise(rb_eArgError, "object must respond to #call");
}
if (!RTEST(envst->thread_id)) {
envst->envp->set_thread_id(envst->envp, bdb_env_thread_id);
}
envst->thread_id = a;
return obj;
}
thread_id_string=(p1)
click to toggle source
static VALUE
bdb_env_set_thread_id_string(VALUE obj, VALUE a)
{
bdb_ENV *envst;
GetEnvDB(obj, envst);
if (!rb_respond_to(a, bdb_id_call)) {
rb_raise(rb_eArgError, "object must respond to #call");
}
if (!RTEST(envst->thread_id_string)) {
envst->envp->set_thread_id_string(envst->envp, bdb_env_thread_id_string);
}
envst->thread_id_string = a;
return obj;
}