Ejemplo n.º 1
0
static GError*
_update_container_quota(struct meta1_backend_s *m1,
		struct container_info_s *cinfo)
{
	GError *e0 = NULL;
	gint rc;
	sqlite3_stmt *stmt = NULL;
	struct sqlx_sqlite3_s *sq3 = NULL;
	struct sqlx_repctx_s *repctx = NULL;

	e0 = meta1_backend_open_base(m1, cinfo->id, M1V2_OPENBASE_MASTERONLY, &sq3);
	if (NULL != e0)
		return e0;

	e0 = sqlx_transaction_begin(sq3, &repctx);
	if (NULL != e0) {
		sqlx_repository_unlock_and_close_noerror(sq3);
		return e0;
	}

	sqlite3_prepare_debug(rc, sq3->db, "UPDATE properties SET"
			" value = ?"
			" WHERE cid = ?"
			" AND name = 'meta2.quota'", -1, &stmt, NULL);
	(void) sqlite3_bind_int64(stmt, 1, cinfo->size);
	(void) sqlite3_bind_blob(stmt, 2, cinfo->id,
			sizeof(container_id_t), NULL);

	for (rc=SQLITE_ROW; rc == SQLITE_ROW ;)
		rc = sqlite3_step(stmt);
	if (rc != SQLITE_OK && rc != SQLITE_DONE)
		e0 = SQLITE_GERROR(sq3->db, rc);
	sqlite3_finalize_debug(rc, stmt);

	if (!e0 && sqlite3_changes(sq3->db) <= 0) {
		sqlite3_prepare_debug(rc, sq3->db,
				"INSERT INTO properties (cid,name,value)"
				" VALUES (?,?,?)", -1, &stmt, NULL);
		(void) sqlite3_bind_blob(stmt, 1, cinfo->id, sizeof(container_id_t), NULL);
		(void) sqlite3_bind_text(stmt, 2, "meta2.quota", sizeof("meta2.quota")-1, NULL);
		(void) sqlite3_bind_int64(stmt, 3, cinfo->size);

		for (rc=SQLITE_ROW; rc == SQLITE_ROW ;)
			rc = sqlite3_step(stmt);
		if (rc != SQLITE_OK && rc != SQLITE_DONE)
			e0 = SQLITE_GERROR(sq3->db, rc);
		sqlite3_finalize_debug(rc, stmt);
	}

	/* Commit then close the container's base */
	e0 = sqlx_transaction_end(repctx, e0);
	sqlx_repository_unlock_and_close_noerror(sq3);
	return e0;
}
Ejemplo n.º 2
0
static GError *
__get_container_all_services(struct sqlx_sqlite3_s *sq3, struct oio_url_s *url,
                             const char *srvtype, struct meta1_service_url_s ***result)
{
    GError *err = NULL;
    sqlite3_stmt *stmt = NULL;
    GPtrArray *gpa;
    int rc;

    /* Prepare the statement */
    if (srvtype && *srvtype) {
        sqlite3_prepare_debug(rc, sq3->db,
                              "SELECT seq,srvtype,url,args 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);
    }
    else {
        sqlite3_prepare_debug(rc, sq3->db,
                              "SELECT seq,srvtype,url,args FROM services WHERE cid = ?", -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);
    }

    /* Run the result */
    gpa = g_ptr_array_new();
    while (SQLITE_ROW == (rc = sqlite3_step(stmt))) {
        struct meta1_service_url_s *u;

        u = g_malloc0(sizeof(struct meta1_service_url_s) + 1 + sqlite3_column_bytes(stmt, 3));
        u->seq = sqlite3_column_int(stmt, 0);
        g_strlcpy(u->srvtype, (gchar*)sqlite3_column_text(stmt, 1), sizeof(u->srvtype));
        g_strlcpy(u->host, (gchar*)sqlite3_column_text(stmt, 2), sizeof(u->host)-1);
        memcpy(u->args, (gchar*)sqlite3_column_text(stmt, 3), sqlite3_column_bytes(stmt, 3));
        g_ptr_array_add(gpa, u);
    }

    if (rc != SQLITE_DONE && rc != SQLITE_OK)
        err = M1_SQLITE_GERROR(sq3->db, rc);
    sqlite3_finalize_debug(rc, stmt);

    if (err) {
        gpa_str_free(gpa);
        return err;
    }

    g_ptr_array_add(gpa, NULL);
    *result = (struct meta1_service_url_s**) g_ptr_array_free(gpa, FALSE);
    return NULL;
}
Ejemplo n.º 3
0
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;
}
Ejemplo n.º 4
0
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;
}
Ejemplo n.º 5
0
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;
}
Ejemplo n.º 6
0
static GError*
__count_FK (struct sqlx_sqlite3_s *sq3, struct hc_url_s *url,
            const char *table, guint *count)
{
    gint rc;
    sqlite3_stmt *stmt = NULL;

    gchar sql[sizeof(FMT_COUNT)+32];
    g_snprintf (sql, sizeof(sql), FMT_COUNT, table);

    sqlite3_prepare_debug(rc, sq3->db, sql, -1, &stmt, NULL);
    if (rc != SQLITE_OK)
        return M1_SQLITE_GERROR(sq3->db, rc);

    (void) sqlite3_bind_blob(stmt, 1, hc_url_get_id (url), hc_url_get_id_size (url), NULL);

    guint _count = 0;
    while (SQLITE_ROW == (rc = sqlite3_step(stmt)))
        _count += sqlite3_column_int(stmt, 0);

    GError *err = NULL;
    if (rc != SQLITE_OK && rc != SQLITE_DONE)
        err = M1_SQLITE_GERROR(sq3->db, rc);
    sqlite3_finalize_debug(rc, stmt);

    if (err)
        return err;
    *count = _count;
    return NULL;
}
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 *
__get_one_property(struct sqlx_sqlite3_s *sq3, struct oio_url_s *url, const gchar *name, GPtrArray *gpa)
{
	GError *err = NULL;
	sqlite3_stmt *stmt = NULL;
	int rc;

	GRID_TRACE("%s(n=%s)", __FUNCTION__, name);

	sqlite3_prepare_debug(rc, sq3->db,
			"SELECT name,value 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, name, -1, NULL);
		while (SQLITE_ROW == (rc = sqlite3_step(stmt))) {
			g_ptr_array_add(gpa, item(stmt, 0));
			g_ptr_array_add(gpa, item(stmt, 1));
		}
		if (rc != SQLITE_OK && rc != SQLITE_DONE)
			err = M1_SQLITE_GERROR(sq3->db, rc);
		sqlite3_finalize_debug(rc, stmt);
	}

	return err;
}
Ejemplo n.º 10
0
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;
}
Ejemplo n.º 11
0
static GError*
_load_from_base(struct sqlx_sqlite3_s *sq3, GPtrArray **result)
{
	GError *err = NULL;
	GPtrArray *array;
	sqlite3_stmt *stmt;
	int rc;
	guint count = 0;

	sqlite3_prepare_debug(rc, sq3->db, "SELECT prefix,addr,ROWID FROM meta1",
			-1, &stmt, NULL);
	if (rc != SQLITE_OK && rc != SQLITE_DONE)
		return SQLITE_GERROR(sq3->db, rc);

	array = meta0_utils_array_create();

	for (;;) {
		rc = sqlite3_step(stmt);
		if (rc == SQLITE_ROW) {
			gint64 rowid;
			const guint8 *prefix, *url;
			gsize prefix_len;

			prefix_len = sqlite3_column_bytes(stmt, 0);
			prefix = sqlite3_column_blob(stmt, 0);
			url = sqlite3_column_text(stmt, 1);
			rowid = sqlite3_column_int64(stmt, 2);

			if (prefix_len != 2)
				GRID_WARN("Invalid prefix for URL [%s] ROWID %"G_GINT64_FORMAT,
						url, rowid);
			else {
				meta0_utils_check_url_from_base((gchar**)&url);
				meta0_utils_array_add(array, prefix, (gchar*)url);
				count ++;
			}
		}
		else if (rc == SQLITE_DONE || rc == SQLITE_OK)
			break;
		else if (rc == SQLITE_BUSY)
			sleep(1);
		else {
			err = SQLITE_GERROR(sq3->db, rc);
			break;
		}
	}

	sqlite3_finalize_debug(rc, stmt);

	if (!err) {
		*result = array;
		GRID_INFO("Reloaded %u prefixes in %p (%u)",
				count, array, array->len);
	}

	return err;
}
Ejemplo n.º 12
0
static GError*
_load_meta1ref_from_base(struct sqlx_sqlite3_s *sq3, GPtrArray **result)
{
        GError *err = NULL;
        GPtrArray *array;
        sqlite3_stmt *stmt;
        int rc;
        guint count = 0;

	array = g_ptr_array_new();

        sqlite3_prepare_debug(rc, sq3->db, "SELECT addr,state,prefixes FROM meta1_ref",
			 -1, &stmt, NULL);
        if (rc != SQLITE_OK && rc != SQLITE_DONE) {
		if ( rc == SQLITE_ERROR ) {
			GRID_DEBUG("Missing table meta1ref in DB");
			*result = array;
			return NULL;
		}
                return SQLITE_GERROR(sq3->db, rc);
	}

	for (;;) {
                rc = sqlite3_step(stmt);
                if (rc == SQLITE_ROW) {
			const unsigned char *url,*prefix_nb,*ref;
			url = sqlite3_column_text(stmt,0);
			ref = sqlite3_column_text(stmt,1);
			prefix_nb = sqlite3_column_text(stmt,2);

			GRID_INFO("url %s, ref %s,prefix_nb %s ",url,ref,prefix_nb);
			g_ptr_array_add(array,meta0_utils_pack_meta1ref((gchar *)url,(gchar *)ref,(gchar *)prefix_nb));
			count++;
		}
		else if (rc == SQLITE_DONE || rc == SQLITE_OK)
                        break;
                else if (rc == SQLITE_BUSY)
                        sleep(1);
                else {
                        err = SQLITE_GERROR(sq3->db, rc);
                        break;
                }

	}
	sqlite3_finalize_debug(rc, stmt);

        if (!err) {
                *result = array;
                GRID_INFO("Reloaded %u meta1 in %p (%u)",
                                count, array, array->len);
        }

        return err;
}
Ejemplo n.º 13
0
static GError *
_record_meta1ref(sqlite3 *db, const GPtrArray *new_assign_meta1ref)
{
	GError *err = NULL;
	gint rc;
	guint idx;
	sqlite3_stmt *stmt = NULL;

	sqlite3_prepare_debug(rc, db, "REPLACE INTO meta1_ref"
			" (addr,state,prefixes) VALUES (?,?,?)", -1, &stmt, NULL);
	if (rc != SQLITE_OK && rc != SQLITE_DONE) {
		if ( rc == SQLITE_ERROR ) {
			GRID_DEBUG("Missing table meta1ref in DB");
			return NULL;
		}
		return SQLITE_GERROR(db, rc);
	}

	for (idx=0; idx < new_assign_meta1ref->len; idx++) {
		gchar *m1ref = new_assign_meta1ref->pdata[idx];
		gchar *addr, *ref, *nb;
		if ( ! meta0_utils_unpack_meta1ref(m1ref,&addr,&ref,&nb) )
			continue;
		sqlite3_reset(stmt);
		sqlite3_clear_bindings(stmt);
		sqlite3_bind_text(stmt, 1, addr, -1, NULL);
		sqlite3_bind_text(stmt, 2, ref, -1, NULL);
		sqlite3_bind_text(stmt, 3, nb, -1, NULL);

		while (!err) {
			rc = sqlite3_step(stmt);
			if (rc == SQLITE_OK || rc == SQLITE_DONE)
				break;
			if (rc == SQLITE_BUSY)
				sleep(1);
			else
				err = SQLITE_GERROR(db, rc);
		}

		if (addr)
			g_free(addr);
		if (ref)
			g_free(ref);
		if (nb)
			g_free(nb);
	}
	sqlite3_finalize_debug(rc, stmt);
	return err;
}
Ejemplo n.º 14
0
static GError *
_db_prepare_statement(sqlite3 *db, const gchar *sql, sqlite3_stmt **result)
{
	gint rc;
	sqlite3_stmt *stmt = NULL;

	sqlite3_prepare_debug(rc, db, sql, -1, &stmt, NULL);

	if (rc != SQLITE_OK && rc != SQLITE_ROW)
		return M2_SQLITE_GERROR(db,rc);
	EXTRA_ASSERT(stmt != NULL);

	*result = stmt;
	return NULL;
}
Ejemplo n.º 15
0
static GError *
__get_all_services(struct sqlx_sqlite3_s *sq3,
                   struct meta1_service_url_s ***result)
{
    GError *err = NULL;
    sqlite3_stmt *stmt = NULL;
    GPtrArray *gpa;
    int rc;

    // Prepare the statement
    sqlite3_prepare_debug(rc, sq3->db,
                          "SELECT DISTINCT srvtype,url FROM services order by srvtype,url", -1, &stmt, NULL);
    if (rc != SQLITE_OK)
        return M1_SQLITE_GERROR(sq3->db, rc);

    // Run the result
    gpa = g_ptr_array_new();
    while (SQLITE_ROW == (rc = sqlite3_step(stmt))) {
        struct meta1_service_url_s *u;

        u = g_malloc0(sizeof(struct meta1_service_url_s) + 1 + sqlite3_column_bytes(stmt, 3));
        u->seq = 0;
        g_strlcpy(u->srvtype, (gchar*)sqlite3_column_text(stmt, 0), sizeof(u->srvtype));
        g_strlcpy(u->host,    (gchar*)sqlite3_column_text(stmt, 1), sizeof(u->host)-1);
        u->args[0] = '\0';
        g_ptr_array_add(gpa, u);
    }

    if (rc != SQLITE_DONE && rc != SQLITE_OK)
        err = M1_SQLITE_GERROR(sq3->db, rc);

    sqlite3_finalize_debug(rc, stmt);

    if (err) {
        gpa_str_free(gpa);
        return err;
    }

    g_ptr_array_add(gpa, NULL);
    *result = (struct meta1_service_url_s**) g_ptr_array_free(gpa, FALSE);
    return NULL;
}
Ejemplo n.º 16
0
static GError *
_delete_meta1_ref(sqlite3 *db, gchar *meta1_ref)
{
	GError *err = NULL;
	gint rc;
	sqlite3_stmt *stmt = NULL;

	sqlite3_prepare_debug(rc, db, "DELETE FROM meta1_ref where addr=?",
			-1, &stmt, NULL);
	if (rc != SQLITE_OK && rc != SQLITE_DONE)
		return SQLITE_GERROR(db, rc);

	(void) sqlite3_bind_text(stmt,1,meta1_ref, strlen(meta1_ref), NULL);
	do { rc = sqlite3_step(stmt); } while (rc == SQLITE_ROW );
	if (rc != SQLITE_OK && rc != SQLITE_DONE)
		err = SQLITE_GERROR(db, rc);

	sqlite3_finalize_debug(rc, stmt);
	return err;
}
Ejemplo n.º 17
0
static void
load_table_row(sqlite3 *db, const hashstr_t *name, gint64 rowid, Row_t *row,
		Table_t *table)
{
	int rc;
	sqlite3_stmt *stmt = NULL;
	gchar *sql;

	GRID_TRACE2("%s(%p,%s,%"G_GINT64_FORMAT",%p,%p)", __FUNCTION__,
			db, hashstr_str(name), rowid, row, table);

	sql = g_strdup_printf("SELECT * FROM %s WHERE ROWID = ?", hashstr_str(name));
	sqlite3_prepare_debug(rc, db, sql, -1, &stmt, NULL);
	g_free(sql);

	sqlite3_bind_int64(stmt, 1, rowid);
	while (SQLITE_ROW == (rc = sqlite3_step(stmt)))
		load_statement(stmt, row, table);

	sqlite3_finalize_debug(rc, stmt);
}
void
__exec_cid(sqlite3 *handle, const gchar *sql, const container_id_t cid)
{
	int rc;
	const char *next;
	sqlite3_stmt *stmt = NULL;

	while (sql && *sql) {

		sqlite3_prepare_debug(rc, handle, sql, -1, &stmt, &next);
		if (rc != SQLITE_OK)
			continue;
		sql = next;

		(void) sqlite3_bind_blob(stmt, 1, cid, sizeof(container_id_t), NULL);

		do { rc = sqlite3_step(stmt); } while (rc == SQLITE_ROW);

		sqlite3_finalize_debug(rc, stmt);
	}
}
Ejemplo n.º 19
0
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;
}
Ejemplo n.º 20
0
static GError*
__fill(sqlite3 *db, gchar **urls, guint max, guint shift)
{
	gint rc;
	guint idx;
	sqlite3_stmt *stmt = NULL;
	GError *err = NULL;

	sqlite3_prepare_debug(rc, db, "INSERT INTO meta1"
			" (prefix,addr) VALUES (?,?)", -1, &stmt, NULL);
	if (rc != SQLITE_OK && rc != SQLITE_DONE)
		return SQLITE_GERROR(db, rc);

	/* One partition for each url */
	for (idx=0; idx<65536 ;idx++) {

		gchar **purl = urls + ((idx+shift) % max);
		guint16 index16 = idx;

		sqlite3_reset(stmt);
		sqlite3_clear_bindings(stmt);
		sqlite3_bind_blob(stmt, 1, &index16, 2, NULL);
		sqlite3_bind_text(stmt, 2, *purl, -1, NULL);
		while (!err) {
			rc = sqlite3_step(stmt);
			if (rc == SQLITE_OK || rc == SQLITE_DONE)
				break;
			if (rc == SQLITE_BUSY)
				sleep(1);
			else
				err = SQLITE_GERROR(db, rc);
		}
	}
	sqlite3_finalize_debug(rc, stmt);

	return err;
}
static GError *
__get_all_container_properties(struct sqlx_sqlite3_s *sq3, struct oio_url_s *url, GPtrArray *gpa)
{
	GError *err = NULL;
	sqlite3_stmt *stmt = NULL;
	int rc;

	/* prepare the statement */
	sqlite3_prepare_debug(rc, sq3->db, "SELECT name,value FROM properties WHERE cid = ?", -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);
		while (SQLITE_ROW == (rc = sqlite3_step(stmt))) {
			g_ptr_array_add(gpa, item(stmt, 0));
			g_ptr_array_add(gpa, item(stmt, 1));
		}
		if (rc != SQLITE_DONE && rc != SQLITE_OK)
			err = M1_SQLITE_GERROR(sq3->db, rc);
		sqlite3_finalize_debug(rc, stmt);
	}

	return err;
}
Ejemplo n.º 22
0
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;
}
GError*
_open_and_lock(struct meta1_backend_s *m1, struct oio_url_s *url,
		enum m1v2_open_type_e how, struct sqlx_sqlite3_s **handle)
{
	EXTRA_ASSERT(m1 != NULL);
	EXTRA_ASSERT(url != NULL);
	EXTRA_ASSERT(handle != NULL);

	GRID_TRACE2("%s(%p,%p,%d,%p)", __FUNCTION__, (void*)m1,
			oio_url_get (url, OIOURL_HEXID), how, (void*)handle);

	if (!oio_url_has (url, OIOURL_HEXID))
		return NEWERROR (CODE_BAD_REQUEST, "Partial URL (missing HEXID)");
	if (!m1b_check_ns_url (m1, url))
		return NEWERROR(CODE_NAMESPACE_NOTMANAGED, "Invalid NS");

	gchar base[5];
	const guint8 *cid = oio_url_get_id(url);
	g_snprintf(base, sizeof(base), "%02X%02X", cid[0], cid[1]);

	if (!meta1_prefixes_is_managed(m1->prefixes, cid))
		return NEWERROR(CODE_RANGE_NOTFOUND, "prefix [%s] not managed", base);

	/* Now open/lock the base in a way suitable for our op */
	struct sqlx_name_s n = {.base=base, .type=NAME_SRVTYPE_META1, .ns=m1->ns_name};
	GError *err = sqlx_repository_open_and_lock(m1->repo, &n, m1_to_sqlx(how), handle, NULL);

	if (err != NULL) {
		if (!CODE_IS_REDIRECT(err->code))
			g_prefix_error(&err, "Open/Lock error: ");  
		return err;
	}

	EXTRA_ASSERT(*handle != NULL);
	GRID_TRACE("Opened and locked [%s][%s] -> [%s][%s]",
			base, NAME_SRVTYPE_META1,
			(*handle)->name.base, (*handle)->name.type);
	return NULL;
}

GError*
__create_user(struct sqlx_sqlite3_s *sq3, struct oio_url_s *url)
{
	if (!oio_url_has_fq_container (url))
		return NEWERROR(CODE_BAD_REQUEST, "Partial URL");

	static const gchar *sql = "INSERT INTO users ('cid','account','user') VALUES (?,?,?)";

	GError *err = NULL;
	sqlite3_stmt *stmt = NULL;
	int rc;

	EXTRA_ASSERT(sq3 != NULL);
	EXTRA_ASSERT(sq3->db != NULL);

	/* Prepare the statement */
	sqlite3_prepare_debug(rc, sq3->db, sql, -1, &stmt, NULL);
	if (rc != SQLITE_OK)
		err = M1_SQLITE_GERROR(sq3->db, rc);
	else {
		sqlite3_bind_blob(stmt, 1, oio_url_get_id(url), oio_url_get_id_size(url), NULL);
		sqlite3_bind_text(stmt, 2, oio_url_get(url, OIOURL_ACCOUNT), -1, NULL);
		sqlite3_bind_text(stmt, 3, oio_url_get(url, OIOURL_USER), -1, NULL);

		/* Run the results */
		do { rc = sqlite3_step(stmt); } while (rc == SQLITE_ROW);

		if (rc != SQLITE_OK && rc != SQLITE_DONE) {
			err = M1_SQLITE_GERROR(sq3->db, rc);
			if (rc == SQLITE_CONSTRAINT) {
				g_prefix_error(&err, "Already created? ");
				err->code = CODE_CONTAINER_EXISTS;
			}
		}

		sqlite3_finalize_debug(rc, stmt);
	}

	if (err)
		GRID_DEBUG("User creation failed : (%d) %s", err->code, err->message);

	return err;
}

GError*
__info_user(struct sqlx_sqlite3_s *sq3, struct oio_url_s *url, gboolean ac,
		struct oio_url_s ***result)
{
	GError *err = NULL;
	sqlite3_stmt *stmt = NULL;
	GPtrArray *gpa;
	int rc;
	gboolean found;

	EXTRA_ASSERT(sq3 != NULL);
	EXTRA_ASSERT(sq3->db != NULL);
	EXTRA_ASSERT(url != NULL);

retry:
	/* Prepare the statement */
	sqlite3_prepare_debug(rc, sq3->db, "SELECT account,user FROM users WHERE cid = ?", -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);

	/* Run the results */
	found = FALSE;
 	gpa = result ? g_ptr_array_new() : NULL;
	do { if (SQLITE_ROW == (rc = sqlite3_step(stmt))) {
		found = TRUE;
		if (!gpa) continue;
		struct oio_url_s *u = oio_url_empty ();
		oio_url_set (u, OIOURL_NS, oio_url_get (url, OIOURL_NS));
		oio_url_set (u, OIOURL_ACCOUNT, (char*)sqlite3_column_text(stmt, 0));
		oio_url_set (u, OIOURL_USER, (char*)sqlite3_column_text(stmt, 1));
		oio_url_set (u, OIOURL_HEXID, oio_url_get (url, OIOURL_HEXID));
		g_ptr_array_add(gpa, u);
	} } while (rc == SQLITE_ROW);

	if (rc != SQLITE_DONE && rc != SQLITE_OK) {
		err = M1_SQLITE_GERROR(sq3->db, rc);
		g_prefix_error(&err, "DB error: ");
	}

	sqlite3_finalize_debug(rc,stmt);
	stmt = NULL;

	if (err) {
		if (gpa) {
			g_ptr_array_set_free_func (gpa, (GDestroyNotify)oio_url_clean);
			g_ptr_array_free (gpa, TRUE);
		}
		return err;
	}

	if (!found) {
		if (gpa) g_ptr_array_free (gpa, TRUE);
		if (ac) {
			ac = FALSE; /* do not retry */
			err = __create_user (sq3, url);
			if (!err) goto retry;
		}
		return NEWERROR(CODE_USER_NOTFOUND, "no such container");
	}
	if (gpa)
		*result = (struct oio_url_s**) metautils_gpa_to_array(gpa, TRUE);
	return NULL;
}
Ejemplo n.º 24
0
static GError *
_assign_prefixes(sqlite3 *db, const GPtrArray *new_assign_prefixes,
		gboolean init)
{
	GError *err = NULL;
	gint rc;
	guint idx;
	sqlite3_stmt *stmt = NULL;

	if ( !init ) {
		sqlite3_prepare_debug(rc, db, "DELETE FROM meta1", -1, &stmt, NULL);
		if (rc != SQLITE_OK && rc != SQLITE_DONE)
			return SQLITE_GERROR(db, rc);
		while (!err) {
			rc = sqlite3_step(stmt);
			if (rc == SQLITE_OK || rc == SQLITE_DONE)
				break;
			if (rc == SQLITE_BUSY)
				sleep(1);
			else {
				return SQLITE_GERROR(db,rc);
			}
		}
		sqlite3_finalize_debug(rc, stmt);
	}

	sqlite3_prepare_debug(rc, db, "INSERT  INTO meta1"
			" (prefix,addr) VALUES (?,?)", -1, &stmt, NULL);

	if (rc != SQLITE_OK && rc != SQLITE_DONE) {
		return SQLITE_GERROR(db, rc);
	}

	for (idx=0; idx<65536 ;idx++) {

		gchar **url = new_assign_prefixes->pdata[idx];
		guint16 index16 = idx;

		if (!url || ! *url )
			continue;
		for (; *url ;url++) {
			sqlite3_reset(stmt);
			sqlite3_clear_bindings(stmt);
			sqlite3_bind_blob(stmt, 1, &index16, 2, NULL);
			sqlite3_bind_text(stmt, 2, *url, -1, NULL);
			while (!err) {
				rc = sqlite3_step(stmt);
				if (rc == SQLITE_OK || rc == SQLITE_DONE)
					break;
				if (rc == SQLITE_BUSY)
					sleep(1);
				else {
					err = SQLITE_GERROR(db, rc);
				}
			}
		}
	}
	sqlite3_finalize_debug(rc, stmt);

	return err;

}