This example shows how you might obtain a Gnome::Gda::Dict by loading it from an XML file instead of querying the database. It also saves the dict back to XML when the program finishs.
File: examplewindow.h
#include <memory>
#include <gtkmm.h>
#include <libgdamm.h>
#include <libgnomedbmm.h>
class ExampleWindow : public Gtk::Window
{
public:
ExampleWindow(const Glib::RefPtr<Gnome::Gda::Dict>& dict);
private:
#ifdef GLIBMM_EXCEPTIONS_ENABLED
void create_model(const Glib::RefPtr<Gnome::Gda::Dict>& dict);
#else
void create_model(const Glib::RefPtr<Gnome::Gda::Dict>& dict, std::auto_ptr<Glib::Error>& error);
#endif
Glib::RefPtr<Gnome::Gda::DataModelQuery> m_model;
Gtk::VBox m_box;
Gtk::Label m_label;
Gnome::Db::Grid* m_grid;
};
File: main.cc
#include <libgnomedbmm.h>
#include <libgdamm.h>
#include <gtkmm.h>
#include <iostream>
#include "examplewindow.h"
#ifdef GLIBMM_EXCEPTIONS_ENABLED
void do_example(const Glib::RefPtr<Gnome::Gda::Dict>& dict)
#else
void do_example(const Glib::RefPtr<Gnome::Gda::Dict>& dict, std::auto_ptr<Glib::Error>& error)
#endif // GLIBMM_EXCEPTIONS_ENABLED
{
// File to try to read dictionary from
std::string filename = "my_dict.xml";
Glib::RefPtr<Gnome::Gda::Client> client = Gnome::Gda::Client::create();
Glib::ustring connection_string = "DB_DIR=" LIBGNOMEDB_DATADIR ";DB_NAME=demo_db";
#ifdef GLIBMM_EXCEPTIONS_ENABLED
Glib::RefPtr<Gnome::Gda::Connection> cnc = client->open_connection_from_string("SQLite", connection_string, "" /* username */, "" /* password */);
#else
Glib::RefPtr<Gnome::Gda::Connection> cnc = client->open_connection_from_string("SQLite", connection_string, "" /* username */, "" /* password */, Gnome::Gda::ConnectionOptions(0), error);
if(error.get() != NULL) return;
#endif // GLIBMM_EXCEPTIONS_ENABLED
dict->set_connection(cnc);
// Load from XML file if present, query database otherwise
if(Glib::file_test(filename, Glib::FILE_TEST_IS_REGULAR))
{
#ifdef GLIBMM_EXCEPTIONS_ENABLED
dict->load_xml_file(filename);
#else
dict->load_xml_file(filename, error);
if(error.get() != NULL) return;
#endif // GLIBMM_EXCEPTIONS_ENABLED
}
else
{
#ifdef GLIBMM_EXCEPTIONS_ENABLED
dict->update_dbms_meta_data();
#else
dict->update_dbms_meta_data(error);
if(error.get() != NULL) return;
#endif // GLIBMM_EXCEPTIONS_ENABLED
}
ExampleWindow window(dict);
Gtk::Main::run(window);
// Save dict back to XML after program termination
#ifdef GLIBMM_EXCEPTIONS_ENABLED
dict->save_xml_file(filename);
#else
dict->save_xml_file(filename, error);
#endif // GLIBMM_EXCEPTIONS_ENABLED
}
int main(int argc, char* argv[])
{
Gtk::Main kit(argc, argv);
Gnome::Db::init("Grid example", "1.0", argc, argv);
Glib::RefPtr<Gnome::Gda::Dict> dict = Gnome::Gda::Dict::create();
#ifdef GLIBMM_EXCEPTIONS_ENABLED
try
{
do_example(dict);
}
catch(const Glib::Error& err)
{
std::cerr << "Exception caught: " << err.what() << std::endl;
return 1;
}
#else
std::auto_ptr<Glib::Error> error;
do_example(dict, error);
if(error.get() != NULL)
{
std::cerr << "Exception caught: " << error->what() << std::endl;
return 1;
}
#endif // GLIBMM_EXCEPTIONS_ENABLED
return 0;
}
File: examplewindow.cc
#include "examplewindow.h"
#include <libgdamm.h>
#include <iostream>
#ifdef GLIBMM_EXCEPTIONS_ENABLED
void ExampleWindow::create_model(const Glib::RefPtr<Gnome::Gda::Dict>& dict)
#else
void ExampleWindow::create_model(const Glib::RefPtr<Gnome::Gda::Dict>& dict, std::auto_ptr<Glib::Error>& error)
#endif // GLIBMM_EXCEPTIONS_ENABLED
{
Glib::RefPtr<Gnome::Gda::Query> query = Gnome::Gda::Query::create(dict);
#ifdef GLIBMM_EXCEPTIONS_ENABLED
query->set_sql_text("SELECT ref, category, name, price, wh_stored FROM products");
#else
query->set_sql_text("SELECT ref, category, name, price, wh_stored FROM products", error);
if(error.get() != NULL) return;
#endif // GLIBMM_EXCEPTIONS_ENABLED
m_model = Gnome::Gda::DataModelQuery::create(query);
const Glib::ustring update_query =
"UPDATE products set "
"ref=##/*name:'+0' type:gchararray*/, "
"category=##/*name:'+1' type:gint*/,"
"name=##/*name:'+2' type:gchararray*/, "
"wh_stored=##/*name:'+4' type:gint*/ "
"WHERE ref=##/*name:'-0' type:gchararray*/";
const Glib::ustring delete_query =
"DELETE FROM products WHERE ref=##/*name:'-0' type:gchararray*/";
const Glib::ustring insert_query =
"INSERT INTO products (ref, category, name, price, wh_stored) "
"VALUES (##/*name:'+0' type:gchararray*/, "
"##/*name:'+1' type:gint*/, "
"##/*name:'+2' type:gchararray*/, "
"1.0, "
"##/*name:'+4' type:gint*/)";
#ifdef GLIBMM_EXCEPTIONS_ENABLED
m_model->set_modification_query(update_query);
m_model->set_modification_query(delete_query);
m_model->set_modification_query(insert_query);
#else
m_model->set_modification_query(update_query, error);
m_model->set_modification_query(delete_query, error);
m_model->set_modification_query(insert_query, error);
#endif
}
ExampleWindow::ExampleWindow(const Glib::RefPtr<Gnome::Gda::Dict>& dict) :
m_label("The following Gnome::Db::Grid widget displays data from the 'products' table.\n\n"
"As modification queries are provided, the data is read-write\n(except for the 'price' "
"field as these queries voluntarily omit that field).")
{
m_box.set_border_width(6);
m_box.pack_start(m_label, Gtk::PACK_SHRINK);
#ifdef GLIBMM_EXCEPTIONS_ENABLED
try
{
create_model(dict);
}
catch(const Glib::Error& err)
{
std::cerr << "Exception caught: " << err.what() << std::endl;
exit(1);
}
#else
std::auto_ptr<Glib::Error> error;
create_model(dict, error);
if(error.get() != NULL)
{
std::cerr << "Exception caught: " << error->what() << std::endl;
exit(1);
}
#endif
/* Create the demo widget */
m_grid = Gtk::manage(new Gnome::Db::Grid(m_model));
m_box.pack_start(*m_grid);
add(m_box);
set_default_size(0, 400);
show_all();
}