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;
}
static GError *
__get_container_properties(struct sqlx_sqlite3_s *sq3, struct oio_url_s *url, gchar **names, gchar ***result)
{
	GError *err = NULL;
	GPtrArray *gpa = g_ptr_array_new();

	if (!names || !*names)
		err = __get_all_container_properties(sq3, url, gpa);
	else {
		for (gchar **p=names; !err && *p ;p++)
			err = __get_one_property(sq3, url, *p, gpa);
	}

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

	g_ptr_array_add(gpa, NULL);
	*result = (gchar**) g_ptr_array_free(gpa, FALSE);
	return NULL;
}