[glom/sqlbuilder2: 116/117] Fix merge conflicts.



commit 1f5eef3ea967f130aa1e51750038c30bd3fd4c2c
Merge: 8146ab4 145fde8
Author: Murray Cumming <murrayc murrayc com>
Date:   Tue Apr 27 15:34:09 2010 +0200

    Fix merge conflicts.

 .gitignore                                         |    4 +
 ChangeLog                                          |  781 +++
 Makefile.am                                        |   14 +-
 Makefile_glom.am                                   |   79 +-
 Makefile_tests.am                                  |   37 +-
 NEWS                                               |   70 +-
 autogen.sh                                         |    3 +-
 configure.ac                                       |   53 +-
 .../Doxyfile                                       |    0
 .../Doxyfile_libglom                               |    0
 docs/libglom_reference/.gitignore                  |    4 +
 .../Doxyfile => libglom_reference/Doxyfile.in}     |  240 +-
 docs/libglom_reference/Makefile.am                 |   22 +
 docs/pyglom_reference/.gitignore                   |    3 +
 docs/pyglom_reference/Makefile.am                  |   53 +
 docs/pyglom_reference/conf.py.in                   |  194 +
 docs/pyglom_reference/index.rst.in                 |   25 +
 docs/user-guide/.gitignore                         |    2 +-
 glom/application.cc                                |  170 +-
 glom/application.h                                 |    8 +
 glom/base_db.cc                                    |  238 +-
 glom/box_reports.cc                                |   10 +-
 glom/box_reports.h                                 |    4 +-
 glom/dialog_connection.cc                          |    5 +-
 glom/dialog_connection.h                           |    3 +
 glom/dialog_existing_or_new.cc                     |   28 +-
 glom/dialog_existing_or_new.h                      |    3 +
 glom/dialog_invalid_data.cc                        |   15 +-
 glom/dialog_invalid_data.h                         |    3 +
 glom/dialog_progress_creating.cc                   |    3 +
 glom/dialog_progress_creating.h                    |    3 +
 glom/filechooser_export.cc                         |   26 +-
 glom/frame_glom.cc                                 |  304 +-
 glom/glade_utils.cc                                |   31 +-
 glom/glade_utils.h                                 |  104 +-
 glom/glom.glade                                    |  391 +-
 glom/glom_developer.glade                          | 1443 ++---
 glom/glom_document.dtd                             |   53 +-
 glom/import_csv/dialog_import_csv.cc               |    7 +-
 glom/import_csv/dialog_import_csv.h                |    3 +
 glom/import_csv/dialog_import_csv_progress.cc      |    3 +
 glom/import_csv/dialog_import_csv_progress.h       |    3 +
 glom/libglom/connectionpool.cc                     |   58 +-
 glom/libglom/connectionpool.h                      |    7 +-
 glom/libglom/connectionpool_backends/backend.cc    |    3 +-
 glom/libglom/connectionpool_backends/backend.h     |    2 +-
 .../connectionpool_backends/postgres_self.cc       |    7 +-
 .../connectionpool_backends/postgres_self.h        |    2 +-
 .../data_structure/layout/fieldformatting.h        |    2 +-
 glom/libglom/document/bakery/document.cc           |   54 +-
 .../{test_document.cc => example_document_load.cc} |   46 +-
 glom/libglom/init.h                                |   53 +
 glom/libglom/python_embed/py_glom_record.cc        |   79 +-
 glom/libglom/python_embed/py_glom_record.h         |   24 +-
 glom/libglom/python_embed/py_glom_related.cc       |   10 +-
 glom/libglom/python_embed/py_glom_related.h        |    8 +-
 glom/libglom/python_embed/py_glom_relatedrecord.cc |   18 +-
 glom/libglom/python_embed/py_glom_relatedrecord.h  |   10 +-
 .../libglom/python_embed/pygdavalue_conversions.cc |   62 +-
 glom/libglom/sharedptr.h                           |    7 +-
 glom/main.cc                                       |   13 +-
 glom/mode_data/box_data_calendar_related.cc        |   17 +-
 glom/mode_data/box_data_details.cc                 |   25 +-
 glom/mode_data/box_data_details.h                  |    2 +-
 glom/mode_data/box_data_list.cc                    |   12 +-
 glom/mode_data/box_data_list_related.cc            |   12 +-
 glom/mode_data/box_data_list_related.h             |    2 -
 glom/{utility_widgets => mode_data}/buttonglom.cc  |   40 +-
 glom/{utility_widgets => mode_data}/buttonglom.h   |    2 +-
 .../datawidget/checkbutton.cc}                     |   24 +-
 .../datawidget/checkbutton.h}                      |   12 +-
 .../comboglom.cc => mode_data/datawidget/combo.cc} |   10 +-
 .../comboglom.h => mode_data/datawidget/combo.h}   |    6 +-
 .../datawidget}/combo_as_radio_buttons.cc          |    8 +-
 .../datawidget}/combo_as_radio_buttons.h           |    6 +-
 .../datawidget}/combochoices.cc                    |    5 +-
 .../datawidget}/combochoices.h                     |    6 +-
 .../datawidget}/combochoiceswithtreemodel.cc       |    5 +-
 .../datawidget}/combochoiceswithtreemodel.h        |    6 +-
 .../datawidget/comboentry.cc}                      |   59 +-
 .../datawidget/comboentry.h}                       |   14 +-
 .../datawidget}/datawidget.cc                      |  159 +-
 .../datawidget}/datawidget.h                       |    5 +-
 .../datawidget}/dialog_choose_date.cc              |    7 +
 .../datawidget}/dialog_choose_date.h               |   11 +-
 .../datawidget}/dialog_choose_id.cc                |    8 +-
 .../datawidget}/dialog_choose_id.h                 |   11 +-
 .../entryglom.cc => mode_data/datawidget/entry.cc} |   50 +-
 .../entryglom.h => mode_data/datawidget/entry.h}   |   13 +-
 .../labelglom.cc => mode_data/datawidget/label.cc} |   63 +-
 .../labelglom.h => mode_data/datawidget/label.h}   |   18 +-
 .../datawidget/textview.cc}                        |   50 +-
 .../datawidget/textview.h}                         |   14 +-
 glom/mode_data/flowtablewithfields.cc              |  100 +-
 .../placeholder-glom.cc                            |    1 -
 .../placeholder-glom.h                             |    2 +-
 glom/mode_design/dialog_add_related_table.cc       |    3 +
 glom/mode_design/dialog_add_related_table.h        |    3 +
 glom/mode_design/dialog_database_preferences.cc    |    3 +
 glom/mode_design/dialog_database_preferences.h     |    3 +
 glom/mode_design/dialog_design.cc                  |    4 +-
 glom/mode_design/dialog_design.h                   |    1 -
 glom/mode_design/dialog_fields.cc                  |    6 +-
 glom/mode_design/dialog_fields.h                   |    3 +
 glom/mode_design/dialog_initial_password.cc        |    3 +
 glom/mode_design/dialog_initial_password.h         |    3 +
 glom/mode_design/dialog_relationships.cc           |    5 +-
 glom/mode_design/dialog_relationships.h            |    3 +
 glom/mode_design/fields/box_db_table_definition.cc |    6 +-
 glom/mode_design/fields/dialog_fieldcalculation.cc |    3 +
 glom/mode_design/fields/dialog_fieldcalculation.h  |    3 +
 glom/mode_design/fields/dialog_fielddefinition.cc  |   49 +-
 glom/mode_design/fields/dialog_fielddefinition.h   |    8 +-
 glom/mode_design/layout/dialog_choose_field.cc     |    3 +
 glom/mode_design/layout/dialog_choose_field.h      |    3 +
 .../layout/dialog_choose_relationship.cc           |    3 +
 .../layout/dialog_choose_relationship.h            |    3 +
 .../layout/dialog_layout_calendar_related.cc       |    3 +
 .../layout/dialog_layout_calendar_related.h        |    3 +
 glom/mode_design/layout/dialog_layout_details.cc   |  108 +-
 glom/mode_design/layout/dialog_layout_details.h    |    3 +
 glom/mode_design/layout/dialog_layout_export.cc    |    3 +
 glom/mode_design/layout/dialog_layout_export.h     |    3 +
 glom/mode_design/layout/dialog_layout_list.cc      |    3 +
 glom/mode_design/layout/dialog_layout_list.h       |    3 +
 .../layout/dialog_layout_list_related.cc           |    3 +
 .../layout/dialog_layout_list_related.h            |    3 +
 .../layout/layout_item_dialogs/box_formatting.cc   |    3 +
 .../layout/layout_item_dialogs/box_formatting.h    |    3 +
 .../layout_item_dialogs/dialog_buttonscript.cc     |    3 +
 .../layout_item_dialogs/dialog_buttonscript.h      |    3 +
 .../layout_item_dialogs/dialog_field_layout.cc     |   14 +-
 .../layout_item_dialogs/dialog_field_layout.h      |    3 +
 .../layout_item_dialogs/dialog_field_summary.cc    |    3 +
 .../layout_item_dialogs/dialog_field_summary.h     |    3 +
 .../layout_item_dialogs/dialog_formatting.cc       |   10 +-
 .../layout/layout_item_dialogs/dialog_group_by.cc  |   29 +-
 .../layout/layout_item_dialogs/dialog_group_by.h   |    3 +
 .../dialog_groupby_secondaryfields.cc              |    3 +
 .../dialog_groupby_secondaryfields.h               |    3 +
 .../dialog_groupby_sortfields.cc                   |    3 +
 .../dialog_groupby_sortfields.h                    |    3 +
 .../layout_item_dialogs/dialog_imageobject.cc      |    5 +-
 .../layout_item_dialogs/dialog_imageobject.h       |    5 +-
 .../layout/layout_item_dialogs/dialog_notebook.cc  |    3 +
 .../layout/layout_item_dialogs/dialog_notebook.h   |    3 +
 .../layout_item_dialogs/dialog_textobject.cc       |    5 +-
 .../layout/layout_item_dialogs/dialog_textobject.h |    5 +-
 .../mode_design/print_layouts/box_print_layouts.cc |   10 +-
 glom/mode_design/print_layouts/box_print_layouts.h |    4 +-
 .../print_layouts/dialog_text_formatting.cc        |   15 +-
 .../print_layouts/dialog_text_formatting.h         |    3 +
 .../print_layouts/window_print_layout_edit.cc      |    3 +
 .../print_layouts/window_print_layout_edit.h       |    3 +
 .../dialog_relationships_overview.cc               |    2 +
 .../dialog_relationships_overview.h                |    5 +-
 .../report_layout/dialog_layout_report.cc          |  135 +-
 .../report_layout/dialog_layout_report.h           |    3 +
 .../script_library/dialog_new_script.cc            |    3 +
 .../mode_design/script_library/dialog_new_script.h |    3 +
 .../script_library/dialog_script_library.cc        |   18 +-
 .../script_library/dialog_script_library.h         |    3 +
 .../translation/dialog_change_language.cc          |    3 +
 .../translation/dialog_change_language.h           |    3 +
 .../translation/dialog_copy_translation.cc         |    3 +
 .../translation/dialog_copy_translation.h          |    3 +
 .../translation/dialog_identify_original.cc        |    3 +
 .../translation/dialog_identify_original.h         |    3 +
 .../mode_design/translation/window_translations.cc |   99 +-
 glom/mode_design/translation/window_translations.h |    3 +
 glom/mode_design/users/dialog_choose_user.cc       |    3 +
 glom/mode_design/users/dialog_choose_user.h        |    9 +-
 glom/mode_design/users/dialog_groups_list.cc       |   32 +-
 glom/mode_design/users/dialog_groups_list.h        |    3 +
 glom/mode_design/users/dialog_new_group.cc         |    3 +
 glom/mode_design/users/dialog_new_group.h          |    3 +
 glom/mode_design/users/dialog_user.cc              |    3 +
 glom/mode_design/users/dialog_user.h               |    3 +
 glom/mode_design/users/dialog_users_list.cc        |   44 +-
 glom/mode_design/users/dialog_users_list.h         |    3 +
 glom/navigation/box_tables.cc                      |    7 +-
 glom/navigation/box_tables.h                       |    3 +
 glom/print_layout/canvas_print_layout.cc           |   29 +-
 glom/python_embed/glom_python.cc                   |   64 +-
 glom/python_embed/python_module/py_glom_module.cc  |  125 +-
 glom/utility_widgets/adddel/adddel.cc              |    2 +-
 glom/utility_widgets/adddel/adddel_withbuttons.cc  |   30 +-
 glom/utility_widgets/adddel/adddel_withbuttons.h   |    2 +-
 glom/utility_widgets/alignment_justified.cc        |   61 -
 glom/utility_widgets/alignment_justified.h         |   42 -
 .../utility_widgets/canvas/canvas_image_movable.cc |    4 +-
 glom/utility_widgets/db_adddel/db_adddel.cc        |    6 +-
 .../db_adddel/db_adddel_withbuttons.cc             |   16 +-
 .../db_adddel/db_adddel_withbuttons.h              |    2 +-
 glom/utility_widgets/dialog_flowtable.cc           |    3 +
 glom/utility_widgets/dialog_flowtable.h            |    3 +
 glom/utility_widgets/dialog_image_progress.cc      |    3 +
 glom/utility_widgets/dialog_image_progress.h       |    7 +-
 .../filechooserdialog_saveextras.cc                |    4 +-
 glom/utility_widgets/flowtable_dnd.cc              |    7 +-
 glom/utility_widgets/imageglom.cc                  |   78 +-
 glom/utility_widgets/imageglom.h                   |    2 -
 glom/utility_widgets/layoutwidgetbase.cc           |   10 +-
 glom/utility_widgets/notebooklabelglom.cc          |   26 +-
 glom/utility_widgets/notebooklabelglom.h           |    8 +-
 glom/utility_widgets/table_columns.cc              |   83 -
 glom/utility_widgets/table_columns.h               |   53 -
 glom/utils_ui.cc                                   |   71 +-
 glom/utils_ui.h                                    |   18 +
 macros/ax_boost_python_murrayc.m4                  |  107 +-
 macros/dk-warn.m4                                  |  114 -
 po/POTFILES.in                                     |    8 +-
 po/cs.po                                           | 1702 +++---
 po/de.po                                           | 1644 +++---
 po/es.po                                           | 1815 +++---
 po/fr.po                                           | 1623 +++---
 po/sl.po                                           | 6931 ++++++++++----------
 tests/glade_toplevels_instantiation.cc             |  137 +
 tests/test_document_load/test_document_load.cc     |  129 +
 tests/test_dtd_file_validation.sh                  |    3 +-
 tests/test_glade_derived_instantiation.cc          |  135 +
 tests/test_glade_file_validation.sh                |    3 +-
 tests/test_glade_toplevels_instantiation.sh        |    7 +
 tests/test_python_execute_func_date.cc             |   83 +-
 .../test_selfhosting_new_empty.cc                  |  186 +
 win32/build-installer                              |   24 +-
 win32/glom.iss.in                                  |   15 +-
 227 files changed, 11610 insertions(+), 10327 deletions(-)
---
diff --cc glom/libglom/python_embed/py_glom_related.cc
index 2f49217,d25a49a..3e40187
--- a/glom/libglom/python_embed/py_glom_related.cc
+++ b/glom/libglom/python_embed/py_glom_related.cc
@@@ -82,14 -82,21 +82,14 @@@ boost::python::object PyGlomRelated::ge
              PyGlomRecord::type_map_field_values::const_iterator iterFromKey = record->m_map_field_values.find(from_key);
              if(iterFromKey != record->m_map_field_values.end())
              {
--              const Gnome::Gda::Value from_key_value = iterFromKey->second;
++              const Gnome::Gda::Value& from_key_value = iterFromKey->second;
  
                //TODO_Performance:
                //Get the full field details so we can sqlize its value:
 -              sharedptr<Field> from_key_field;
 -              from_key_field = record->m_document->get_field(record->m_table_name, from_key);
 +              sharedptr<const Field> from_key_field = record->m_document->get_field(record->m_table_name, from_key);
                if(from_key_field)
-               { 
-                 PyGlomRelatedRecord_SetRelationship(pyRelatedRecord, iterFind->second, from_key_value, record->m_document);
+               {
 -                Glib::ustring key_value_sqlized;
 -                //std::cout << "from_key_field=" << from_key_field->get_name() << ", from_key_value=" << from_key_value.to_string() << std::endl;
 -
 -                if(!Conversions::value_is_empty(from_key_value)) //Do not link on null-values. That would cause us to link on 0, or "0".
 -                  key_value_sqlized = from_key_field->sql(from_key_value);
 -
 -                pyRelatedRecord->set_relationship(iterFind->second, key_value_sqlized, record->m_document);
++                pyRelatedRecord->set_relationship(iterFind->second, from_key_value, record->m_document);
  
                  //Store it in the cache:
                  boost::python::object objectRelatedRecord(pyRelatedRecord);
diff --cc glom/libglom/python_embed/py_glom_relatedrecord.cc
index 4e7e111,48d2bca..0fb059b
--- a/glom/libglom/python_embed/py_glom_relatedrecord.cc
+++ b/glom/libglom/python_embed/py_glom_relatedrecord.cc
@@@ -62,91 -61,86 +62,91 @@@ boost::python::object PyGlomRelatedReco
      //If the value has already been stored, then just return it again:
      return glom_pygda_value_as_boost_pyobject(iterFind->second);
    }
-   
++
 +  const Glib::ustring related_table = m_relationship->get_to_table();
 +
 +  //Check whether the field exists in the table.
 +  //TODO_Performance: Do this without the useless Field information?
 +  sharedptr<const Field> field = m_document->get_field(m_relationship->get_to_table(), field_name);
 +  if(!field)
 +  {
 +    g_warning("PyGlomRelatedRecord::setitem(): field %s not found in table %s", field_name.c_str(), m_relationship->get_to_table().c_str());
 +    PyErr_SetString(PyExc_IndexError, "field not found");
 +    return boost::python::object();
 +  }
    else
    {
 -    const Glib::ustring related_table = m_relationship->get_to_table();
 -
 -    //Check whether the field exists in the table.
 -    //TODO_Performance: Do this without the useless Field information?
 -    sharedptr<const Field> field = m_document->get_field(m_relationship->get_to_table(), field_name);
 -    if(!field)
 -      g_warning("RelatedRecord_tp_as_mapping_getitem: field %s not found in table %s", field_name.c_str(), m_relationship->get_to_table().c_str());
 -    else
 -    {
 -      //Try to get the value from the database:
 -      //const Glib::ustring parent_key_name;
 +    //Try to get the value from the database:
 +    //const Glib::ustring parent_key_name;
  #ifdef GLIBMM_EXCEPTIONS_ENABLED
 -      sharedptr<SharedConnection> sharedconnection = ConnectionPool::get_instance()->connect();
 +    sharedptr<SharedConnection> sharedconnection = ConnectionPool::get_instance()->connect();
  #else
 -      std::auto_ptr<ExceptionConnection> conn_error;
 -      sharedptr<SharedConnection> sharedconnection = ConnectionPool::get_instance()->connect(conn_error);
 -      // Ignore error, sharedconnection presence is checked below
 +    std::auto_ptr<ExceptionConnection> conn_error;
 +    sharedptr<SharedConnection> sharedconnection = ConnectionPool::get_instance()->connect(conn_error);
 +    // Ignore error, sharedconnection presence is checked below
  #endif
 -      if(sharedconnection)
 -      {
 -        Glib::RefPtr<Gnome::Gda::Connection> gda_connection = sharedconnection->get_gda_connection();
 -
 -        const Glib::ustring related_key_name = m_relationship->get_to_field();
 -
 -        //Do not try to get a value based on a null key value:
 -        if(m_from_key_value_sqlized.empty())
 -          return boost::python::object();
 -
 -        //Get the single value from the related records:
 -        const Glib::ustring sql_query = "SELECT \"" + related_table + "\".\"" + field_name + "\" FROM \"" + related_table + "\""
 -          + " WHERE \"" + related_table + "\".\"" + related_key_name + "\" = " + m_from_key_value_sqlized;
 -
 -        /* TODO: Fix linking problems
 -        const Application* app = Application::get_application();
 -        if(app && app->get_show_sql_debug())
 -        {
 -          try
 -          {
 -            std::cout << "Debug: RelatedRecord_tp_as_mapping_getitem():  " << sql_query << std::endl;
 -          }
 -          catch(const Glib::Exception& ex)
 -          {
 -            std::cout << "Debug: query string could not be converted to std::cout: " << ex.what() << std::endl;
 -          }
 -        }*/
  
 -#ifdef GLIBMM_EXCEPTIONS_ENABLED
 -        // TODO: Does this behave well if this throws an exception?
 -        Glib::RefPtr<Gnome::Gda::DataModel> datamodel = gda_connection->statement_execute_select(sql_query);
 -#else
 -        std::auto_ptr<Glib::Error> error;
 -        Glib::RefPtr<Gnome::Gda::DataModel> datamodel =  gda_connection->statement_execute_select(sql_query, Gnome::Gda::STATEMENT_MODEL_RANDOM_ACCESS, error);
 -        // Ignore error, datamodel return value is checked below
 -#endif
 -        if(datamodel && datamodel->get_n_rows())
 -        {
 -#ifdef GLIBMM_EXCEPTIONS_ENABLED
 -          Gnome::Gda::Value value = datamodel->get_value_at(0, 0);
 -#else
 -          Gnome::Gda::Value value = datamodel->get_value_at(0, 0, error);
 -#endif
 -          //g_warning("RelatedRecord_tp_as_mapping_getitem(): value from datamodel = %s", value.to_string().c_str());
 -
 -          //Cache it, in case it's asked-for again.
 -          m_map_field_values[field_name] = value;
 -          return glom_pygda_value_as_boost_pyobject(value);
 -        }
 -        else if(!datamodel)
 -        {
 -          g_warning("RelatedRecord_tp_as_mapping_getitem(): The datamodel was null.");
 -          ConnectionPool::handle_error_cerr_only();
 -          RelatedRecord_HandlePythonError();
 -        }
 -        else
 -        {
 -          g_warning("RelatedRecord_tp_as_mapping_getitem(): No related records exist yet for relationship %s.",  m_relationship->get_name().c_str());
 -        }
 +    if(!sharedconnection)
 +    {
 +      PyErr_SetString(PyExc_IndexError, "no database connection");
 +      return boost::python::object();
 +    }
 +
 +    Glib::RefPtr<Gnome::Gda::Connection> gda_connection = sharedconnection->get_gda_connection();
 +
 +    const Glib::ustring related_key_name = m_relationship->get_to_field();
 +
 +    //Do not try to get a value based on a null key value:
 +    if(Conversions::value_is_empty(m_from_key_value))
 +    {
 +      PyErr_SetString(PyExc_IndexError, "connection not found");
 +      return boost::python::object();
 +    }
 +
 +    //Get the single value from the related records:
 +    Glib::RefPtr<Gnome::Gda::SqlBuilder> builder =
 +      Gnome::Gda::SqlBuilder::create(Gnome::Gda::SQL_STATEMENT_SELECT);
 +    builder->select_add_field(field_name, related_table);
 +    builder->select_add_target(related_table);
 +    builder->set_where(
 +      builder->add_cond(Gnome::Gda::SQL_OPERATOR_TYPE_EQ,
 +        builder->add_id(related_key_name), //TODO: It would nice to specify the table name here too.
 +        builder->add_expr(m_from_key_value)));
-         
++
 +    /* TODO: Fix linking problems
 +    const App_Glom* app = App_Glom::get_application();
 +    if(app && app->get_show_sql_debug())
 +    {
 +      try
 +      {
 +        std::cout << "Debug: PyGlomRelatedRecord::setitem()():  " << sql_query << std::endl;
        }
 +      catch(const Glib::Exception& ex)
 +      {
 +        std::cout << "Debug: query string could not be converted to std::cout: " << ex.what() << std::endl;
 +      }
 +    }*/
-     
++
 +    // TODO: Does this behave well if this throws an exception?
 +    Glib::RefPtr<Gnome::Gda::DataModel> datamodel = gda_connection->statement_execute_select_builder(builder);
 +    if(datamodel && datamodel->get_n_rows())
 +    {
 +      const Gnome::Gda::Value value = datamodel->get_value_at(0, 0);
 +      //g_warning("PyGlomRelatedRecord::setitem()(): value from datamodel = %s", value.to_string().c_str());
 +
 +      //Cache it, in case it's asked-for again.
 +      m_map_field_values[field_name] = value;
 +      return glom_pygda_value_as_boost_pyobject(value);
 +    }
 +    else if(!datamodel)
 +    {
 +      g_warning("PyGlomRelatedRecord::setitem()(): The datamodel was null.");
 +      ConnectionPool::handle_error_cerr_only();
 +      RelatedRecord_HandlePythonError();
 +    }
 +    else
 +    {
 +      g_warning("PyGlomRelatedRecord::setitem()(): No related records exist yet for relationship %s.",  m_relationship->get_name().c_str());
      }
    }
  
@@@ -193,18 -188,15 +193,18 @@@ boost::python::object PyGlomRelatedReco
    }
  
    //Get the aggregate value from the related records:
 -  const Glib::ustring sql_query = "SELECT " + aggregate + "(\"" + related_table + "\".\"" + field_name + "\") FROM \"" + related_table + "\""
 -    + " WHERE \"" + related_table + "\".\"" + related_key_name + "\" = " + m_from_key_value_sqlized;
 +  Glib::RefPtr<Gnome::Gda::SqlBuilder> builder =
 +    Gnome::Gda::SqlBuilder::create(Gnome::Gda::SQL_STATEMENT_SELECT);
 +  builder->add_function(aggregate, builder->add_id(field_name)); //TODO: It would be nice to specify the table here too.
 +  builder->select_add_target(related_table);
 +  builder->set_where(
 +    builder->add_cond(Gnome::Gda::SQL_OPERATOR_TYPE_EQ,
 +      builder->add_id(related_key_name), //TODO: It would nice to specify the table name here too.
 +      builder->add_expr(m_from_key_value)));
 +
-  
+ 
    //std::cout << "PyGlomRelatedRecord: Executing:  " << sql_query << std::endl;
 -#ifdef GLIBMM_EXCEPTIONS_ENABLED
 -  Glib::RefPtr<Gnome::Gda::DataModel> datamodel = gda_connection->statement_execute_select(sql_query);
 -#else
 -  std::auto_ptr<Glib::Error> error;
 -  Glib::RefPtr<Gnome::Gda::DataModel> datamodel = gda_connection->statement_execute_select(sql_query, Gnome::Gda::STATEMENT_MODEL_RANDOM_ACCESS, error);
 +  Glib::RefPtr<Gnome::Gda::DataModel> datamodel = gda_connection->statement_execute_select_builder(builder);
  
    // Ignore the error: The case that the command execution didn't return
    // a datamodel is handled below.
@@@ -251,13 -248,11 +251,11 @@@ boost::python::object PyGlomRelatedReco
    return generic_aggregate(field_name, "max");
  }
  
- void PyGlomRelatedRecord_SetRelationship(PyGlomRelatedRecord* self, const sharedptr<const Relationship>& relationship, const Gnome::Gda::Value& from_key_value,  Document* document)
 -void PyGlomRelatedRecord::set_relationship(const sharedptr<const Relationship>& relationship, const Glib::ustring& from_key_value_sqlized,  Document* document)
++void PyGlomRelatedRecord::set_relationship(const sharedptr<const Relationship>& relationship, const Gnome::Gda::Value& from_key_value,  Document* document)
  {
-   self->m_relationship = relationship;
- 
-   self->m_from_key_value = from_key_value;
- 
-   self->m_document = document;
+   m_relationship = relationship;
 -  m_from_key_value_sqlized = from_key_value_sqlized;
++  m_from_key_value = from_key_value;
+   m_document = document;
  }
  
  } //namespace Glom
diff --cc glom/libglom/python_embed/py_glom_relatedrecord.h
index 7c92734,918794f..09b360f
--- a/glom/libglom/python_embed/py_glom_relatedrecord.h
+++ b/glom/libglom/python_embed/py_glom_relatedrecord.h
@@@ -38,6 -38,8 +38,8 @@@ public
    PyGlomRelatedRecord();
    ~PyGlomRelatedRecord();
  
 -  void set_relationship(const sharedptr<const Relationship>& relationship, const Glib::ustring& from_key_value_sqlized, Document* document);
++  void set_relationship(const sharedptr<const Relationship>& relationship, const Gnome::Gda::Value& from_key_value, Document* document);
+ 
    boost::python::object sum(const std::string& field_name) const;
    boost::python::object count(const std::string& field_name) const;
    boost::python::object min(const std::string& field_name) const;
@@@ -63,12 -65,10 +65,6 @@@ private
    mutable type_map_field_values m_map_field_values; //A cache.
  };
  
- void PyGlomRelatedRecord_SetRelationship(PyGlomRelatedRecord* self, const sharedptr<const Relationship>& relationship, const Gnome::Gda::Value& from_key_value, Document* document);
- 
--/*
--void PyGlomRelatedRecord_SetConnection(PyGlomRelatedRecord* self, const Glib::RefPtr<Gnome::Gda::Connection>& connection);
--*/
--
  } //namespace Glom
  
  



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]