[PATCH] [REVIEW] python bindings and lost business data

Mark Jenkins mark at parit.ca
Wed Jun 9 19:53:44 EDT 2010


> Back to bug killing.

I came up with the attached patch to stop business objects from being lost.

The modules "gnucash/business-core-xml" and "gnucash/business-core-sql"
are now loaded.

I've tested this with
>>> from gnucash import Session
>>> s = Session('sqlite3:///full_path_to_file')
>>> s.save()
>>> s.end()

Will test more tomorrow, but I thought it was a good time for feedback
right now.

I'd appreciate it if there could be some review as to this being the
right approach or not. You don't actually have to know anything about
python or swig to help with this crucial part of the python bindings.
The init section in src/optional/python-bindings/gnucash_core.i is
simply C code that is called before any other GnuCash functions (like
qof_session_new) are called.

This, and the linking decisions in Makefile.am are the most critical
elements of the python bindings. Everything else is high level fluff to
create a object oriented API instead of the C style API. The content
really should be no different than what a C programmer trying to use the
GnuCash API in a fresh application would have to write prior to running
through a sequence of qof_session_new, qof_session_begin,
qof_session_load, qof_session_save, and qof_session_end .

With this patch, this init section in gnucash_core.i becomes:
g_type_init();
scm_init_guile();
gnc_module_load("gnucash/engine", 0);
gnc_module_load("gnucash/business-core", 0);
gnc_module_load("gnucash/business-core-xml", 0);
gnc_module_load("gnucash/business-core-sql", 0);

It strikes me as over kill that scheme is needed for this, but its my
understanding that the gnc_module stuff depends on that.

I took a first stab at looking for another approach. I looked into what
the cutecash folks had done and came up with this:
"""
qof_log_init();
qof_init();
gnc_module_system_init();
char * no_args[1] = { NULL };
gnc_engine_init_static(0, no_args);

gnc_module_init_backend_xml();
gnc_module_init_backend_dbi();
gnc_module_init_business_core_init();
gnc_module_init_business_core_xml_init();

void gnc_address_sql_initialize( void );
void gnc_billterm_sql_initialize( void );
void gnc_customer_sql_initialize( void );
void gnc_employee_sql_initialize( void );
void gnc_entry_sql_initialize( void );
void gnc_invoice_sql_initialize( void );
void gnc_job_sql_initialize( void );
void gnc_order_sql_initialize( void );
void gnc_owner_sql_initialize( void );
void gnc_taxtable_sql_initialize( void );
void gnc_vendor_sql_initialize( void );

gnc_address_sql_initialize();
gnc_billterm_sql_initialize();
gnc_customer_sql_initialize();
gnc_employee_sql_initialize();
gnc_entry_sql_initialize();
gnc_invoice_sql_initialize();
gnc_job_sql_initialize();
gnc_order_sql_initialize();
gnc_owner_sql_initialize();
gnc_taxtable_sql_initialize();
gnc_vendor_sql_initialize();
"""

That also seemed to work, but the additional linking I had to throw to
_gnucash_core_c_la_LIBADD (from
src/optional/python-bindings/Makefile.am) in against
${top_builddir}/src/backend/xml/libgncmod-backend-xml.la
${top_builddir}/src/business/business-core/xml/libgncmod-business-backend-xml.la

${top_builddir}/src/backend/dbi/libgncmod-backend-dbi.la
and
${top_builddir}/src/business/business-core/sql/libgncmod-business-backend-sql.la

resulted in a warning that linking against those wasn't portable.


Any advice?


Mark
-------------- next part --------------
A non-text attachment was scrubbed...
Name: fix_broken_business_objects_python_bindings.patch
Type: text/x-diff
Size: 473 bytes
Desc: not available
URL: <http://lists.gnucash.org/pipermail/gnucash-devel/attachments/20100609/a2fbcef0/attachment.bin>


More information about the gnucash-devel mailing list