class BDB::Lockid
Public Instance Methods
close()
click to toggle source
static VALUE
bdb_env_lockid_close(VALUE obj)
{
bdb_ENV *envst;
bdb_LOCKID *dblockid;
Data_Get_Struct(obj, bdb_LOCKID, dblockid);
bdb_clean_env(dblockid->env, obj);
#if HAVE_ST_DB_ENV_LOCK_ID_FREE
GetEnvDB(dblockid->env, envst);
RDATA(obj)->dfree = free;
if (envst->envp) {
bdb_test_error(envst->envp->lock_id_free(envst->envp, dblockid->lock));
}
#endif
dblockid->env = 0;
return Qnil;
}
get(p1, p2, p3 = v3)
click to toggle source
static VALUE
bdb_lockid_get(int argc, VALUE *argv, VALUE obj)
{
bdb_LOCKID *lockid;
bdb_ENV *envst;
DB_LOCK lock;
bdb_LOCK *lockst;
DBT objet;
unsigned int flags;
int lock_mode;
VALUE a, b, c, res;
rb_secure(2);
flags = 0;
if (rb_scan_args(argc, argv, "21", &a, &b, &c) == 3) {
if (c == Qtrue) {
flags = DB_LOCK_NOWAIT;
}
else {
flags = NUM2UINT(c);
}
}
SafeStringValue(a);
MEMZERO(&objet, DBT, 1);
objet.data = StringValuePtr(a);
objet.size = RSTRING_LEN(a);
lock_mode = NUM2INT(b);
GetLockid(obj, lockid, envst);
#if HAVE_ST_DB_ENV_LK_INFO
if (!envst->envp->lk_info) {
rb_raise(bdb_eLock, "lock region not open");
}
bdb_test_error(lock_get(envst->envp->lk_info, lockid->lock, flags,
&objet, lock_mode, &lock));
#elif HAVE_ST_DB_ENV_LOCK_GET
bdb_test_error(envst->envp->lock_get(envst->envp, lockid->lock,
flags, &objet, lock_mode, &lock));
#else
bdb_test_error(lock_get(envst->envp, lockid->lock, flags,
&objet, lock_mode, &lock));
#endif
res = Data_Make_Struct(bdb_cLock, bdb_LOCK, lock_mark, lock_free, lockst);
#if HAVE_ST_DB_ENV_LK_INFO
lockst->lock = lock;
#else
lockst->lock = ALLOC(DB_LOCK);
MEMCPY(lockst->lock, &lock, DB_LOCK, 1);
#endif
lockst->env = lockid->env;
return res;
}
lock_get(p1, p2, p3 = v3)
click to toggle source
static VALUE
bdb_lockid_get(int argc, VALUE *argv, VALUE obj)
{
bdb_LOCKID *lockid;
bdb_ENV *envst;
DB_LOCK lock;
bdb_LOCK *lockst;
DBT objet;
unsigned int flags;
int lock_mode;
VALUE a, b, c, res;
rb_secure(2);
flags = 0;
if (rb_scan_args(argc, argv, "21", &a, &b, &c) == 3) {
if (c == Qtrue) {
flags = DB_LOCK_NOWAIT;
}
else {
flags = NUM2UINT(c);
}
}
SafeStringValue(a);
MEMZERO(&objet, DBT, 1);
objet.data = StringValuePtr(a);
objet.size = RSTRING_LEN(a);
lock_mode = NUM2INT(b);
GetLockid(obj, lockid, envst);
#if HAVE_ST_DB_ENV_LK_INFO
if (!envst->envp->lk_info) {
rb_raise(bdb_eLock, "lock region not open");
}
bdb_test_error(lock_get(envst->envp->lk_info, lockid->lock, flags,
&objet, lock_mode, &lock));
#elif HAVE_ST_DB_ENV_LOCK_GET
bdb_test_error(envst->envp->lock_get(envst->envp, lockid->lock,
flags, &objet, lock_mode, &lock));
#else
bdb_test_error(lock_get(envst->envp, lockid->lock, flags,
&objet, lock_mode, &lock));
#endif
res = Data_Make_Struct(bdb_cLock, bdb_LOCK, lock_mark, lock_free, lockst);
#if HAVE_ST_DB_ENV_LK_INFO
lockst->lock = lock;
#else
lockst->lock = ALLOC(DB_LOCK);
MEMCPY(lockst->lock, &lock, DB_LOCK, 1);
#endif
lockst->env = lockid->env;
return res;
}
lock_vec(p1, p2 = v2)
click to toggle source
static VALUE
bdb_lockid_vec(int argc, VALUE *argv, VALUE obj)
{
DB_LOCKREQ *list;
bdb_LOCKID *lockid;
bdb_LOCK *lockst;
bdb_ENV *envst;
unsigned int flags;
VALUE a, b, c, res;
int i, n, err;
VALUE listobj;
struct lockreq *listst;
flags = 0;
if (rb_scan_args(argc, argv, "11", &a, &b) == 2) {
if (b == Qtrue) {
flags = DB_LOCK_NOWAIT;
}
else {
flags = NUM2UINT(b);
}
}
Check_Type(a, T_ARRAY);
list = ALLOCA_N(DB_LOCKREQ, RARRAY_LEN(a));
MEMZERO(list, DB_LOCKREQ, RARRAY_LEN(a));
listobj = Data_Make_Struct(obj, struct lockreq, 0, free, listst);
for (i = 0; i < RARRAY_LEN(a); i++) {
b = RARRAY_PTR(a)[i];
Check_Type(b, T_HASH);
listst->list = &list[i];
rb_iterate(rb_each, b, bdb_lockid_each, listobj);
}
GetLockid(obj, lockid, envst);
#if HAVE_ST_DB_ENV_LK_INFO
if (!envst->envp->lk_info) {
rb_raise(bdb_eLock, "lock region not open");
}
err = lock_vec(envst->envp->lk_info, lockid->lock, flags,
list, RARRAY_LEN(a), NULL);
#elif HAVE_ST_DB_ENV_LOCK_VEC
err = envst->envp->lock_vec(envst->envp, lockid->lock, flags,
list, RARRAY_LEN(a), NULL);
#else
err = lock_vec(envst->envp, lockid->lock, flags,
list, RARRAY_LEN(a), NULL);
#endif
if (err != 0) {
for (i = 0; i < RARRAY_LEN(a); i++) {
if (list[i].obj)
free(list[i].obj);
}
res = (err == DB_LOCK_DEADLOCK)?bdb_eLock:bdb_eFatal;
if (bdb_errcall) {
bdb_errcall = 0;
rb_raise(res, "%s -- %s", StringValuePtr(bdb_errstr), db_strerror(err));
}
else
rb_raise(res, "%s", db_strerror(err));
}
res = rb_ary_new2(RARRAY_LEN(a));
n = 0;
for (i = 0; i < RARRAY_LEN(a); i++) {
if (list[i].op == DB_LOCK_GET) {
c = Data_Make_Struct(bdb_cLock, bdb_LOCK, lock_mark, lock_free, lockst);
#if HAVE_ST_DB_ENV_LK_INFO
lockst->lock = list[i].lock;
#else
lockst->lock = ALLOC(DB_LOCK);
MEMCPY(lockst->lock, &list[i].lock, DB_LOCK, 1);
#endif
lockst->env = lockid->env;
rb_ary_push(res, c);
n++;
}
else {
rb_ary_push(res, Qnil);
}
}
return res;
}
vec(p1, p2 = v2)
click to toggle source
static VALUE
bdb_lockid_vec(int argc, VALUE *argv, VALUE obj)
{
DB_LOCKREQ *list;
bdb_LOCKID *lockid;
bdb_LOCK *lockst;
bdb_ENV *envst;
unsigned int flags;
VALUE a, b, c, res;
int i, n, err;
VALUE listobj;
struct lockreq *listst;
flags = 0;
if (rb_scan_args(argc, argv, "11", &a, &b) == 2) {
if (b == Qtrue) {
flags = DB_LOCK_NOWAIT;
}
else {
flags = NUM2UINT(b);
}
}
Check_Type(a, T_ARRAY);
list = ALLOCA_N(DB_LOCKREQ, RARRAY_LEN(a));
MEMZERO(list, DB_LOCKREQ, RARRAY_LEN(a));
listobj = Data_Make_Struct(obj, struct lockreq, 0, free, listst);
for (i = 0; i < RARRAY_LEN(a); i++) {
b = RARRAY_PTR(a)[i];
Check_Type(b, T_HASH);
listst->list = &list[i];
rb_iterate(rb_each, b, bdb_lockid_each, listobj);
}
GetLockid(obj, lockid, envst);
#if HAVE_ST_DB_ENV_LK_INFO
if (!envst->envp->lk_info) {
rb_raise(bdb_eLock, "lock region not open");
}
err = lock_vec(envst->envp->lk_info, lockid->lock, flags,
list, RARRAY_LEN(a), NULL);
#elif HAVE_ST_DB_ENV_LOCK_VEC
err = envst->envp->lock_vec(envst->envp, lockid->lock, flags,
list, RARRAY_LEN(a), NULL);
#else
err = lock_vec(envst->envp, lockid->lock, flags,
list, RARRAY_LEN(a), NULL);
#endif
if (err != 0) {
for (i = 0; i < RARRAY_LEN(a); i++) {
if (list[i].obj)
free(list[i].obj);
}
res = (err == DB_LOCK_DEADLOCK)?bdb_eLock:bdb_eFatal;
if (bdb_errcall) {
bdb_errcall = 0;
rb_raise(res, "%s -- %s", StringValuePtr(bdb_errstr), db_strerror(err));
}
else
rb_raise(res, "%s", db_strerror(err));
}
res = rb_ary_new2(RARRAY_LEN(a));
n = 0;
for (i = 0; i < RARRAY_LEN(a); i++) {
if (list[i].op == DB_LOCK_GET) {
c = Data_Make_Struct(bdb_cLock, bdb_LOCK, lock_mark, lock_free, lockst);
#if HAVE_ST_DB_ENV_LK_INFO
lockst->lock = list[i].lock;
#else
lockst->lock = ALLOC(DB_LOCK);
MEMCPY(lockst->lock, &list[i].lock, DB_LOCK, 1);
#endif
lockst->env = lockid->env;
rb_ary_push(res, c);
n++;
}
else {
rb_ary_push(res, Qnil);
}
}
return res;
}