Dbt *DbSequence::get_key() { DB_SEQUENCE *seq = unwrap(this); memset(&key_, 0, sizeof(DBT)); (void)seq->get_key(seq, &key_); return Dbt::get_Dbt(&key_); }
static int btreeSeqRemoveHandle( sqlite3_context *context, Btree *p, CACHED_DB *cache_entry) { BtShared *pBt; DB_SEQUENCE *seq; DBT key; SEQ_COOKIE cookie; int ret; pBt = p->pBt; memcpy(&cookie, cache_entry->cookie, sizeof(cookie)); /* Remove the entry from the hash table. */ sqlite3HashInsert(&pBt->db_cache, cookie.name, cookie.name_len, NULL); if (cookie.cache != 0) { seq = (DB_SEQUENCE *)cache_entry->dbp; seq->remove(seq, p->savepoint_txn, 0); } /* Remove the cookie entry from the metadata database. */ memset(&key, 0, sizeof(key)); key.data = cookie.name; key.size = cookie.name_len; if ((ret = pBt->metadb->del(pBt->metadb, p->savepoint_txn, &key, 0)) != 0 && ret != DB_NOTFOUND) { btreeSeqError(context, SQLITE_ERROR, "Sequence remove incomplete. Couldn't delete metadata." "Error %s.", db_strerror(ret)); } if (cache_entry->cookie != NULL) sqlite3_free(cache_entry->cookie); sqlite3_free(cache_entry); return (ret == 0 ? SQLITE_OK : dberr2sqlite(ret, NULL)); }
static JSBool rpmseq_Close(JSContext *cx, uintN argc, jsval *vp) { jsval *argv = JS_ARGV(cx , vp); JSObject *obj = JS_NewObjectForConstructor(cx , vp); if(!obj) { JS_ReportError(cx , "Failed to create 'this' object"); return JS_FALSE; } void * ptr = JS_GetInstancePrivate(cx, obj, &rpmseqClass, NULL); DB_SEQUENCE * seq = ptr; uint32_t _flags = 0; JSBool ok = JS_FALSE; _METHOD_DEBUG_ENTRY(_debug); if (seq == NULL) goto exit; JS_SET_RVAL(cx, vp, JSVAL_FALSE); if (!(ok = JS_ConvertArguments(cx, argc, argv, "/u", &_flags))) goto exit; { int ret = seq->close(seq, _flags); if (ret) fprintf(stderr, "DB_SEQUENCE->close: %s\n", db_strerror(ret)); else JS_SET_RVAL(cx, vp, JSVAL_TRUE); seq = ptr = NULL; (void) JS_SetPrivate(cx, obj, ptr); } ok = JS_TRUE; exit: return ok; }
Db *DbSequence::get_db() { DB_SEQUENCE *seq = unwrap(this); DB *db; (void)seq->get_db(seq, &db); return Db::get_Db(db); }
DbSequence::~DbSequence() { DB_SEQUENCE *seq; seq = unwrap(this); if (seq != NULL) (void)seq->close(seq, 0); }
static void rpmseq_dtor(JSContext *cx, JSObject *obj) { void * ptr = JS_GetInstancePrivate(cx, obj, &rpmseqClass, NULL); DB_SEQUENCE * seq = ptr; _DTOR_DEBUG_ENTRY(_debug); if (seq) (void) seq->close(seq, 0); }
static JSBool rpmseq_Get(JSContext *cx, uintN argc, jsval *vp) { jsval *argv = JS_ARGV(cx , vp); JSObject *obj = JS_NewObjectForConstructor(cx , vp); if(!obj) { JS_ReportError(cx , "Failed to create 'this' object"); return JS_FALSE; } void * ptr = JS_GetInstancePrivate(cx, obj, &rpmseqClass, NULL); DB_SEQUENCE * seq = ptr; JSObject * o = NULL; DB_TXN * _txn = NULL; int32_t _delta = 1; uint32_t _flags = 0; JSBool ok = JS_FALSE; _METHOD_DEBUG_ENTRY(_debug); if (seq == NULL) goto exit; JS_SET_RVAL(cx, vp, JSVAL_FALSE); if (!(ok = JS_ConvertArguments(cx, argc, argv, "o/iu", &o, &_delta, &_flags))) goto exit; if (o && OBJ_IS_RPMTXN(cx, o)) _txn = JS_GetInstancePrivate(cx, o, &rpmtxnClass, NULL); if (_delta <= 0) goto exit; { jsdouble d = 0; db_seq_t _seqno = 0; int ret = seq->get(seq, _txn, _delta, &_seqno, _flags); switch (ret) { default: fprintf(stderr, "DB_SEQUENCE->get: %s\n", db_strerror(ret)); goto exit; break; case 0: d = _seqno; if (!JS_NewNumberValue(cx, d, &JS_RVAL(cx, vp))) JS_SET_RVAL(cx, vp, JSVAL_FALSE); break; } } ok = JS_TRUE; exit: return ok; }
static JSBool rpmseq_Open(JSContext *cx, uintN argc, jsval *vp) { jsval *argv = JS_ARGV(cx , vp); JSObject *obj = JS_NewObjectForConstructor(cx , vp); if(!obj) { JS_ReportError(cx , "Failed to create 'this' object"); return JS_FALSE; } void * ptr = JS_GetInstancePrivate(cx, obj, &rpmseqClass, NULL); DB_SEQUENCE * seq = ptr; JSObject * o = NULL; DB_TXN * _txn = NULL; jsval _kv = JSVAL_NULL; _RPMDBT _k = _RPMDBT_INIT; uint32_t _flags = DB_CREATE; JSBool ok = JS_FALSE; _METHOD_DEBUG_ENTRY(_debug); if (seq == NULL) goto exit; JS_SET_RVAL(cx, vp, JSVAL_FALSE); if (!(ok = JS_ConvertArguments(cx, argc, argv, "ov/u", &o, &_kv, &_flags))) goto exit; if (o && OBJ_IS_RPMTXN(cx, o)) _txn = JS_GetInstancePrivate(cx, o, &rpmtxnClass, NULL); if (rpmdb_v2dbt(cx, _kv, &_k)) goto exit; { int ret = seq->open(seq, _txn, _RPMDBT_PTR(_k), _flags); switch (ret) { default: fprintf(stderr, "DB_SEQUENCE->open: %s\n", db_strerror(ret)); goto exit; break; case 0: JS_SET_RVAL(cx, vp, JSVAL_TRUE); seq->api_internal = obj; break; } } ok = JS_TRUE; exit: return ok; }
static JSBool rpmseq_Remove(JSContext *cx, uintN argc, jsval *vp) { jsval *argv = JS_ARGV(cx , vp); JSObject *obj = JS_NewObjectForConstructor(cx , vp); if(!obj) { JS_ReportError(cx , "Failed to create 'this' object"); return JS_FALSE; } void * ptr = JS_GetInstancePrivate(cx, obj, &rpmseqClass, NULL); DB_SEQUENCE * seq = ptr; JSObject * o = NULL; DB_TXN * _txn = NULL; uint32_t _flags = 0; JSBool ok = JS_FALSE; _METHOD_DEBUG_ENTRY(_debug); if (seq == NULL) goto exit; JS_SET_RVAL(cx, vp, JSVAL_FALSE); if (!(ok = JS_ConvertArguments(cx, argc, argv, "o/u", &o, &_flags))) goto exit; if (o && OBJ_IS_RPMTXN(cx, o)) _txn = JS_GetInstancePrivate(cx, o, &rpmtxnClass, NULL); { int ret = seq->remove(seq, _txn, _flags); switch (ret) { default: fprintf(stderr, "DB_SEQUENCE->remove: %s\n", db_strerror(ret)); goto exit; break; case 0: JS_SET_RVAL(cx, vp, JSVAL_TRUE); break; } seq = ptr = NULL; (void) JS_SetPrivate(cx, obj, ptr); } ok = JS_TRUE; exit: return ok; }
static int btreeSeqOpen( sqlite3_context *context, Btree *p, SEQ_COOKIE *cookie) { BtShared *pBt; DBT key; DB_SEQUENCE *seq; char seq_key[BT_MAX_SEQ_NAME]; int ret, seq_len; u_int32_t flags; pBt = p->pBt; if ((ret = btreeSeqGetCookie(context, p, cookie, 0)) != 0) return (ret); if (cookie->cache != 0) { if ((ret = db_sequence_create(&seq, pBt->metadb, 0)) != 0) return ret; seq->set_cachesize(seq, cookie->cache); flags = 0; #ifdef BDBSQL_SINGLE_THREAD flags |= DB_THREAD; #endif sqlite3_snprintf( BT_MAX_SEQ_NAME, seq_key, "%s_db", cookie->name); seq_len = (int)strlen(seq_key); memset(&key, 0, sizeof(key)); key.data = seq_key; key.size = key.ulen = seq_len; key.flags = DB_DBT_USERMEM; if ((ret = seq->open( seq, NULL, &key, flags)) != 0) { (void)seq->close(seq, 0); return ret; } cookie->handle = seq; } return (0); }
int TestSequencePreOpenSetterAndGetter(CuTest *ct) { DB_ENV *dbenv; DB *dbp; DB_SEQUENCE *seq; u_int32_t seq_flags; CuAssert(ct, "db_env_create", create_dbenv_handle(&dbenv) == 0); CuAssert(ct, "dbenv->open", dbenv->open(dbenv, TEST_ENV, DB_CREATE | DB_INIT_MPOOL, 0644) == 0); CuAssert(ct, "db_create", create_db_handle(&dbp, dbenv) == 0); CuAssert(ct, "dbp->open", dbp->open(dbp, NULL, "seq.db", NULL, DB_BTREE, DB_CREATE, 0644) == 0); CuAssert(ct, "db_sequence_create", create_seq_handle(&seq, dbp) == 0); /* Test DB_SEQUENCE->set_cachesize(), DB_SEQUENCE->get_cachesize(). */ CHECK_1_DIGIT_VALUE(seq, set_cachesize, get_cachesize, u_int32_t, rand()); /* Test DB_SEQUENCE->set_flags(), DB_SEQUENCE->get_flags(). */ seq_flags = 0; CHECK_1_DIGIT_VALUE(seq, set_flags, get_flags, u_int32_t, DB_SEQ_DEC | DB_SEQ_WRAP); /* We make sure the DB_SEQ_DEC is cleared if we set DB_SEQ_INC. */ CuAssert(ct, "seq->set_flags", seq->set_flags(seq, DB_SEQ_INC) == 0); CuAssert(ct, "seq->get_flags", seq->get_flags(seq, &seq_flags) == 0); CuAssert(ct, "check seq flags", seq_flags == (DB_SEQ_INC | DB_SEQ_WRAP)); /* * Test DB_SEQUENCE->set_range(), DB_SEQUENCE->get_range(). * The max should be bigger than min. */ CHECK_2_DIGIT_VALUES(seq, set_range, get_range, db_seq_t, 2, db_seq_t, 1048576); CuAssert(ct, "seq->close", close_seq_handle(seq) == 0); CuAssert(ct, "dbp->close", close_db_handle(dbp) == 0); CuAssert(ct, "dbenv->close", close_dbenv_handle(dbenv) == 0); return (0); }
/* --- Object ctors/dtors */ static DB_SEQUENCE * rpmseq_init(JSContext *cx, JSObject *obj, DB * db, uint32_t flags) { DB_SEQUENCE * seq = NULL; int ret = db_sequence_create(&seq, db, flags); if (ret || seq == NULL || !JS_SetPrivate(cx, obj, (void *)seq)) { if (db) db->err(db, ret, "db_sequence_create"); else fprintf(stderr, "db_sequence_create: %s\n", db_strerror(ret)); if (seq) ret = seq->close(seq, 0); seq = NULL; } if (_debug) fprintf(stderr, "<== %s(%p,%p) seq %p\n", __FUNCTION__, cx, obj, seq); return seq; }
static int btreeSeqCreate( sqlite3_context *context, Btree *p, SEQ_COOKIE *cookie) { BtShared *pBt; DBT key; DB_SEQUENCE *seq; char seq_key[BT_MAX_SEQ_NAME]; int ret, seq_len; u_int32_t flags; pBt = p->pBt; if (cookie->cache != 0) { if ((ret = db_sequence_create(&seq, pBt->metadb, 0)) != 0) return ret; if (cookie->cache > 0) seq->set_cachesize(seq, cookie->cache); if (cookie->decrementing != 0) seq->set_flags(seq, DB_SEQ_DEC); /* Always set min_val and max_val */ if ((ret = seq->set_range(seq, cookie->min_val, cookie->max_val)) != 0) return ret; if ((ret = seq->initial_value(seq, cookie->start_val)) != 0) return ret; flags = DB_CREATE; #ifndef BDBSQL_SINGLE_THREAD flags |= DB_THREAD; #endif sqlite3_snprintf( BT_MAX_SEQ_NAME, seq_key, "%s_db", cookie->name); seq_len = (int)strlen(seq_key); memset(&key, 0, sizeof(key)); key.data = seq_key; key.size = key.ulen = seq_len; key.flags = DB_DBT_USERMEM; if ((ret = seq->open(seq, p->savepoint_txn, &key, flags)) != 0) return ret; cookie->handle = seq; } else { cookie->handle = NULL; cookie->val = cookie->start_val; if ((cookie->decrementing && cookie->start_val < cookie->min_val) || (!cookie->decrementing && cookie->start_val > cookie->max_val) || cookie->min_val == cookie->max_val) return EINVAL; } if ((ret = btreeSeqPutCookie(context, p, cookie, DB_NOOVERWRITE)) != 0) return (ret); return (0); }
static JSBool rpmseq_setprop(JSContext *cx, JSObject *obj, jsid id, JSBool strict, jsval *vp) { void * ptr = JS_GetInstancePrivate(cx, obj, &rpmseqClass, NULL); DB_SEQUENCE * seq = ptr; jsval idval; JS_IdToValue(cx, id, &idval); jsint tiny = JSVAL_TO_INT(idval); jsdouble d = 0; int ret; /* XXX the class has ptr == NULL, instances have ptr != NULL. */ if (ptr == NULL) return JS_TRUE; switch (tiny) { case _DEBUG: if (!JS_ValueToInt32(cx, *vp, &_debug)) break; break; case _CACHESIZE: { int32_t _i = 0; if (seq->api_internal != NULL || !JS_ValueToNumber(cx, *vp, &d)) { *vp = JSVAL_FALSE; break; } _i = d; ret = seq->set_cachesize(seq, _i); *vp = (!ret ? JSVAL_TRUE : JSVAL_FALSE); } break; case _FLAGS: { uint32_t _u = 0; if (seq->api_internal != NULL || !JS_ValueToNumber(cx, *vp, &d)) { *vp = JSVAL_FALSE; break; } _u = d; ret = seq->set_flags(seq, _u); *vp = (!ret ? JSVAL_TRUE : JSVAL_FALSE); } break; case _INITVAL: { db_seq_t _ival = 0; if (seq->api_internal != NULL || !JS_ValueToNumber(cx, *vp, &d)) { *vp = JSVAL_FALSE; break; } _ival = d; ret = seq->initial_value(seq, _ival); *vp = (!ret ? JSVAL_TRUE : JSVAL_FALSE); } break; case _RANGEMIN: case _RANGEMAX: { db_seq_t _min = 0; db_seq_t _max = 0; if (seq->api_internal != NULL || !JS_ValueToNumber(cx, *vp, &d)) { *vp = JSVAL_FALSE; break; } if ((ret = seq->get_range(seq, &_min, &_max)) != 0) { *vp = JSVAL_VOID; break; } switch (tiny) { case _RANGEMIN: _min = d; break; case _RANGEMAX: _max = d; break; } ret = seq->set_range(seq, _min, _max); *vp = (!ret ? JSVAL_TRUE : JSVAL_FALSE); } break; default: break; } return JS_TRUE; }
static JSBool rpmseq_getprop(JSContext *cx, JSObject *obj, jsid id, jsval *vp) { void * ptr = JS_GetInstancePrivate(cx, obj, &rpmseqClass, NULL); DB_SEQUENCE * seq = ptr; jsval idval; JS_IdToValue(cx, id, &idval); jsint tiny = JSVAL_TO_INT(idval); jsdouble d = 0; int ret; /* XXX the class has ptr == NULL, instances have ptr != NULL. */ if (ptr == NULL) return JS_TRUE; switch (tiny) { case _DEBUG: *vp = INT_TO_JSVAL(_debug); break; case _DB: { DB * _db = NULL; if ((ret = seq->get_db(seq, &_db)) != 0) { *vp = JSVAL_VOID; break; } *vp = _db->app_private ? OBJECT_TO_JSVAL(_db->app_private) : JSVAL_NULL; } break; case _KEY: { DBT _k = {0}; if ((ret = seq->get_key(seq, &_k)) != 0) { *vp = JSVAL_VOID; break; } *vp = _k.data ? STRING_TO_JSVAL(JS_NewStringCopyZ(cx, _k.data)) : JSVAL_NULL; } break; case _CACHESIZE: { int32_t _i = 0; if ((ret = seq->get_cachesize(seq, &_i)) != 0) { *vp = JSVAL_VOID; break; } d = _i; if (!JS_NewNumberValue(cx, d, vp)) *vp = JSVAL_FALSE; } break; case _FLAGS: { uint32_t _u = 0; if ((ret = seq->get_flags(seq, &_u)) != 0) { *vp = JSVAL_VOID; break; } d = _u; if (!JS_NewNumberValue(cx, d, vp)) *vp = JSVAL_FALSE; } break; case _RANGEMIN: case _RANGEMAX: { db_seq_t _min = 0; db_seq_t _max = 0; if ((ret = seq->get_range(seq, &_min, &_max)) != 0) { *vp = JSVAL_VOID; break; } switch (tiny) { case _RANGEMIN: d = _min; break; case _RANGEMAX: d = _max; break; } if (!JS_NewNumberValue(cx, d, vp)) *vp = JSVAL_FALSE; } break; case _ST_WAIT: case _ST_NOWAIT: case _ST_CURRENT: case _ST_VALUE: case _ST_LAST_VALUE: case _ST_MIN: case _ST_MAX: case _ST_CACHESIZE: case _ST_FLAGS: { DB_SEQUENCE_STAT * sp = NULL; uint32_t _flags = 0; if ((ret = seq->stat(seq, &sp, _flags)) != 0) { *vp = JSVAL_VOID; break; } switch (tiny) { case _ST_WAIT: d = sp->st_wait; break; case _ST_NOWAIT: d = sp->st_nowait; break; case _ST_CURRENT: d = sp->st_current; break; case _ST_VALUE: d = sp->st_value; break; case _ST_LAST_VALUE: d = sp->st_last_value; break; case _ST_MIN: d = sp->st_min; break; case _ST_MAX: d = sp->st_max; break; case _ST_CACHESIZE: d = sp->st_cache_size; break; case _ST_FLAGS: d = sp->st_flags; break; } sp = _free(sp); if (!JS_NewNumberValue(cx, d, vp)) *vp = JSVAL_FALSE; } break; default: break; } return JS_TRUE; }