QOF GObject Usage Example

# Query Over a Collection of GObjects

- Home
- SourceForge
- Documentation
- QOF-Generator
- Object queries
- Why QOF?
- Data Freedom
- Support

The example below shows how to perform an SQL query over a collection of Glib GObjects. Three `GtkButton` objects are created, each with a different label. Then the SQL statement `SELECT * FROM GtkButton WHERE (label='asdfasdf');` is performed on this collection. The one button with the matching label is returned.

    /** @file gobj-example.c
     *  @brief Example usage of QOF to query a set of GObjects.
     *  @author Copyright (c) 2004 Linas Vepstas <linas@linas.org>
     *
     * This example program shows how to use QOF to query over a set
     * of GObjects.  In this example, the query is performed over
     * three GtkButtons, each having a different label.  The result
     * of the search is the one GtkButton with the desired label.
     *
     * The use of GtkButton in this example is artificial.  GLib
     * GObjects do not have to be GUI objects, and can be created
     * for any use desired.  I didn't want to turn this into an
     * example of how to create a GObject, and so used a pre-existing
     * GObject, the GtkButton.
     */

    #include <qof/qof.h>
    #include <gtk/gtk.h>

    int
    main(int argc, char *argv[])
    {
    	g_type_init ();
    	gtk_init (&argc, &argv);
    	qof_gobject_init ();

    	/* Register a new searchable type */
    	GtkWidget *w = gtk_button_new_with_label ("Howdy Doody");
    	GtkButtonClass * wc = GTK_BUTTON_GET_CLASS(w);
    	GObjectClass *goc = G_OBJECT_CLASS(wc);

    	qof_gobject_register ("MyGtkButton", goc);

    	/* Add a number of instances to the collection */
    	QofBook *book =  qof_book_new();
    	qof_gobject_register_instance (book, "MyGtkButton", G_OBJECT(w));

    	w = gtk_button_new_with_label ("dorf");
    	qof_gobject_register_instance (book, "MyGtkButton", G_OBJECT(w));

    	w = gtk_button_new_with_label ("zinger");
    	qof_gobject_register_instance (book, "MyGtkButton", G_OBJECT(w));

    	printf ("\nCreated three objects and registered them\n\n");

    	/* Create a new query, run that query */
    	QofSqlQuery *q;
    	q =  qof_sql_query_new ();

    	/* Set the book to be searched */
    	qof_sql_query_set_book(q, book);

    	char * qstr = "SELECT * FROM MyGtkButton WHERE (label = 'dorf')";
    	printf ("Going to perform the query %s\n", qstr);

    	GList *results = qof_sql_query_run (q, qstr);
    	printf ("\nQuery returned %d results\n", g_list_length (results));

    	GList *n;
    	for (n=results; n; n=n->next)
    	{
    		GtkWidget *qw = n->data;
    		if (GTK_IS_BUTTON(qw))
    		{
    			GtkButton *bw = GTK_BUTTON (qw);
    			printf ("Found a button whose label is %s\n", gtk_button_get_label(bw));
    		}
    	}

    	qof_gobject_shutdown ();
    	return 0;
    }

    /* =================== END OF FILE ===================== */