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;
}