Ejemplo n.º 1
0
/*
 * COMMAND: <gda_report_section>
 *
 * Creates copies of its contents, one copy per row in the new run context's
 * data model.
 *
 * uses node's contents: yes
 * requested attributes: none
 *
 * REM: either "query_name" or a <gda_report_query> sub node must be provided to create a data model.
 */
static gboolean
command_gda_report_iter_run (GdaReportEngine *engine, xmlNodePtr node, GSList **created_nodes,
			     RunContext *context, GError **error)
{
	if (!context || !context->iter)
		return TRUE;

	gda_data_model_iter_move_next (context->iter);
	while (gda_data_model_iter_is_valid (context->iter)) {
		xmlNodePtr dup, child;
		dup = xmlCopyNode (node, 1);
				
		if (!real_run_at_node (engine, dup->children, context, error)) {
			xmlFreeNode (dup);
			return FALSE;
		}
		else {
			for (child = dup->children; child; child = dup->children) {
				xmlUnlinkNode (child);
				*created_nodes = g_slist_prepend (*created_nodes, child);
			}
		}
		xmlFreeNode (dup);
		gda_data_model_iter_move_next (context->iter);
	}

	*created_nodes = g_slist_reverse (*created_nodes);

	return TRUE;
}
Ejemplo n.º 2
0
gboolean
wmud_db_load_exits(GSList **exits, GError **err)
{
    GdaStatement     *sth = NULL;
    GdaDataModel     *res = NULL;
    GdaDataModelIter *iter;

    g_log(G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "Loading exits");
    if (dbh == NULL) {
        if (err) {
            g_set_error(err,
                        WMUD_DB_ERROR, WMUD_DB_ERROR_NOINIT,
                        "Database backend not initialized");
        }

        return FALSE;
    }

    sth = gda_sql_parser_parse_string(
        parser,
        "SELECT room_id, direction, other_side FROM room_exits",
        NULL,
        NULL);
    res  = gda_connection_statement_execute_select(dbh, sth, NULL, NULL);
    iter = gda_data_model_create_iter(res);
    gda_data_model_iter_move_next(iter);

    while (gda_data_model_iter_is_valid(iter)) {
        const GValue *val;
        wmudExit     *room_exit;

        room_exit = g_new0(wmudExit, 1);

        val                       = gda_data_model_iter_get_value_at(iter, 0);
        room_exit->source_room_id = g_value_get_int(val);

        val                     = gda_data_model_iter_get_value_at(iter, 1);
        room_exit->direction_id = g_value_get_int(val);

        val                            = gda_data_model_iter_get_value_at(iter, 2);
        room_exit->destination_room_id = g_value_get_int(val);

        g_log(G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG,
              "Loaded exit %d =%d=> %d",
              room_exit->source_room_id,
              room_exit->direction_id,
              room_exit->destination_room_id);

        *exits = g_slist_prepend(*exits, room_exit);

        gda_data_model_iter_move_next(iter);
    }

    g_object_unref(iter);
    g_object_unref(sth);

    return TRUE;
}
Ejemplo n.º 3
0
gboolean
wmud_db_load_planet_planes(GSList **planet_planes, GError **err)
{
    GdaStatement     *sth = NULL;
    GdaDataModel     *res = NULL;
    GdaDataModelIter *iter;

    g_log(G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG,
          "Loading planet<->plane associations");
    if (dbh == NULL) {
        if (err) {
            g_set_error(err,
                        WMUD_DB_ERROR, WMUD_DB_ERROR_NOINIT,
                        "Database backend not initialized");
        }

        return FALSE;
    }

    sth = gda_sql_parser_parse_string(
        parser,
        "SELECT planet_id, plane_id FROM planet_planes",
        NULL,
        NULL);
    res  = gda_connection_statement_execute_select(dbh, sth, NULL, NULL);
    iter = gda_data_model_create_iter(res);
    gda_data_model_iter_move_next(iter);

    while (gda_data_model_iter_is_valid(iter)) {
        const GValue         *val;
        wmudPlanetPlaneAssoc *planet_plane;

        planet_plane = g_new0(wmudPlanetPlaneAssoc, 1);

        val                     = gda_data_model_iter_get_value_at(iter, 0);
        planet_plane->planet_id = g_value_get_int(val);

        val                    = gda_data_model_iter_get_value_at(iter, 1);
        planet_plane->plane_id = g_value_get_int(val);

        g_log(G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG,
              "Loaded planet-plane association %d <> %d",
              planet_plane->planet_id,
              planet_plane->plane_id);

        *planet_planes = g_slist_prepend(*planet_planes, planet_plane);

        gda_data_model_iter_move_next(iter);
    }

    g_object_unref(iter);
    g_object_unref(sth);

    return TRUE;
}
Ejemplo n.º 4
0
gboolean
wmud_db_load_areas(GSList **areas, GError **err)
{
    GdaStatement     *sth = NULL;
    GdaDataModel     *res = NULL;
    GdaDataModelIter *iter;

    g_log(G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "Loading areas");
    if (dbh == NULL) {
        if (err) {
            g_set_error(err,
                        WMUD_DB_ERROR, WMUD_DB_ERROR_NOINIT,
                        "Database backend not initialized");
        }

        return FALSE;
    }

    sth = gda_sql_parser_parse_string(
        parser,
        "SELECT id, name FROM areas",
        NULL,
        NULL);
    res  = gda_connection_statement_execute_select(dbh, sth, NULL, NULL);
    iter = gda_data_model_create_iter(res);
    gda_data_model_iter_move_next(iter);

    while (gda_data_model_iter_is_valid(iter)) {
        const GValue *val;
        wmudArea     *area;

        area = g_new0(wmudArea, 1);

        val      = gda_data_model_iter_get_value_at(iter, 0);
        area->id = g_value_get_int(val);

        val        = gda_data_model_iter_get_value_at(iter, 1);
        area->name = g_strdup(g_value_get_string(val));

        g_log(G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "Loaded area _%s_", area->name);

        *areas = g_slist_prepend(*areas, area);

        gda_data_model_iter_move_next(iter);
    }

    g_object_unref(iter);
    g_object_unref(sth);

    return TRUE;
}
Ejemplo n.º 5
0
/*
 * GdaDataModel interface implementation
 */
static gint
gda_data_access_wrapper_get_n_rows (GdaDataModel *model)
{
	GdaDataAccessWrapper *imodel;
	g_return_val_if_fail (GDA_IS_DATA_ACCESS_WRAPPER (model), 0);
	imodel = (GdaDataAccessWrapper*) model;
	g_return_val_if_fail (imodel->priv, 0);

	if (imodel->priv->nb_rows >= 0)
		return imodel->priv->nb_rows;

	if (imodel->priv->model_access_flags & GDA_DATA_MODEL_ACCESS_RANDOM)
		/* imodel->priv->mode is a random access model, use it */
		imodel->priv->nb_rows = gda_data_model_get_n_rows (imodel->priv->model);
	else {
		/* go at the end */
		while (!imodel->priv->end_of_data) {
			if (! gda_data_model_iter_move_next (imodel->priv->iter)) 
				break;
		}
		if (imodel->priv->end_of_data)
			imodel->priv->nb_rows = imodel->priv->last_row +1;
		else
			imodel->priv->nb_rows = -1;
	}

	return imodel->priv->nb_rows;
}
Ejemplo n.º 6
0
gboolean
symbol_db_engine_iterator_move_next (SymbolDBEngineIterator *dbi)
{
	SymbolDBEngineIteratorPriv *priv;
	
	g_return_val_if_fail (dbi != NULL, FALSE);
	priv = dbi->priv;

	return gda_data_model_iter_move_next (priv->data_iter);
}
Ejemplo n.º 7
0
static GSList *
gda_tree_mgr_select_update_children (GdaTreeManager *manager, GdaTreeNode *node,
				     G_GNUC_UNUSED const GSList *children_nodes, gboolean *out_error,
				     GError **error)
{
	GdaTreeMgrSelect *mgr = GDA_TREE_MGR_SELECT (manager);
	GdaDataModel *model;
	GSList *list = NULL;

	if (!mgr->priv->cnc) {
		g_set_error (error, GDA_TREE_MANAGER_ERROR, GDA_TREE_MANAGER_UNKNOWN_ERROR,
			     "%s", _("No connection specified"));
		if (out_error)
			*out_error = TRUE;
		return NULL;
	}

	if (!mgr->priv->stmt) {
		g_set_error (error, GDA_TREE_MANAGER_ERROR, GDA_TREE_MANAGER_UNKNOWN_ERROR,
			     "%s", _("No SELECT statement specified"));
		if (out_error)
			*out_error = TRUE;
		return NULL;
	}

	if (node && mgr->priv->non_bound_params) {
		/* looking for values in @node's attributes */
		GSList *nbplist;
		for (nbplist = mgr->priv->non_bound_params; nbplist; nbplist = nbplist->next) {
			const GValue *cvalue;
			GdaHolder *holder = (GdaHolder*) nbplist->data;
			cvalue = gda_tree_node_fetch_attribute (node, gda_holder_get_id (holder));
			if (cvalue) {
				if (!gda_holder_set_value (holder, cvalue, error)) {
					if (out_error)
						*out_error = TRUE;
					return NULL;
				}
			}
			else {
				g_set_error (error, GDA_TREE_MANAGER_ERROR, GDA_TREE_MANAGER_UNKNOWN_ERROR,
					     _("No value specified for parameter '%s'"), gda_holder_get_id (holder));
				if (out_error)
					*out_error = TRUE;
				return NULL;
			}
		}
	}

	model = gda_connection_statement_execute_select (mgr->priv->cnc, mgr->priv->stmt, mgr->priv->priv_params, error);
	if (!model) {
		if (out_error)
			*out_error = TRUE;
		return NULL;
	}

	GdaDataModelIter *iter;
	iter = gda_data_model_create_iter (model);
	for (; iter && gda_data_model_iter_move_next (iter);) {
		GdaTreeNode* snode = NULL;
		const GValue *cvalue;
		GSList *iholders;

		for (iholders = GDA_SET (iter)->holders; iholders; iholders = iholders->next) {
			GdaHolder *holder = (GdaHolder*) iholders->data;

			if (!gda_holder_is_valid (holder) || !(cvalue = gda_holder_get_value (holder))) {
				if (list) {
					g_slist_foreach (list, (GFunc) g_object_unref, NULL);
					g_slist_free (list);
				}

				if (out_error)
					*out_error = TRUE;
				g_set_error (error, GDA_TREE_MANAGER_ERROR, GDA_TREE_MANAGER_UNKNOWN_ERROR,
					     "%s", _("Unable to get iterator's value"));
				return NULL;
			}

			if (!snode) {
				gchar *str = gda_value_stringify (cvalue);
				snode = gda_tree_manager_create_node (manager, node, str);
				g_free (str);
				list = g_slist_prepend (list, snode);
			}
			
			gda_tree_node_set_node_attribute (snode, g_strdup (gda_holder_get_id (holder)), cvalue, g_free);
		}
	}
	if (iter)
		g_object_unref (iter);
	g_object_unref (model);

	return list;
}
Ejemplo n.º 8
0
static GSList *
gda_tree_mgr_columns_update_children (GdaTreeManager *manager, GdaTreeNode *node, G_GNUC_UNUSED const GSList *children_nodes,
				      gboolean *out_error, GError **error)
{
	GdaTreeMgrColumns *mgr = GDA_TREE_MGR_COLUMNS (manager);
	GdaMetaStore *store;
	GdaDataModel *model;
	GSList *list = NULL;
	GdaConnection *scnc;
	GdaTreeMgrColumnsPrivate *priv = gda_tree_mgr_columns_get_instance_private (mgr);

	if (!priv->cnc && !priv->mstore) {
		g_set_error (error, GDA_TREE_MANAGER_ERROR, GDA_TREE_MANAGER_UNKNOWN_ERROR,
			     "%s", _("No connection and no GdaMetaStore specified"));
		if (out_error)
			*out_error = TRUE;
		return NULL;
	}
	else if (priv->mstore)
		store = priv->mstore;
	else
		store = gda_connection_get_meta_store (priv->cnc);

	scnc = gda_meta_store_get_internal_connection (store);

	/* create statements if necessary */
	if (!priv->stmt) {
		GdaSqlParser *parser;
		GdaStatement *stmt;

		parser = gda_connection_create_parser (scnc);
		if (! parser)
			parser = gda_sql_parser_new ();

		stmt = gda_sql_parser_parse_string (parser,
						    "SELECT column_name FROM _columns WHERE "
						    "table_schema= ##schema::string AND "
						    "table_name= ##table_name::string "
						    "ORDER BY ordinal_position", NULL, error);
		g_object_unref (parser);
		if (!stmt) {
			if (out_error)
				*out_error = TRUE;
			return NULL;
		}

		if (!gda_statement_get_parameters (stmt, &(priv->params), error)) {
			if (out_error)
				*out_error = TRUE;
			g_object_unref (stmt);
			return NULL;
		}
		priv->stmt = stmt;
	}


	gboolean schema_specified = FALSE;
	gboolean table_specified = FALSE;
	if (priv->schema) {
		schema_specified = TRUE;
		g_assert (gda_set_set_holder_value (priv->params, NULL, "schema",
						    priv->schema));
	}
	if (priv->table_name) {
		table_specified = TRUE;
		g_assert (gda_set_set_holder_value (priv->params, NULL, "table_name",
						    priv->table_name));
	}
	if (!schema_specified && node) {
		/* looking for a schema in @node's attributes */
		const GValue *cvalue;
		cvalue = gda_tree_node_fetch_attribute (node, "schema");
		if (cvalue) {
			GdaHolder *h = gda_set_get_holder (priv->params, "schema");
			if (!gda_holder_set_value (h, cvalue, error)) {
				if (out_error)
					*out_error = TRUE;
				return NULL;
			}
			schema_specified = TRUE;
		}
	}
	if (!table_specified && node) {
		/* looking for a table in @node's attributes */
		const GValue *cvalue;
		cvalue = gda_tree_node_fetch_attribute (node, "table_name");
		if (cvalue) {
			GdaHolder *h = gda_set_get_holder (priv->params, "table_name");
			if (!gda_holder_set_value (h, cvalue, error)) {
				if (out_error)
					*out_error = TRUE;
				return NULL;
			}
			table_specified = TRUE;
		}
	}

	if (!schema_specified) {
		g_set_error (error, GDA_TREE_MANAGER_ERROR, GDA_TREE_MANAGER_UNKNOWN_ERROR,
			     "%s", _("No schema specified"));
		if (out_error)
			*out_error = TRUE;
		return NULL;
	}

	if (!table_specified) {
		g_set_error (error, GDA_TREE_MANAGER_ERROR, GDA_TREE_MANAGER_UNKNOWN_ERROR,
			     "%s", _("No table specified"));
		if (out_error)
			*out_error = TRUE;
		return NULL;
	}

	model = gda_connection_statement_execute_select (scnc, priv->stmt, priv->params, error);

	if (!model) {
		if (out_error)
			*out_error = TRUE;
		return NULL;
	}

	GdaDataModelIter *iter;
	iter = gda_data_model_create_iter (model);
	for (; iter && gda_data_model_iter_move_next (iter);) {
		GdaTreeNode* snode;
		const GValue *cvalue;

		cvalue = gda_data_model_iter_get_value_at (iter, 0);
		if (!cvalue) {
			if (list) {
				g_slist_free_full (list, (GDestroyNotify) g_object_unref);
			}
			if (out_error)
				*out_error = TRUE;
			g_set_error (error, GDA_TREE_MANAGER_ERROR, GDA_TREE_MANAGER_UNKNOWN_ERROR,
				     "%s", _("Unable to get column name"));
			return NULL;
		}

		snode = gda_tree_manager_create_node (manager, node, g_value_get_string (cvalue));
		gda_tree_node_set_node_attribute (snode, "column_name", cvalue, NULL);
		list = g_slist_prepend (list, snode);
	}
	if (iter)
		g_object_unref (iter);
	g_object_unref (model);

	return list;
}
Ejemplo n.º 9
0
static gboolean
test_iter (GdaConnection *cnc)
{
	gboolean retval = FALSE;
	GdaDataModel *model1, *model2;
	GdaDataModelIter *iter;

	model1 = ui_tests_common_get_products_2cols (cnc, TRUE);
	model2 = ui_tests_common_get_products (cnc, FALSE);
	iter = gda_data_model_create_iter (model1);

	const gchar *col_ids[] = {"ref", "category", NULL};
	const gchar *col_types[] = {"string", "int", NULL};
	const gchar *col_values[] = {"1", "14", NULL};

	g_assert (gda_data_model_iter_move_next (iter));
	dump_iter (iter);
	if (!compare_iter (iter, 0, col_ids, col_types, col_values)) {
		g_print ("Error, step1\n");
		goto out;
	}

	g_object_set (iter, "data-model", model2, NULL);
	dump_iter (iter);
	if (!compare_iter (iter, -1, NULL, NULL, NULL)) {
		g_print ("Error, step2\n");
		goto out;
	}

	const gchar *col_ids3[] = {"ref", "category", "name", "price", "wh_stored", NULL};
	const gchar *col_types3[] = {"string", "int", "string", "gdouble", "int", NULL};
	const gchar *col_values3[] = {"1", "14", "ACADEMY ACADEMY", "25.990000", "0", NULL};

	g_assert (gda_data_model_iter_move_next (iter));
	dump_iter (iter);
	if (!compare_iter (iter, 0, col_ids3, col_types3, col_values3)) {
		g_print ("Error, step3\n");
		goto out;
	}

	g_object_set (iter, "data-model", model1, NULL);
	dump_iter (iter);
	if (!compare_iter (iter, -1, NULL, NULL, NULL)) {
		g_print ("Error, step2\n");
		goto out;
	}
	g_assert (gda_data_model_iter_move_next (iter));
	dump_iter (iter);
	if (!compare_iter (iter, 0, col_ids, col_types, col_values)) {
		g_print ("Error, step3\n");
		goto out;
	}
	

	retval = TRUE;

 out:
	g_object_unref (model1);
	g_object_unref (model2);
	g_object_unref (iter);

	return retval;
}
Ejemplo n.º 10
0
static GSList *
gda_tree_mgr_schemas_update_children (GdaTreeManager *manager, GdaTreeNode *node,
				      G_GNUC_UNUSED const GSList *children_nodes, gboolean *out_error,
				      GError **error)
{
	GdaTreeMgrSchemas *mgr = GDA_TREE_MGR_SCHEMAS (manager);
	GdaMetaStore *store;
	GdaDataModel *model;
	GSList *list = NULL;
	GdaConnection *scnc;

	if (!mgr->priv->cnc && !mgr->priv->mstore) {
		g_set_error (error, GDA_TREE_MANAGER_ERROR, GDA_TREE_MANAGER_UNKNOWN_ERROR,
			     "%s", _("No connection and no GdaMetaStore specified"));
		if (out_error)
			*out_error = TRUE;
		return NULL;
	}
	else if (mgr->priv->mstore)
		store = mgr->priv->mstore;
	else
		store = gda_connection_get_meta_store (mgr->priv->cnc);

	scnc = gda_meta_store_get_internal_connection (store);

	if (!mgr->priv->stmt) {
		GdaSqlParser *parser;
		GdaStatement *stmt;

		parser = gda_connection_create_parser (scnc);
		if (! parser)
			parser = gda_sql_parser_new ();

		stmt = gda_sql_parser_parse_string (parser,
						    "SELECT schema_name FROM _schemata "
						    "WHERE schema_internal = FALSE OR schema_name LIKE 'info%' "
						    "ORDER BY schema_name DESC", NULL, error);
		g_object_unref (parser);
		if (!stmt) {
			if (out_error)
				*out_error = TRUE;
			return NULL;
		}
		mgr->priv->stmt = stmt;
	}

	model = gda_connection_statement_execute_select (scnc, mgr->priv->stmt, NULL, error);
	if (!model) {
		if (out_error)
			*out_error = TRUE;
		return NULL;
	}

	GdaDataModelIter *iter;
	iter = gda_data_model_create_iter (model);
	for (; iter && gda_data_model_iter_move_next (iter);) {
		GdaTreeNode* snode;
		const GValue *cvalue;

		cvalue = gda_data_model_iter_get_value_at (iter, 0);
		if (!cvalue) {
			if (list) {
				g_slist_foreach (list, (GFunc) g_object_unref, NULL);
				g_slist_free (list);
			}
			if (out_error)
				*out_error = TRUE;
			g_set_error (error, GDA_TREE_MANAGER_ERROR, GDA_TREE_MANAGER_UNKNOWN_ERROR,
				     "%s", _("Unable to get schema name"));
			return NULL;
		}

		snode = gda_tree_manager_create_node (manager, node, g_value_get_string (cvalue));
		gda_tree_node_set_node_attribute (snode, "schema", cvalue, NULL);
		list = g_slist_prepend (list, snode);
	}
	if (iter)
		g_object_unref (iter);
	g_object_unref (model);

	return list;
}
Ejemplo n.º 11
0
/**
 * wmud_db_load_players:
 * @err: a GError to put error messages in it
 *
 * Loads all player records from the database
 */
gboolean
wmud_db_load_players(GError **err)
{
    GdaStatement     *sth = NULL;
    GdaDataModel     *res;
    GdaDataModelIter *iter;
    GError           *local_err = NULL;

    g_log(G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "Loading players");
    if (dbh == NULL) {
        if (err) {
            g_set_error(err,
                        WMUD_DB_ERROR, WMUD_DB_ERROR_NOINIT,
                        "Database backend not initialized");
        }

        return FALSE;
    }

    sth = gda_sql_parser_parse_string(
        parser,
        "SELECT id, login, password, email FROM players",
        NULL,
        NULL);

    /* TODO: error checking! */
    if ((res = gda_connection_statement_execute_select(
             dbh,
             sth,
             NULL,
             &local_err)) == NULL) {
        g_log(G_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL,
              "Unable to load players: %s",
              local_err->message);
        g_set_error(err,
                    WMUD_DB_ERROR, WMUD_DB_ERROR_SELECT_ERROR,
                    "SELECT error: %s",
                    local_err->message);

        return FALSE;
    }

    iter = gda_data_model_create_iter(res);
    gda_data_model_iter_move_next(iter);

    while (gda_data_model_iter_is_valid(iter)) {
        const GValue *val;
        WmudPlayer   *player;

        player = wmud_player_new();

        val = gda_data_model_iter_get_value_at(iter, 0);
        wmud_player_set_id(player, g_value_get_int(val));

        val = gda_data_model_iter_get_value_at(iter, 1);
        wmud_player_set_player_name(player, g_value_get_string(val));

        val = gda_data_model_iter_get_value_at(iter, 2);
        wmud_player_set_cpassword(player, g_value_get_string(val));

        val = gda_data_model_iter_get_value_at(iter, 3);
        wmud_player_set_email(player, g_value_get_string(val));

        g_log(G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG,
              "Loaded player _%s_",
              wmud_player_get_player_name(player));

        players = g_slist_prepend(players, player);

        gda_data_model_iter_move_next(iter);
    }

    g_object_unref(iter);
    g_object_unref(sth);
    g_log(G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "Finished loading players");

    return TRUE;
}
Ejemplo n.º 12
0
gboolean
wmud_db_load_menu(GSList **menu_items, GError **err)
{
    GdaStatement     *sth = NULL;
    GdaDataModel     *res = NULL;
    GdaDataModelIter *iter;

    g_log(G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "Loading menu items");
    if (dbh == NULL) {
        if (err) {
            g_set_error(err,
                        WMUD_DB_ERROR, WMUD_DB_ERROR_NOINIT,
                        "Database backend not initialized");
        }

        return FALSE;
    }

    sth = gda_sql_parser_parse_string(
        parser,
        "SELECT id, menuchar, need_active_char, placement, display_text, fnctn FROM menu ORDER BY placement",
        NULL,
        NULL);
    res  = gda_connection_statement_execute_select(dbh, sth, NULL, NULL);
    iter = gda_data_model_create_iter(res);
    gda_data_model_iter_move_next(iter);

    while (gda_data_model_iter_is_valid(iter)) {
        const GValue *val;
        wmudMenu     *menu_item;

        menu_item = g_new0(wmudMenu, 1);

        val           = gda_data_model_iter_get_value_at(iter, 0);
        menu_item->id = g_value_get_int(val);

        val                 = gda_data_model_iter_get_value_at(iter, 1);
        menu_item->menuchar = *(g_value_get_string(val));

        val                         = gda_data_model_iter_get_value_at(iter, 2);
        menu_item->need_active_char = g_value_get_boolean(val);

        val                  = gda_data_model_iter_get_value_at(iter, 3);
        menu_item->placement = g_value_get_int(val);

        val             = gda_data_model_iter_get_value_at(iter, 4);
        menu_item->text = g_strdup(g_value_get_string(val));

        val             = gda_data_model_iter_get_value_at(iter, 5);
        menu_item->func = g_strdup(g_value_get_string(val));

        g_log(G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG,
              "Loaded menu item %d: %s(%c)",
              menu_item->id, menu_item->text,
              menu_item->menuchar);

        *menu_items = g_slist_prepend(*menu_items, menu_item);

        gda_data_model_iter_move_next(iter);
    }

    g_object_unref(iter);
    g_object_unref(sth);

    return TRUE;
}
Ejemplo n.º 13
0
gboolean
wmud_db_load_rooms(GSList **rooms, GError **err)
{
    GdaStatement     *sth = NULL;
    GdaDataModel     *res = NULL;
    GdaDataModelIter *iter;

    g_log(G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "Loading rooms");
    if (dbh == NULL) {
        if (err) {
            g_set_error(err,
                        WMUD_DB_ERROR, WMUD_DB_ERROR_NOINIT,
                        "Database backend not initialized");
        }

        return FALSE;
    }

    sth = gda_sql_parser_parse_string(
        parser,
        "SELECT id, area, name, distant_description, close_description FROM rooms",
        NULL,
        NULL);
    res  = gda_connection_statement_execute_select(dbh, sth, NULL, NULL);
    iter = gda_data_model_create_iter(res);
    gda_data_model_iter_move_next(iter);

    while (gda_data_model_iter_is_valid(iter)) {
        const GValue *val;
        wmudRoom     *room;

        room = g_new0(wmudRoom, 1);

        val      = gda_data_model_iter_get_value_at(iter, 0);
        room->id = g_value_get_int(val);

        val           = gda_data_model_iter_get_value_at(iter, 1);
        room->area_id = g_value_get_int(val);

        val        = gda_data_model_iter_get_value_at(iter, 2);
        room->name = g_strdup(g_value_get_string(val));

        val                       = gda_data_model_iter_get_value_at(iter, 3);
        room->distant_description = g_strdup(g_value_get_string(val));

        val                     = gda_data_model_iter_get_value_at(iter, 4);
        room->close_description = g_strdup(g_value_get_string(val));

        g_log(G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG,
              "Loaded room %d/_%s_",
              room->area_id,
              room->name);

        *rooms = g_slist_prepend(*rooms, room);

        gda_data_model_iter_move_next(iter);
    }

    g_object_unref(iter);
    g_object_unref(sth);

    return TRUE;
}
Ejemplo n.º 14
0
gboolean
wmud_db_load_directions(GSList **directions, GError **err)
{
    GdaStatement     *sth = NULL;
    GdaDataModel     *res = NULL;
    GdaDataModelIter *iter;
    GError           *local_err = NULL;

    g_log(G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "Loading directions");

    if (dbh == NULL) {
        if (err) {
            g_set_error(err,
                        WMUD_DB_ERROR, WMUD_DB_ERROR_NOINIT,
                        "Database backend not initialized");
        }

        return FALSE;
    }

    sth = gda_sql_parser_parse_string(
        parser,
        "SELECT id, short_name, name FROM directions",
        NULL,
        NULL);

    if ((res = gda_connection_statement_execute_select(
             dbh, sth,
             NULL, &local_err)) == NULL) {
        g_set_error(err,
                    WMUD_DB_ERROR, WMUD_DB_ERROR_SELECT_ERROR,
                    "Unable to load directions: %s",
                    local_err->message);

        return FALSE;
    }

    iter = gda_data_model_create_iter(res);
    gda_data_model_iter_move_next(iter);

    while (gda_data_model_iter_is_valid(iter)) {
        const GValue  *val;
        wmudDirection *dir;

        dir = g_new0(wmudDirection, 1);

        val     = gda_data_model_iter_get_value_at(iter, 0);
        dir->id = g_value_get_int(val);

        val             = gda_data_model_iter_get_value_at(iter, 1);
        dir->short_name = g_strdup(g_value_get_string(val));

        val       = gda_data_model_iter_get_value_at(iter, 2);
        dir->name = g_strdup(g_value_get_string(val));

        g_log(G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG,
              "Loaded direction _%s_",
              dir->name);

        *directions = g_slist_prepend(*directions, dir);

        gda_data_model_iter_move_next(iter);
    }

    g_object_unref(iter);
    g_object_unref(sth);

    return TRUE;
}
Ejemplo n.º 15
0
static gboolean
server_api_get_info_sensors (GPtrArray ** p_rsensors, GPtrArray ** p_unrsensors, GHashTable ** p_hash)
{
  gboolean result = FALSE;
  GPtrArray *r_array = NULL;
  GPtrArray *unr_array = NULL;
  GdaDataModel *data_model = NULL;
  GdaDataModelIter *iter = NULL;
  GHashTable *hash = NULL;
  GError *error = NULL;
  const GValue *v_av_uuid;
  const GValue *v_name;
  const GValue *v_internal_uuid;
  *p_rsensors = *p_unrsensors = NULL;
  *p_hash = NULL;
  do
  {
    if ((r_array = g_ptr_array_new_with_free_func (g_free)) == NULL)
      break;
    if ((unr_array = g_ptr_array_new_with_free_func (g_free)) == NULL)
      break;
    if ((hash = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free)) == NULL)
    {
      g_message ("%s: Can't create object", __FUNCTION__);
      break;
    }
    if ((data_model =
            sim_database_execute_single_command (ossim.dbossim,
                "SELECT s.name as SENSOR_NAME, HEX(s.id) AS SENSOR_TABLE_UUID, UCASE(HEX(cl.id)) AS SYSTEM_UUID FROM sensor s, system cl WHERE (s.ip=cl.vpn_ip OR s.ip=cl.admin_ip);")) == NULL)
    {
      g_message ("Query error in  server_api_get_info_sensors");
      break;
    }
    if ((iter = gda_data_model_create_iter (data_model)) == NULL)
    {
      g_message ("%s: Can't create data iterator", __FUNCTION__);
      break;
    }
    result = TRUE;
    while (gda_data_model_iter_move_next (iter))
    {

      if ((v_name = gda_data_model_iter_get_value_at_e (iter, 0, &error)) == NULL || !G_VALUE_HOLDS_STRING (v_name))
      {
        result = FALSE;
        break;
      }
      if ((v_internal_uuid = gda_data_model_iter_get_value_at_e (iter, 1, &error)) == NULL || !G_VALUE_HOLDS_STRING (v_internal_uuid))
      {
        result = FALSE;
        break;
      }

      if ((v_av_uuid = gda_data_model_iter_get_value_at_e (iter, 2, &error)) == NULL || !G_VALUE_HOLDS_STRING (v_av_uuid))
      {
        result = FALSE;
        break;
      }
      if (strcmp ("(null)", g_value_get_string (v_name)) == 0)
      {
        g_ptr_array_add (unr_array, g_strdup (g_value_get_string (v_av_uuid)));
      }
      else
      {
        g_ptr_array_add (r_array, g_strdup (g_value_get_string (v_av_uuid)));
      }
      /* Insert the data in the hash table indexed by IP, we need it for the connected sensors */
      /* XXX verify  the next case: New sensor detected, but without av uuid */
      g_hash_table_insert (hash, g_strdup (g_value_get_string (v_internal_uuid)), g_strdup (g_value_get_string (v_av_uuid)));




    }
    if (!result)
      break;

    result = TRUE;
  }
  while (0);
  /* Clean up */
  if (result == FALSE)
  {
    if (r_array != NULL)
      g_ptr_array_unref (r_array);
    if (unr_array != NULL)
      g_ptr_array_unref (unr_array);
    if (hash != NULL)
      g_hash_table_destroy (hash);

  }
  else
  {
    *p_rsensors = r_array;
    *p_unrsensors = unr_array;
    *p_hash = hash;
  }
  if (iter != NULL)
    g_object_unref (iter);
  if (data_model != NULL)
    g_object_unref (data_model);
  if (error != NULL)
    g_error_free (error);

  return result;
}
Ejemplo n.º 16
0
static const GValue *
gda_data_access_wrapper_get_value_at (GdaDataModel *model, gint col, gint row, GError **error)
{
	GdaDataAccessWrapper *imodel;

	g_return_val_if_fail (GDA_IS_DATA_ACCESS_WRAPPER (model), NULL);
	imodel = (GdaDataAccessWrapper*) model;
	g_return_val_if_fail (imodel->priv, NULL);
	g_return_val_if_fail (imodel->priv->model, NULL);
	g_return_val_if_fail (row >= 0, NULL);

	if (col >= imodel->priv->nb_cols) {
		g_set_error (error, GDA_DATA_MODEL_ERROR, GDA_DATA_MODEL_COLUMN_OUT_OF_RANGE_ERROR,
			     _("Column %d out of range (0-%d)"), col, imodel->priv->nb_cols - 1);
		return NULL;
	}

	if (!imodel->priv->rows) {
		/* imodel->priv->model is a random access model, use it */
		if (imodel->priv->rows_mapping)
			return gda_data_model_get_value_at (imodel->priv->model, imodel->priv->rows_mapping [col],
							    row, error);
		else
			return gda_data_model_get_value_at (imodel->priv->model, col, row, error);
	}
	else {
		GdaRow *gda_row;
		gint tmp;
		tmp = row;
		gda_row = g_hash_table_lookup (imodel->priv->rows, &tmp);
		if (gda_row) {
			GValue *val = gda_row_get_value (gda_row, col);
			if (gda_row_value_is_valid (gda_row, val))
				return val;
			else
				return NULL;
		}
		else {
			g_assert (imodel->priv->iter);
			if (imodel->priv->iter_row < 0) {
				if (gda_data_model_iter_move_next (imodel->priv->iter)) {
					tmp = row;
					gda_row = g_hash_table_lookup (imodel->priv->rows, &tmp);
					if (row == imodel->priv->iter_row) {
						GValue *val = gda_row_get_value (gda_row, col);
						if (gda_row_value_is_valid (gda_row, val))
							return val;
						else
							return NULL;
					}
				}
				else {
					g_set_error (error, GDA_DATA_MODEL_ERROR, GDA_DATA_MODEL_ACCESS_ERROR,
						      "%s", _("Can't set iterator's position"));
					return NULL;
				}
			}
				
			gda_row = NULL;
			if (row != imodel->priv->iter_row) {
				if (row > imodel->priv->iter_row) {
					/* need to move forward */
					while ((imodel->priv->iter_row < row) && 
					       gda_data_model_iter_move_next (imodel->priv->iter));
				}
				else {
					/* need to move backwards */
					g_assert (imodel->priv->model_access_flags & GDA_DATA_MODEL_ACCESS_CURSOR_BACKWARD);
					while ((imodel->priv->iter_row > row) && 
					       gda_data_model_iter_move_prev (imodel->priv->iter)) ;
				}
			}

			if (! (imodel->priv->model_access_flags & GDA_DATA_MODEL_ACCESS_CURSOR_BACKWARD) ||
			    ! (imodel->priv->model_access_flags & GDA_DATA_MODEL_ACCESS_CURSOR_FORWARD)) {
				tmp = row;
				gda_row = g_hash_table_lookup (imodel->priv->rows, &tmp);

				if (gda_row) {
					GValue *val = gda_row_get_value (gda_row, col);
					if (gda_row_value_is_valid (gda_row, val))
						return val;
					else
						return NULL;
				}
			}
			else {
				/* in this case iter can be moved forward and backward at will => we only
				 * need to keep a pool of GdaRow for performances reasons */
				tmp = row;
				gda_row = g_hash_table_lookup (imodel->priv->rows, &tmp);

				if (!gda_row) {
					if (! imodel->priv->rows_buffer_array) {
						imodel->priv->rows_buffer_array = g_array_sized_new (FALSE, FALSE, 
												     sizeof (GdaRow*),
												     ROWS_POOL_SIZE);
						imodel->priv->rows_buffer_index = g_array_sized_new (FALSE, FALSE, 
												     sizeof (gint), 
												     ROWS_POOL_SIZE);
					}
					else if (imodel->priv->rows_buffer_array->len == ROWS_POOL_SIZE) {
						/* get rid of the oldest row (was model's index_row row)*/
						gint index_row;

						index_row = g_array_index (imodel->priv->rows_buffer_index, gint,
									   ROWS_POOL_SIZE - 1);
						g_array_remove_index (imodel->priv->rows_buffer_array,
								      ROWS_POOL_SIZE - 1);
						g_array_remove_index (imodel->priv->rows_buffer_index,
								      ROWS_POOL_SIZE - 1);
						g_hash_table_remove (imodel->priv->rows, &index_row);
					}
					if (gda_data_model_iter_move_to_row (imodel->priv->iter, row)) {
						gda_row = create_new_row (imodel);
						g_array_prepend_val (imodel->priv->rows_buffer_array, gda_row);
						g_array_prepend_val (imodel->priv->rows_buffer_index, imodel->priv->iter_row);
					}
				}

				GValue *val;
				val = gda_row ? gda_row_get_value (gda_row, col) : NULL;
				if (gda_row && gda_row_value_is_valid (gda_row, val))
					return val;
				else
					return NULL;
			}
		}
	}

	g_set_error (error, GDA_DATA_MODEL_ERROR, GDA_DATA_MODEL_ACCESS_ERROR,
		      "%s", _("Can't access data"));
	return NULL;
}