GError * meta0_backend_reset(struct meta0_backend_s *m0, gboolean flag_local) { EXTRA_ASSERT(m0 != NULL); GError *err = NULL; struct sqlx_sqlite3_s *sq3 = NULL; struct sqlx_repctx_s *repctx = NULL; err = _open_and_lock(m0, flag_local ? M0V2_OPENBASE_LOCAL : M0V2_OPENBASE_MASTERONLY, &sq3); if (err) return err; if (!(err = sqlx_transaction_begin (sq3, &repctx))) { gint rc; sqlite3_stmt *stmt = NULL; sqlite3_prepare_debug (rc, sq3->db, "DELETE FROM meta1", -1, &stmt, NULL); if (rc != SQLITE_OK && rc != SQLITE_DONE) err = SQLITE_GERROR(sq3->db, rc); else { sqlite3_step_debug_until_end (rc, stmt); if (rc != SQLITE_OK && rc != SQLITE_DONE) err = SQLITE_GERROR(sq3->db, rc); else sqlx_transaction_notify_huge_changes (repctx); sqlite3_finalize_debug (rc, stmt); } err = sqlx_transaction_end (repctx, err); } _unlock_and_close (sq3); return NULL; }
static GError * __save_service(struct sqlx_sqlite3_s *sq3, struct oio_url_s *url, struct meta1_service_url_s *m1url, gboolean force) { gint rc; GError *err = NULL; sqlite3_stmt *stmt = NULL; sqlite3_prepare_debug(rc, sq3->db, force ? "INSERT OR REPLACE INTO services (cid,srvtype,seq,url,args) VALUES (?,?,?,?,?)" : "INSERT INTO services (cid,srvtype,seq,url,args) VALUES (?,?,?,?,?)", -1, &stmt, NULL); if (rc != SQLITE_OK) return M1_SQLITE_GERROR(sq3->db, rc); (void) sqlite3_bind_blob(stmt, 1, oio_url_get_id(url), oio_url_get_id_size(url), NULL); (void) sqlite3_bind_text(stmt, 2, m1url->srvtype, -1, NULL); (void) sqlite3_bind_int(stmt, 3, m1url->seq); (void) sqlite3_bind_text(stmt, 4, m1url->host, -1, NULL); (void) sqlite3_bind_text(stmt, 5, m1url->args, -1, NULL); sqlite3_step_debug_until_end(rc, stmt); if (rc != SQLITE_DONE && rc != SQLITE_OK) err = M1_SQLITE_GERROR(sq3->db, rc); sqlite3_finalize_debug(rc, stmt); return err; }
static GError * __configure_service(struct sqlx_sqlite3_s *sq3, struct oio_url_s *url, struct meta1_service_url_s *m1url) { static const char *sql = "UPDATE services SET args = ? " "WHERE cid = ? AND seq = ? AND srvtype = ?"; gint rc; GError *err = NULL; sqlite3_stmt *stmt = NULL; sqlite3_prepare_debug(rc, sq3->db, sql, -1, &stmt, NULL); if (rc != SQLITE_OK) err = M1_SQLITE_GERROR(sq3->db, rc); else { (void) sqlite3_bind_text(stmt, 1, m1url->args, -1, NULL); (void) sqlite3_bind_blob(stmt, 2, oio_url_get_id(url), oio_url_get_id_size(url), NULL); (void) sqlite3_bind_int64(stmt, 3, m1url->seq); (void) sqlite3_bind_text(stmt, 4, m1url->srvtype, -1, NULL); sqlite3_step_debug_until_end (rc, stmt); if (rc != SQLITE_OK && rc != SQLITE_DONE) err = M1_SQLITE_GERROR(sq3->db, rc); sqlite3_finalize_debug(rc, stmt); if (!err && !sqlite3_changes(sq3->db)) err = NEWERROR(CODE_SRV_NOLINK, "Service not found"); } return err; }
static GError * __del_container_srvtype_properties(struct sqlx_sqlite3_s *sq3, struct oio_url_s *url, const char *srvtype) { GError *err = NULL; gint rc; sqlite3_stmt *stmt = NULL; sqlite3_prepare_debug(rc, sq3->db, "DELETE FROM properties WHERE cid = ? AND name LIKE ?", -1, &stmt, NULL); if (rc != SQLITE_OK && rc != SQLITE_DONE) err = M1_SQLITE_GERROR(sq3->db, rc); else { int len = strlen(srvtype)+10; gchar *tmp_name = g_malloc0(sizeof(gchar)*len); if (tmp_name) { g_snprintf(tmp_name, len, "%s.%%", srvtype); (void) sqlite3_bind_blob(stmt, 1, oio_url_get_id(url), oio_url_get_id_size(url), NULL); (void) sqlite3_bind_text(stmt, 2, tmp_name, -1, NULL); sqlite3_step_debug_until_end (rc, stmt); if (rc != SQLITE_OK && rc != SQLITE_DONE) err = M1_SQLITE_GERROR(sq3->db, rc); sqlite3_finalize_debug(rc, stmt); g_free (tmp_name); } } return err; }
static GError * __replace_property(struct sqlx_sqlite3_s *sq3, struct oio_url_s *url, const gchar *name, const gchar *value) { GError *err = NULL; gint rc; sqlite3_stmt *stmt = NULL; EXTRA_ASSERT(name != NULL && *name != '\0'); EXTRA_ASSERT(value != NULL && *value != '\0'); GRID_TRACE("%s(n=%s,v=%s)", __FUNCTION__, name, value); sqlite3_prepare_debug(rc, sq3->db, "REPLACE INTO properties (name,value,cid) VALUES (?,?,?)", -1, &stmt, NULL); if (rc != SQLITE_OK && rc != SQLITE_DONE) err = M1_SQLITE_GERROR(sq3->db, rc); else { (void) sqlite3_bind_text(stmt, 1, name, -1, NULL); (void) sqlite3_bind_text(stmt, 2, value, -1, NULL); (void) sqlite3_bind_blob(stmt, 3, oio_url_get_id(url), oio_url_get_id_size(url), NULL); sqlite3_step_debug_until_end (rc, stmt); if (rc != SQLITE_DONE && rc != SQLITE_OK) err = M1_SQLITE_GERROR(sq3->db, rc); sqlite3_finalize_debug(rc, stmt); } return err; }
static GError * __del_container_properties(struct sqlx_sqlite3_s *sq3, struct oio_url_s *url, gchar **names) { GError *err = NULL; gchar **p_name; if (!names || !*names) __exec_cid(sq3->db, "DELETE FROM properties WHERE cid = ?", oio_url_get_id(url)); else { for (p_name=names; !err && p_name && *p_name ;p_name++) { sqlite3_stmt *stmt = NULL; gint rc; sqlite3_prepare_debug(rc, sq3->db, "DELETE FROM properties WHERE cid = ? AND name = ?", -1, &stmt, NULL); if (rc != SQLITE_OK && rc != SQLITE_DONE) err = M1_SQLITE_GERROR(sq3->db, rc); else { (void) sqlite3_bind_blob(stmt, 1, oio_url_get_id(url), oio_url_get_id_size(url), NULL); (void) sqlite3_bind_text(stmt, 2, *p_name, strlen(*p_name), NULL); sqlite3_step_debug_until_end (rc, stmt); if (rc != SQLITE_DONE) GRID_WARN("SQLite error rc=%d", rc); sqlite3_finalize_debug(rc, stmt); } } } return err; }
static GError * __delete_service(struct sqlx_sqlite3_s *sq3, struct oio_url_s *url, const char *srvtype) { gint rc; GError *err = NULL; sqlite3_stmt *stmt = NULL; sqlite3_prepare_debug(rc, sq3->db, "DELETE FROM services WHERE cid = ? AND srvtype = ?", -1, &stmt, NULL); if (rc != SQLITE_OK) return M1_SQLITE_GERROR(sq3->db, rc); (void) sqlite3_bind_blob(stmt, 1, oio_url_get_id(url), oio_url_get_id_size(url), NULL); (void) sqlite3_bind_text(stmt, 2, srvtype, -1, NULL); sqlite3_step_debug_until_end (rc, stmt); if (rc != SQLITE_DONE && rc != SQLITE_OK) err = M1_SQLITE_GERROR(sq3->db, rc); sqlite3_finalize_debug(rc, stmt); return err; }
static GError * __del_container_one_service(struct sqlx_sqlite3_s *sq3, struct oio_url_s *url, const char *srvtype, gint64 seq) { static const char *sql = "DELETE FROM services WHERE cid = ? AND srvtype = ? AND seq = ?"; sqlite3_stmt *stmt = NULL; GError *err = NULL; int rc; sqlite3_prepare_debug(rc, sq3->db, sql, -1, &stmt, NULL); if (rc != SQLITE_OK) err = M1_SQLITE_GERROR(sq3->db, rc); else { (void) sqlite3_bind_blob(stmt, 1, oio_url_get_id(url), oio_url_get_id_size(url), NULL); (void) sqlite3_bind_text(stmt, 2, srvtype, -1, NULL); (void) sqlite3_bind_int64(stmt, 3, seq); sqlite3_step_debug_until_end (rc, stmt); if (rc != SQLITE_OK && rc != SQLITE_DONE) err = M1_SQLITE_GERROR(sq3->db, rc); sqlite3_finalize_debug(rc, stmt); } return err; }