int get_info(void* _pvCtx, int _iRhs, int* _piParent, int *_piAddr, int _iItemPos)
{
    SciErr sciErr;
    int iRet    = 0;
    int iType   = 0;

    sciErr = getVarType(_pvCtx, _piAddr, &iType);
    switch (iType)
    {
        case sci_matrix :
            iRet = get_double_info(_pvCtx, _iRhs, _piParent, _piAddr, _iItemPos);
            break;
        case sci_poly :
            iRet = get_poly_info(_pvCtx, _iRhs, _piParent, _piAddr, _iItemPos);
            break;
        case sci_boolean :
            iRet = get_boolean_info(_pvCtx, _iRhs, _piParent, _piAddr, _iItemPos);
            break;
        case sci_sparse :
            iRet = get_sparse_info(_pvCtx, _iRhs, _piParent, _piAddr, _iItemPos);
            break;
        case sci_boolean_sparse :
            iRet = get_bsparse_info(_pvCtx, _iRhs, _piParent, _piAddr, _iItemPos);
            break;
        case sci_ints :
            iRet = get_integer_info(_pvCtx, _iRhs, _piParent, _piAddr, _iItemPos);
            break;
        case sci_strings :
            iRet = get_string_info(_pvCtx, _iRhs, _piParent, _piAddr, _iItemPos);
            break;
        case sci_list :
            insert_indent();
            sciprint("List ");
            iRet = get_list_info(_pvCtx, _iRhs, _piParent, _piAddr, _iItemPos);
            break;
        case sci_tlist :
            insert_indent();
            sciprint("TList ");
            iRet = get_list_info(_pvCtx, _iRhs, _piParent, _piAddr, _iItemPos);
            break;
        case sci_mlist :
            insert_indent();
            sciprint("MList ");
            iRet = get_list_info(_pvCtx, _iRhs, _piParent, _piAddr, _iItemPos);
            break;
        case sci_pointer :
            iRet = get_pointer_info(_pvCtx, _iRhs, _piParent, _piAddr, _iItemPos);
            break;
        default :
            insert_indent();
            sciprint("Unknown type\n");
            return 1;
    }
    return iRet;
}
Exemple #2
0
int Database::list_destroy(string& key)
{
	list_key_encode(key, skey)
	string val;
	int r = get(skey, &val);
	if (r != ErrorCode::OK) return r;
	uint32_t size;
	uint64_t first, last;
	bool valid;
	get_list_info(size, first, last, val, valid);
	if (!valid) return ErrorCode::DB_ERROR;

	list_item_key_encode(key, first, sfirst);
	leveldb::ReadOptions options;
	options.fill_cache = false;
	leveldb::Iterator* it = db->NewIterator(options);
	it->Seek(sfirst);
	uint32_t i = 0;

	leveldb::WriteBatch batch;

	while (i < size && it->Valid())
	{
		batch.Delete(it->key());
		it->Next();
		i++;
	}
	batch.Delete(skey);
	leveldb::Status s = db->Write(leveldb::WriteOptions(), &batch);
	if (s.ok()) return ErrorCode::OK;
	return ErrorCode::DB_ERROR;
}
Exemple #3
0
int Database::list_index(string& key, uint32_t index, string& val)
{
	list_key_encode(key, skey)
	string lval;
	int r = get(skey, &lval);
	if (r != ErrorCode::OK) return r;
	uint32_t size;
	uint64_t first, last;
	bool valid;
	get_list_info(size, first, last, lval, valid);
	if (!valid) return ErrorCode::DB_ERROR;

	list_item_key_encode(key, first, sfirst);
	leveldb::ReadOptions options;
	//options.fill_cache = false;
	leveldb::Iterator* it = db->NewIterator(options);
	it->Seek(sfirst);

	uint32_t i = 0;

	while (i < size && it->Valid())
	{
		if (i == index)
		{
			val = it->value().ToString();
			return ErrorCode::OK;
		}
		it->Next();
		i++;
	}
	return ErrorCode::IS_NOT_FOUND;
}
Exemple #4
0
int Database::list_size(string& key, uint32_t& size)
{
	list_key_encode(key, skey)
	string lval;
	int r = get(skey, &lval);
	if (r != ErrorCode::OK) return r;

	uint64_t first, last;
	bool valid;
	get_list_info(size, first, last, lval, valid);
	if (!valid) return ErrorCode::DB_ERROR;
	return ErrorCode::OK;
}
Exemple #5
0
int Database::list_range(string& key, uint32_t index, uint32_t& count, char* data, uint32_t& data_size)
{
	list_key_encode(key, skey)
	string lval;
	int r = get(skey, &lval);
	if (r != ErrorCode::OK) return r;
	uint32_t size;
	uint64_t first, last;
	bool valid;
	get_list_info(size, first, last, lval, valid);
	if (!valid) return ErrorCode::DB_ERROR;

	list_item_key_encode(key, first, sfirst);
	leveldb::ReadOptions options;
	//options.fill_cache = false;
	leveldb::Iterator* it = db->NewIterator(options);
	it->Seek(sfirst);

	uint32_t i = 0;

	while (i < size && it->Valid())
	{
		if (i == index)
		{
			uint32_t c = 0;
			_enc_declare2_(result, data);
			while (c < count && it->Valid())
			{
				if (it->value().size() + _enc_size_(result) > data_size) break;
				_enc_put_string_(result, it->value().ToString());
				it->Next();
				c++;
			}
			count = c;
			data_size = _enc_size_(result);
			return ErrorCode::OK;
		}
		it->Next();
		i++;
	}
	return ErrorCode::IS_NOT_FOUND;
}
Exemple #6
0
int Database::list_remove(string& key, uint32_t index)
{
	list_key_encode(key, skey)
	string lval;
	int r = get(skey, &lval);
	if (r != ErrorCode::OK) return r;
	uint32_t size;
	uint64_t first, last;
	bool valid;
	get_list_info(size, first, last, lval, valid);
	if (!valid) return ErrorCode::DB_ERROR;

	list_item_key_encode(key, first, sfirst);
	leveldb::ReadOptions options;
	options.fill_cache = false;
	leveldb::Iterator* it = db->NewIterator(options);
	it->Seek(sfirst);

	uint32_t i = 0;

	while (i < size && it->Valid())
	{
		if (i == index)
		{
			leveldb::WriteBatch batch;
			size--;
			set_list_info(size, first, last, val);
			batch.Put(skey, val);
			batch.Delete(it->key());
			leveldb::Status status = db->Write(leveldb::WriteOptions(), &batch);
			if (status.ok()) return ErrorCode::OK;
			else return ErrorCode::DB_ERROR;
		}
		it->Next();
		i++;
	}
	return ErrorCode::IS_NOT_FOUND;
}
Exemple #7
0
int Database::list_pushback(string& key, string& val)
{
	list_key_encode(key, skey)
	string lval;
	int r = get(skey, &lval);
	if (r != ErrorCode::OK) return r;

	uint32_t size;
	uint64_t first, last;
	bool valid;
	get_list_info(size, first, last, lval, valid);
	if (!valid) return ErrorCode::DB_ERROR;
	size++;
	last++;
	set_list_info(size, first, last, lval2);

	list_item_key_encode(key, last, slast);
	leveldb::WriteBatch batch;
	batch.Put(slast, val);
	batch.Put(skey, lval2);
	leveldb::Status s = db->Write(leveldb::WriteOptions(), &batch);
	if (s.ok()) return ErrorCode::OK;
	return ErrorCode::DB_ERROR;
}