class BDB::Cursor
Public Instance Methods
c_clone(p1 = v1)
click to toggle source
static VALUE bdb_cursor_dup(int argc, VALUE *argv, VALUE obj) { int flags = 0; VALUE a, b; bdb_DBC *dbcst, *dbcstdup; bdb_DB *dbst; DBC *dbcdup; if (rb_scan_args(argc, argv, "01", &a)) flags = NUM2INT(a); GetCursorDB(obj, dbcst, dbst); bdb_test_error(dbcst->dbc->c_dup(dbcst->dbc, &dbcdup, flags)); b = Data_Make_Struct(bdb_cCursor, bdb_DBC, 0, bdb_cursor_free, dbcstdup); dbcstdup->dbc = dbcdup; dbcstdup->db = dbcst->db; return b; }
c_close()
click to toggle source
static VALUE bdb_cursor_close(VALUE obj) { bdb_DBC *dbcst; bdb_DB *dbst; if (!OBJ_TAINTED(obj) && rb_safe_level() >= 4) rb_raise(rb_eSecurityError, "Insecure: can't close the cursor"); GetCursorDB(obj, dbcst, dbst); bdb_test_error(dbcst->dbc->c_close(dbcst->dbc)); dbcst->dbc = NULL; return Qtrue; }
c_count()
click to toggle source
static VALUE bdb_cursor_count(VALUE obj) { #if !HAVE_CONST_DB_NEXT_DUP rb_raise(bdb_eFatal, "DB_NEXT_DUP needs Berkeley DB 2.6 or later"); #else #if !HAVE_ST_DBC_C_COUNT DBT key, data; DBT key_o, data_o; int ret; #endif bdb_DBC *dbcst; bdb_DB *dbst; db_recno_t count; GetCursorDB(obj, dbcst, dbst); #if HAVE_ST_DBC_C_COUNT bdb_test_error(dbcst->dbc->c_count(dbcst->dbc, &count, 0)); return INT2NUM(count); #else MEMZERO(&key, DBT, 1); key.flags |= DB_DBT_MALLOC; MEMZERO(&data, DBT, 1); data.flags |= DB_DBT_MALLOC; MEMZERO(&key_o, DBT, 1); key_o.flags |= DB_DBT_MALLOC; MEMZERO(&data_o, DBT, 1); data_o.flags |= DB_DBT_MALLOC; SET_PARTIAL(dbst, data); ret = bdb_test_error(dbcst->dbc->c_get(dbcst->dbc, &key_o, &data_o, DB_CURRENT)); if (ret == DB_NOTFOUND || ret == DB_KEYEMPTY) return INT2NUM(0); count = 1; while (1) { MEMZERO(&key, DBT, 1); key.flags |= DB_DBT_MALLOC; MEMZERO(&data, DBT, 1); data.flags |= DB_DBT_MALLOC; SET_PARTIAL(dbst, data); ret = bdb_test_error(dbcst->dbc->c_get(dbcst->dbc, &key, &data, DB_NEXT_DUP)); if (ret == DB_NOTFOUND) { MEMZERO(&key_o, DBT, 1); key_o.flags |= DB_DBT_MALLOC; MEMZERO(&data_o, DBT, 1); data_o.flags |= DB_DBT_MALLOC; bdb_test_error(dbcst->dbc->c_get(dbcst->dbc, &key_o, &data_o, DB_SET)); FREE_KEY(dbst, key_o); free(data_o.data); return INT2NUM(count); } if (ret == DB_KEYEMPTY) continue; FREE_KEY(dbst, key); free(data.data); count++; } return INT2NUM(-1); #endif #endif }
c_current()
click to toggle source
static VALUE bdb_cursor_current(VALUE obj) { return bdb_cursor_xxx(obj, DB_CURRENT); }
c_del()
click to toggle source
static VALUE bdb_cursor_del(VALUE obj) { int flags = 0; bdb_DBC *dbcst; bdb_DB *dbst; rb_secure(4); GetCursorDB(obj, dbcst, dbst); bdb_test_error(dbcst->dbc->c_del(dbcst->dbc, flags)); return Qtrue; }
c_dup(p1 = v1)
click to toggle source
static VALUE bdb_cursor_dup(int argc, VALUE *argv, VALUE obj) { int flags = 0; VALUE a, b; bdb_DBC *dbcst, *dbcstdup; bdb_DB *dbst; DBC *dbcdup; if (rb_scan_args(argc, argv, "01", &a)) flags = NUM2INT(a); GetCursorDB(obj, dbcst, dbst); bdb_test_error(dbcst->dbc->c_dup(dbcst->dbc, &dbcdup, flags)); b = Data_Make_Struct(bdb_cCursor, bdb_DBC, 0, bdb_cursor_free, dbcstdup); dbcstdup->dbc = dbcdup; dbcstdup->db = dbcst->db; return b; }
c_first()
click to toggle source
static VALUE bdb_cursor_first(VALUE obj) { return bdb_cursor_xxx(obj, DB_FIRST); }
c_get(*args)
click to toggle source
static VALUE bdb_cursor_get(int argc, VALUE *argv, VALUE obj) { return bdb_cursor_get_common(argc, argv, obj, 0); }
c_last()
click to toggle source
static VALUE bdb_cursor_last(VALUE obj) { return bdb_cursor_xxx(obj, DB_LAST); }
c_next()
click to toggle source
static VALUE bdb_cursor_next(VALUE obj) { return bdb_cursor_xxx(obj, DB_NEXT); }
c_next_dup()
click to toggle source
static VALUE bdb_cursor_next_dup(VALUE obj) { return bdb_cursor_xxx(obj, DB_NEXT_DUP); }
c_pget(*args)
click to toggle source
static VALUE bdb_cursor_pget(int argc, VALUE *argv, VALUE obj) { return bdb_cursor_get_common(argc, argv, obj, 1); }
c_prev()
click to toggle source
static VALUE bdb_cursor_prev(VALUE obj) { return bdb_cursor_xxx(obj, DB_PREV); }
c_put(p1, p2, p3 = v3)
click to toggle source
static VALUE bdb_cursor_put(int argc, VALUE *argv, VALUE obj) { int flags, cnt; DBT key, data; bdb_DBC *dbcst; bdb_DB *dbst; VALUE a, b, c, f; volatile VALUE d = Qnil; volatile VALUE e = Qnil; db_recno_t recno; int ret; rb_secure(4); MEMZERO(&key, DBT, 1); MEMZERO(&data, DBT, 1); cnt = rb_scan_args(argc, argv, "21", &a, &b, &c); GetCursorDB(obj, dbcst, dbst); flags = NUM2INT(a); if (flags == DB_KEYFIRST || flags == DB_KEYLAST) { if (cnt != 3) rb_raise(bdb_eFatal, "invalid number of arguments"); d = bdb_test_recno(dbcst->db, &key, &recno, b); e = bdb_test_dump(dbcst->db, &data, c, FILTER_VALUE); f = c; } else { e = bdb_test_dump(dbcst->db, &data, b, FILTER_VALUE); f = b; } SET_PARTIAL(dbst, data); ret = bdb_test_error(dbcst->dbc->c_put(dbcst->dbc, &key, &data, flags)); if (cnt == 3) { FREE_KEY(dbst, key); } if (data.flags & DB_DBT_MALLOC) free(data.data); if (ret == DB_KEYEXIST) { return Qfalse; } else { if (dbst->partial) { return bdb_cursor_current(obj); } else { return bdb_test_ret(obj, e, f, FILTER_VALUE); } } }
c_set(p1)
click to toggle source
static VALUE bdb_cursor_set(VALUE obj, VALUE a) { return bdb_cursor_set_xxx(obj, a, DB_SET); }
c_set_range(p1)
click to toggle source
static VALUE bdb_cursor_set_range(VALUE obj, VALUE a) { return bdb_cursor_set_xxx(obj, a, DB_SET_RANGE); }
c_set_recno(p1)
click to toggle source
static VALUE bdb_cursor_set_recno(VALUE obj, VALUE a) { return bdb_cursor_set_xxx(obj, a, DB_SET_RECNO); }
clone(p1 = v1)
click to toggle source
static VALUE bdb_cursor_dup(int argc, VALUE *argv, VALUE obj) { int flags = 0; VALUE a, b; bdb_DBC *dbcst, *dbcstdup; bdb_DB *dbst; DBC *dbcdup; if (rb_scan_args(argc, argv, "01", &a)) flags = NUM2INT(a); GetCursorDB(obj, dbcst, dbst); bdb_test_error(dbcst->dbc->c_dup(dbcst->dbc, &dbcdup, flags)); b = Data_Make_Struct(bdb_cCursor, bdb_DBC, 0, bdb_cursor_free, dbcstdup); dbcstdup->dbc = dbcdup; dbcstdup->db = dbcst->db; return b; }
close()
click to toggle source
static VALUE bdb_cursor_close(VALUE obj) { bdb_DBC *dbcst; bdb_DB *dbst; if (!OBJ_TAINTED(obj) && rb_safe_level() >= 4) rb_raise(rb_eSecurityError, "Insecure: can't close the cursor"); GetCursorDB(obj, dbcst, dbst); bdb_test_error(dbcst->dbc->c_close(dbcst->dbc)); dbcst->dbc = NULL; return Qtrue; }
count()
click to toggle source
static VALUE bdb_cursor_count(VALUE obj) { #if !HAVE_CONST_DB_NEXT_DUP rb_raise(bdb_eFatal, "DB_NEXT_DUP needs Berkeley DB 2.6 or later"); #else #if !HAVE_ST_DBC_C_COUNT DBT key, data; DBT key_o, data_o; int ret; #endif bdb_DBC *dbcst; bdb_DB *dbst; db_recno_t count; GetCursorDB(obj, dbcst, dbst); #if HAVE_ST_DBC_C_COUNT bdb_test_error(dbcst->dbc->c_count(dbcst->dbc, &count, 0)); return INT2NUM(count); #else MEMZERO(&key, DBT, 1); key.flags |= DB_DBT_MALLOC; MEMZERO(&data, DBT, 1); data.flags |= DB_DBT_MALLOC; MEMZERO(&key_o, DBT, 1); key_o.flags |= DB_DBT_MALLOC; MEMZERO(&data_o, DBT, 1); data_o.flags |= DB_DBT_MALLOC; SET_PARTIAL(dbst, data); ret = bdb_test_error(dbcst->dbc->c_get(dbcst->dbc, &key_o, &data_o, DB_CURRENT)); if (ret == DB_NOTFOUND || ret == DB_KEYEMPTY) return INT2NUM(0); count = 1; while (1) { MEMZERO(&key, DBT, 1); key.flags |= DB_DBT_MALLOC; MEMZERO(&data, DBT, 1); data.flags |= DB_DBT_MALLOC; SET_PARTIAL(dbst, data); ret = bdb_test_error(dbcst->dbc->c_get(dbcst->dbc, &key, &data, DB_NEXT_DUP)); if (ret == DB_NOTFOUND) { MEMZERO(&key_o, DBT, 1); key_o.flags |= DB_DBT_MALLOC; MEMZERO(&data_o, DBT, 1); data_o.flags |= DB_DBT_MALLOC; bdb_test_error(dbcst->dbc->c_get(dbcst->dbc, &key_o, &data_o, DB_SET)); FREE_KEY(dbst, key_o); free(data_o.data); return INT2NUM(count); } if (ret == DB_KEYEMPTY) continue; FREE_KEY(dbst, key); free(data.data); count++; } return INT2NUM(-1); #endif #endif }
current()
click to toggle source
static VALUE bdb_cursor_current(VALUE obj) { return bdb_cursor_xxx(obj, DB_CURRENT); }
del()
click to toggle source
static VALUE bdb_cursor_del(VALUE obj) { int flags = 0; bdb_DBC *dbcst; bdb_DB *dbst; rb_secure(4); GetCursorDB(obj, dbcst, dbst); bdb_test_error(dbcst->dbc->c_del(dbcst->dbc, flags)); return Qtrue; }
delete()
click to toggle source
static VALUE bdb_cursor_del(VALUE obj) { int flags = 0; bdb_DBC *dbcst; bdb_DB *dbst; rb_secure(4); GetCursorDB(obj, dbcst, dbst); bdb_test_error(dbcst->dbc->c_del(dbcst->dbc, flags)); return Qtrue; }
dup(p1 = v1)
click to toggle source
static VALUE bdb_cursor_dup(int argc, VALUE *argv, VALUE obj) { int flags = 0; VALUE a, b; bdb_DBC *dbcst, *dbcstdup; bdb_DB *dbst; DBC *dbcdup; if (rb_scan_args(argc, argv, "01", &a)) flags = NUM2INT(a); GetCursorDB(obj, dbcst, dbst); bdb_test_error(dbcst->dbc->c_dup(dbcst->dbc, &dbcdup, flags)); b = Data_Make_Struct(bdb_cCursor, bdb_DBC, 0, bdb_cursor_free, dbcstdup); dbcstdup->dbc = dbcdup; dbcstdup->db = dbcst->db; return b; }
first()
click to toggle source
static VALUE bdb_cursor_first(VALUE obj) { return bdb_cursor_xxx(obj, DB_FIRST); }
get(*args)
click to toggle source
static VALUE bdb_cursor_get(int argc, VALUE *argv, VALUE obj) { return bdb_cursor_get_common(argc, argv, obj, 0); }
last()
click to toggle source
static VALUE bdb_cursor_last(VALUE obj) { return bdb_cursor_xxx(obj, DB_LAST); }
next()
click to toggle source
static VALUE bdb_cursor_next(VALUE obj) { return bdb_cursor_xxx(obj, DB_NEXT); }
next_dup()
click to toggle source
static VALUE bdb_cursor_next_dup(VALUE obj) { return bdb_cursor_xxx(obj, DB_NEXT_DUP); }
pget(*args)
click to toggle source
static VALUE bdb_cursor_pget(int argc, VALUE *argv, VALUE obj) { return bdb_cursor_get_common(argc, argv, obj, 1); }
prev()
click to toggle source
static VALUE bdb_cursor_prev(VALUE obj) { return bdb_cursor_xxx(obj, DB_PREV); }
priority()
click to toggle source
static VALUE bdb_cursor_priority(VALUE obj) { bdb_DBC *dbcst; bdb_DB *dbst; DB_CACHE_PRIORITY prio = 0; GetCursorDB(obj, dbcst, dbst); if (dbcst->dbc->get_priority(dbcst->dbc, &prio)) { rb_raise(rb_eArgError, "invalid argument"); } return INT2FIX(prio); }
priority=(p1)
click to toggle source
static VALUE bdb_cursor_set_priority(VALUE obj, VALUE a) { bdb_DBC *dbcst; bdb_DB *dbst; GetCursorDB(obj, dbcst, dbst); if (dbcst->dbc->set_priority(dbcst->dbc, NUM2INT(a))) { rb_raise(rb_eArgError, "invalid argument"); } return a; }
put(p1, p2, p3 = v3)
click to toggle source
static VALUE bdb_cursor_put(int argc, VALUE *argv, VALUE obj) { int flags, cnt; DBT key, data; bdb_DBC *dbcst; bdb_DB *dbst; VALUE a, b, c, f; volatile VALUE d = Qnil; volatile VALUE e = Qnil; db_recno_t recno; int ret; rb_secure(4); MEMZERO(&key, DBT, 1); MEMZERO(&data, DBT, 1); cnt = rb_scan_args(argc, argv, "21", &a, &b, &c); GetCursorDB(obj, dbcst, dbst); flags = NUM2INT(a); if (flags == DB_KEYFIRST || flags == DB_KEYLAST) { if (cnt != 3) rb_raise(bdb_eFatal, "invalid number of arguments"); d = bdb_test_recno(dbcst->db, &key, &recno, b); e = bdb_test_dump(dbcst->db, &data, c, FILTER_VALUE); f = c; } else { e = bdb_test_dump(dbcst->db, &data, b, FILTER_VALUE); f = b; } SET_PARTIAL(dbst, data); ret = bdb_test_error(dbcst->dbc->c_put(dbcst->dbc, &key, &data, flags)); if (cnt == 3) { FREE_KEY(dbst, key); } if (data.flags & DB_DBT_MALLOC) free(data.data); if (ret == DB_KEYEXIST) { return Qfalse; } else { if (dbst->partial) { return bdb_cursor_current(obj); } else { return bdb_test_ret(obj, e, f, FILTER_VALUE); } } }
set(p1)
click to toggle source
static VALUE bdb_cursor_set(VALUE obj, VALUE a) { return bdb_cursor_set_xxx(obj, a, DB_SET); }
set_range(p1)
click to toggle source
static VALUE bdb_cursor_set_range(VALUE obj, VALUE a) { return bdb_cursor_set_xxx(obj, a, DB_SET_RANGE); }
set_recno(p1)
click to toggle source
static VALUE bdb_cursor_set_recno(VALUE obj, VALUE a) { return bdb_cursor_set_xxx(obj, a, DB_SET_RECNO); }