Exemple #1
0
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));
}
Exemple #3
0
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;
}
Exemple #4
0
Db *DbSequence::get_db()
{
	DB_SEQUENCE *seq = unwrap(this);
	DB *db;
	(void)seq->get_db(seq, &db);
	return Db::get_Db(db);
}
Exemple #5
0
DbSequence::~DbSequence()
{
	DB_SEQUENCE *seq;

	seq = unwrap(this);
	if (seq != NULL)
		(void)seq->close(seq, 0);
}
Exemple #6
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);
}
Exemple #7
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;
}
Exemple #8
0
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;
}
Exemple #9
0
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;
}
Exemple #10
0
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);
}
Exemple #12
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;
}
Exemple #13
0
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);
}
Exemple #14
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;
}
Exemple #15
0
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;
}