示例#1
0
GError *
meta2_backend_has_container(struct meta2_backend_s *m2,
		struct oio_url_s *url)
{
	GError *err = NULL;

	EXTRA_ASSERT(m2 != NULL);
	EXTRA_ASSERT(url != NULL);
	GRID_DEBUG("HAS(%s)", oio_url_get(url, OIOURL_WHOLE));

	struct sqlx_name_mutable_s n;
	sqlx_name_fill (&n, url, NAME_SRVTYPE_META2, 1);
	err = sqlx_repository_has_base(m2->backend.repo, sqlx_name_mutable_to_const(&n));
	sqlx_name_clean (&n);

	if (NULL != err) {
		g_prefix_error(&err, "File error: ");
		return err;
	}

	struct sqlx_sqlite3_s *sq3 = NULL;
	err = m2b_open(m2, url, M2V2_OPEN_LOCAL, &sq3);
	if (NULL == err) {
		if (!sqlx_admin_has(sq3, META2_INIT_FLAG))
			err = NEWERROR(CODE_CONTAINER_NOTFOUND,
					"Container created but not initiated");
		m2b_close(sq3);
	}
	return err;
}
示例#2
0
static gint
do_query(struct gridd_client_s *client, struct meta1_service_url_s *surl,
		const gchar *Q)
{
	gint rc = 0;
	GError *err;
	GByteArray *req;
	struct sqlx_name_mutable_s name;

	GRID_DEBUG("Querying [%s]", Q);

	sqlx_name_fill (&name, url, NAME_SRVTYPE_SQLX, surl->seq);

	req = sqlx_pack_QUERY_single(sqlx_name_mutable_to_const(&name), Q, FALSE);
	err = gridd_client_request(client, req, NULL, _on_reply);
	g_byte_array_unref(req);

	if (NULL != err) {
		g_printerr("Local error: (%d) %s\n", err->code, err->message);
		g_clear_error(&err);
	}
	else if (NULL != (err = gridd_client_loop(client))) {
		g_printerr("Local error: (%d) %s\n", err->code, err->message);
		g_clear_error(&err);
	}
	else {
		if (NULL != (err = gridd_client_error(client))) {
			g_printerr("SQLX error: (%d) %s\n", err->code, err->message);
			g_clear_error(&err);
		}
		else {
			GRID_DEBUG("SQLX query succeeded");
			rc = 1;
		}
	}

	sqlx_name_clean (&name);
	return rc;
}
示例#3
0
static GError *
m2b_open(struct meta2_backend_s *m2, struct oio_url_s *url,
		enum m2v2_open_type_e how, struct sqlx_sqlite3_s **result)
{
	GError *err = NULL;
	struct sqlx_sqlite3_s *sq3 = NULL;

	EXTRA_ASSERT(url != NULL);
	EXTRA_ASSERT(result != NULL);
	EXTRA_ASSERT(m2 != NULL);
	EXTRA_ASSERT(m2->backend.repo != NULL);

	/* TODO */
	gboolean no_peers = FALSE;
	if (no_peers) {
		how &= ~M2V2_OPEN_REPLIMODE;
		how |= M2V2_OPEN_LOCAL|M2V2_OPEN_NOREFCHECK;
	}

	struct sqlx_name_mutable_s n;
	sqlx_name_fill (&n, url, NAME_SRVTYPE_META2, 1);
	err = sqlx_repository_open_and_lock(m2->backend.repo,
			sqlx_name_mutable_to_const(&n), m2_to_sqlx(how), &sq3, NULL);
	sqlx_name_clean (&n);

	if (NULL != err) {
		if (err->code == CODE_CONTAINER_NOTFOUND)
			err->domain = GQ();
		return err;
	}

	sq3->no_peers = how & (M2V2_OPEN_LOCAL|M2V2_OPEN_NOREFCHECK);

	// XXX If the container is being deleted, this is sad ...
	// This MIGHT happen if a cache is present (and this is the
	// common case for m2v2), because the deletion will happen
	// when the base exit the cache.
	// In facts this SHOULD NOT happend because a base being deleted
	// is closed with an instruction to exit the cache immediately.
	// TODO FIXME this is maybe a good place for an assert().
	if (sq3->deleted) {
		err = NEWERROR(CODE_CONTAINER_FROZEN, "destruction pending");
		m2b_close(sq3);
		return err;
	}

	// Complete URL with full VNS and container name
	void set(gchar *k, int f) {
		if (oio_url_has(url, f))
			return;
		gchar *s = sqlx_admin_get_str (sq3, k);
		if (s) {
			oio_url_set (url, f, s);
			g_free (s);
		}
	}
	set (SQLX_ADMIN_NAMESPACE, OIOURL_NS);
	set (SQLX_ADMIN_ACCOUNT, OIOURL_ACCOUNT);
	set (SQLX_ADMIN_USERNAME, OIOURL_USER);
	set (SQLX_ADMIN_USERTYPE, OIOURL_TYPE);

	*result = sq3;
	return NULL;
}