Пример #1
0
SerdStatus
sord_erase(SordModel* sord, SordIter* iter)
{
	if (sord->n_iters > 1) {
		error(sord->world, SERD_ERR_BAD_ARG, "erased with many iterators\n");
	}

	SordQuad tup;
	sord_iter_get(iter, tup);

	SORD_WRITE_LOG("Remove " TUP_FMT "\n", TUP_FMT_ARGS(tup));

	SordNode* quad = NULL;
	for (unsigned i = 0; i < NUM_ORDERS; ++i) {
		if (sord->indices[i]) {
			if (zix_btree_remove(sord->indices[i], tup, (void**)&quad,
			                     i == iter->order ? &iter->cur : NULL)) {
				return (i == 0) ? SERD_ERR_NOT_FOUND : SERD_ERR_INTERNAL;
			}
		}
	}
	iter->end = zix_btree_iter_is_end(iter->cur);

	free(quad);

	for (int i = 0; i < TUP_LEN; ++i)
		sord_drop_quad_ref(sord, tup[i], (SordQuadIndex)i);

	--sord->n_quads;
	return SERD_SUCCESS;
}
Пример #2
0
bool
sord_add(SordModel* sord, const SordQuad tup)
{
	SORD_WRITE_LOG("Add " TUP_FMT "\n", TUP_FMT_ARGS(tup));
	if (!tup[0] || !tup[1] || !tup[2]) {
		error(sord->world, SERD_ERR_BAD_ARG,
		      "attempt to add quad with NULL field\n");
		return false;
	} else if (sord->n_iters > 0) {
		error(sord->world, SERD_ERR_BAD_ARG, "added tuple during iteration\n");
	}

	const SordNode** quad = (const SordNode**)malloc(sizeof(SordQuad));
	memcpy(quad, tup, sizeof(SordQuad));

	for (unsigned i = 0; i < NUM_ORDERS; ++i) {
		if (sord->indices[i]) {
			if (!sord_add_to_index(sord, quad, (SordOrder)i)) {
				assert(i == 0);  // Assuming index coherency
				free(quad);
				return false;  // Quad already stored, do nothing
			}
		}
	}

	for (int i = 0; i < TUP_LEN; ++i)
		sord_add_quad_ref(sord, tup[i], (SordQuadIndex)i);

	++sord->n_quads;
	return true;
}
Пример #3
0
void
sord_remove(SordModel* sord, const SordQuad tup)
{
	SORD_WRITE_LOG("Remove " TUP_FMT "\n", TUP_FMT_ARGS(tup));
	if (sord->n_iters > 0) {
		error(sord->world, SERD_ERR_BAD_ARG, "remove with iterator\n");
	}

	SordNode* quad = NULL;
	for (unsigned i = 0; i < NUM_ORDERS; ++i) {
		if (sord->indices[i]) {
			if (zix_btree_remove(sord->indices[i], tup, (void**)&quad, NULL)) {
				assert(i == 0);  // Assuming index coherency
				return;  // Quad not found, do nothing
			}
		}
	}

	free(quad);

	for (int i = 0; i < TUP_LEN; ++i)
		sord_drop_quad_ref(sord, tup[i], (SordQuadIndex)i);

	--sord->n_quads;
}
Пример #4
0
void
sord_remove(SordModel* sord, const SordQuad tup)
{
	SORD_WRITE_LOG("Remove " TUP_FMT "\n", TUP_FMT_ARGS(tup));

	SordNode** quad = NULL;
	for (unsigned i = 0; i < NUM_ORDERS; ++i) {
		if (sord->indices[i]) {
			ZixTreeIter* const cur = index_search(sord->indices[i], tup);
			if (!zix_tree_iter_is_end(cur)) {
				if (!quad) {
					quad = (SordNode**)zix_tree_get(cur);
				}
				zix_tree_remove(sord->indices[i], cur);
			} else {
				assert(i == 0);  // Assuming index coherency
				return;  // Quad not found, do nothing
			}
		}
	}

	free(quad);

	for (int i = 0; i < TUP_LEN; ++i)
		sord_drop_quad_ref(sord, tup[i], (SordQuadIndex)i);

	--sord->n_quads;
}