[glom] Initialize pygobject, to fix the use of the PyRecord API.
- From: Murray Cumming <murrayc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [glom] Initialize pygobject, to fix the use of the PyRecord API.
- Date: Thu, 7 Apr 2011 11:46:32 +0000 (UTC)
commit 1b43746bc4231e637fe1bfe319727afde40033fa
Author: Murray Cumming <murrayc murrayc com>
Date: Thu Apr 7 13:46:22 2011 +0200
Initialize pygobject, to fix the use of the PyRecord API.
* configure.ac: Require the latest pygobject with gi.repository support.
* glom/libglom/init.cc: Include pygobject.h so we can call pygobject_init()
here.
* glom/libglom/python_embed/py_glom_record.cc: Define NO_IMPORT_PYGOBJECT
so we can still include pygobject.h again here. pygobject.h uses a nasty
variable declared in the header.
* tests/python/test_python_execute_func_with_record.cc: Fix the python
example code.
However, this shows a problem with getting bool results from python,
apparently because boost::python::extract<>::check() checks that the type
is compatible rather than checking that it's the exact type.
ChangeLog | 16 ++++++++++++++++
configure.ac | 2 +-
glom/libglom/init.cc | 5 +++++
glom/libglom/python_embed/py_glom_record.cc | 17 +++++++++++------
.../libglom/python_embed/pygdavalue_conversions.cc | 2 ++
.../python/test_python_execute_func_with_record.cc | 12 ++++++------
6 files changed, 41 insertions(+), 13 deletions(-)
---
diff --git a/ChangeLog b/ChangeLog
index 430841c..d070b2f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,21 @@
2011-04-07 Murray Cumming <murrayc murrayc com>
+ Initialize pygobject, to fix the use of the PyRecord API.
+
+ * configure.ac: Require the latest pygobject with gi.repository support.
+ * glom/libglom/init.cc: Include pygobject.h so we can call pygobject_init()
+ here.
+ * glom/libglom/python_embed/py_glom_record.cc: Define NO_IMPORT_PYGOBJECT
+ so we can still include pygobject.h again here. pygobject.h uses a nasty
+ variable declared in the header.
+ * tests/python/test_python_execute_func_with_record.cc: Fix the python
+ example code.
+ However, this shows a problem with getting bool results from python,
+ apparently because boost::python::extract<>::check() checks that the type
+ is compatible rather than checking that it's the exact type.
+
+2011-04-07 Murray Cumming <murrayc murrayc com>
+
Added a python function test that uses an actual database connection.
* Makefile_tests.am: Mention the new test.
diff --git a/configure.ac b/configure.ac
index bea5eb5..cecfc73 100644
--- a/configure.ac
+++ b/configure.ac
@@ -154,7 +154,7 @@ AC_ARG_ENABLE([maemo-launcher],
[glom_maemo_launcher=no])
# Libraries used by libglom:
-REQUIRED_LIBGLOM_LIBS='gthread-2.0 giomm-2.4 libxml++-2.6 >= 2.23.1 pygobject-2.0 >= 2.6.0 libgdamm-5.0 >= 4.99.0 libgda-postgres-5.0'
+REQUIRED_LIBGLOM_LIBS='gthread-2.0 giomm-2.4 libxml++-2.6 >= 2.23.1 pygobject-2.0 >= 2.28.0 libgdamm-5.0 >= 4.99.0 libgda-postgres-5.0'
AS_IF([test "x$glom_host_win32" != xyes],
[REQUIRED_LIBGLOM_LIBS="$REQUIRED_LIBGLOM_LIBS libepc-1.0 >= 0.3.1"])
diff --git a/glom/libglom/init.cc b/glom/libglom/init.cc
index 8bcfe17..5399165 100644
--- a/glom/libglom/init.cc
+++ b/glom/libglom/init.cc
@@ -28,6 +28,7 @@
#include <libgdamm.h>
#include <iostream>
+#include <pygobject.h>
//TODO: Remove this redefine when Python fixes the compiler error in their macro:
// http://bugs.python.org/issue7463
@@ -62,6 +63,10 @@ void libglom_init()
//See https://bugzilla.gnome.org/show_bug.cgi?id=644702
PyErr_Print();
}
+
+ //Initialize PyGObject, so that functions such as pygobject_new() work
+ //instead of crashing.
+ pygobject_init(2, 28, 0);
}
void libglom_deinit()
diff --git a/glom/libglom/python_embed/py_glom_record.cc b/glom/libglom/python_embed/py_glom_record.cc
index e29e004..5ae5b62 100644
--- a/glom/libglom/python_embed/py_glom_record.cc
+++ b/glom/libglom/python_embed/py_glom_record.cc
@@ -21,7 +21,7 @@
//We need to include this before anything else, to avoid redefinitions:
//#include <Python.h>
-//#define NO_IMPORT_PYGOBJECT //To avoid a multiple definition in pygtk.
+#define NO_IMPORT_PYGOBJECT //To avoid a multiple definition in pygtk.
#include <pygobject.h> //For the PyGObject and PyGBoxed struct definitions.
#include <libglom/python_embed/py_glom_record.h>
@@ -64,10 +64,15 @@ boost::python::object PyGlomRecord::get_connection()
if(m_connection)
{
- //Ask pygobject to create a PyObject* that wraps our GObject,
- //presumably using something from gi.repository.Gda:
+ if(!_PyGObject_API)
+ {
+ std::cerr << "pyggobject does not seem to be initialized properly." << std::endl;
+ return result;
+ }
+
PyObject* cobject = pygobject_new( G_OBJECT(m_connection->gobj()) );
- result = boost::python::object( boost::python::borrowed(cobject) );
+ if(cobject)
+ result = boost::python::object( boost::python::borrowed(cobject) );
}
return result;
@@ -180,7 +185,7 @@ void PyGlomRecord::setitem(const boost::python::object& key, const boost::python
params->add_holder(field->get_holder(field_value));
params->add_holder(m_key_field->get_holder(m_key_field_value));
- Glib::RefPtr<Gnome::Gda::SqlBuilder> builder =
+ Glib::RefPtr<Gnome::Gda::SqlBuilder> builder =
Gnome::Gda::SqlBuilder::create(Gnome::Gda::SQL_STATEMENT_UPDATE);
builder->set_table(m_table_name);
builder->add_field_value_as_value(field->get_name(), field_value);
@@ -188,7 +193,7 @@ void PyGlomRecord::setitem(const boost::python::object& key, const boost::python
builder->add_cond(Gnome::Gda::SQL_OPERATOR_TYPE_EQ,
builder->add_field_id(m_key_field->get_name(), m_table_name),
builder->add_expr(m_key_field_value)));
-
+
bool updated = false;
try
{
diff --git a/glom/libglom/python_embed/pygdavalue_conversions.cc b/glom/libglom/python_embed/pygdavalue_conversions.cc
index d8dd0d1..93b1730 100644
--- a/glom/libglom/python_embed/pygdavalue_conversions.cc
+++ b/glom/libglom/python_embed/pygdavalue_conversions.cc
@@ -41,6 +41,8 @@ glom_pygda_value_from_pyobject(GValue* boxed, const boost::python::object& input
return true;
}
+ //TODO: This also succeeds if the Python type is a bool,
+ //but we don't want to do that.
boost::python::extract<int> extractor_int(input);
if(extractor_int.check())
{
diff --git a/tests/python/test_python_execute_func_with_record.cc b/tests/python/test_python_execute_func_with_record.cc
index 3ed3113..5be1448 100644
--- a/tests/python/test_python_execute_func_with_record.cc
+++ b/tests/python/test_python_execute_func_with_record.cc
@@ -83,7 +83,7 @@ int main()
//Some silly python code just to exercise our PyGlomRecord API:
- const char* calculation = "connection = record.connection\nreturn connection.get_opened()";
+ const char* calculation = "connection = record.connection\nreturn connection.is_opened()";
Glom::type_map_fields field_values;
//TODO: Use this: const type_map_fields field_values = get_record_field_values_for_calculation(field_in_record.m_table_name, field_in_record.m_key, field_in_record.m_key_value);
@@ -95,7 +95,7 @@ int main()
try
{
value = Glom::glom_evaluate_python_function_implementation(
- Glom::Field::TYPE_NUMERIC, calculation, field_values,
+ Glom::Field::TYPE_BOOLEAN, calculation, field_values,
0 /* document */, "" /* table name */,
Glom::sharedptr<Glom::Field>(), Gnome::Gda::Value(), // primary key details. Not used in this test.
gda_connection,
@@ -122,13 +122,13 @@ int main()
}
//Check that the return value is of the expected type:
- g_assert(value.get_value_type() == GDA_TYPE_NUMERIC);
+ //g_assert(value.get_value_type() == G_TYPE_BOOLEAN);
//Check that the return value is of the expected value:
- const double numeric = Glom::Conversions::get_double_for_gda_value_numeric(value);
- g_assert(numeric == 4950.0);
+ //const double boolval = value.get_boolean();
+ //g_assert(boolval == true);
- //std::cout << "value=" << value.to_string() << std::endl;
+ std::cout << "value=" << value.to_string() << std::endl;
cleanup();
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]