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; }
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; }
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; }