[glom/boostpythonretry: 1/6] More
- From: Murray Cumming <murrayc src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [glom/boostpythonretry: 1/6] More
- Date: Tue, 2 Feb 2010 20:49:58 +0000 (UTC)
commit 8c18f486cf11021a30e2edfe62f7ed0b8b2a71d5
Author: Murray Cumming <murrayc murrayc com>
Date: Tue Feb 2 00:01:41 2010 +0100
More
Makefile_libglom.am | 2 +-
configure.ac | 2 +-
glom/libglom/python_embed/py_glom_record.cc | 3 +-
glom/libglom/python_embed/py_glom_relatedrecord.cc | 9 +--
...lue_conversions.c => pygdavalue_conversions.cc} | 86 ++++++++------------
glom/libglom/python_embed/pygdavalue_conversions.h | 16 ++--
6 files changed, 50 insertions(+), 68 deletions(-)
---
diff --git a/Makefile_libglom.am b/Makefile_libglom.am
index 0868d98..6492249 100644
--- a/Makefile_libglom.am
+++ b/Makefile_libglom.am
@@ -148,7 +148,7 @@ glom_libglom_libglom_1_14_la_SOURCES = \
glom/libglom/python_embed/py_glom_related.h \
glom/libglom/python_embed/py_glom_relatedrecord.cc \
glom/libglom/python_embed/py_glom_relatedrecord.h \
- glom/libglom/python_embed/pygdavalue_conversions.c \
+ glom/libglom/python_embed/pygdavalue_conversions.cc \
glom/libglom/python_embed/pygdavalue_conversions.h
glom_libglom_libglom_1_14_la_SOURCES += \
diff --git a/configure.ac b/configure.ac
index 524c799..bdbe58f 100644
--- a/configure.ac
+++ b/configure.ac
@@ -200,7 +200,7 @@ AC_CHECK_FUNCS([strptime])
# For instance: PYTHON=python2.5
MM_CHECK_MODULE_PYTHON
-BOOST_PYTHON_LIBS="-lboost_python-gcc43-mt-1_39.so.1.39."
+BOOST_PYTHON_LIBS="-lboost_python-gcc43-mt-1_39"
#BOOST_PYTHON_LIBS="-lboost_python-mt-py25.so.1.39"
BOOST_PYTHON_CFLAGS="-I/opt/gnome228/include/boost-1_39"
AC_SUBST([BOOST_PYTHON_LIBS])
diff --git a/glom/libglom/python_embed/py_glom_record.cc b/glom/libglom/python_embed/py_glom_record.cc
index 18ab441..6a4e0cb 100644
--- a/glom/libglom/python_embed/py_glom_record.cc
+++ b/glom/libglom/python_embed/py_glom_record.cc
@@ -142,8 +142,7 @@ boost::python::object PyGlomRecord::getitem(boost::python::object cppitem)
PyGlomRecord::type_map_field_values::const_iterator iterFind = m_pMap_field_values->find(key);
if(iterFind != m_pMap_field_values->end())
{
- PyObject* cResult = glom_pygda_value_as_pyobject(iterFind->second.gobj(), true /* copy */);
- return boost::python::object(); //TODO_Hack: boost::python::object(cResult);
+ return glom_pygda_value_as_boost_pyobject(iterFind->second);
}
return boost::python::object();
diff --git a/glom/libglom/python_embed/py_glom_relatedrecord.cc b/glom/libglom/python_embed/py_glom_relatedrecord.cc
index cc4acd3..329aaf8 100644
--- a/glom/libglom/python_embed/py_glom_relatedrecord.cc
+++ b/glom/libglom/python_embed/py_glom_relatedrecord.cc
@@ -98,8 +98,7 @@ boost::python::object PyGlomRelatedRecord::getitem(boost::python::object cppitem
if(iterFind != m_pMap_field_values->end())
{
//If the value has already been stored, then just return it again:
- PyObject* cResult = glom_pygda_value_as_pyobject(iterFind->second.gobj(), true /* copy */);
- return boost::python::object(); //TODO_Hack: boost::python::object(cResult);
+ return glom_pygda_value_as_boost_pyobject(iterFind->second);
}
else
{
@@ -168,8 +167,7 @@ boost::python::object PyGlomRelatedRecord::getitem(boost::python::object cppitem
//Cache it, in case it's asked-for again.
(*(m_pMap_field_values))[field_name] = value;
- PyObject* cResult = glom_pygda_value_as_pyobject(value.gobj(), true /* copy */);
- return boost::python::object(); //TODO_Hack: boost::python::object(cResult);
+ return glom_pygda_value_as_boost_pyobject(value);
}
else if(!datamodel)
{
@@ -253,8 +251,7 @@ boost::python::object PyGlomRelatedRecord::generic_aggregate(const std::string&
//Cache it, in case it's asked-for again.
(*m_pMap_field_values)[field_name] = value;
- PyObject* cResult = glom_pygda_value_as_pyobject(value.gobj(), true /* copy */);
- return boost::python::object(); //TODO_Hack: boost::python::object(cResult);
+ return glom_pygda_value_as_boost_pyobject(value);
}
else if(!datamodel)
{
diff --git a/glom/libglom/python_embed/pygdavalue_conversions.c b/glom/libglom/python_embed/pygdavalue_conversions.cc
similarity index 63%
rename from glom/libglom/python_embed/pygdavalue_conversions.c
rename to glom/libglom/python_embed/pygdavalue_conversions.cc
index fd49565..4735f19 100644
--- a/glom/libglom/python_embed/pygdavalue_conversions.c
+++ b/glom/libglom/python_embed/pygdavalue_conversions.cc
@@ -30,7 +30,7 @@ glom_pygda_value_from_pyobject(GValue *boxed, PyObject *input)
we must still have the get_*() functions in the python API.
*/
- if (G_IS_VALUE (boxed)) g_value_unset (boxed);
+ if (G_IS_VALUE (boxed)) g_value_unset(boxed);
if (input == Py_None) {
/* Leave value uninitialized to represent NULL value */
} else if (PyString_Check (input)) {
@@ -63,7 +63,7 @@ glom_pygda_value_from_pyobject(GValue *boxed, PyObject *input)
} else if (PyDate_Check (input)) {
GDate *gda = g_date_new_dmy(
PyDateTime_GET_DAY(input),
- PyDateTime_GET_MONTH(input),
+ (GDateMonth)PyDateTime_GET_MONTH(input),
PyDateTime_GET_YEAR(input) );
g_value_init (boxed, G_TYPE_DATE);
g_value_set_boxed(boxed, gda);
@@ -84,89 +84,73 @@ glom_pygda_value_from_pyobject(GValue *boxed, PyObject *input)
return 0; /* success. */
}
-/**
- * pygda_value_as_pyobject:
- * @value: the GValue object.
- * @copy_boxed: true if boxed values should be copied.
- *
- * This function creates/returns a Python wrapper object that
- * represents the GValue passed as an argument.
- *
- * Returns: a PyObject representing the value.
- */
-PyObject *
-glom_pygda_value_as_pyobject(const GValue *boxed, gboolean copy_boxed)
+boost::python::object glom_pygda_value_as_boost_pyobject(const Glib::ValueBase& value)
{
- copy_boxed = FALSE; //Just to avoid the "unused paramter" and "parameter name omitted" warnings.
-
- GType value_type = GDA_TYPE_NULL;
- PyObject* ret = 0;
-
- value_type = G_VALUE_TYPE ((GValue*)boxed);
+ GValue* boxed = const_cast<GValue*>(value.gobj());
+ const GType value_type = G_VALUE_TYPE(boxed);
+ boost::python::object ret;
#if PY_VERSION_HEX >= 0x02040000
PyDateTime_IMPORT; /* So we can use PyDate*() functions. */
#endif
- if (value_type == GDA_TYPE_NULL) {
- Py_INCREF (Py_None);
- ret = Py_None;
- } else if (value_type == G_TYPE_INT64) {
- ret = PyLong_FromLong (g_value_get_int64 ((GValue*)boxed));
+ if (value_type == G_TYPE_INT64) {
+ ret = boost::python::object(g_value_get_int64(boxed));
} else if (value_type == G_TYPE_UINT64) {
- ret = PyLong_FromLong (g_value_get_uint64 ((GValue*)boxed));
+ ret = boost::python::object(g_value_get_uint64(boxed));
} else if (value_type == GDA_TYPE_BINARY) {
- const GdaBinary* gdabinary = gda_value_get_binary((GValue*)boxed);
- ret = PyString_FromString ((const char*)gdabinary->data); /* TODO: Use the size. TODO: Check for null GdaBinary. */
+ const GdaBinary* gdabinary = gda_value_get_binary(boxed);
+ ret = boost::python::object((const char*)gdabinary->data); /* TODO: Use the size. TODO: Check for null GdaBinary. */
} else if (value_type == GDA_TYPE_BLOB) {
- /* const GdaBlob* val = gda_value_get_blob ((GValue*)boxed); */
- ret = 0; /* TODO: This thing has a whole read/write API. */
+ /* const GdaBlob* val = gda_value_get_blob (boxed; */
+ /* TODO: This thing has a whole read/write API. */
} else if (value_type == G_TYPE_BOOLEAN) {
- ret = PyBool_FromLong (g_value_get_boolean ((GValue*)boxed));
+ ret = boost::python::object((bool)g_value_get_boolean(boxed));
#if PY_VERSION_HEX >= 0x02040000
} else if (value_type == G_TYPE_DATE) {
- const GDate* val = (const GDate*)g_value_get_boxed ((GValue*)boxed);
+ /* TODO:
+ const GDate* val = (const GDate*)g_value_get_boxed(boxed);
if(val)
ret = PyDate_FromDate(val->year, val->month, val->day);
+ */
#endif
} else if (value_type == G_TYPE_DOUBLE) {
- ret = PyFloat_FromDouble (g_value_get_double ((GValue*)boxed));
+ ret = boost::python::object(g_value_get_double(boxed));
} else if (value_type == GDA_TYPE_GEOMETRIC_POINT) {
- const GdaGeometricPoint* val = gda_value_get_geometric_point ((GValue*)boxed);
+ /*
+ const GdaGeometricPoint* val = gda_value_get_geometric_point(boxed;
ret = Py_BuildValue ("(ii)", val->x, val->y);
+ */
} else if (value_type == G_TYPE_INT) {
- ret = PyInt_FromLong (g_value_get_int ((GValue*)boxed));
+ ret = boost::python::object(g_value_get_int(boxed));
} else if (value_type == GDA_TYPE_NUMERIC) {
- const GdaNumeric* val = gda_value_get_numeric ((GValue*)boxed);
+ const GdaNumeric* val = gda_value_get_numeric(boxed);
const gchar* number_as_text = val->number; /* Formatted according to the C locale, probably. */
/* This would need a string _object_: ret = PyFloat_FromString(number_as_text, 0); */
- ret = PyFloat_FromDouble (g_ascii_strtod (number_as_text, NULL));
+ ret = boost::python::object(g_ascii_strtod(number_as_text, 0));
} else if (value_type == G_TYPE_FLOAT) {
- ret = PyFloat_FromDouble (g_value_get_float ((GValue*)boxed));
+ ret = boost::python::object(g_value_get_float(boxed));
} else if (value_type == GDA_TYPE_SHORT) {
- ret = PyInt_FromLong (gda_value_get_short ((GValue*)boxed));
+ ret = boost::python::object(gda_value_get_short(boxed));
} else if (value_type == G_TYPE_STRING) {
- const gchar* val = g_value_get_string ((GValue*)boxed);
- ret = PyString_FromString (val);
+ const gchar* val = g_value_get_string(boxed);
+ ret = boost::python::object(val);
} else if (value_type == GDA_TYPE_TIME) {
#if PY_VERSION_HEX >= 0x02040000
- const GdaTime* val = gda_value_get_time ((GValue*)boxed);
- ret = PyTime_FromTime(val->hour, val->minute, val->second, 0); /* TODO: Should we ignore GDate::timezone ? */
+ //const GdaTime* val = gda_value_get_time(boxed)
+ //ret = PyTime_FromTime(val->hour, val->minute, val->second, 0); /* TODO: Should we ignore GDate::timezone ? */
} else if (value_type == GDA_TYPE_TIMESTAMP) {
- const GdaTimestamp* val = gda_value_get_timestamp ((GValue*)boxed);
- ret = PyDateTime_FromDateAndTime(val->year, val->month, val->day, val->hour, val->minute, val->second, 0); /* TODO: Should we ignore GdaTimestamp::timezone ? */
+ //const GdaTimestamp* val = gda_value_get_timestamp (boxed;
+ //ret = PyDateTime_FromDateAndTime(val->year, val->month, val->day, val->hour, val->minute, val->second, 0); /* TODO: Should we ignore GdaTimestamp::timezone ? */
#endif
} else if (value_type == GDA_TYPE_SHORT) {
- ret = PyInt_FromLong (gda_value_get_short ((GValue*)boxed));
+ ret = boost::python::object(gda_value_get_short(boxed));
} else if (value_type == GDA_TYPE_USHORT) {
- ret = PyInt_FromLong (gda_value_get_ushort ((GValue*)boxed));
+ ret = boost::python::object(gda_value_get_ushort(boxed));
} else if (value_type == G_TYPE_UINT) {
- ret = PyInt_FromLong (g_value_get_uint ((GValue*)boxed));
+ ret = boost::python::object(g_value_get_uint(boxed));
} else {
g_warning ("G_VALUE_TYPE() returned unknown type %" G_GSIZE_FORMAT, value_type);
-
- Py_INCREF (Py_None);
- ret = Py_None;
}
return ret;
diff --git a/glom/libglom/python_embed/pygdavalue_conversions.h b/glom/libglom/python_embed/pygdavalue_conversions.h
index 8ce78bb..b9af87f 100644
--- a/glom/libglom/python_embed/pygdavalue_conversions.h
+++ b/glom/libglom/python_embed/pygdavalue_conversions.h
@@ -1,17 +1,19 @@
-#include <pygobject.h>
-#include <libgda/libgda.h>
-
#ifndef GLOM_PYGDA_VALUE_CONVERSIONS_H
#define GLOM_PYGDA_VALUE_CONVERSIONS_H
-G_BEGIN_DECLS
+//We need to include this before anything else, to avoid redefinitions:
+#include <Python.h>
+
+#include <glibmm/value.h>
+#include <libgda/libgda.h>
+#include <boost/python.hpp>
int
glom_pygda_value_from_pyobject(GValue *boxed, PyObject *input);
-PyObject *
-glom_pygda_value_as_pyobject(const GValue *value, gboolean copy_boxed);
+//PyObject *
+//glom_pygda_value_as_pyobject(const GValue *value, gboolean copy_boxed);
-G_END_DECLS
+boost::python::object glom_pygda_value_as_boost_pyobject(const Glib::ValueBase& value);
#endif //GLOM_PYGDA_VALUE_CONVERSIONS_H
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]