Merge gda-dev2 branch into trunk.

This introduces the dbi backend and the --enable-dbi configure option.



git-svn-id: svn+ssh://svn.gnucash.org/repo/gnucash/trunk@17444 57a11ea4-9604-0410-9ed3-97b8803252fd
This commit is contained in:
Phil Longstaff 2008-08-01 16:02:07 +00:00
parent 8bc6249efb
commit 9173035d57
152 changed files with 14402 additions and 759 deletions

25
DBI_STATUS Normal file
View File

@ -0,0 +1,25 @@
Status of the DBI backend.
Code for all standard and business objects has been written. The following
bugs/issues are known.
* Initial save performance is better than it used to be, but is still slow.
For example, saving my file with ~8000 transactions and ~21000 splits takes
13 minutes to an sqlite db.
* Foreign key definitions should be used for referential integrity.
* (Maybe) Keep an 'old values' table for each main table. When a record is
updated, copy the old record to the 'old values' table first to keep track of
any changes.
* Use prepared statements
* Use cursor-based data models when reading from the db for better performance
* Write automated tests
* Write doxygen comment headers
* Don't need a log file
* Certain dialogs create an object when opened and update it as they go along.
This can result in trying to save invalid objects:
- Price editor (new price has no commodity or currency)
- New invoice
* Need transactions to group updates to multiple objects
* Possibly mark commodities that are in the db so that they don't need to be
queried every time.
* The sqlite db file is *much* larger than the gzipped XML file.

View File

@ -604,6 +604,55 @@ AC_SUBST(QOF_PREFIX)
AC_SUBST(QOF_LIB_DIR) AC_SUBST(QOF_LIB_DIR)
AC_SUBST(QOF_XML_DIR) AC_SUBST(QOF_XML_DIR)
AC_DEFINE(QOF_DISABLE_DEPRECATED,1, [Don't use deprecated qof functions])
### -----------------------
### LIBGDA
#AC_ARG_ENABLE(gda,
# [AS_HELP_STRING([--enable-gda],[build with the libgda backend])],
# [case "${enableval}" in
# yes) want_gda=true ;;
# no) want_gda=false ;;
# *) want_gda=false ;;
# esac],
# [want_gda=false])
#if test x${want_gda} = xtrue
#then
# PKG_CHECK_MODULES(LIBGDA, libgda-4.0 >= 3.99.2, [GDA_DIR=gda])
#fi
#AC_SUBST(GDA_DIR)
#AC_SUBST(LIBGDA_CFLAGS)
#AC_SUBST(LIBGDA_LIBS)
### ----------------------
### LIBDBI
AC_ARG_ENABLE(dbi,
[AS_HELP_STRING([--enable-dbi],[build with the libdbi backend])],
[case "${enableval}" in
yes) want_dbi=true ;;
no) want_dbi=false ;;
*) want_dbi=false ;;
esac],
[want_dbi=false])
if test x${want_dbi} = xtrue
then
AC_CHECK_HEADERS(dbi/dbi.h)
if test "x$ac_cv_header_dbi_dbi_h" != xno; then
AC_ARG_WITH( dbi-dbd-dir,
[AS_HELP_STRING([--with-dbi-dbd-dir=PATH],[specify location of libdbi drivers @<:@default=/usr/lib/dbd@:>@])],
GNC_DBD_DIR="$with_dbi_dbd_dir",
GNC_DBD_DIR="/usr/lib/dbd")
LIBDBI_LIBS=-ldbi
DBI_DIR=dbi
else
AC_MSG_ERROR( Unable to find dbi/dbi.h )
fi
fi
AC_SUBST(LIBDBI_LIBS)
AC_SUBST(DBI_DIR)
AC_SUBST(GNC_DBD_DIR)
### -------------------------------------------------------------------------- ### --------------------------------------------------------------------------
### Variables ### Variables
### Set up all the initial variable values... ### Set up all the initial variable values...
@ -653,94 +702,6 @@ AC_ARG_ENABLE( ref-counts-dumps,
AC_DEFINE(DEBUG_REFERENCE_COUNTING,0,Enable reference count dumps) ) AC_DEFINE(DEBUG_REFERENCE_COUNTING,0,Enable reference count dumps) )
### --------------------------------------------------------------------------
### SQL
# Check to see if the user wants to have Postgres support
#
# hack alert ... we should use 'pg_config --includedir' and
# 'pg_config --libdir' to find paths; unfortunately pg_config itself
# is hard to find :-(
AC_ARG_ENABLE( sql,
[ --enable-sql compile with sql support],
[
PG_CONFIG=`which pg_config`
if test "x$PG_CONFIG" = "x" ; then
PG_CONFIG="/usr/lib/postgresql/bin/pg_config"
fi
if test "x$enableval" != "xno" ; then
PGSQL_CFLAGS=`${PG_CONFIG} --includedir`
if test "x$PGSQL_CFLAGS" != x; then
PGSQL_CFLAGS="-I${PGSQL_CFLAGS}"
fi
AS_SCRUB_INCLUDE(PGSQL_CFLAGS)
# XXX Fixme: CPPFLAGS are saved but CFLAGS are altered later on and not restored.
saved_CPPFLAGS="${CPPFLAGS}"
saved_CFLAGS="${CFLAGS}"
CPPFLAGS="${CPPFLAGS} ${PGSQL_CFLAGS}"
AC_CHECK_HEADERS(pgsql/libpq-fe.h postgresql/libpq-fe.h libpq-fe.h)
if test "x$ac_cv_header_pgsql_libpq_fe_h$ac_cv_header_postgresql_libpq_fe_h$ac_cv_header_libpq_fe_h" = xnonono; then
AC_MSG_ERROR([Cannot find PostgreSQL headers; won't build sql backend])
else
master_dirs="/usr/include /usr/local/include"
if test "x$ac_cv_header_pgsql_libpq_fe_h" != xno; then
for dir in $master_dirs; do
if test -f "$dir/pgsql/libpq-fe.h"; then
CFLAGS="${CFLAGS} -I$dir/pgsql"
break
fi
done
elif test "x$ac_cv_header_postgresql_libpq_fe_h" != xno; then
for dir in $master_dirs; do
if test -f "$dir/postgresql/libpq-fe.h"; then
CFLAGS="${CFLAGS} -I$dir/postgresql"
break
fi
done
fi
AS_SCRUB_INCLUDE(CFLAGS)
PGSQL_LIBS=`${PG_CONFIG} --libdir`
if test "x$PGSQL_LIBS" != x; then
PGSQL_LIBS="-L${PGSQL_LIBS}"
fi
saved_LIBS="$LIBS"
LIBS="${PGSQL_LIBS} -lpq $LIBS"
AC_MSG_CHECKING(for libpq)
AC_TRY_LINK(
[
#include <libpq-fe.h>
],
[
PQconnectdb("asdf");
],
[
AC_MSG_RESULT(yes)
SQL_DIR=postgres
],
[
AC_MSG_ERROR([Cannot find PostgreSQL libraries; will not build sql backend])
]
)
LIBS="$saved_LIBS"
fi
CPPFLAGS="$saved_CPPFLAGS"
CFLAGS="$saved_CFLAGS"
fi
]
)
AC_SUBST(PGSQL_CFLAGS)
AC_SUBST(PGSQL_LIBS)
AC_SUBST(SQL_DIR)
### -------------------------------------------------------------------------- ### --------------------------------------------------------------------------
### RPC has been removed in gnucash 1.9.0 ### RPC has been removed in gnucash 1.9.0
@ -1497,12 +1458,16 @@ AC_CONFIG_FILES(po/Makefile.in
src/app-utils/Makefile src/app-utils/Makefile
src/app-utils/test/Makefile src/app-utils/test/Makefile
src/backend/Makefile src/backend/Makefile
src/backend/dbi/Makefile
src/backend/dbi/test/Makefile
src/backend/file/Makefile src/backend/file/Makefile
src/backend/file/test/Makefile src/backend/file/test/Makefile
src/backend/file/test/test-files/Makefile src/backend/file/test/test-files/Makefile
src/backend/file/test/test-files/xml2/Makefile src/backend/file/test/test-files/xml2/Makefile
src/backend/postgres/Makefile src/backend/postgres/Makefile
src/backend/postgres/test/Makefile src/backend/postgres/test/Makefile
src/backend/sql/Makefile
src/backend/sql/test/Makefile
src/bin/Makefile src/bin/Makefile
src/bin/overrides/Makefile src/bin/overrides/Makefile
src/bin/test/Makefile src/bin/test/Makefile
@ -1587,6 +1552,7 @@ AC_CONFIG_FILES(po/Makefile.in
src/test-core/Makefile src/test-core/Makefile
src/business/Makefile src/business/Makefile
src/business/business-core/Makefile src/business/business-core/Makefile
src/business/business-core/sql/Makefile
src/business/business-core/test/Makefile src/business/business-core/test/Makefile
src/business/business-core/file/Makefile src/business/business-core/file/Makefile
src/business/business-utils/Makefile src/business/business-utils/Makefile
@ -1611,8 +1577,11 @@ output_qof_prefix=`eval eval eval echo $QOF_PREFIX`
output_qof_lib_dir=`eval eval eval echo $QOF_LIB_DIR` output_qof_lib_dir=`eval eval eval echo $QOF_LIB_DIR`
output_qof_xml_dir=`eval eval eval echo $QOF_XML_DIR` output_qof_xml_dir=`eval eval eval echo $QOF_XML_DIR`
if test x${SQL_DIR} != x; then if test x${DBI_DIR} != x; then
components="$components sql" components="$components dbi"
fi
if test x${GDA_DIR} != x; then
components="$components gda"
fi fi
if test x${OFX_DIR} != x; then if test x${OFX_DIR} != x; then
components="$components ofx" components="$components ofx"

View File

@ -1052,7 +1052,7 @@ gnc_iso8601_to_timespec_gmt(const char *str)
/* Timezone format can be +hh or +hhmm or +hh.mm (or -) (or not present) */ /* Timezone format can be +hh or +hhmm or +hh.mm (or -) (or not present) */
str += strcspn (str, "+-"); str += strcspn (str, "+-");
if (str) if (*str)
{ {
buf[0] = str[0]; buf[0] = str[0];
buf[1] = str[1]; buf[1] = str[1];

View File

@ -970,11 +970,11 @@ qof_commit_edit_part2(QofInstance *inst,
/* XXX the backend commit code should clear dirty!! */ /* XXX the backend commit code should clear dirty!! */
priv->dirty = FALSE; priv->dirty = FALSE;
} }
if (dirty && qof_get_alt_dirty_mode() && // if (dirty && qof_get_alt_dirty_mode() &&
!(priv->infant && priv->do_free)) { // !(priv->infant && priv->do_free)) {
qof_collection_mark_dirty(priv->collection); // qof_collection_mark_dirty(priv->collection);
qof_book_mark_dirty(priv->book); // qof_book_mark_dirty(priv->book);
} // }
priv->infant = FALSE; priv->infant = FALSE;
if (priv->do_free) { if (priv->do_free) {

View File

@ -63,6 +63,20 @@ qof_backend_register_provider (QofBackendProvider *prov)
provider_list = g_slist_append (provider_list, prov); provider_list = g_slist_append (provider_list, prov);
} }
GList*
qof_backend_get_registered_access_method_list(void)
{
GList* list = NULL;
GSList* node;
for( node = provider_list; node != NULL; node = node->next ) {
QofBackendProvider *prov = node->data;
list = g_list_append( list, (gchar*)prov->access_method );
}
return list;
}
/* ====================================================================== */ /* ====================================================================== */
/* hook routines */ /* hook routines */

View File

@ -436,5 +436,10 @@ gboolean qof_session_export (QofSession *tmp_session,
QofSession *real_session, QofSession *real_session,
QofPercentageFunc percentage_func); QofPercentageFunc percentage_func);
/** Return a list of strings for the registered access methods. The owner is
* responsible for freeing the list but not the strings.
*/
GList* qof_backend_get_registered_access_method_list(void);
#endif /* QOF_SESSION_H */ #endif /* QOF_SESSION_H */
/** @} */ /** @} */

View File

@ -9,6 +9,8 @@ EXTRA_DIST = \
install-fq-mods.bat \ install-fq-mods.bat \
libofx-0.8.3-patch.diff \ libofx-0.8.3-patch.diff \
opensp-1.5.2-patch.diff \ opensp-1.5.2-patch.diff \
libgda-3.1.2-patch.diff \
libgda-3.1.2-patch2.diff \
pi.sh \ pi.sh \
Greek-4-5.1.11.isl \ Greek-4-5.1.11.isl \
reset.sh reset.sh

View File

@ -262,6 +262,11 @@ set_default AQBANKING_WITH_QT yes
# If set to yes, download Qt from http://www.trolltech.com/developer/downloads/qt/windows, # If set to yes, download Qt from http://www.trolltech.com/developer/downloads/qt/windows,
# install it and set QTDIR in custom.sh, like "QTDIR=/c/Qt/4.2.3". # install it and set QTDIR in custom.sh, like "QTDIR=/c/Qt/4.2.3".
set_default LIBGDA_URL "http://ftp.acc.umu.se/pub/GNOME/sources/libgda/3.1/libgda-3.1.2.tar.gz"
set_default LIBGDA_DIR $GLOBAL_DIR\\libgda
set_default LIBGDA_PATCH `pwd`/libgda-3.1.2-patch.diff
set_default LIBGDA_PATCH2 `pwd`/libgda-3.1.2-patch2.diff
set_default DOCBOOK_XSL_URL "$SF_MIRROR/docbook/docbook-xsl-1.72.0.zip" set_default DOCBOOK_XSL_URL "$SF_MIRROR/docbook/docbook-xsl-1.72.0.zip"
set_default UPDATE_DOCS yes set_default UPDATE_DOCS yes
set_default DOCS_REV "HEAD" set_default DOCS_REV "HEAD"
@ -305,6 +310,7 @@ add_step inst_libofx
add_step inst_gwenhywfar add_step inst_gwenhywfar
add_step inst_ktoblzcheck add_step inst_ktoblzcheck
add_step inst_aqbanking add_step inst_aqbanking
add_step inst_libgda
## ##
if [ "$CROSS_COMPILE" != "yes" ]; then if [ "$CROSS_COMPILE" != "yes" ]; then
add_step inst_inno add_step inst_inno

View File

@ -34,6 +34,7 @@ function prepare() {
_LIBOFX_UDIR=`unix_path $LIBOFX_DIR` _LIBOFX_UDIR=`unix_path $LIBOFX_DIR`
_GWENHYWFAR_UDIR=`unix_path $GWENHYWFAR_DIR` _GWENHYWFAR_UDIR=`unix_path $GWENHYWFAR_DIR`
_AQBANKING_UDIR=`unix_path $AQBANKING_DIR` _AQBANKING_UDIR=`unix_path $AQBANKING_DIR`
_LIBGDA_UDIR=`unix_path $LIBGDA_DIR`
_GNUCASH_UDIR=`unix_path $GNUCASH_DIR` _GNUCASH_UDIR=`unix_path $GNUCASH_DIR`
_REPOS_UDIR=`unix_path $REPOS_DIR` _REPOS_UDIR=`unix_path $REPOS_DIR`
_BUILD_UDIR=`unix_path $BUILD_DIR` _BUILD_UDIR=`unix_path $BUILD_DIR`
@ -171,6 +172,14 @@ function dist_aqbanking() {
cp -a ${_AQBANKING_UDIR}/share/locale ${DIST_UDIR}/lib cp -a ${_AQBANKING_UDIR}/share/locale ${DIST_UDIR}/lib
} }
function dist_libgda() {
setup Libgda
cp -a ${_LIBGDA_UDIR}/bin/* ${DIST_UDIR}/bin
cp -a ${_LIBGDA_UDIR}/lib/libgda-3.0 ${DIST_UDIR}/lib
cp -a ${_LIBGDA_UDIR}/share/libgda-3.0 ${DIST_UDIR}/share
cp -a ${_LIBGDA_UDIR}/share/locale ${DIST_UDIR}/lib
}
function dist_gnucash() { function dist_gnucash() {
setup GnuCash setup GnuCash
mkdir -p $DIST_UDIR/bin mkdir -p $DIST_UDIR/bin
@ -245,6 +254,7 @@ dist_goffice
dist_libofx dist_libofx
dist_gwenhywfar dist_gwenhywfar
dist_aqbanking dist_aqbanking
dist_libgda
dist_gnucash dist_gnucash
finish finish
qpopd qpopd

View File

@ -929,6 +929,33 @@ function inst_aqbanking() {
fi fi
} }
function inst_libgda() {
setup LibGDA
_LIBGDA_UDIR=`unix_path ${LIBGDA_DIR}`
add_to_env ${_LIBGDA_UDIR}/bin PATH
add_to_env ${_LIBGDA_UDIR}/lib/pkgconfig PKG_CONFIG_PATH
if quiet ${PKG_CONFIG} --exists libgda-3.0
then
echo "Libgda already installed. skipping."
else
wget_unpacked $LIBGDA_URL $DOWNLOAD_DIR $TMP_DIR
assert_one_dir $TMP_UDIR/libgda-*
qpushd $TMP_UDIR/libgda-*
#patch to ignore vfs, as libgda uses depriciated header
patch libgda/gda-data-model-dir.c $LIBGDA_PATCH
#patch to use g_setenv instead of setenv (bug #510739)
patch tools/gda-sql.c $LIBGDA_PATCH2
./configure \
--prefix=${_LIBGDA_UDIR} \
CPPFLAGS="${REGEX_CPPFLAGS} ${GNOME_CPPFLAGS}" \
LDFLAGS="${REGEX_LDFLAGS} ${GNOME_LDFLAGS} -lintl"
make
make install
qpopd
${PKG_CONFIG} --exists libgda-3.0 || die "Libgda not installed correctly"
fi
}
function svn_up() { function svn_up() {
mkdir -p $_REPOS_UDIR mkdir -p $_REPOS_UDIR
qpushd $REPOS_DIR qpushd $REPOS_DIR
@ -992,7 +1019,7 @@ function inst_gnucash() {
qpushd src/bin qpushd src/bin
rm gnucash rm gnucash
make PATH_SEPARATOR=";" \ make PATH_SEPARATOR=";" \
bindir="${_INSTALL_UDIR}/bin:${_INSTALL_UDIR}/lib:${_INSTALL_UDIR}/lib/gnucash:${_GOFFICE_UDIR}/bin:${_LIBGSF_UDIR}/bin:${_PCRE_UDIR}/bin:${_GNOME_UDIR}/bin:${_LIBXML2_UDIR}/bin:${_GUILE_UDIR}/bin:${_REGEX_UDIR}/bin:${_AUTOTOOLS_UDIR}/bin:${AQBANKING_UPATH}:${_LIBOFX_UDIR}/bin:${_OPENSP_UDIR}/bin" \ bindir="${_INSTALL_UDIR}/bin:${_INSTALL_UDIR}/lib:${_INSTALL_UDIR}/lib/gnucash:${_GOFFICE_UDIR}/bin:${_LIBGSF_UDIR}/bin:${_PCRE_UDIR}/bin:${_GNOME_UDIR}/bin:${_LIBXML2_UDIR}/bin:${_GUILE_UDIR}/bin:${_REGEX_UDIR}/bin:${_AUTOTOOLS_UDIR}/bin:${AQBANKING_UPATH}:${_LIBOFX_UDIR}/bin:${_OPENSP_UDIR}/bin:${LIBGDA_DIR}/bin" \
gnucash gnucash
qpopd qpopd
@ -1035,7 +1062,7 @@ function make_install() {
# Create a startup script that works without the msys shell # Create a startup script that works without the msys shell
qpushd $_INSTALL_UDIR/bin qpushd $_INSTALL_UDIR/bin
echo "setlocal" > gnucash.bat echo "setlocal" > gnucash.bat
echo "set PATH=${INSTALL_DIR}\\bin;${INSTALL_DIR}\\lib;${INSTALL_DIR}\\lib\\gnucash;${GOFFICE_DIR}\\bin;${LIBGSF_DIR}\\bin;${PCRE_DIR}\\bin;${GNOME_DIR}\\bin;${LIBXML2_DIR}\\bin;${GUILE_DIR}\\bin;${REGEX_DIR}\\bin;${AUTOTOOLS_DIR}\\bin;${AQBANKING_PATH};${LIBOFX_DIR}\\bin;${OPENSP_DIR}\\bin;%PATH%" >> gnucash.bat echo "set PATH=${INSTALL_DIR}\\bin;${INSTALL_DIR}\\lib;${INSTALL_DIR}\\lib\\gnucash;${GOFFICE_DIR}\\bin;${LIBGSF_DIR}\\bin;${PCRE_DIR}\\bin;${GNOME_DIR}\\bin;${LIBXML2_DIR}\\bin;${GUILE_DIR}\\bin;${REGEX_DIR}\\bin;${AUTOTOOLS_DIR}\\bin;${AQBANKING_PATH};${LIBOFX_DIR}\\bin;${OPENSP_DIR}\\bin;${LIBGDA_DIR}\\bin;%PATH%" > gnucash.bat
echo "set GUILE_WARN_DEPRECATED=no" >> gnucash.bat echo "set GUILE_WARN_DEPRECATED=no" >> gnucash.bat
echo "set GNC_MODULE_PATH=${INSTALL_DIR}\\lib\\gnucash" >> gnucash.bat echo "set GNC_MODULE_PATH=${INSTALL_DIR}\\lib\\gnucash" >> gnucash.bat
echo "set GUILE_LOAD_PATH=${INSTALL_DIR}\\share\\gnucash\\guile-modules;${INSTALL_DIR}\\share\\gnucash\\scm;%GUILE_LOAD_PATH%" >> gnucash.bat echo "set GUILE_LOAD_PATH=${INSTALL_DIR}\\share\\gnucash\\guile-modules;${INSTALL_DIR}\\share\\gnucash\\scm;%GUILE_LOAD_PATH%" >> gnucash.bat

View File

@ -0,0 +1,4 @@
31c31
< #include <libgnomevfs/gnome-vfs-mime.h>
---
> #undef HAVE_GNOMEVFS

View File

@ -0,0 +1,6 @@
880,881c880,881
< setenv ("GDA_DATA_MODEL_DUMP_TITLE", "Yes", TRUE);
< setenv ("GDA_DATA_MODEL_NULL_AS_EMPTY", "Yes", TRUE);
---
> g_setenv ("GDA_DATA_MODEL_DUMP_TITLE", "Yes", TRUE);
> g_setenv ("GDA_DATA_MODEL_NULL_AS_EMPTY", "Yes", TRUE);

View File

@ -1,3 +1,3 @@
SUBDIRS = file ${SQL_DIR} SUBDIRS = file sql ${SQL_DIR} ${GDA_DIR} ${DBI_DIR}
DIST_SUBDIRS = file postgres DIST_SUBDIRS = file sql ${SQL_DIR} ${GDA_DIR} ${DBI_DIR}

View File

@ -0,0 +1,34 @@
SUBDIRS = . test
# Now a shared library AND a GModule
pkglib_LTLIBRARIES = libgncmod-backend-dbi.la
AM_CFLAGS = \
-I.. -I../.. \
-DLOCALE_DIR=\""$(datadir)/locale"\" \
-I${top_srcdir}/src/backend \
-I${top_srcdir}/src/backend/sql \
-I${top_srcdir}/src/engine \
-I${top_srcdir}/src/core-utils\
-I${top_srcdir}/lib/libc\
${QOF_CFLAGS} \
${GLIB_CFLAGS} \
${GCONF_CFLAGS} \
${WARN_CFLAGS}
libgncmod_backend_dbi_la_SOURCES = \
gnc-backend-dbi.c
noinst_HEADERS = \
gnc-backend-dbi.h
libgncmod_backend_dbi_la_LDFLAGS = -module -avoid-version
libgncmod_backend_dbi_la_LIBADD = \
${GLIB_LIBS} ${GCONF_LIBS} \
${top_builddir}/src/backend/sql/libgnc-backend-sql.la \
${top_builddir}/src/engine/libgncmod-engine.la \
${LIBDBI_LIBS} \
${QOF_LIBS}
INCLUDES = -DG_LOG_DOMAIN=\"gnc.backend.dbi\"

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,37 @@
/********************************************************************
* gnc-backend-dbi.h: load and save data to SQL via libdbi *
* *
* This program is free software; you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation; either version 2 of *
* the License, or (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License*
* along with this program; if not, contact: *
* *
* Free Software Foundation Voice: +1-617-542-5942 *
* 51 Franklin Street, Fifth Floor Fax: +1-617-542-2652 *
* Boston, MA 02110-1301, USA gnu@gnu.org *
\********************************************************************/
/** @file gnc-backend-dbi.h
* @brief load and save data to SQL via libdbi
* @author Copyright (c) 2006-2008 Phil Longstaff <plongstaff@rogers.com>
*
* This file implements the top-level QofBackend API for saving/
* restoring data to/from an SQL database via libdbi
*/
#ifndef GNC_BACKEND_DBI_H_
#define GNC_BACKEND_DBI_H_
#include <gmodule.h>
G_MODULE_EXPORT void
qof_backend_module_init(void);
#endif /* GNC_BACKEND_DBI_H_ */

View File

@ -0,0 +1,63 @@
/*********************************************************************
* gncmod-backend-dbi.c
* module definition/initialization for the dbi backend module
*
* @author Copyright (c) 2006-2008 Phil Longstaff <plongstaff@rogers.com>
*********************************************************************/
#include <stdio.h>
#include <gmodule.h>
/* #include <glib-gobject.h> */
#include "gnc-module.h"
#include "gnc-module-api.h"
/* version of the gnc module system interface we require */
int gnc_module_system_interface = 0;
/* module versioning uses libtool semantics. */
int gnc_module_current = 0;
int gnc_module_revision = 0;
int gnc_module_age = 0;
static GNCModule engine;
gchar *
gnc_module_path(void)
{
return g_strdup("gnucash/backend/dbi");
}
gchar *
gnc_module_description(void)
{
return g_strdup("The DBI/SQL backend for GnuCash");
}
int
gnc_module_init(int refcount)
{
engine = gnc_module_load("gnucash/engine", 0);
if(!engine) return FALSE;
/* Need to initialize g-type engine for gconf */
if (refcount == 0) {
g_type_init();
}
return TRUE;
}
int
gnc_module_end(int refcount)
{
int unload = TRUE;
if (engine)
unload = gnc_module_unload(engine);
if (refcount == 0)
engine = NULL;
return unload;
}

View File

@ -0,0 +1,50 @@
SUBDIRS = .
TESTS = \
test-load-backend \
test-dbi-account
GNC_TEST_DEPS := \
--gnc-module-dir ${top_builddir}/src/engine \
--guile-load-dir ${top_builddir}/src/engine \
--library-dir ${top_builddir}/lib/libqof/qof \
--library-dir ${top_builddir}/src/core-utils \
--library-dir ${top_builddir}/src/gnc-module \
--library-dir ${top_builddir}/src/engine \
--library-dir ${top_builddir}/src/backend/gda
TESTS_ENVIRONMENT := \
GNC_ACCOUNT_PATH=${top_srcdir}/accounts/C \
SRCDIR=${srcdir} \
$(shell ${top_srcdir}/src/gnc-test-env --no-exports ${GNC_TEST_DEPS})
check_PROGRAMS = \
test-load-backend \
test-dbi-account
#noinst_HEADERS = test-file-stuff.h
LDADD = ${top_builddir}/src/test-core/libgncmod-test.la \
${top_builddir}/src/gnc-module/libgnc-module.la \
${top_builddir}/src/engine/libgncmod-engine.la \
${top_builddir}/src/engine/test-core/libgncmod-test-engine.la \
${top_builddir}/src/core-utils/libgnc-core-utils.la \
${QOF_LIBS} \
${top_builddir}/lib/libc/libc-missing.la
AM_CFLAGS = \
-I${top_srcdir}/lib/libc \
-I${top_srcdir}/src \
-I${top_srcdir}/src/core-utils \
-I${top_srcdir}/src/gnc-module \
-I${top_srcdir}/src/test-core \
-I${top_srcdir}/src/engine \
-I${top_srcdir}/src/engine/test-core \
-I${top_srcdir}/src/backend/gda \
-I${top_srcdir}/src/backend/qsf \
${GLIB_CFLAGS} \
${QOF_CFLAGS} \
${GUILE_INCS} \
${GCONF_CFLAGS}
INCLUDES = -DG_LOG_DOMAIN=\"gnc.backend.dbi\"

View File

@ -0,0 +1,45 @@
/***************************************************************************
* test-load-backend.c
*
* Replaces the guile version to test the GModule file backend loading.
*
* Sun Oct 9 18:58:47 2005
* Copyright 2005 Neil Williams
* linux@codehelp.co.uk
****************************************************************************/
/*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA.
*/
#include "config.h"
#include "qof.h"
#include "cashobjects.h"
#include "test-stuff.h"
#define GNC_LIB_NAME "gncmod-backend-dbi"
int main (int argc, char ** argv)
{
qof_init();
cashobjects_register();
do_test(
qof_load_backend_library ("../.libs/", GNC_LIB_NAME),
" loading gnc-backend-dbi GModule failed");
print_test_results();
qof_close();
exit(get_rv());
}

View File

@ -1,8 +1,8 @@
SUBDIRS = . test SUBDIRS = . test
# Now a shared library AND a GModule # Now a shared library AND a GModule
lib_LTLIBRARIES = libgnc-backend-file-utils.la lib_LTLIBRARIES = libgnc-backend-xml-utils.la
pkglib_LTLIBRARIES = libgncmod-backend-file.la pkglib_LTLIBRARIES = libgncmod-backend-xml.la
AM_CFLAGS = \ AM_CFLAGS = \
-I.. -I../.. \ -I.. -I../.. \
@ -16,7 +16,7 @@ AM_CFLAGS = \
${GLIB_CFLAGS} \ ${GLIB_CFLAGS} \
${GCONF_CFLAGS} ${GCONF_CFLAGS}
libgnc_backend_file_utils_la_SOURCES = \ libgnc_backend_xml_utils_la_SOURCES = \
gnc-account-xml-v2.c \ gnc-account-xml-v2.c \
gnc-book-xml-v2.c \ gnc-book-xml-v2.c \
gnc-budget-xml-v2.c \ gnc-budget-xml-v2.c \
@ -39,7 +39,7 @@ libgnc_backend_file_utils_la_SOURCES = \
sixtp-utils.c \ sixtp-utils.c \
sixtp.c sixtp.c
libgncmod_backend_file_la_SOURCES = \ libgncmod_backend_xml_la_SOURCES = \
gnc-backend-file.c gnc-backend-file.c
noinst_HEADERS = \ noinst_HEADERS = \
@ -58,18 +58,18 @@ noinst_HEADERS = \
sixtp-stack.h \ sixtp-stack.h \
sixtp-utils.h sixtp-utils.h
libgnc_backend_file_utils_la_LIBADD = \ libgnc_backend_xml_utils_la_LIBADD = \
${GLIB_LIBS} ${GCONF_LIBS} ${LIBXML2_LIBS} \ ${GLIB_LIBS} ${GCONF_LIBS} ${LIBXML2_LIBS} \
${top_builddir}/src/engine/libgncmod-engine.la \ ${top_builddir}/src/engine/libgncmod-engine.la \
${top_builddir}/src/core-utils/libgnc-core-utils.la \ ${top_builddir}/src/core-utils/libgnc-core-utils.la \
${QOF_LIBS} ${QOF_LIBS}
libgncmod_backend_file_la_LDFLAGS = -module -avoid-version libgncmod_backend_xml_la_LDFLAGS = -module -avoid-version
libgncmod_backend_file_la_LIBADD = \ libgncmod_backend_xml_la_LIBADD = \
${GLIB_LIBS} ${GCONF_LIBS} ${LIBXML2_LIBS} \ ${GLIB_LIBS} ${GCONF_LIBS} ${LIBXML2_LIBS} \
${top_builddir}/src/engine/libgncmod-engine.la \ ${top_builddir}/src/engine/libgncmod-engine.la \
${top_builddir}/src/core-utils/libgnc-core-utils.la \ ${top_builddir}/src/core-utils/libgnc-core-utils.la \
libgnc-backend-file-utils.la \ libgnc-backend-xml-utils.la \
${QOF_LIBS} ${QOF_LIBS}
INCLUDES = -DG_LOG_DOMAIN=\"gnc.backend.file\" INCLUDES = -DG_LOG_DOMAIN=\"gnc.backend.xml\"

View File

@ -219,7 +219,8 @@ account_commodity_handler (xmlNodePtr node, gpointer act_pdata)
struct account_pdata *pdata = act_pdata; struct account_pdata *pdata = act_pdata;
gnc_commodity *ref; gnc_commodity *ref;
ref = dom_tree_to_commodity_ref_no_engine(node, pdata->book); // ref = dom_tree_to_commodity_ref_no_engine(node, pdata->book);
ref = dom_tree_to_commodity_ref(node, pdata->book);
xaccAccountSetCommodity(pdata->account, ref); xaccAccountSetCommodity(pdata->account, ref);
return TRUE; return TRUE;

View File

@ -1,5 +1,5 @@
/******************************************************************** /********************************************************************
* gnc-backend-file.c: load and save data to files * * gnc-backend-xml.c: load and save data to XML files *
* * * *
* This program is free software; you can redistribute it and/or * * This program is free software; you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as * * modify it under the terms of the GNU General Public License as *
@ -18,8 +18,8 @@
* 51 Franklin Street, Fifth Floor Fax: +1-617-542-2652 * * 51 Franklin Street, Fifth Floor Fax: +1-617-542-2652 *
* Boston, MA 02110-1301, USA gnu@gnu.org * * Boston, MA 02110-1301, USA gnu@gnu.org *
\********************************************************************/ \********************************************************************/
/** @file gnc-backend-file.c /** @file gnc-backend-xml.c
* @brief load and save data to files * @brief load and save data to XML files
* @author Copyright (c) 2000 Gnumatic Inc. * @author Copyright (c) 2000 Gnumatic Inc.
* @author Copyright (c) 2002 Derek Atkins <warlord@MIT.EDU> * @author Copyright (c) 2002 Derek Atkins <warlord@MIT.EDU>
* @author Copyright (c) 2003 Linas Vepstas <linas@linas.org> * @author Copyright (c) 2003 Linas Vepstas <linas@linas.org>
@ -453,6 +453,12 @@ gnc_determine_file_type (const char *path)
FILE *t; FILE *t;
if (!path) { return FALSE; } if (!path) { return FALSE; }
// Since this can be called with "xml:" as a prefix, remove it if it exists
if( g_str_has_prefix( path, "xml:" ) ) {
path += 4;
}
if (0 == safe_strcmp(path, QOF_STDOUT)) { return FALSE; } if (0 == safe_strcmp(path, QOF_STDOUT)) { return FALSE; }
t = g_fopen(path, "r"); t = g_fopen(path, "r");
if(!t) { PINFO (" new file"); return TRUE; } if(!t) { PINFO (" new file"); return TRUE; }
@ -462,7 +468,7 @@ gnc_determine_file_type (const char *path)
if (sbuf.st_size == 0) { PINFO (" empty file"); return TRUE; } if (sbuf.st_size == 0) { PINFO (" empty file"); return TRUE; }
if(gnc_is_xml_data_file_v2(path, NULL)) { return TRUE; } if(gnc_is_xml_data_file_v2(path, NULL)) { return TRUE; }
else if(gnc_is_xml_data_file(path)) { return TRUE; } else if(gnc_is_xml_data_file(path)) { return TRUE; }
PINFO (" %s is not a gnc file", path); PINFO (" %s is not a gnc XML file", path);
return FALSE; return FALSE;
} }
@ -854,6 +860,11 @@ file_rollback_edit (QofBackend *be, QofInstance *inst)
static void static void
file_commit_edit (QofBackend *be, QofInstance *inst) file_commit_edit (QofBackend *be, QofInstance *inst)
{ {
if (qof_instance_get_dirty(inst) && qof_get_alt_dirty_mode() &&
!(qof_instance_get_infant(inst) && qof_instance_get_destroying(inst))) {
qof_collection_mark_dirty(qof_instance_get_collection(inst));
qof_book_mark_dirty(qof_instance_get_book(inst));
}
#if BORKEN_FOR_NOW #if BORKEN_FOR_NOW
FileBackend *fbe = (FileBackend *) be; FileBackend *fbe = (FileBackend *) be;
QofBook *book = gp; QofBook *book = gp;
@ -1070,6 +1081,15 @@ qof_backend_module_init(void)
prov->provider_free = gnc_provider_free; prov->provider_free = gnc_provider_free;
prov->check_data_type = gnc_determine_file_type; prov->check_data_type = gnc_determine_file_type;
qof_backend_register_provider (prov); qof_backend_register_provider (prov);
prov = g_new0 (QofBackendProvider, 1);
prov->provider_name = "GnuCash File Backend Version 2";
prov->access_method = "xml";
prov->partial_book_supported = FALSE;
prov->backend_new = gnc_backend_new;
prov->provider_free = gnc_provider_free;
prov->check_data_type = gnc_determine_file_type;
qof_backend_register_provider (prov);
} }
/* ========================== END OF FILE ===================== */ /* ========================== END OF FILE ===================== */

View File

@ -1,5 +1,5 @@
/******************************************************************** /********************************************************************
* gnc-backend-file.h: load and save data to files * * gnc-backend-xml.h: load and save data to XML files *
* * * *
* This program is free software; you can redistribute it and/or * * This program is free software; you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as * * modify it under the terms of the GNU General Public License as *
@ -28,8 +28,8 @@
* restoring data to/from an ordinary Unix filesystem file. * restoring data to/from an ordinary Unix filesystem file.
*/ */
#ifndef GNC_BACKEND_FILE_H_ #ifndef GNC_BACKEND_XML_H_
#define GNC_BACKEND_FILE_H_ #define GNC_BACKEND_XML_H_
#include "qof.h" #include "qof.h"
#include <gmodule.h> #include <gmodule.h>
@ -59,4 +59,4 @@ typedef struct FileBackend_struct FileBackend;
G_MODULE_EXPORT void G_MODULE_EXPORT void
qof_backend_module_init(void); qof_backend_module_init(void);
#endif /* GNC_BACKEND_FILE_H_ */ #endif /* GNC_BACKEND_XML_H_ */

View File

@ -787,6 +787,13 @@ tt_act_handler( xmlNodePtr node, gpointer data )
pre-7/11/2001-CIT-change SX template Account was parsed [but pre-7/11/2001-CIT-change SX template Account was parsed [but
incorrectly]. */ incorrectly]. */
if ( xaccAccountGetCommodity( acc ) == NULL ) { if ( xaccAccountGetCommodity( acc ) == NULL ) {
#if 1
gnc_commodity_table* table;
table = gnc_commodity_table_get_table( txd->book );
com = gnc_commodity_table_lookup( table,
"template", "template" );
#else
/* FIXME: This should first look in the table of the /* FIXME: This should first look in the table of the
book, maybe? The right thing happens [WRT file book, maybe? The right thing happens [WRT file
load/save] if we just _new all the time, but it load/save] if we just _new all the time, but it
@ -798,6 +805,7 @@ tt_act_handler( xmlNodePtr node, gpointer data )
"template", "template", "template", "template",
"template", "template", "template", "template",
1 ); 1 );
#endif
xaccAccountSetCommodity( acc, com ); xaccAccountSetCommodity( acc, com );
} }

View File

@ -0,0 +1,65 @@
/*********************************************************************
* gncmod-file-backend.c
* module definition/initialization for the file backend module
*
* Copyright (c) 2001 Linux Developers Group, Inc.
*********************************************************************/
#include <stdio.h>
#include <gmodule.h>
/* #include <glib-gobject.h> */
#include "gnc-module.h"
#include "gnc-module-api.h"
GNC_MODULE_API_DECL(libgncmod_backend_file)
/* version of the gnc module system interface we require */
int libgnc_backend_file_utils_gnc_module_system_interface = 0;
/* module versioning uses libtool semantics. */
int libgncmod_backend_file_gnc_module_current = 0;
int libgncmod_backend_file_gnc_module_revision = 0;
int libgncmod_backend_file_gnc_module_age = 0;
static GNCModule engine;
char *
libgncmod_backend_file_gnc_module_path(void)
{
return g_strdup("gnucash/backend/file");
}
char *
libgncmod_backend_file_gnc_module_description(void)
{
return g_strdup("The binary and XML (v1 and v2) backends for GnuCash");
}
int
libgncmod_backend_file_gnc_module_init(int refcount)
{
engine = gnc_module_load("gnucash/engine", 0);
if(!engine) return FALSE;
/* Need to initialize g-type engine for gconf */
if (refcount == 0)
g_type_init();
return TRUE;
}
int
libgncmod_backend_file_gnc_module_end(int refcount)
{
int unload = TRUE;
if (engine)
unload = libgnc_backend_file_utils_gnc_module_unload(engine);
if (refcount == 0)
engine = NULL;
return unload;
}

View File

@ -1,3 +1,4 @@
#
SUBDIRS = test-files SUBDIRS = test-files
test_date_converting_SOURCES = \ test_date_converting_SOURCES = \
@ -27,7 +28,7 @@ test_kvp_frames_SOURCES = \
${top_srcdir}/src/backend/file/sixtp-to-dom-parser.c \ ${top_srcdir}/src/backend/file/sixtp-to-dom-parser.c \
test-kvp-frames.c test-kvp-frames.c
# the file backend is now a GModule - this test does # the xml backend is now a GModule - this test does
# not load it as a module and cannot link to it # not load it as a module and cannot link to it
# and remain portable. # and remain portable.
@ -249,4 +250,4 @@ EXTRA_DIST = \
test-real-data.sh \ test-real-data.sh \
test-xml2-is-file.c test-xml2-is-file.c
INCLUDES = -DG_LOG_DOMAIN=\"gnc.backend.file\" INCLUDES = -DG_LOG_DOMAIN=\"gnc.backend.xml\"

View File

@ -30,7 +30,7 @@
#include "cashobjects.h" #include "cashobjects.h"
#include "test-stuff.h" #include "test-stuff.h"
#define GNC_LIB_NAME "gncmod-backend-file" #define GNC_LIB_NAME "gncmod-backend-xml"
int main (int argc, char ** argv) int main (int argc, char ** argv)
{ {
@ -38,7 +38,7 @@ int main (int argc, char ** argv)
cashobjects_register(); cashobjects_register();
do_test( do_test(
qof_load_backend_library ("../.libs/", GNC_LIB_NAME), qof_load_backend_library ("../.libs/", GNC_LIB_NAME),
" loading gnc-backend-file GModule failed"); " loading gnc-backend-xml GModule failed");
print_test_results(); print_test_results();
qof_close(); qof_close();
exit(get_rv()); exit(get_rv());

View File

@ -47,7 +47,7 @@
#include "test-engine-stuff.h" #include "test-engine-stuff.h"
#include "test-file-stuff.h" #include "test-file-stuff.h"
#define GNC_LIB_NAME "gncmod-backend-file" #define GNC_LIB_NAME "gncmod-backend-xml"
static void static void
remove_files_pattern(const char *begining, const char *ending) remove_files_pattern(const char *begining, const char *ending)
@ -112,7 +112,7 @@ main (int argc, char ** argv)
qof_init(); qof_init();
cashobjects_register(); cashobjects_register();
do_test(qof_load_backend_library ("../.libs/", GNC_LIB_NAME), do_test(qof_load_backend_library ("../.libs/", GNC_LIB_NAME),
" loading gnc-backend-file GModule failed"); " loading gnc-backend-xml GModule failed");
if (!location) if (!location)
{ {

View File

@ -7,7 +7,7 @@ GNC_TEST_DEPS := \
--gnc-module-dir ${top_builddir}/src/gnc-module \ --gnc-module-dir ${top_builddir}/src/gnc-module \
--gnc-module-dir ${top_builddir}/src/engine \ --gnc-module-dir ${top_builddir}/src/engine \
--guile-load-dir ${top_srcdir}/src/engine \ --guile-load-dir ${top_srcdir}/src/engine \
--gnc-module-dir ${top_builddir}/src/backend/file \ --gnc-module-dir ${top_builddir}/src/backend/xml \
--gnc-module-dir ${top_builddir}/src/backend/postgres --gnc-module-dir ${top_builddir}/src/backend/postgres
TESTS_ENVIRONMENT := \ TESTS_ENVIRONMENT := \

View File

@ -0,0 +1,50 @@
SUBDIRS = . test
# Now a shared library AND a GModule
lib_LTLIBRARIES = libgnc-backend-sql.la
AM_CFLAGS = \
-I.. -I../.. \
-DLOCALE_DIR=\""$(datadir)/locale"\" \
-I${top_srcdir}/src/backend \
-I${top_srcdir}/src/engine \
-I${top_srcdir}/src/core-utils\
-I${top_srcdir}/lib/libc\
${QOF_CFLAGS} \
${GLIB_CFLAGS} \
${LIBGDA_CFLAGS} \
${GCONF_CFLAGS} \
${WARN_CFLAGS}
libgnc_backend_sql_la_SOURCES = \
gnc-backend-sql.c \
gnc-account-sql.c \
gnc-book-sql.c \
gnc-budget-sql.c \
gnc-commodity-sql.c \
gnc-lots-sql.c \
gnc-price-sql.c \
gnc-recurrence-sql.c \
gnc-schedxaction-sql.c \
gnc-slots-sql.c \
gnc-transaction-sql.c
noinst_HEADERS = \
gnc-account-sql.h \
gnc-backend-sql.h \
gnc-book-sql.h \
gnc-budget-sql.h \
gnc-commodity-sql.h \
gnc-lots-sql.h \
gnc-price-sql.h \
gnc-recurrence-sql.h \
gnc-schedxaction-sql.h \
gnc-slots-sql.h \
gnc-transaction-sql.h
libgnc_backend_sql_la_LIBADD = \
${GLIB_LIBS} ${GCONF_LIBS} \
${top_builddir}/src/engine/libgncmod-engine.la \
${QOF_LIBS}
INCLUDES = -DG_LOG_DOMAIN=\"gnc.backend.sql\"

View File

@ -0,0 +1,366 @@
/********************************************************************
* gnc-account-sql.c: load and save data to SQL *
* *
* This program is free software; you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation; either version 2 of *
* the License, or (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License*
* along with this program; if not, contact: *
* *
* Free Software Foundation Voice: +1-617-542-5942 *
* 51 Franklin Street, Fifth Floor Fax: +1-617-542-2652 *
* Boston, MA 02110-1301, USA gnu@gnu.org *
\********************************************************************/
/** @file gnc-account-sql.c
* @brief load and save data to SQL
* @author Copyright (c) 2006-2008 Phil Longstaff <plongstaff@rogers.com>
*
* This file implements the top-level QofBackend API for saving/
* restoring data to/from an SQL db
*/
#include "config.h"
#include <glib.h>
#include "qof.h"
#include "Account.h"
#include "AccountP.h"
#include "gnc-commodity.h"
#include "gnc-backend-sql.h"
#include "gnc-account-sql.h"
#include "gnc-commodity-sql.h"
#include "gnc-slots-sql.h"
#include "gnc-transaction-sql.h"
static QofLogModule log_module = G_LOG_DOMAIN;
#define TABLE_NAME "accounts"
#define TABLE_VERSION 1
static gpointer get_parent( gpointer pObject, const QofParam* );
static void set_parent( gpointer pObject, gpointer pValue );
static void set_parent_guid( gpointer pObject, gpointer pValue );
#define ACCOUNT_MAX_NAME_LEN 2048
#define ACCOUNT_MAX_TYPE_LEN 2048
#define ACCOUNT_MAX_CODE_LEN 2048
#define ACCOUNT_MAX_DESCRIPTION_LEN 2048
static const GncSqlColumnTableEntry col_table[] =
{
{ "guid", CT_GUID, 0, COL_NNUL|COL_PKEY, "guid" },
{ "name", CT_STRING, ACCOUNT_MAX_NAME_LEN, COL_NNUL, "name" },
{ "account_type", CT_STRING, ACCOUNT_MAX_TYPE_LEN, COL_NNUL, NULL, ACCOUNT_TYPE_ },
{ "commodity_guid", CT_COMMODITYREF, 0, COL_NNUL, "commodity" },
{ "commodity_scu", CT_INT, 0, COL_NNUL, "commodity-scu" },
{ "non_std_scu", CT_BOOLEAN, 0, COL_NNUL, "non-std-scu" },
{ "parent_guid", CT_GUID, 0, 0, NULL, NULL, get_parent, set_parent },
{ "code", CT_STRING, ACCOUNT_MAX_CODE_LEN, 0, "code" },
{ "description", CT_STRING, ACCOUNT_MAX_DESCRIPTION_LEN, 0, "description" },
{ NULL }
};
static GncSqlColumnTableEntry parent_col_table[] =
{
{ "parent_guid", CT_GUID, 0, 0, NULL, NULL, NULL, set_parent_guid },
{ NULL }
};
typedef struct {
Account* pAccount;
GUID guid;
} account_parent_guid_struct;
/* ================================================================= */
static gpointer
get_parent( gpointer pObject, const QofParam* param )
{
const Account* pAccount;
const Account* pParent;
const GUID* parent_guid;
g_return_val_if_fail( pObject != NULL, NULL );
g_return_val_if_fail( GNC_IS_ACCOUNT(pObject), NULL );
pAccount = GNC_ACCOUNT(pObject);
pParent = gnc_account_get_parent( pAccount );
if( pParent == NULL ) {
parent_guid = NULL;
} else {
parent_guid = qof_instance_get_guid( QOF_INSTANCE(pParent) );
}
return (gpointer)parent_guid;
}
static void
set_parent( gpointer pObject, gpointer pValue )
{
Account* pAccount;
QofBook* pBook;
GUID* guid = (GUID*)pValue;
Account* pParent;
g_return_if_fail( pObject != NULL );
g_return_if_fail( GNC_IS_ACCOUNT(pObject) );
pAccount = GNC_ACCOUNT(pObject);
pBook = qof_instance_get_book( QOF_INSTANCE(pAccount) );
if( guid != NULL ) {
pParent = xaccAccountLookup( guid, pBook );
if( pParent != NULL ) {
gnc_account_append_child( pParent, pAccount );
}
}
}
static void
set_parent_guid( gpointer pObject, gpointer pValue )
{
account_parent_guid_struct* s = (account_parent_guid_struct*)pObject;
GUID* guid = (GUID*)pValue;
g_return_if_fail( pObject != NULL );
g_return_if_fail( pValue != NULL );
s->guid = *guid;
}
static Account*
load_single_account( GncSqlBackend* be, GncSqlRow* row,
GList** l_accounts_needing_parents )
{
const GUID* guid;
GUID acc_guid;
Account* pAccount;
g_return_val_if_fail( be != NULL, NULL );
g_return_val_if_fail( row != NULL, NULL );
g_return_val_if_fail( l_accounts_needing_parents != NULL, NULL );
guid = gnc_sql_load_guid( be, row );
acc_guid = *guid;
pAccount = xaccAccountLookup( &acc_guid, be->primary_book );
if( pAccount == NULL ) {
pAccount = xaccMallocAccount( be->primary_book );
}
xaccAccountBeginEdit( pAccount );
gnc_sql_load_object( be, row, GNC_ID_ACCOUNT, pAccount, col_table );
xaccAccountCommitEdit( pAccount );
/* If we don't have a parent, it might be because the parent account hasn't
been loaded yet. Remember the account and its parent guid for later. */
if( gnc_account_get_parent( pAccount ) == NULL ) {
account_parent_guid_struct* s = g_slice_new( account_parent_guid_struct );
s->pAccount = pAccount;
gnc_sql_load_object( be, row, GNC_ID_ACCOUNT, s, parent_col_table );
*l_accounts_needing_parents = g_list_prepend( *l_accounts_needing_parents, s );
}
return pAccount;
}
static void
load_all_accounts( GncSqlBackend* be )
{
GncSqlStatement* stmt = NULL;
GncSqlResult* result;
QofBook* pBook;
gnc_commodity_table* pTable;
int numRows;
int r;
Account* parent;
GList* l_accounts_needing_parents = NULL;
GList* list = NULL;
g_return_if_fail( be != NULL );
pBook = be->primary_book;
pTable = gnc_commodity_table_get_table( pBook );
stmt = gnc_sql_create_select_statement( be, TABLE_NAME );
result = gnc_sql_execute_select_statement( be, stmt );
gnc_sql_statement_dispose( stmt );
if( result != NULL ) {
GncSqlRow* row = gnc_sql_result_get_first_row( result );
Account* acc;
while( row != NULL ) {
acc = load_single_account( be, row, &l_accounts_needing_parents );
if( acc != NULL ) {
list = g_list_append( list, acc );
}
row = gnc_sql_result_get_next_row( result );
}
gnc_sql_result_dispose( result );
if( list != NULL ) {
gnc_sql_slots_load_for_list( be, list );
}
/* While there are items on the list of accounts needing parents,
try to see if the parent has now been loaded. Theory says that if
items are removed from the front and added to the back if the
parent is still not available, then eventually, the list will
shrink to size 0. */
if( l_accounts_needing_parents != NULL ) {
gboolean progress_made = TRUE;
Account* pParent;
GList* elem;
while( progress_made ) {
progress_made = FALSE;
for( elem = l_accounts_needing_parents; elem != NULL; elem = g_list_next( elem ) ) {
account_parent_guid_struct* s = (account_parent_guid_struct*)elem->data;
const gchar* name = xaccAccountGetName( s->pAccount );
pParent = xaccAccountLookup( &s->guid, be->primary_book );
if( pParent != NULL ) {
gnc_account_append_child( pParent, s->pAccount );
l_accounts_needing_parents = g_list_delete_link( l_accounts_needing_parents, elem );
progress_made = TRUE;
}
}
}
/* Any accounts left over must be parented by the root account */
for( elem = l_accounts_needing_parents; elem != NULL; elem = g_list_next( elem ) ) {
account_parent_guid_struct* s = (account_parent_guid_struct*)elem->data;
Account* root;
root = gnc_book_get_root_account( pBook );
if( root == NULL ) {
root = gnc_account_create_root( pBook );
}
gnc_account_append_child( root, s->pAccount );
}
}
}
}
/* ================================================================= */
static void
create_account_tables( GncSqlBackend* be )
{
gint version;
g_return_if_fail( be != NULL );
version = gnc_sql_get_table_version( be, TABLE_NAME );
if( version == 0 ) {
gnc_sql_create_table( be, TABLE_NAME, TABLE_VERSION, col_table );
}
}
/* ================================================================= */
void
gnc_sql_save_account( GncSqlBackend* be, QofInstance* inst )
{
Account* pAcc = GNC_ACCOUNT(inst);
const GUID* guid;
gboolean is_infant;
g_return_if_fail( be != NULL );
g_return_if_fail( inst != NULL );
g_return_if_fail( GNC_IS_ACCOUNT(inst) );
is_infant = qof_instance_get_infant( inst );
// If there is no commodity yet, this might be because a new account name
// has been entered directly into the register and an account window will
// be opened. The account info is not complete yet, but the name has been
// set, triggering this commit
if( xaccAccountGetCommodity( pAcc ) != NULL ) {
gint op;
if( qof_instance_get_destroying( inst ) ) {
op = OP_DB_DELETE;
} else if( be->is_pristine_db || is_infant ) {
op = OP_DB_INSERT;
} else {
op = OP_DB_UPDATE;
}
// If not deleting the account, ensure the commodity is in the db
if( op != OP_DB_DELETE ) {
gnc_sql_save_commodity( be, xaccAccountGetCommodity( pAcc ) );
}
(void)gnc_sql_do_db_operation( be, op, TABLE_NAME, GNC_ID_ACCOUNT, pAcc, col_table );
// Now, commit or delete any slots
guid = qof_instance_get_guid( inst );
if( !qof_instance_get_destroying(inst) ) {
gnc_sql_slots_save( be, guid, is_infant, qof_instance_get_slots( inst ) );
} else {
gnc_sql_slots_delete( be, guid );
}
}
}
/* ================================================================= */
static void
load_account_guid( const GncSqlBackend* be, GncSqlRow* row,
QofSetterFunc setter, gpointer pObject,
const GncSqlColumnTableEntry* table_row )
{
const GValue* val;
GUID guid;
const GUID* pGuid;
Account* account = NULL;
g_return_if_fail( be != NULL );
g_return_if_fail( row != NULL );
g_return_if_fail( pObject != NULL );
g_return_if_fail( table_row != NULL );
val = gnc_sql_row_get_value_at_col_name( row, table_row->col_name );
if( val == NULL ) {
pGuid = NULL;
} else {
string_to_guid( g_value_get_string( val ), &guid );
pGuid = &guid;
}
if( pGuid != NULL ) {
account = xaccAccountLookup( pGuid, be->primary_book );
}
if( table_row->gobj_param_name != NULL ) {
g_object_set( pObject, table_row->gobj_param_name, account, NULL );
} else {
(*setter)( pObject, (const gpointer)account );
}
}
static col_type_handler_t account_guid_handler
= { load_account_guid,
gnc_sql_add_objectref_guid_col_info_to_list,
gnc_sql_add_colname_to_list,
gnc_sql_add_gvalue_objectref_guid_to_slist };
/* ================================================================= */
void
gnc_sql_init_account_handler( void )
{
static GncSqlObjectBackend be_data =
{
GNC_SQL_BACKEND_VERSION,
GNC_ID_ACCOUNT,
gnc_sql_save_account, /* commit */
load_all_accounts, /* initial_load */
create_account_tables /* create_tables */
};
qof_object_register_backend( GNC_ID_ACCOUNT, GNC_SQL_BACKEND, &be_data );
gnc_sql_register_col_type_handler( CT_ACCOUNTREF, &account_guid_handler );
}
/* ========================== END OF FILE ===================== */

View File

@ -0,0 +1,38 @@
/********************************************************************
* gnc-account-sql.h: load and save data to SQL *
* *
* This program is free software; you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation; either version 2 of *
* the License, or (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License*
* along with this program; if not, contact: *
* *
* Free Software Foundation Voice: +1-617-542-5942 *
* 51 Franklin Street, Fifth Floor Fax: +1-617-542-2652 *
* Boston, MA 02110-1301, USA gnu@gnu.org *
\********************************************************************/
/** @file gnc-account-sql.h
* @brief load and save accounts data to SQL
* @author Copyright (c) 2006-2008 Phil Longstaff <plongstaff@rogers.com>
*
* This file implements the top-level QofBackend API for saving/
* restoring data to/from an SQL database
*/
#ifndef GNC_ACCOUNT_SQL_H_
#define GNC_ACCOUNT_SQL_H_
#include "qof.h"
#include <gmodule.h>
void gnc_sql_init_account_handler( void );
void gnc_sql_save_account( GncSqlBackend* be, QofInstance* inst );
#endif /* GNC_ACCOUNT_SQL_H_ */

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,592 @@
/********************************************************************
* gnc-backend-sql.h: load and save data to SQL *
* *
* This program is free software; you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation; either version 2 of *
* the License, or (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License*
* along with this program; if not, contact: *
* *
* Free Software Foundation Voice: +1-617-542-5942 *
* 51 Franklin Street, Fifth Floor Fax: +1-617-542-2652 *
* Boston, MA 02110-1301, USA gnu@gnu.org *
\********************************************************************/
/**
* @defgroup SQLBE SQL Backend Core
@{
*/
/** @addtogroup Columns Columns
@ingroup SQLBE
*/
/**
@}
*/
/** @addtogroup SQLBE
@{
*/
/** @addtogroup SQLBE
* The SQL backend core is a library which can form the core for a QOF
* backend based on an SQL library.
*/
/** @file gnc-backend-sql.h
* @brief load and save data to SQL
* @author Copyright (c) 2006-2008 Phil Longstaff <plongstaff@rogers.com>
*
@}
*/
#ifndef GNC_BACKEND_SQL_H_
#define GNC_BACKEND_SQL_H_
#include "qof.h"
#include "qofbackend-p.h"
#include <gmodule.h>
typedef struct GncSqlConnection GncSqlConnection;
/**
* @struct GncSqlBackend
*
* Main SQL backend structure.
*/
struct GncSqlBackend
{
QofBackend be; /**< QOF backend */
GncSqlConnection* conn; /**< SQL connection */
QofBook *primary_book; /**< The primary, main open book */
gboolean loading; /**< We are performing an initial load */
gboolean in_query; /**< We are processing a query */
gboolean is_pristine_db; /**< Are we saving to a new pristine db? */
gint obj_total; /**< Total # of objects (for percentage calculation) */
gint operations_done; /**< Number of operations (save/load) done */
GHashTable* versions; /**< Version number for each table */
};
typedef struct GncSqlBackend GncSqlBackend;
/**
* Initialize the SQL backend.
*
* @param be SQL backend
*/
void gnc_sql_init( GncSqlBackend* be );
/**
* Load the contents of an SQL database into a book.
*
* @param be SQL backend
* @param book Book to be loaded
*/
void gnc_sql_load( GncSqlBackend* be, QofBook *book );
/**
* Save the contents of a book to an SQL database.
*
* @param be SQL backend
* @param book Book to be saved
*/
void gnc_sql_sync_all( GncSqlBackend* be, QofBook *book );
/**
* An object is about to be edited.
*
* @param be SQL backend
* @param inst Object being edited
*/
void gnc_sql_begin_edit( GncSqlBackend* be, QofInstance *inst );
/**
* Object editing has been cancelled.
*
* @param be SQL backend
* @param inst Object being edited
*/
void gnc_sql_rollback_edit( GncSqlBackend* qbe, QofInstance *inst );
/**
* Object editting is complete and the object should be saved.
*
* @param be SQL backend
* @param inst Object being edited
*/
void gnc_sql_commit_edit( GncSqlBackend* qbe, QofInstance *inst );
/**
*/
typedef struct GncSqlColumnTableEntry GncSqlColumnTableEntry;
typedef struct GncSqlStatement GncSqlStatement;
typedef struct GncSqlResult GncSqlResult;
typedef struct GncSqlRow GncSqlRow;
/**
*@struct GncSqlStatement
*
* Struct which represents an SQL statement. SQL backends must provide a
* structure which implements all of the functions.
*/
struct GncSqlStatement
{
void (*dispose)( GncSqlStatement* );
gchar* (*toSql)( GncSqlStatement* );
void (*addWhereCond)( GncSqlStatement*, QofIdTypeConst, gpointer, const GncSqlColumnTableEntry*, GValue* );
};
#define gnc_sql_statement_dispose(STMT) \
(STMT)->dispose(STMT)
#define gnc_sql_statement_to_sql(STMT) \
(STMT)->toSql(STMT)
#define gnc_sql_statement_add_where_cond(STMT,TYPENAME,OBJ,COLDESC,VALUE) \
(STMT)->addWhereCond(STMT, TYPENAME, OBJ, COLDESC, VALUE)
/**
* @struct GncSqlConnection
*
* Struct which represents the connection to an SQL database. SQL backends
* must provide a structure which implements all of the functions.
*/
struct GncSqlConnection
{
void (*dispose)( GncSqlConnection* );
GncSqlResult* (*executeSelectStatement)( GncSqlConnection*, GncSqlStatement* );
gint (*executeNonSelectStatement)( GncSqlConnection*, GncSqlStatement* );
GncSqlStatement* (*createStatementFromSql)( GncSqlConnection*, gchar* );
gboolean (*doesTableExist)( GncSqlConnection*, const gchar* );
void (*beginTransaction)( GncSqlConnection* );
void (*rollbackTransaction)( GncSqlConnection* );
void (*commitTransaction)( GncSqlConnection* );
const gchar* (*getColumnTypeName)( GncSqlConnection*, GType, gint size );
void (*createTable)( GncSqlConnection*, const gchar*, const GList* );
void (*createIndex)( GncSqlConnection*, const gchar*, const gchar*, const GncSqlColumnTableEntry* );
gchar* (*quoteString)( const GncSqlConnection*, gchar* );
};
#define gnc_sql_connection_dispose(CONN) (CONN)->dispose(CONN)
#define gnc_sql_connection_execute_select_statement(CONN,STMT) \
(CONN)->executeSelectStatement(CONN,STMT)
#define gnc_sql_connection_execute_nonselect_statement(CONN,STMT) \
(CONN)->executeNonSelectStatement(CONN,STMT)
#define gnc_sql_connection_create_statement_from_sql(CONN,SQL) \
(CONN)->createStatementFromSql(CONN,SQL)
#define gnc_sql_connection_does_table_exist(CONN,NAME) \
(CONN)->doesTableExist(CONN,NAME)
#define gnc_sql_connection_begin_transaction(CONN) \
(CONN)->beginTransaction(CONN)
#define gnc_sql_connection_rollback_transaction(CONN) \
(CONN)->rollbackTransaction(CONN)
#define gnc_sql_connection_commit_transaction(CONN) \
(CONN)->commitTransaction(CONN)
#define gnc_sql_connection_get_column_type_name(CONN,TYPE,SIZE) \
(CONN)->getColumnTypeName(CONN,TYPE,SIZE)
#define gnc_sql_connection_create_table(CONN,NAME,COLLIST) \
(CONN)->createTable(CONN,NAME,COLLIST)
#define gnc_sql_connection_create_index(CONN,INDEXNAME,TABLENAME,COLTABLE) \
(CONN)->createIndex(CONN,INDEXNAME,TABLENAME,COLTABLE)
#define gnc_sql_connection_quote_string(CONN,STR) \
(CONN)->quoteString(CONN,STR)
/**
* @struct GncSqlRow
*
* Struct used to represent a row in the result of an SQL SELECT statement.
* SQL backends must provide a structure which implements all of the functions.
*/
struct GncSqlRow
{
const GValue* (*getValueAtColName)( GncSqlRow*, const gchar* );
void (*dispose)( GncSqlRow* );
};
#define gnc_sql_row_get_value_at_col_name(ROW,N) \
(ROW)->getValueAtColName(ROW,N)
#define gnc_sql_row_dispose(ROW) \
(ROW)->dispose(ROW)
/**
* @struct GncSqlResult
*
* Struct used to represent the result of an SQL SELECT statement. SQL
* backends must provide a structure which implements all of the functions.
*/
struct GncSqlResult
{
gint (*getNumRows)( GncSqlResult* );
GncSqlRow* (*getFirstRow)( GncSqlResult* );
GncSqlRow* (*getNextRow)( GncSqlResult* );
void (*dispose)( GncSqlResult* );
};
#define gnc_sql_result_get_num_rows(RESULT) \
(RESULT)->getNumRows(RESULT)
#define gnc_sql_result_get_first_row(RESULT) \
(RESULT)->getFirstRow(RESULT)
#define gnc_sql_result_get_next_row(RESULT) \
(RESULT)->getNextRow(RESULT)
#define gnc_sql_result_dispose(RESULT) \
(RESULT)->dispose(RESULT)
/**
* @struct GncSqlObjectBackend
*
* Struct used to handle a specific engine object type for an SQL backend.
* This * handler should be registered with qof_object_register_backend().
*
* commit() - commit an object to the db
* initial_load() - load stuff when new db opened
* create_tables() - create any db tables
* compile_query() - compile a backend object query
* run_query() - run a compiled query
* free_query() - free a compiled query
* write() - write all objects
*/
typedef struct
{
int version; /**< Backend version number */
const gchar * type_name; /**< Engine object type name */
/** Commit an instance of this object to the database */
void (*commit)( GncSqlBackend* be, QofInstance* inst );
/** Load all objects of this type from the database */
void (*initial_load)( GncSqlBackend* be );
/** Create database tables for this object */
void (*create_tables)( GncSqlBackend* be );
/** Compile a query on these objects */
gpointer (*compile_query)( GncSqlBackend* be, QofQuery* pQuery );
/** Run a query on these objects */
void (*run_query)( GncSqlBackend* be, gpointer pQuery );
/** Free a query on these objects */
void (*free_query)( GncSqlBackend* be, gpointer pQuery );
/** Write all objects of this type to the database */
void (*write)( GncSqlBackend* be );
} GncSqlObjectBackend;
#define GNC_SQL_BACKEND "gnc:sql:1"
#define GNC_SQL_BACKEND_VERSION 1
/**
* @struct GncSqlColumnInfo
*/
typedef struct {
const gchar* name; /**< Column name */
const gchar* type_name; /**< Column SQL type name */
gint size; /**< Column size (string types) */
gboolean is_primary_key;
gboolean null_allowed;
} GncSqlColumnInfo;
// Type for conversion of db row to object.
#define CT_STRING "ct_string"
#define CT_GUID "ct_guid"
#define CT_INT "ct_int"
#define CT_INT64 "ct_int64"
#define CT_TIMESPEC "ct_timespec"
#define CT_GDATE "ct_gdate"
#define CT_NUMERIC "ct_numeric"
#define CT_DOUBLE "ct_double"
#define CT_BOOLEAN "ct_boolean"
#define CT_ACCOUNTREF "ct_accountref"
#define CT_COMMODITYREF "ct_commodityref"
#define CT_TXREF "ct_txref"
#define CT_LOTREF "ct_lotref"
/**
* @struct GncSqlColumnTableEntry
*
* The GncSqlColumnTableEntry struct contains all of the information
* required to copy information between an object and the database.
* The database description for an object consists of an array of
* GncSqlColumnTableEntry objects, with a final member having col_name == NULL.
*/
struct GncSqlColumnTableEntry {
const gchar* col_name; /**< Column name */
const gchar* col_type; /**< Column type */
gint size; /**< Column size in bytes, for string columns */
#define COL_PKEY 0x01
#define COL_NNUL 0x02
#define COL_UNIQUE 0x04
#define COL_AUTOINC 0x08
gint flags; /**< Column flags */
const gchar* gobj_param_name; /**< If non-null, g_object param name */
const gchar* qof_param_name; /**< If non-null, qof parameter name */
QofAccessFunc getter; /**< General access function */
QofSetterFunc setter; /**< General setter function */
};
typedef enum {
OP_DB_INSERT,
OP_DB_UPDATE,
OP_DB_DELETE
} E_DB_OPERATION;
typedef void (*GNC_SQL_LOAD_FN)( const GncSqlBackend* be,
GncSqlRow* row,
QofSetterFunc setter, gpointer pObject,
const GncSqlColumnTableEntry* table );
typedef void (*GNC_SQL_ADD_COL_INFO_TO_LIST_FN)( const GncSqlBackend* be,
const GncSqlColumnTableEntry* table_row,
GList** pList );
typedef void (*GNC_SQL_ADD_COLNAME_TO_LIST_FN)( const GncSqlColumnTableEntry* table_row, GList** pList );
typedef void (*GNC_SQL_ADD_GVALUE_TO_SLIST_FN)( const GncSqlBackend* be,
QofIdTypeConst obj_name, const gpointer pObject,
const GncSqlColumnTableEntry* table_row, GSList** pList );
typedef struct {
GNC_SQL_LOAD_FN load_fn;
GNC_SQL_ADD_COL_INFO_TO_LIST_FN add_col_info_to_list_fn;
GNC_SQL_ADD_COLNAME_TO_LIST_FN add_colname_to_list_fn;
GNC_SQL_ADD_GVALUE_TO_SLIST_FN add_gvalue_to_slist_fn;
} col_type_handler_t;
/**
* Returns the QOF access function for a column.
*
* @param obj_name QOF object type name
* @param table_row DB table column
* @return Access function
*/
QofAccessFunc gnc_sql_get_getter( QofIdTypeConst obj_name, const GncSqlColumnTableEntry* table_row );
/**
* Adds a column name to a list. If the column type spans multiple columns,
* all of the column names for the pieces are added.
*
* @param table_row DB table column
* @pList List
*/
void gnc_sql_add_colname_to_list( const GncSqlColumnTableEntry* table_row, GList** pList );
/**
* Performs an operation on the database.
*
* @param be SQL backend struct
* @param op Operation type
* @param table_name SQL table name
* @param obj_name QOF object type name
* @param pObject Gnucash object
* @param table DB table description
* @return TRUE if successful, FALSE if not
*/
gboolean gnc_sql_do_db_operation( GncSqlBackend* be,
E_DB_OPERATION op,
const gchar* table_name,
QofIdTypeConst obj_name,
gpointer pObject,
const GncSqlColumnTableEntry* table );
/**
* Execute an SQL SELECT statement.
*
* @param be SQL backend struct
* @param statement Statement
* @return Results
*/
GncSqlResult* gnc_sql_execute_select_statement( GncSqlBackend* be, GncSqlStatement* statement );
/**
* Executes an SQL SELECT statement from an SQL char string.
*
* @param be SQL backend struct
* @param sql SQL SELECT string
* @return Results
*/
GncSqlResult* gnc_sql_execute_select_sql( const GncSqlBackend* be, gchar* sql );
/**
* Creates a statement from an SQL char string.
*
* @param be SQL backend struct
* @param sql SQL char string
* @return Statement
*/
GncSqlStatement* gnc_sql_create_statement_from_sql( const GncSqlBackend* be, gchar* sql );
/**
* Loads a Gnucash object from the database.
*
* @param be SQL backend struct
* @param row DB result row
* @param obj_name QOF object type name
* @param pObject Object to be loaded
* @param table DB table description
*/
void gnc_sql_load_object( const GncSqlBackend* be, GncSqlRow* row,
QofIdTypeConst obj_name, gpointer pObject,
const GncSqlColumnTableEntry* table );
/**
* Checks whether an object is in the database or not.
*
* @param be SQL backend struct
* @param table_name DB table name
* @param obj_name QOF object type name
* @param pObject Object to be checked
* @param table DB table description
* @return TRUE if the object is in the database, FALSE otherwise
*/
gboolean gnc_sql_object_is_it_in_db( GncSqlBackend* be,
const gchar* table_name,
QofIdTypeConst obj_name, const gpointer pObject,
const GncSqlColumnTableEntry* table );
/**
* Returns the version number for a DB table.
*
* @param be SQL backend struct
* @param table_name Table name
* @return Version number, or 0 if the table does not exist
*/
gint gnc_sql_get_table_version( const GncSqlBackend* be, const gchar* table_name );
/**
* Creates a table in the database
*
* @param be SQL backend struct
* @param table_name Table name
* @param table_version Table version
* @param col_table DB table description
* @return TRUE if successful, FALSE if unsuccessful
*/
gboolean gnc_sql_create_table( const GncSqlBackend* be, const gchar* table_name,
gint table_version, const GncSqlColumnTableEntry* col_table );
/**
* Creates an index in the database
*
* @param be SQL backend struct
* @param index_name Index name
* @param table_name Table name
* @param col_table Columns that the index should index
*/
void gnc_sql_create_index( const GncSqlBackend* be, const gchar* index_name,
const gchar* table_name, const GncSqlColumnTableEntry* col_table );
/**
* Loads the object guid from a database row. The table must have a column
* named "guid" with type CT_GUID.
*
* @param be SQL backend struct
* @param row Database row
* @return GUID
*/
const GUID* gnc_sql_load_guid( const GncSqlBackend* be, GncSqlRow* row );
/**
* Loads the transaction guid from a database row. The table must have a column
* named "tx_guid" with type CT_GUID.
*
* @param be SQL backend struct
* @param row Database row
* @return GUID
*/
const GUID* gnc_sql_load_tx_guid( const GncSqlBackend* be, GncSqlRow* row );
/**
* Creates a basic SELECT statement for a table.
*
* @param be SQL backend struct
* @param table_name Table name
* @return Statement
*/
GncSqlStatement* gnc_sql_create_select_statement( const GncSqlBackend* be,
const gchar* table_name );
/**
* Registers a column handler for a new column type.
*
* @param colType Column type
* @param handler Column handler
*/
void gnc_sql_register_col_type_handler( const gchar* colType, const col_type_handler_t* handler );
/**
* Adds a GValue for an object reference GUID to the end of a GSList.
*
* @param be SQL backend struct
* @param obj_name QOF object type name
* @param pObject Object
* @param table_row DB table column description
* @param pList List
*/
void gnc_sql_add_gvalue_objectref_guid_to_slist( const GncSqlBackend* be,
QofIdTypeConst obj_name, const gpointer pObject,
const GncSqlColumnTableEntry* table_row, GSList** pList );
/**
* Adds a column info structure for an object reference GUID to the end of a
* GList.
*
* @param be SQL backend struct
* @param table_row DB table column description
* @param pList List
*/
void gnc_sql_add_objectref_guid_col_info_to_list( const GncSqlBackend* be,
const GncSqlColumnTableEntry* table_row, GList** pList );
/**
* Appends the ascii strings for a list of GUIDs to the end of an SQL string.
*
* @param str SQL string
* @param list List of GUIDs
* @param maxCount Max # of GUIDs to append
* @return Number of GUIDs appended
*/
guint gnc_sql_append_guid_list_to_sql( GString* str, GList* list, guint maxCount );
/**
* Appends column names for a subtable to the end of a GList.
*
* @param table_row Main DB column description
* @param subtable Sub-column description table
* @param pList List
*/
void gnc_sql_add_subtable_colnames_to_list( const GncSqlColumnTableEntry* table_row,
const GncSqlColumnTableEntry* subtable,
GList** pList );
/**
* Returns a string corresponding to the SQL representation of a GValue. The
* caller must free the string.
*
* @param conn SQL connection
* @param value Value to be converted
* @return String
*/
gchar* gnc_sql_get_sql_value( const GncSqlConnection* conn, const GValue* value );
/**
* Initializes DB table version information.
*
* @param be SQL backend struct
*/
void gnc_sql_init_version_info( GncSqlBackend* be );
/**
* Finalizes DB table version information.
*
* @param be SQL backend struct
*/
void gnc_sql_finalize_version_info( GncSqlBackend* be );
/**
*
* Commits a "standard" item to the database. In most cases, a commit of one object vs
* another differs only in the table name and column table.
*
* @param be SQL backend
* @param inst Instance
* @param tableName SQL table name
* @param obj_name QOF object type name
* @param col_table Column table
*/
void gnc_sql_commit_standard_item( GncSqlBackend* be, QofInstance* inst, const gchar* tableName,
QofIdTypeConst obj_name, const GncSqlColumnTableEntry* col_table );
void _retrieve_guid_( gpointer pObject, gpointer pValue );
#endif /* GNC_BACKEND_SQL_H_ */

View File

@ -0,0 +1,222 @@
/********************************************************************
* gnc-book-sql.c: load and save data to SQL *
* *
* This program is free software; you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation; either version 2 of *
* the License, or (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License*
* along with this program; if not, contact: *
* *
* Free Software Foundation Voice: +1-617-542-5942 *
* 51 Franklin Street, Fifth Floor Fax: +1-617-542-2652 *
* Boston, MA 02110-1301, USA gnu@gnu.org *
\********************************************************************/
/** @file gnc-book-sql.c
* @brief load and save data to SQL
* @author Copyright (c) 2006-2008 Phil Longstaff <plongstaff@rogers.com>
*
* This file implements the top-level QofBackend API for saving/
* restoring data to/from an SQL db
*/
#include "config.h"
#include <glib.h>
#include "qof.h"
#include "gnc-backend-sql.h"
#include "gnc-book-sql.h"
#include "gnc-slots-sql.h"
#include "gnc-engine.h"
#include "gnc-book.h"
#include "SX-book.h"
#include "SX-book-p.h"
#define BOOK_TABLE "books"
#define TABLE_VERSION 1
static QofLogModule log_module = G_LOG_DOMAIN;
static gpointer get_root_account_guid( gpointer pObject, const QofParam* );
static void set_root_account_guid( gpointer pObject, gpointer pValue );
static gpointer get_root_template_guid( gpointer pObject, const QofParam* );
static void set_root_template_guid( gpointer pObject, gpointer pValue );
static const GncSqlColumnTableEntry col_table[] =
{
{ "guid", CT_GUID, 0, COL_NNUL|COL_PKEY, "guid" },
{ "root_account_guid", CT_GUID, 0, COL_NNUL, NULL, NULL, get_root_account_guid, set_root_account_guid },
{ "root_template_guid", CT_GUID, 0, COL_NNUL, NULL, NULL, get_root_template_guid, set_root_template_guid },
{ NULL }
};
/* ================================================================= */
static gpointer
get_root_account_guid( gpointer pObject, const QofParam* param )
{
GNCBook* book = QOF_BOOK(pObject);
const Account* root;
g_return_val_if_fail( pObject != NULL, NULL );
g_return_val_if_fail( QOF_IS_BOOK(pObject), NULL );
root = gnc_book_get_root_account( book );
return (gpointer)qof_instance_get_guid( QOF_INSTANCE(root) );
}
static void
set_root_account_guid( gpointer pObject, gpointer pValue )
{
GNCBook* book = QOF_BOOK(pObject);
const Account* root;
GUID* guid = (GUID*)pValue;
g_return_if_fail( pObject != NULL );
g_return_if_fail( QOF_IS_BOOK(pObject) );
g_return_if_fail( pValue != NULL );
root = gnc_book_get_root_account( book );
qof_instance_set_guid( QOF_INSTANCE(root), guid );
}
static gpointer
get_root_template_guid( gpointer pObject, const QofParam* param )
{
const GNCBook* book = QOF_BOOK(pObject);
const Account* root;
g_return_val_if_fail( pObject != NULL, NULL );
g_return_val_if_fail( QOF_IS_BOOK(pObject), NULL );
root = gnc_book_get_template_root( book );
return (gpointer)qof_instance_get_guid( QOF_INSTANCE(root) );
}
static void
set_root_template_guid( gpointer pObject, gpointer pValue )
{
GNCBook* book = QOF_BOOK(pObject);
GUID* guid = (GUID*)pValue;
Account* root;
g_return_if_fail( pObject != NULL );
g_return_if_fail( QOF_IS_BOOK(pObject) );
g_return_if_fail( pValue != NULL );
root = gnc_book_get_template_root( book );
if( root == NULL ) {
root = xaccMallocAccount( book );
xaccAccountBeginEdit( root );
xaccAccountSetType( root, ACCT_TYPE_ROOT );
xaccAccountCommitEdit( root );
gnc_book_set_template_root( book, root );
}
qof_instance_set_guid( QOF_INSTANCE(root), guid );
}
/* ================================================================= */
static void
load_single_book( GncSqlBackend* be, GncSqlRow* row )
{
const GUID* guid;
GUID book_guid;
GNCBook* pBook;
g_return_if_fail( be != NULL );
g_return_if_fail( row != NULL );
guid = gnc_sql_load_guid( be, row );
book_guid = *guid;
pBook = be->primary_book;
if( pBook == NULL ) {
pBook = gnc_book_new();
}
gnc_sql_load_object( be, row, GNC_ID_BOOK, pBook, col_table );
gnc_sql_slots_load( be, QOF_INSTANCE(pBook) );
qof_instance_mark_clean( QOF_INSTANCE(pBook) );
}
static void
load_all_books( GncSqlBackend* be )
{
GncSqlStatement* stmt;
GncSqlResult* result;
g_return_if_fail( be != NULL );
stmt = gnc_sql_create_select_statement( be, BOOK_TABLE );
result = gnc_sql_execute_select_statement( be, stmt );
gnc_sql_statement_dispose( stmt );
if( result != NULL ) {
GncSqlRow* row = gnc_sql_result_get_first_row( result );
// If there are no rows, try committing the book
if( row == NULL ) {
gnc_sql_save_book( be, QOF_INSTANCE(be->primary_book) );
} else {
// Otherwise, load the 1st book.
load_single_book( be, row );
}
gnc_sql_result_dispose( result );
}
}
/* ================================================================= */
static void
create_book_tables( GncSqlBackend* be )
{
gint version;
g_return_if_fail( be != NULL );
version = gnc_sql_get_table_version( be, BOOK_TABLE );
if( version == 0 ) {
gnc_sql_create_table( be, BOOK_TABLE, TABLE_VERSION, col_table );
}
}
/* ================================================================= */
void
gnc_sql_save_book( GncSqlBackend* be, QofInstance* inst)
{
const GUID* guid;
gint op;
gboolean is_infant;
g_return_if_fail( be != NULL );
g_return_if_fail( inst != NULL );
g_return_if_fail( QOF_IS_BOOK(inst) );
gnc_sql_commit_standard_item( be, inst, BOOK_TABLE, GNC_ID_BOOK, col_table );
}
/* ================================================================= */
void
gnc_sql_init_book_handler( void )
{
static GncSqlObjectBackend be_data =
{
GNC_SQL_BACKEND_VERSION,
GNC_ID_BOOK,
gnc_sql_save_book, /* commit */
load_all_books, /* initial_load */
create_book_tables /* create_tables */
};
qof_object_register_backend( GNC_ID_BOOK, GNC_SQL_BACKEND, &be_data );
}
/* ========================== END OF FILE ===================== */

View File

@ -0,0 +1,38 @@
/********************************************************************
* gnc-book-sql.h: load and save data to SQL *
* *
* This program is free software; you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation; either version 2 of *
* the License, or (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License*
* along with this program; if not, contact: *
* *
* Free Software Foundation Voice: +1-617-542-5942 *
* 51 Franklin Street, Fifth Floor Fax: +1-617-542-2652 *
* Boston, MA 02110-1301, USA gnu@gnu.org *
\********************************************************************/
/** @file gnc-book-sql.h
* @brief load and save data to SQL
* @author Copyright (c) 2006-2008 Phil Longstaff <plongstaff@rogers.com>
*
* This file implements the top-level QofBackend API for saving/
* restoring data to/from an SQL database
*/
#ifndef GNC_BOOK_SQL_H_
#define GNC_BOOK_SQL_H_
#include "qof.h"
#include <gmodule.h>
void gnc_sql_init_book_handler( void );
void gnc_sql_save_book( GncSqlBackend* be, QofInstance* inst );
#endif /* GNC_BOOK_SQL_H_ */

View File

@ -0,0 +1,203 @@
/********************************************************************
* gnc-budget-sql.c: load and save data to SQL *
* *
* This program is free software; you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation; either version 2 of *
* the License, or (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License*
* along with this program; if not, contact: *
* *
* Free Software Foundation Voice: +1-617-542-5942 *
* 51 Franklin Street, Fifth Floor Fax: +1-617-542-2652 *
* Boston, MA 02110-1301, USA gnu@gnu.org *
\********************************************************************/
/** @file gnc-budget-sql.c
* @brief load and save data to SQL
* @author Copyright (c) 2006-2008 Phil Longstaff <plongstaff@rogers.com>
*
* This file implements the top-level QofBackend API for saving/
* restoring data to/from an SQL db
*/
#include "config.h"
#include <glib.h>
#include "qof.h"
#include "gnc-backend-sql.h"
#include "Recurrence.h"
#include "gnc-budget-sql.h"
#include "gnc-slots-sql.h"
#include "gnc-recurrence-sql.h"
#include "gnc-budget.h"
#define BUDGET_TABLE "budgets"
#define TABLE_VERSION 1
static QofLogModule log_module = G_LOG_DOMAIN;
#define BUDGET_MAX_NAME_LEN 2048
#define BUDGET_MAX_DESCRIPTION_LEN 2048
static const GncSqlColumnTableEntry col_table[] =
{
{ "guid", CT_GUID, 0, COL_NNUL|COL_PKEY, "guid" },
{ "name", CT_STRING, BUDGET_MAX_NAME_LEN, COL_NNUL, "name" },
{ "description", CT_STRING, BUDGET_MAX_DESCRIPTION_LEN, 0, "description" },
{ "num_periods", CT_INT, 0, COL_NNUL, "num_periods" },
{ NULL }
};
/* ================================================================= */
static GncBudget*
load_single_budget( GncSqlBackend* be, GncSqlRow* row )
{
const GUID* guid;
GUID budget_guid;
GncBudget* pBudget;
Recurrence* r;
g_return_val_if_fail( be != NULL, NULL );
g_return_val_if_fail( row != NULL, NULL );
guid = gnc_sql_load_guid( be, row );
budget_guid = *guid;
pBudget = gnc_budget_lookup( &budget_guid, be->primary_book );
if( pBudget == NULL ) {
pBudget = gnc_budget_new( be->primary_book );
}
gnc_budget_begin_edit( pBudget );
gnc_sql_load_object( be, row, GNC_ID_BUDGET, pBudget, col_table );
r = g_new0( Recurrence, 1 );
gnc_sql_recurrence_load( be, gnc_budget_get_guid( pBudget ), r );
gnc_budget_commit_edit( pBudget );
return pBudget;
}
static void
load_all_budgets( GncSqlBackend* be )
{
GncSqlStatement* stmt;
GncSqlResult* result;
int r;
GList* list = NULL;
g_return_if_fail( be != NULL );
stmt = gnc_sql_create_select_statement( be, BUDGET_TABLE );
result = gnc_sql_execute_select_statement( be, stmt );
gnc_sql_statement_dispose( stmt );
if( result != NULL ) {
GncSqlRow* row = gnc_sql_result_get_first_row( result );
GncBudget* b;
while( row != NULL ) {
b = load_single_budget( be, row );
if( b != NULL ) {
list = g_list_append( list, b );
}
row = gnc_sql_result_get_next_row( result );
}
gnc_sql_result_dispose( result );
if( list != NULL ) {
gnc_sql_slots_load_for_list( be, list );
}
}
}
/* ================================================================= */
static void
create_budget_tables( GncSqlBackend* be )
{
gint version;
g_return_if_fail( be != NULL );
version = gnc_sql_get_table_version( be, BUDGET_TABLE );
if( version == 0 ) {
gnc_sql_create_table( be, BUDGET_TABLE, TABLE_VERSION, col_table );
}
}
/* ================================================================= */
static void
save_budget( GncSqlBackend* be, QofInstance* inst )
{
GncBudget* pBudget = GNC_BUDGET(inst);
const GUID* guid;
gint op;
gboolean is_infant;
g_return_if_fail( be != NULL );
g_return_if_fail( inst != NULL );
g_return_if_fail( GNC_IS_BUDGET(inst) );
is_infant = qof_instance_get_infant( inst );
if( qof_instance_get_destroying( inst ) ) {
op = OP_DB_DELETE;
} else if( be->is_pristine_db || is_infant ) {
op = OP_DB_INSERT;
} else {
op = OP_DB_UPDATE;
}
(void)gnc_sql_do_db_operation( be, op, BUDGET_TABLE, GNC_ID_BUDGET, pBudget, col_table );
// Now, commit any slots and recurrence
guid = qof_instance_get_guid( inst );
if( !qof_instance_get_destroying(inst) ) {
gnc_sql_recurrence_save( be, guid, gnc_budget_get_recurrence( pBudget ) );
gnc_sql_slots_save( be, guid, is_infant, qof_instance_get_slots( inst ) );
} else {
gnc_sql_recurrence_delete( be, guid );
gnc_sql_slots_delete( be, guid );
}
}
static void
do_save_budget( QofInstance* inst, gpointer data )
{
save_budget( (GncSqlBackend*)data, inst );
}
static void
write_budgets( GncSqlBackend* be )
{
g_return_if_fail( be != NULL );
qof_collection_foreach( qof_book_get_collection( be->primary_book, GNC_ID_BUDGET ),
(QofInstanceForeachCB)do_save_budget, be );
}
/* ================================================================= */
void
gnc_sql_init_budget_handler( void )
{
static GncSqlObjectBackend be_data =
{
GNC_SQL_BACKEND_VERSION,
GNC_ID_BUDGET,
save_budget, /* commit */
load_all_budgets, /* initial_load */
create_budget_tables, /* create_tables */
NULL, NULL, NULL,
write_budgets /* write */
};
qof_object_register_backend( GNC_ID_BUDGET, GNC_SQL_BACKEND, &be_data );
}
/* ========================== END OF FILE ===================== */

View File

@ -0,0 +1,37 @@
/********************************************************************
* gnc-budget-sql.h: load and save data to SQL *
* *
* This program is free software; you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation; either version 2 of *
* the License, or (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License*
* along with this program; if not, contact: *
* *
* Free Software Foundation Voice: +1-617-542-5942 *
* 51 Franklin Street, Fifth Floor Fax: +1-617-542-2652 *
* Boston, MA 02110-1301, USA gnu@gnu.org *
\********************************************************************/
/** @file gnc-budget-sql.h
* @brief load and save data to SQL
* @author Copyright (c) 2006-2008 Phil Longstaff <plongstaff@rogers.com>
*
* This file implements the top-level QofBackend API for saving/
* restoring data to/from an SQL database
*/
#ifndef GNC_BUDGET_SQL_H_
#define GNC_BUDGET_SQL_H_
#include "qof.h"
#include <gmodule.h>
void gnc_sql_init_budget_handler( void );
#endif /* GNC_BUDGET_SQL_H_ */

View File

@ -0,0 +1,261 @@
/********************************************************************
* gnc-commodity-sql.c: load and save data to SQL *
* *
* This program is free software; you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation; either version 2 of *
* the License, or (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License*
* along with this program; if not, contact: *
* *
* Free Software Foundation Voice: +1-617-542-5942 *
* 51 Franklin Street, Fifth Floor Fax: +1-617-542-2652 *
* Boston, MA 02110-1301, USA gnu@gnu.org *
\********************************************************************/
/** @file gnc-commodity-sql.c
* @brief load and save data to SQL
* @author Copyright (c) 2006-2008 Phil Longstaff <plongstaff@rogers.com>
*
* This file implements the top-level QofBackend API for saving/
* restoring data to/from an SQL db
*/
#include "config.h"
#include <glib.h>
#include "qof.h"
#include "gnc-backend-sql.h"
#include "gnc-commodity.h"
#include "gnc-commodity-sql.h"
#include "gnc-slots-sql.h"
static QofLogModule log_module = G_LOG_DOMAIN;
static gpointer get_quote_source_name( gpointer pObject, const QofParam* );
static void set_quote_source_name( gpointer pObject, gpointer pValue );
#define COMMODITIES_TABLE "commodities"
#define TABLE_VERSION 1
#define COMMODITY_MAX_NAMESPACE_LEN 2048
#define COMMODITY_MAX_MNEMONIC_LEN 2048
#define COMMODITY_MAX_FULLNAME_LEN 2048
#define COMMODITY_MAX_CUSIP_LEN 2048
#define COMMODITY_MAX_QUOTESOURCE_LEN 2048
#define COMMODITY_MAX_QUOTE_TZ_LEN 2048
static const GncSqlColumnTableEntry col_table[] = {
{ "guid", CT_GUID, 0, COL_NNUL|COL_PKEY, "guid" },
{ "namespace", CT_STRING, COMMODITY_MAX_NAMESPACE_LEN, COL_NNUL, NULL, NULL,
(QofAccessFunc)gnc_commodity_get_namespace,
(QofSetterFunc)gnc_commodity_set_namespace },
{ "mnemonic", CT_STRING, COMMODITY_MAX_MNEMONIC_LEN, COL_NNUL, "mnemonic" },
{ "fullname", CT_STRING, COMMODITY_MAX_FULLNAME_LEN, 0, "fullname" },
{ "cusip", CT_STRING, COMMODITY_MAX_CUSIP_LEN, 0, "cusip" },
{ "fraction", CT_INT, 0, COL_NNUL, "fraction" },
{ "quote_flag", CT_BOOLEAN, 0, COL_NNUL, "quote_flag" },
{ "quote_source", CT_STRING, COMMODITY_MAX_QUOTESOURCE_LEN, 0, NULL, NULL,
get_quote_source_name, set_quote_source_name },
{ "quote_tz", CT_STRING, COMMODITY_MAX_QUOTE_TZ_LEN, 0, "quote-tz" },
{ NULL }
};
/* ================================================================= */
static gpointer
get_quote_source_name( gpointer pObject, const QofParam* param )
{
const gnc_commodity* pCommodity = GNC_COMMODITY(pObject);
g_return_val_if_fail( pObject != NULL, NULL );
g_return_val_if_fail( GNC_IS_COMMODITY(pObject), NULL );
return (gpointer)gnc_quote_source_get_internal_name(
gnc_commodity_get_quote_source(pCommodity));
}
static void
set_quote_source_name( gpointer pObject, gpointer pValue )
{
gnc_commodity* pCommodity = GNC_COMMODITY(pObject);
const gchar* quote_source_name = (const gchar*)pValue;
gnc_quote_source* quote_source;
g_return_if_fail( pObject != NULL );
g_return_if_fail( GNC_IS_COMMODITY(pObject) );
if( pValue == NULL ) return;
quote_source = gnc_quote_source_lookup_by_internal( quote_source_name );
gnc_commodity_set_quote_source( pCommodity, quote_source );
}
static gnc_commodity*
load_single_commodity( GncSqlBackend* be, GncSqlRow* row )
{
QofBook* pBook = be->primary_book;
int col;
const GValue* val;
gnc_commodity* pCommodity;
pCommodity = gnc_commodity_new( pBook, NULL, NULL, NULL, NULL, 100 );
gnc_commodity_begin_edit( pCommodity );
gnc_sql_load_object( be, row, GNC_ID_COMMODITY, pCommodity, col_table );
gnc_commodity_commit_edit( pCommodity );
return pCommodity;
}
static void
load_all_commodities( GncSqlBackend* be )
{
GncSqlStatement* stmt;
GncSqlResult* result;
gnc_commodity_table* pTable;
pTable = gnc_commodity_table_get_table( be->primary_book );
stmt = gnc_sql_create_select_statement( be, COMMODITIES_TABLE );
result = gnc_sql_execute_select_statement( be, stmt );
gnc_sql_statement_dispose( stmt );
if( result != NULL ) {
int r;
gnc_commodity* pCommodity;
GList* list = NULL;
GncSqlRow* row = gnc_sql_result_get_first_row( result );
while( row != NULL ) {
gnc_commodity* c;
pCommodity = load_single_commodity( be, row );
if( pCommodity != NULL ) {
GUID guid;
guid = *qof_instance_get_guid( QOF_INSTANCE(pCommodity) );
pCommodity = gnc_commodity_table_insert( pTable, pCommodity );
list = g_list_append( list, pCommodity );
qof_instance_set_guid( QOF_INSTANCE(pCommodity), &guid );
}
row = gnc_sql_result_get_next_row( result );
}
gnc_sql_result_dispose( result );
if( list != NULL ) {
gnc_sql_slots_load_for_list( be, list );
}
}
}
/* ================================================================= */
static void
create_commodities_tables( GncSqlBackend* be )
{
gint version;
g_return_if_fail( be != NULL );
version = gnc_sql_get_table_version( be, COMMODITIES_TABLE );
if( version == 0 ) {
gnc_sql_create_table( be, COMMODITIES_TABLE, TABLE_VERSION, col_table );
}
}
/* ================================================================= */
static void
commit_commodity( GncSqlBackend* be, QofInstance* inst )
{
const GUID* guid;
g_return_if_fail( be != NULL );
g_return_if_fail( inst != NULL );
g_return_if_fail( GNC_IS_COMMODITY(inst) );
gnc_sql_commit_standard_item( be, inst, COMMODITIES_TABLE, GNC_ID_COMMODITY, col_table );
}
static gboolean
is_commodity_in_db( GncSqlBackend* be, gnc_commodity* pCommodity )
{
g_return_val_if_fail( be != NULL, FALSE );
g_return_val_if_fail( pCommodity != NULL, FALSE );
return gnc_sql_object_is_it_in_db( be, COMMODITIES_TABLE, GNC_ID_COMMODITY,
pCommodity, col_table );
}
void
gnc_sql_save_commodity( GncSqlBackend* be, gnc_commodity* pCommodity )
{
g_return_if_fail( be != NULL );
g_return_if_fail( pCommodity != NULL );
if( !is_commodity_in_db( be, pCommodity ) ) {
commit_commodity( be, QOF_INSTANCE(pCommodity) );
}
}
/* ----------------------------------------------------------------- */
static void
load_commodity_guid( const GncSqlBackend* be, GncSqlRow* row,
QofSetterFunc setter, gpointer pObject,
const GncSqlColumnTableEntry* table_row )
{
const GValue* val;
GUID guid;
const GUID* pGuid;
gnc_commodity* commodity = NULL;
g_return_if_fail( be != NULL );
g_return_if_fail( row != NULL );
g_return_if_fail( pObject != NULL );
g_return_if_fail( table_row != NULL );
val = gnc_sql_row_get_value_at_col_name( row, table_row->col_name );
if( val == NULL ) {
pGuid = NULL;
} else {
string_to_guid( g_value_get_string( val ), &guid );
pGuid = &guid;
}
if( pGuid != NULL ) {
commodity = gnc_commodity_find_commodity_by_guid( pGuid, be->primary_book );
}
if( table_row->gobj_param_name != NULL ) {
g_object_set( pObject, table_row->gobj_param_name, commodity, NULL );
} else {
(*setter)( pObject, (const gpointer)commodity );
}
}
static col_type_handler_t commodity_guid_handler
= { load_commodity_guid,
gnc_sql_add_objectref_guid_col_info_to_list,
gnc_sql_add_colname_to_list,
gnc_sql_add_gvalue_objectref_guid_to_slist };
/* ================================================================= */
void
gnc_sql_init_commodity_handler( void )
{
static GncSqlObjectBackend be_data =
{
GNC_SQL_BACKEND_VERSION,
GNC_ID_COMMODITY,
commit_commodity, /* commit */
load_all_commodities, /* initial_load */
create_commodities_tables /* create_tables */
};
qof_object_register_backend( GNC_ID_COMMODITY, GNC_SQL_BACKEND, &be_data );
gnc_sql_register_col_type_handler( CT_COMMODITYREF, &commodity_guid_handler );
}
/* ========================== END OF FILE ===================== */

View File

@ -0,0 +1,38 @@
/********************************************************************
* gnc-commodity-sql.h: load and save data to SQL *
* *
* This program is free software; you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation; either version 2 of *
* the License, or (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License*
* along with this program; if not, contact: *
* *
* Free Software Foundation Voice: +1-617-542-5942 *
* 51 Franklin Street, Fifth Floor Fax: +1-617-542-2652 *
* Boston, MA 02110-1301, USA gnu@gnu.org *
\********************************************************************/
/** @file gnc-commodity-sql.h
* @brief load and save data to SQL
* @author Copyright (c) 2006-2008 Phil Longstaff <plongstaff@rogers.com>
*
* This file implements the top-level QofBackend API for saving/
* restoring data to/from an SQL database
*/
#ifndef GNC_COMMODITY_SQL_H_
#define GNC_COMMODITY_SQL_H_
#include "qof.h"
#include <gmodule.h>
void gnc_sql_init_commodity_handler( void );
void gnc_sql_save_commodity( GncSqlBackend* be, gnc_commodity* pCommodity );
#endif /* GNC_COMMODITY_SQL_H_ */

View File

@ -0,0 +1,249 @@
/********************************************************************
* gnc-lots-sql.c: load and save data to SQL *
* *
* This program is free software; you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation; either version 2 of *
* the License, or (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License*
* along with this program; if not, contact: *
* *
* Free Software Foundation Voice: +1-617-542-5942 *
* 51 Franklin Street, Fifth Floor Fax: +1-617-542-2652 *
* Boston, MA 02110-1301, USA gnu@gnu.org *
\********************************************************************/
/** @file gnc-lots-sql.c
* @brief load and save data to SQL
* @author Copyright (c) 2006-2008 Phil Longstaff <plongstaff@rogers.com>
*
* This file implements the top-level QofBackend API for saving/
* restoring data to/from an SQL db
*/
#include "config.h"
#include <glib.h>
#include "qof.h"
#include "gnc-lot.h"
#include "gnc-backend-sql.h"
#include "gnc-slots-sql.h"
#include "gnc-lots-sql.h"
static QofLogModule log_module = G_LOG_DOMAIN;
#define TABLE_NAME "lots"
#define TABLE_VERSION 1
static gpointer get_lot_account( gpointer pObject, const QofParam* param );
static void set_lot_account( gpointer pObject, gpointer pValue );
static void set_lot_is_closed( gpointer pObject, gboolean value );
static const GncSqlColumnTableEntry col_table[] =
{
{ "guid", CT_GUID, 0, COL_NNUL|COL_PKEY, "guid" },
{ "account_guid", CT_GUID, 0, COL_NNUL, NULL, NULL, get_lot_account, set_lot_account },
{ "is_closed", CT_BOOLEAN, 0, COL_NNUL, NULL, NULL,
(QofAccessFunc)gnc_lot_is_closed, (QofSetterFunc)set_lot_is_closed },
{ NULL }
};
/* ================================================================= */
static gpointer
get_lot_account( gpointer pObject, const QofParam* param )
{
const GNCLot* lot = GNC_LOT(pObject);
const Account* pAccount;
g_return_val_if_fail( pObject != NULL, NULL );
g_return_val_if_fail( GNC_IS_LOT(pObject), NULL );
pAccount = gnc_lot_get_account( lot );
return (gpointer)qof_instance_get_guid( QOF_INSTANCE(pAccount) );
}
static void
set_lot_account( gpointer pObject, gpointer pValue )
{
GNCLot* lot = GNC_LOT(pObject);
QofBook* pBook;
GUID* guid = (GUID*)pValue;
Account* pAccount;
g_return_if_fail( pObject != NULL );
g_return_if_fail( GNC_IS_LOT(pObject) );
g_return_if_fail( pValue != NULL );
pBook = qof_instance_get_book( QOF_INSTANCE(lot) );
pAccount = xaccAccountLookup( guid, pBook );
xaccAccountInsertLot( pAccount, lot );
}
static void
set_lot_is_closed( gpointer pObject, gboolean closed )
{
GNCLot* lot = GNC_LOT(pObject);
g_return_if_fail( pObject != NULL );
g_return_if_fail( GNC_IS_LOT(pObject) );
lot->is_closed = closed;
}
static GNCLot*
load_single_lot( GncSqlBackend* be, GncSqlRow* row )
{
GNCLot* lot;
g_return_val_if_fail( be != NULL, NULL );
g_return_val_if_fail( row != NULL, NULL );
lot = gnc_lot_new( be->primary_book );
gnc_lot_begin_edit( lot );
gnc_sql_load_object( be, row, GNC_ID_LOT, lot, col_table );
gnc_lot_commit_edit( lot );
return lot;
}
static void
load_all_lots( GncSqlBackend* be )
{
GncSqlStatement* stmt;
GncSqlResult* result;
g_return_if_fail( be != NULL );
stmt = gnc_sql_create_select_statement( be, TABLE_NAME );
result = gnc_sql_execute_select_statement( be, stmt );
gnc_sql_statement_dispose( stmt );
if( result != NULL ) {
int r;
GList* list = NULL;
GncSqlRow* row = gnc_sql_result_get_first_row( result );
GNCLot* lot;
while( row != NULL ) {
lot = load_single_lot( be, row );
if( lot != NULL ) {
list = g_list_append( list, lot );
}
row = gnc_sql_result_get_next_row( result );
}
gnc_sql_result_dispose( result );
if( list != NULL ) {
gnc_sql_slots_load_for_list( be, list );
}
}
}
/* ================================================================= */
static void
create_lots_tables( GncSqlBackend* be )
{
gint version;
g_return_if_fail( be != NULL );
version = gnc_sql_get_table_version( be, TABLE_NAME );
if( version == 0 ) {
gnc_sql_create_table( be, TABLE_NAME, TABLE_VERSION, col_table );
}
}
/* ================================================================= */
static void
commit_lot( GncSqlBackend* be, QofInstance* inst )
{
g_return_if_fail( be != NULL );
g_return_if_fail( inst != NULL );
g_return_if_fail( GNC_IS_LOT(inst) );
gnc_sql_commit_standard_item( be, inst, TABLE_NAME, GNC_ID_LOT, col_table );
}
static void
do_save_lot( QofInstance* inst, gpointer data )
{
commit_lot( (GncSqlBackend*)data, inst );
}
static void
write_lots( GncSqlBackend* be )
{
g_return_if_fail( be != NULL );
qof_collection_foreach( qof_book_get_collection( be->primary_book, GNC_ID_LOT ),
(QofInstanceForeachCB)do_save_lot, be );
}
/* ================================================================= */
static void
load_lot_guid( const GncSqlBackend* be, GncSqlRow* row,
QofSetterFunc setter, gpointer pObject,
const GncSqlColumnTableEntry* table_row )
{
const GValue* val;
GUID guid;
const GUID* pGuid;
GNCLot* lot = NULL;
g_return_if_fail( be != NULL );
g_return_if_fail( row != NULL );
g_return_if_fail( pObject != NULL );
g_return_if_fail( table_row != NULL );
val = gnc_sql_row_get_value_at_col_name( row, table_row->col_name );
if( val == NULL ) {
pGuid = NULL;
} else {
string_to_guid( g_value_get_string( val ), &guid );
pGuid = &guid;
}
if( pGuid != NULL ) {
lot = gnc_lot_lookup( pGuid, be->primary_book );
}
if( table_row->gobj_param_name != NULL ) {
g_object_set( pObject, table_row->gobj_param_name, lot, NULL );
} else {
(*setter)( pObject, (const gpointer)lot );
}
}
static col_type_handler_t lot_guid_handler
= { load_lot_guid,
gnc_sql_add_objectref_guid_col_info_to_list,
gnc_sql_add_colname_to_list,
gnc_sql_add_gvalue_objectref_guid_to_slist };
/* ================================================================= */
void
gnc_sql_init_lot_handler( void )
{
static GncSqlObjectBackend be_data =
{
GNC_SQL_BACKEND_VERSION,
GNC_ID_LOT,
commit_lot, /* commit */
load_all_lots, /* initial_load */
create_lots_tables, /* create tables */
NULL, NULL, NULL,
write_lots /* save all */
};
qof_object_register_backend( GNC_ID_LOT, GNC_SQL_BACKEND, &be_data );
gnc_sql_register_col_type_handler( CT_LOTREF, &lot_guid_handler );
}
/* ========================== END OF FILE ===================== */

View File

@ -0,0 +1,37 @@
/********************************************************************
* gnc-lots-sql.h: load and save data to SQL *
* *
* This program is free software; you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation; either version 2 of *
* the License, or (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License*
* along with this program; if not, contact: *
* *
* Free Software Foundation Voice: +1-617-542-5942 *
* 51 Franklin Street, Fifth Floor Fax: +1-617-542-2652 *
* Boston, MA 02110-1301, USA gnu@gnu.org *
\********************************************************************/
/** @file gnc-lots-sql.h
* @brief load and save data to SQL
* @author Copyright (c) 2006-2008 Phil Longstaff <plongstaff@rogers.com>
*
* This file implements the top-level QofBackend API for saving/
* restoring data to/from an SQL database
*/
#ifndef GNC_LOT_SQL_H_
#define GNC_LOT_SQL_H_
#include "qof.h"
#include <gmodule.h>
void gnc_sql_init_lot_handler( void );
#endif /* GNC_LOT_SQL_H_ */

View File

@ -0,0 +1,207 @@
/********************************************************************
* gnc-price-sql.c: load and save data to SQL *
* *
* This program is free software; you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation; either version 2 of *
* the License, or (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License*
* along with this program; if not, contact: *
* *
* Free Software Foundation Voice: +1-617-542-5942 *
* 51 Franklin Street, Fifth Floor Fax: +1-617-542-2652 *
* Boston, MA 02110-1301, USA gnu@gnu.org *
\********************************************************************/
/** @file gnc-price-sql.c
* @brief load and save data to SQL
* @author Copyright (c) 2006-2008 Phil Longstaff <plongstaff@rogers.com>
*
* This file implements the top-level QofBackend API for saving/
* restoring data to/from an SQL db
*/
#include "config.h"
#include <glib.h>
#include "qof.h"
#include "gnc-pricedb.h"
#include "gnc-backend-sql.h"
#include "gnc-commodity-sql.h"
#include "gnc-price-sql.h"
#include "gnc-slots-sql.h"
static QofLogModule log_module = G_LOG_DOMAIN;
#define TABLE_NAME "prices"
#define TABLE_VERSION 1
#define PRICE_MAX_SOURCE_LEN 2048
#define PRICE_MAX_TYPE_LEN 2048
static const GncSqlColumnTableEntry col_table[] =
{
{ "guid", CT_GUID, 0, COL_NNUL|COL_PKEY, "guid" },
{ "commodity_guid", CT_COMMODITYREF, 0, COL_NNUL, NULL, PRICE_COMMODITY },
{ "currency_guid", CT_COMMODITYREF, 0, COL_NNUL, NULL, PRICE_CURRENCY },
{ "date", CT_TIMESPEC, 0, COL_NNUL, NULL, PRICE_DATE },
{ "source", CT_STRING, PRICE_MAX_SOURCE_LEN, 0, NULL, PRICE_SOURCE },
{ "type", CT_STRING, PRICE_MAX_TYPE_LEN, 0, NULL, PRICE_TYPE },
{ "value", CT_NUMERIC, 0, COL_NNUL, NULL, PRICE_VALUE },
{ NULL }
};
/* ================================================================= */
static GNCPrice*
load_single_price( GncSqlBackend* be, GncSqlRow* row )
{
GNCPrice* pPrice;
g_return_val_if_fail( be != NULL, NULL );
g_return_val_if_fail( row != NULL, NULL );
pPrice = gnc_price_create( be->primary_book );
gnc_price_begin_edit( pPrice );
gnc_sql_load_object( be, row, GNC_ID_PRICE, pPrice, col_table );
gnc_price_commit_edit( pPrice );
return pPrice;
}
static void
load_all_prices( GncSqlBackend* be )
{
GncSqlStatement* stmt;
GncSqlResult* result;
QofBook* pBook;
GNCPriceDB* pPriceDB;
g_return_if_fail( be != NULL );
pBook = be->primary_book;
pPriceDB = gnc_book_get_pricedb( pBook );
stmt = gnc_sql_create_select_statement( be, TABLE_NAME );
result = gnc_sql_execute_select_statement( be, stmt );
gnc_sql_statement_dispose( stmt );
if( result != NULL ) {
int r;
GNCPrice* pPrice;
GList* list = NULL;
GncSqlRow* row = gnc_sql_result_get_first_row( result );
while( row != NULL ) {
pPrice = load_single_price( be, row );
if( pPrice != NULL ) {
list = g_list_append( list, pPrice );
gnc_pricedb_add_price( pPriceDB, pPrice );
}
row = gnc_sql_result_get_next_row( result );
}
gnc_sql_result_dispose( result );
if( list != NULL ) {
gnc_sql_slots_load_for_list( be, list );
}
}
}
/* ================================================================= */
static void
create_prices_tables( GncSqlBackend* be )
{
gint version;
g_return_if_fail( be != NULL );
version = gnc_sql_get_table_version( be, TABLE_NAME );
if( version == 0 ) {
gnc_sql_create_table( be, TABLE_NAME, TABLE_VERSION, col_table );
}
}
/* ================================================================= */
static void
save_price( GncSqlBackend* be, QofInstance* inst )
{
GNCPrice* pPrice = GNC_PRICE(inst);
gint op;
gboolean is_infant;
g_return_if_fail( be != NULL );
g_return_if_fail( inst != NULL );
g_return_if_fail( GNC_IS_PRICE(inst) );
is_infant = qof_instance_get_infant( inst );
if( qof_instance_get_destroying( inst ) ) {
op = OP_DB_DELETE;
} else if( be->is_pristine_db || is_infant ) {
op = OP_DB_INSERT;
} else {
op = OP_DB_UPDATE;
}
if( op != OP_DB_DELETE ) {
/* Ensure commodity and currency are in the db */
gnc_sql_save_commodity( be, gnc_price_get_commodity( pPrice ) );
gnc_sql_save_commodity( be, gnc_price_get_currency( pPrice ) );
}
(void)gnc_sql_do_db_operation( be, op, TABLE_NAME, GNC_ID_PRICE, pPrice, col_table );
}
static gboolean
write_price( GNCPrice* p, gpointer data )
{
GncSqlBackend* be = (GncSqlBackend*)data;
g_return_val_if_fail( p != NULL, FALSE );
g_return_val_if_fail( data != NULL, FALSE );
save_price( be, QOF_INSTANCE(p) );
return TRUE;
}
static void
write_prices( GncSqlBackend* be )
{
GNCPriceDB* priceDB;
g_return_if_fail( be != NULL );
priceDB = gnc_book_get_pricedb( be->primary_book );
gnc_pricedb_foreach_price( priceDB, write_price, be, TRUE );
}
/* ================================================================= */
void
gnc_sql_init_price_handler( void )
{
static GncSqlObjectBackend be_data =
{
GNC_SQL_BACKEND_VERSION,
GNC_ID_PRICE,
save_price, /* commit */
load_all_prices, /* initial_load */
create_prices_tables, /* create tables */
NULL, NULL, NULL,
write_prices /* write */
};
qof_object_register_backend( GNC_ID_PRICE, GNC_SQL_BACKEND, &be_data );
}
/* ========================== END OF FILE ===================== */

View File

@ -0,0 +1,37 @@
/********************************************************************
* gnc-price-sql.h: load and save data to SQL *
* *
* This program is free software; you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation; either version 2 of *
* the License, or (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License*
* along with this program; if not, contact: *
* *
* Free Software Foundation Voice: +1-617-542-5942 *
* 51 Franklin Street, Fifth Floor Fax: +1-617-542-2652 *
* Boston, MA 02110-1301, USA gnu@gnu.org *
\********************************************************************/
/** @file gnc-price-sql.h
* @brief load and save data to SQL
* @author Copyright (c) 2006-2008 Phil Longstaff <plongstaff@rogers.com>
*
* This file implements the top-level QofBackend API for saving/
* restoring data to/from an SQL database
*/
#ifndef GNC_PRICE_SQL_H_
#define GNC_PRICE_SQL_H_
#include "qof.h"
#include <gmodule.h>
void gnc_sql_init_price_handler( void );
#endif /* GNC_PRICE_SQL_H_ */

View File

@ -0,0 +1,342 @@
/********************************************************************
* gnc-recurrence-sql.c: load and save data to SQL *
* *
* This program is free software; you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation; either version 2 of *
* the License, or (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License*
* along with this program; if not, contact: *
* *
* Free Software Foundation Voice: +1-617-542-5942 *
* 51 Franklin Street, Fifth Floor Fax: +1-617-542-2652 *
* Boston, MA 02110-1301, USA gnu@gnu.org *
\********************************************************************/
/** @file gnc-recurrence-sql.c
* @brief load and save data to SQL
* @author Copyright (c) 2006-2008 Phil Longstaff <plongstaff@rogers.com>
*
* This file implements the top-level QofBackend API for saving/
* restoring data to/from an SQL db
*/
#include "config.h"
#include <glib.h>
#include "qof.h"
#include "gnc-engine.h"
#include "Recurrence.h"
#include "gnc-backend-sql.h"
#include "gnc-recurrence-sql.h"
static QofLogModule log_module = G_LOG_DOMAIN;
#define TABLE_NAME "recurrences"
#define TABLE_VERSION 1
#define BUDGET_MAX_RECURRENCE_PERIOD_TYPE_LEN 2048
typedef struct {
GncSqlBackend* be;
const GUID* guid;
Recurrence* pRecurrence;
} recurrence_info_t;
static gpointer get_obj_guid( gpointer pObject, const QofParam* param );
static void set_obj_guid( gpointer pObject, gpointer pValue );
static gint get_recurrence_mult( gpointer pObject );
static void set_recurrence_mult( gpointer pObject, gint value );
static gpointer get_recurrence_period_type( gpointer pObject, const QofParam* );
static void set_recurrence_period_type( gpointer pObject, gpointer pValue );
static gpointer get_recurrence_period_start( gpointer pObject, const QofParam* );
static void set_recurrence_period_start( gpointer pObject, gpointer pValue );
static const GncSqlColumnTableEntry col_table[] =
{
{ "obj_guid", CT_GUID, 0, COL_NNUL, NULL, NULL,
get_obj_guid, set_obj_guid },
{ "recurrence_mult", CT_INT, 0, COL_NNUL, NULL, NULL,
(QofAccessFunc)get_recurrence_mult, (QofSetterFunc)set_recurrence_mult },
{ "recurrence_period_type", CT_STRING, BUDGET_MAX_RECURRENCE_PERIOD_TYPE_LEN, COL_NNUL, NULL, NULL,
get_recurrence_period_type, set_recurrence_period_type },
{ "recurrence_period_start", CT_GDATE, 0, COL_NNUL, NULL, NULL,
get_recurrence_period_start, set_recurrence_period_start },
{ NULL }
};
/* Special column table because we need to be able to access the table by
a column other than the primary key */
static const GncSqlColumnTableEntry guid_col_table[] =
{
{ "obj_guid", CT_GUID, 0, 0, NULL, NULL, get_obj_guid, set_obj_guid },
{ NULL }
};
/* ================================================================= */
static gpointer
get_obj_guid( gpointer pObject, const QofParam* param )
{
recurrence_info_t* pInfo = (recurrence_info_t*)pObject;
g_return_val_if_fail( pObject != NULL, NULL );
return (gpointer)pInfo->guid;
}
static void
set_obj_guid( gpointer pObject, gpointer pValue )
{
// Nowhere to put the GUID
}
static gint
get_recurrence_mult( gpointer pObject )
{
recurrence_info_t* pInfo = (recurrence_info_t*)pObject;
g_return_val_if_fail( pObject != NULL, 0 );
g_return_val_if_fail( pInfo->pRecurrence != NULL, 0 );
return pInfo->pRecurrence->mult;
}
static void
set_recurrence_mult( gpointer pObject, gint value )
{
recurrence_info_t* pInfo = (recurrence_info_t*)pObject;
g_return_if_fail( pObject != NULL );
g_return_if_fail( pInfo->pRecurrence != NULL );
pInfo->pRecurrence->mult = value;
}
static gpointer
get_recurrence_period_type( gpointer pObject, const QofParam* param )
{
recurrence_info_t* pInfo = (recurrence_info_t*)pObject;
g_return_val_if_fail( pObject != NULL, NULL );
g_return_val_if_fail( pInfo->pRecurrence != NULL, NULL );
return (gpointer)recurrencePeriodTypeToString(
recurrenceGetPeriodType( pInfo->pRecurrence ) );
}
static void
set_recurrence_period_type( gpointer pObject, gpointer pValue )
{
recurrence_info_t* pInfo = (recurrence_info_t*)pObject;
g_return_if_fail( pObject != NULL );
g_return_if_fail( pInfo->pRecurrence != NULL );
g_return_if_fail( pValue != NULL );
pInfo->pRecurrence->ptype = recurrencePeriodTypeFromString( (gchar*)pValue );
}
static gpointer
get_recurrence_period_start( gpointer pObject, const QofParam* param )
{
recurrence_info_t* pInfo = (recurrence_info_t*)pObject;
static GDate date;
g_return_val_if_fail( pObject != NULL, NULL );
g_return_val_if_fail( pInfo->pRecurrence != NULL, NULL );
date = recurrenceGetDate( pInfo->pRecurrence );
return (gpointer)&date;
}
static void
set_recurrence_period_start( gpointer pObject, gpointer pValue )
{
recurrence_info_t* pInfo = (recurrence_info_t*)pObject;
GDate* date = (GDate*)pValue;
g_return_if_fail( pObject != NULL );
g_return_if_fail( pInfo->pRecurrence != NULL );
g_return_if_fail( pValue != NULL );
pInfo->pRecurrence->start = *date;
}
/* ================================================================= */
void
gnc_sql_recurrence_save( GncSqlBackend* be, const GUID* guid, const Recurrence* r )
{
recurrence_info_t recurrence_info;
g_return_if_fail( be != NULL );
g_return_if_fail( guid != NULL );
g_return_if_fail( r != NULL );
gnc_sql_recurrence_delete( be, guid );
recurrence_info.be = be;
recurrence_info.guid = guid;
recurrence_info.pRecurrence = (Recurrence*)r;
(void)gnc_sql_do_db_operation( be, OP_DB_INSERT, TABLE_NAME,
TABLE_NAME, &recurrence_info, col_table );
}
void
gnc_sql_recurrence_save_list( GncSqlBackend* be, const GUID* guid, GList* schedule )
{
recurrence_info_t recurrence_info;
GList* l;
g_return_if_fail( be != NULL );
g_return_if_fail( guid != NULL );
gnc_sql_recurrence_delete( be, guid );
recurrence_info.be = be;
recurrence_info.guid = guid;
for( l = schedule; l != NULL; l = g_list_next( l ) ) {
recurrence_info.pRecurrence = (Recurrence*)l->data;
(void)gnc_sql_do_db_operation( be, OP_DB_INSERT, TABLE_NAME,
TABLE_NAME, &recurrence_info, col_table );
}
}
void
gnc_sql_recurrence_delete( GncSqlBackend* be, const GUID* guid )
{
recurrence_info_t recurrence_info;
g_return_if_fail( be != NULL );
g_return_if_fail( guid != NULL );
recurrence_info.be = be;
recurrence_info.guid = guid;
(void)gnc_sql_do_db_operation( be, OP_DB_DELETE, TABLE_NAME,
TABLE_NAME, &recurrence_info, guid_col_table );
}
static void
load_recurrence( GncSqlBackend* be, GncSqlRow* row, Recurrence* r )
{
recurrence_info_t recurrence_info;
g_return_if_fail( be != NULL );
g_return_if_fail( row != NULL );
g_return_if_fail( r != NULL );
recurrence_info.be = be;
recurrence_info.pRecurrence = r;
gnc_sql_load_object( be, row, TABLE_NAME, &recurrence_info, col_table );
}
static GncSqlResult*
gnc_sql_set_recurrences_from_db( GncSqlBackend* be, const GUID* guid )
{
gchar* buf;
gchar guid_buf[GUID_ENCODING_LENGTH+1];
gchar* field_name;
GncSqlStatement* stmt;
GError* error = NULL;
GncSqlResult* result;
g_return_val_if_fail( be != NULL, NULL );
g_return_val_if_fail( guid != NULL, NULL );
guid_to_string_buff( guid, guid_buf );
buf = g_strdup_printf( "SELECT * FROM %s WHERE obj_guid='%s'", TABLE_NAME, guid_buf );
stmt = gnc_sql_connection_create_statement_from_sql( be->conn, buf );
result = gnc_sql_execute_select_statement( be, stmt );
gnc_sql_statement_dispose( stmt );
return result;
}
void
gnc_sql_recurrence_load( GncSqlBackend* be, const GUID* guid, Recurrence* pRecurrence )
{
GncSqlResult* result;
g_return_if_fail( be != NULL );
g_return_if_fail( guid != NULL );
g_return_if_fail( pRecurrence != NULL );
result = gnc_sql_set_recurrences_from_db( be, guid );
if( result != NULL ) {
int numRows = gnc_sql_result_get_num_rows( result );
if( numRows > 0 ) {
if( numRows > 1 ) {
g_warning( "More than 1 recurrence found: first one used" );
}
load_recurrence( be, gnc_sql_result_get_first_row( result ),
pRecurrence );
} else {
g_warning( "No recurrences found" );
}
gnc_sql_result_dispose( result );
}
}
void
gnc_sql_recurrence_load_list( GncSqlBackend* be, const GUID* guid, GList** pSchedule )
{
GncSqlResult* result;
g_return_if_fail( be != NULL );
g_return_if_fail( guid != NULL );
g_return_if_fail( pSchedule != NULL );
result = gnc_sql_set_recurrences_from_db( be, guid );
if( result != NULL ) {
GncSqlRow* row = gnc_sql_result_get_first_row( result );
while( row != NULL ) {
Recurrence* pRecurrence = g_new0( Recurrence, 1 );
load_recurrence( be, row, pRecurrence );
*pSchedule = g_list_append( *pSchedule, pRecurrence );
row = gnc_sql_result_get_next_row( result );
}
gnc_sql_result_dispose( result );
}
}
/* ================================================================= */
static void
create_recurrence_tables( GncSqlBackend* be )
{
gint version;
g_return_if_fail( be != NULL );
version = gnc_sql_get_table_version( be, TABLE_NAME );
if( version == 0 ) {
gnc_sql_create_table( be, TABLE_NAME, TABLE_VERSION, col_table );
}
}
/* ================================================================= */
void
gnc_sql_init_recurrence_handler( void )
{
static GncSqlObjectBackend be_data =
{
GNC_SQL_BACKEND_VERSION,
GNC_ID_ACCOUNT,
NULL, /* commit - cannot occur */
NULL, /* initial_load - cannot occur */
create_recurrence_tables /* create_tables */
};
qof_object_register_backend( TABLE_NAME, GNC_SQL_BACKEND, &be_data );
}
/* ========================== END OF FILE ===================== */

View File

@ -0,0 +1,43 @@
/********************************************************************
* gnc-recurrence-sql.h: load and save data to SQL *
* *
* This program is free software; you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation; either version 2 of *
* the License, or (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License*
* along with this program; if not, contact: *
* *
* Free Software Foundation Voice: +1-617-542-5942 *
* 51 Franklin Street, Fifth Floor Fax: +1-617-542-2652 *
* Boston, MA 02110-1301, USA gnu@gnu.org *
\********************************************************************/
/** @file gnc-recurrence-sql.h
* @brief load and save accounts data to SQL
* @author Copyright (c) 2006-2008 Phil Longstaff <plongstaff@rogers.com>
*
* This file implements the top-level QofBackend API for saving/
* restoring data to/from an SQL database
*/
#ifndef GNC_RECURRENCE_SQL_H_
#define GNC_RECURRENCE_SQL_H_
#include "qof.h"
#include <gmodule.h>
void gnc_sql_recurrence_save( GncSqlBackend* be, const GUID* guid, const Recurrence* pRecurrence );
void gnc_sql_recurrence_save_list( GncSqlBackend* be, const GUID* guid, GList* schedule );
void gnc_sql_recurrence_delete( GncSqlBackend* be, const GUID* guid );
void gnc_sql_recurrence_load( GncSqlBackend* be, const GUID* guid, Recurrence* pRecurrence );
void gnc_sql_recurrence_load_list( GncSqlBackend* be, const GUID* guid, GList** pSchedule );
void gnc_sql_init_recurrence_handler( void );
#endif /* GNC_RECURRENCE_SQL_H_ */

View File

@ -0,0 +1,312 @@
/********************************************************************
* gnc-schedxaction-sql.c: load and save data to SQL *
* *
* This program is free software; you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation; either version 2 of *
* the License, or (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License*
* along with this program; if not, contact: *
* *
* Free Software Foundation Voice: +1-617-542-5942 *
* 51 Franklin Street, Fifth Floor Fax: +1-617-542-2652 *
* Boston, MA 02110-1301, USA gnu@gnu.org *
\********************************************************************/
/** @file gnc-schedxaction-sql.c
* @brief load and save data to SQL
* @author Copyright (c) 2006-2008 Phil Longstaff <plongstaff@rogers.com>
*
* This file implements the top-level QofBackend API for saving/
* restoring data to/from an SQL db
*/
#include "config.h"
#include <glib.h>
#include "qof.h"
#include "gnc-backend-sql.h"
#include "gnc-schedxaction-sql.h"
#include "gnc-slots-sql.h"
#include "SchedXaction.h"
#include "SX-book.h"
#include "Recurrence.h"
#include "gnc-recurrence-sql.h"
#define SCHEDXACTION_TABLE "schedxactions"
#define TABLE_VERSION 1
static QofLogModule log_module = G_LOG_DOMAIN;
#define SX_MAX_NAME_LEN 2048
static gboolean get_autocreate( gpointer pObject );
static void set_autocreate( gpointer pObject, gboolean value );
static gboolean get_autonotify( gpointer pObject );
static void set_autonotify( gpointer pObject, gboolean value );
static gint get_instance_count( gpointer pObject );
static gpointer get_template_act_guid( gpointer pObject, const QofParam* param );
static void set_template_act_guid( gpointer pObject, gpointer pValue );
static const GncSqlColumnTableEntry col_table[] =
{
{ "guid", CT_GUID, 0, COL_NNUL|COL_PKEY, "guid" },
{ "name", CT_STRING, SX_MAX_NAME_LEN, 0, NULL, GNC_SX_NAME },
{ "enabled", CT_BOOLEAN, 0, COL_NNUL, NULL, NULL,
(QofAccessFunc)xaccSchedXactionGetEnabled, (QofSetterFunc)xaccSchedXactionSetEnabled },
{ "start_date", CT_GDATE, 0, COL_NNUL, NULL, GNC_SX_START_DATE },
{ "last_occur", CT_GDATE, 0, 0, NULL, GNC_SX_LAST_DATE },
{ "num_occur", CT_INT, 0, COL_NNUL, NULL, GNC_SX_NUM_OCCUR },
{ "rem_occur", CT_INT, 0, COL_NNUL, NULL, GNC_SX_REM_OCCUR },
{ "auto_create", CT_BOOLEAN, 0, COL_NNUL, NULL, NULL,
(QofAccessFunc)get_autocreate, (QofSetterFunc)set_autocreate },
{ "auto_notify", CT_BOOLEAN, 0, COL_NNUL, NULL, NULL,
(QofAccessFunc)get_autonotify, (QofSetterFunc)set_autonotify },
{ "adv_creation", CT_INT, 0, COL_NNUL, NULL, NULL,
(QofAccessFunc)xaccSchedXactionGetAdvanceCreation,
(QofSetterFunc)xaccSchedXactionSetAdvanceCreation },
{ "adv_notify", CT_INT, 0, COL_NNUL, NULL, NULL,
(QofAccessFunc)xaccSchedXactionGetAdvanceReminder,
(QofSetterFunc)xaccSchedXactionSetAdvanceReminder },
{ "instance_count", CT_INT, 0, COL_NNUL, NULL, NULL,
(QofAccessFunc)get_instance_count, (QofSetterFunc)gnc_sx_set_instance_count },
{ "template_act_guid", CT_GUID, 0, COL_NNUL, NULL, NULL,
get_template_act_guid, set_template_act_guid },
{ NULL }
};
/* ================================================================= */
static gboolean
get_autocreate( gpointer pObject )
{
const SchedXaction* pSx = GNC_SX(pObject);
gboolean autoCreate;
gboolean autoNotify;
g_return_val_if_fail( pObject != NULL, FALSE );
g_return_val_if_fail( GNC_IS_SX(pObject), FALSE );
xaccSchedXactionGetAutoCreate( pSx, &autoCreate, &autoNotify );
return autoCreate;
}
static void
set_autocreate( gpointer pObject, gboolean value )
{
SchedXaction* pSx = GNC_SX(pObject);
gboolean autoNotify;
gboolean dummy;
g_return_if_fail( pObject != NULL );
g_return_if_fail( GNC_IS_SX(pObject) );
xaccSchedXactionGetAutoCreate( pSx, &dummy, &autoNotify );
xaccSchedXactionSetAutoCreate( pSx, value, autoNotify );
}
static gboolean
get_autonotify( gpointer pObject )
{
const SchedXaction* pSx = GNC_SX(pObject);
gboolean autoCreate;
gboolean autoNotify;
g_return_val_if_fail( pObject != NULL, FALSE );
g_return_val_if_fail( GNC_IS_SX(pObject), FALSE );
xaccSchedXactionGetAutoCreate( pSx, &autoCreate, &autoNotify );
return autoNotify;
}
static void
set_autonotify( gpointer pObject, gboolean value )
{
SchedXaction* pSx = GNC_SX(pObject);
gboolean autoCreate;
gboolean dummy;
g_return_if_fail( pObject != NULL );
g_return_if_fail( GNC_IS_SX(pObject) );
xaccSchedXactionGetAutoCreate( pSx, &autoCreate, &dummy );
xaccSchedXactionSetAutoCreate( pSx, autoCreate, value );
}
static gint
get_instance_count( gpointer pObject )
{
const SchedXaction* pSx = GNC_SX(pObject);
g_return_val_if_fail( pObject != NULL, FALSE );
g_return_val_if_fail( GNC_IS_SX(pObject), FALSE );
return gnc_sx_get_instance_count( pSx, NULL );
}
static gpointer
get_template_act_guid( gpointer pObject, const QofParam* param )
{
const SchedXaction* pSx = GNC_SX(pObject);
g_return_val_if_fail( pObject != NULL, NULL );
g_return_val_if_fail( GNC_IS_SX(pObject), NULL );
return (gpointer)xaccAccountGetGUID( pSx->template_acct );
}
static void
set_template_act_guid( gpointer pObject, gpointer pValue )
{
SchedXaction* pSx = GNC_SX(pObject);
QofBook* pBook;
GUID* guid = (GUID*)pValue;
Account* pAcct;
g_return_if_fail( pObject != NULL );
g_return_if_fail( GNC_IS_SX(pObject) );
g_return_if_fail( pValue != NULL );
pBook = qof_instance_get_book( QOF_INSTANCE(pSx) );
pAcct = xaccAccountLookup( guid, pBook );
sx_set_template_account( pSx, pAcct );
}
/* ================================================================= */
static SchedXaction*
load_single_sx( GncSqlBackend* be, GncSqlRow* row )
{
const GUID* guid;
GUID sx_guid;
SchedXaction* pSx;
GList* schedule = NULL;
g_return_val_if_fail( be != NULL, NULL );
g_return_val_if_fail( row != NULL, NULL );
guid = gnc_sql_load_guid( be, row );
sx_guid = *guid;
pSx = xaccSchedXactionMalloc( be->primary_book );
gnc_sx_begin_edit( pSx );
gnc_sql_load_object( be, row, GNC_SX_ID, pSx, col_table );
gnc_sql_recurrence_load_list( be, guid, &schedule );
gnc_sx_set_schedule( pSx, schedule );
gnc_sx_commit_edit( pSx );
return pSx;
}
static void
load_all_sxes( GncSqlBackend* be )
{
GncSqlStatement* stmt = NULL;
GncSqlResult* result;
g_return_if_fail( be != NULL );
stmt = gnc_sql_create_select_statement( be, SCHEDXACTION_TABLE );
result = gnc_sql_execute_select_statement( be, stmt );
gnc_sql_statement_dispose( stmt );
if( result != NULL ) {
GncSqlRow* row;
int r;
SchedXactions *sxes;
GList* list = NULL;
sxes = gnc_book_get_schedxactions( be->primary_book );
row = gnc_sql_result_get_first_row( result );
while( row != NULL ) {
SchedXaction* sx;
sx = load_single_sx( be, row );
if( sx != NULL ) {
gnc_sxes_add_sx( sxes, sx );
list = g_list_append( list, sx );
}
row = gnc_sql_result_get_next_row( result );
}
gnc_sql_result_dispose( result );
if( list != NULL ) {
gnc_sql_slots_load_for_list( be, list );
}
}
}
/* ================================================================= */
static void
create_sx_tables( GncSqlBackend* be )
{
gint version;
g_return_if_fail( be != NULL );
version = gnc_sql_get_table_version( be, SCHEDXACTION_TABLE );
if( version == 0 ) {
gnc_sql_create_table( be, SCHEDXACTION_TABLE, TABLE_VERSION, col_table );
}
}
/* ================================================================= */
void
gnc_sql_save_schedxaction( GncSqlBackend* be, QofInstance* inst )
{
SchedXaction* pSx;
const GUID* guid;
gint op;
gboolean is_infant;
g_return_if_fail( be != NULL );
g_return_if_fail( inst != NULL );
g_return_if_fail( GNC_IS_SX(inst) );
pSx = GNC_SX(inst);
is_infant = qof_instance_get_infant( inst );
if( qof_instance_get_destroying( inst ) ) {
op = OP_DB_DELETE;
} else if( be->is_pristine_db || is_infant ) {
op = OP_DB_INSERT;
} else {
op = OP_DB_UPDATE;
}
(void)gnc_sql_do_db_operation( be, op, SCHEDXACTION_TABLE, GNC_SX_ID, pSx, col_table );
guid = qof_instance_get_guid( inst );
gnc_sql_recurrence_save_list( be, guid, gnc_sx_get_schedule( pSx ) );
// Now, commit any slots
if( !qof_instance_get_destroying(inst) ) {
gnc_sql_slots_save( be, guid, is_infant, qof_instance_get_slots( inst ) );
} else {
gnc_sql_slots_delete( be, guid );
}
}
/* ================================================================= */
void
gnc_sql_init_schedxaction_handler( void )
{
static GncSqlObjectBackend be_data =
{
GNC_SQL_BACKEND_VERSION,
GNC_ID_SCHEDXACTION,
gnc_sql_save_schedxaction, /* commit */
load_all_sxes, /* initial_load */
create_sx_tables /* create_tables */
};
qof_object_register_backend( GNC_ID_SCHEDXACTION, GNC_SQL_BACKEND, &be_data );
}
/* ========================== END OF FILE ===================== */

View File

@ -0,0 +1,38 @@
/********************************************************************
* gnc-schedxaction-sql.h: load and save data to SQL *
* *
* This program is free software; you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation; either version 2 of *
* the License, or (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License*
* along with this program; if not, contact: *
* *
* Free Software Foundation Voice: +1-617-542-5942 *
* 51 Franklin Street, Fifth Floor Fax: +1-617-542-2652 *
* Boston, MA 02110-1301, USA gnu@gnu.org *
\********************************************************************/
/** @file gnc-backend-sql.h
* @brief load and save data to SQL
* @author Copyright (c) 2006-2008 Phil Longstaff <plongstaff@rogers.com>
*
* This file implements the top-level QofBackend API for saving/
* restoring data to/from an SQL database
*/
#ifndef GNC_SCHEDXACTION_SQL_H_
#define GNC_SCHEDXACTION_SQL_H_
#include "qof.h"
#include <gmodule.h>
void gnc_sql_init_schedxaction_handler( void );
void gnc_sql_save_schedxaction( GncSqlBackend* be, QofInstance* inst );
#endif /* GNC_SCHEDXACTION_SQL_H_ */

View File

@ -0,0 +1,567 @@
/********************************************************************
* gnc-slots-sql.c: load and save data to SQL *
* *
* This program is free software; you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation; either version 2 of *
* the License, or (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License*
* along with this program; if not, contact: *
* *
* Free Software Foundation Voice: +1-617-542-5942 *
* 51 Franklin Street, Fifth Floor Fax: +1-617-542-2652 *
* Boston, MA 02110-1301, USA gnu@gnu.org *
\********************************************************************/
/** @file gnc-slots-sql.c
* @brief load and save data to SQL
* @author Copyright (c) 2006-2008 Phil Longstaff <plongstaff@rogers.com>
*
* This file implements the top-level QofBackend API for saving/
* restoring data to/from an SQL db
*/
#include "config.h"
#include <glib.h>
#include "qof.h"
#include "gnc-engine.h"
#include "gnc-backend-sql.h"
#include "gnc-slots-sql.h"
static QofLogModule log_module = G_LOG_DOMAIN;
#define TABLE_NAME "slots"
#define TABLE_VERSION 1
typedef struct {
GncSqlBackend* be;
const GUID* guid;
KvpFrame* pKvpFrame;
KvpValueType value_type;
KvpValue* pKvpValue;
GString* path;
} slot_info_t;
static gpointer get_obj_guid( gpointer pObject, const QofParam* param );
static void set_obj_guid( gpointer pObject, gpointer pValue );
static gpointer get_path( gpointer pObject, const QofParam* param );
static void set_path( gpointer pObject, gpointer pValue );
static gpointer get_slot_type( gpointer pObject, const QofParam* param );
static void set_slot_type( gpointer pObject, gpointer pValue );
static gint64 get_int64_val( gpointer pObject, const QofParam* param );
static void set_int64_val( gpointer pObject, gint64 pValue );
static gpointer get_string_val( gpointer pObject, const QofParam* param );
static void set_string_val( gpointer pObject, gpointer pValue );
static gpointer get_double_val( gpointer pObject, const QofParam* param );
static void set_double_val( gpointer pObject, gpointer pValue );
static Timespec get_timespec_val( gpointer pObject, const QofParam* param );
static void set_timespec_val( gpointer pObject, Timespec ts );
static gpointer get_guid_val( gpointer pObject, const QofParam* param );
static void set_guid_val( gpointer pObject, gpointer pValue );
static gnc_numeric get_numeric_val( gpointer pObject, const QofParam* param );
static void set_numeric_val( gpointer pObject, gnc_numeric value );
#define SLOT_MAX_PATHNAME_LEN 4096
#define SLOT_MAX_STRINGVAL_LEN 4096
static const GncSqlColumnTableEntry col_table[] =
{
{ "obj_guid", CT_GUID, 0, COL_NNUL, NULL, NULL,
get_obj_guid, set_obj_guid },
{ "name", CT_STRING, SLOT_MAX_PATHNAME_LEN, COL_NNUL, NULL, NULL,
get_path, set_path },
{ "slot_type", CT_INT, 0, COL_NNUL, NULL, NULL,
get_slot_type, set_slot_type, },
{ "int64_val", CT_INT64, 0, 0, NULL, NULL,
(QofAccessFunc)get_int64_val, (QofSetterFunc)set_int64_val },
{ "string_val", CT_STRING, SLOT_MAX_PATHNAME_LEN, 0, NULL, NULL,
get_string_val, set_string_val },
{ "double_val", CT_DOUBLE, 0, 0, NULL, NULL,
get_double_val, set_double_val },
{ "timespec_val", CT_TIMESPEC, 0, 0, NULL, NULL,
(QofAccessFunc)get_timespec_val, (QofSetterFunc)set_timespec_val },
{ "guid_val", CT_GUID, 0, 0, NULL, NULL,
get_guid_val, set_guid_val },
{ "numeric_val", CT_NUMERIC, 0, 0, NULL, NULL,
(QofAccessFunc)get_numeric_val, (QofSetterFunc)set_numeric_val },
{ NULL }
};
/* Special column table because we need to be able to access the table by
a column other than the primary key */
static const GncSqlColumnTableEntry obj_guid_col_table[] =
{
{ "obj_guid", CT_GUID, 0, 0, NULL, NULL, get_obj_guid, _retrieve_guid_ },
{ NULL }
};
/* ================================================================= */
static gpointer
get_obj_guid( gpointer pObject, const QofParam* param )
{
slot_info_t* pInfo = (slot_info_t*)pObject;
g_return_val_if_fail( pObject != NULL, NULL );
return (gpointer)pInfo->guid;
}
static void
set_obj_guid( gpointer pObject, gpointer pValue )
{
// Nowhere to put the GUID
}
static gpointer
get_path( gpointer pObject, const QofParam* param )
{
slot_info_t* pInfo = (slot_info_t*)pObject;
g_return_val_if_fail( pObject != NULL, NULL );
return (gpointer)pInfo->path->str;
}
static void
set_path( gpointer pObject, gpointer pValue )
{
slot_info_t* pInfo = (slot_info_t*)pObject;
g_return_if_fail( pObject != NULL );
g_return_if_fail( pValue != NULL );
pInfo->path = g_string_new( (gchar*)pValue );
}
static gpointer
get_slot_type( gpointer pObject, const QofParam* param )
{
slot_info_t* pInfo = (slot_info_t*)pObject;
g_return_val_if_fail( pObject != NULL, NULL );
return (gpointer)kvp_value_get_type( pInfo->pKvpValue );
}
static void
set_slot_type( gpointer pObject, gpointer pValue )
{
slot_info_t* pInfo = (slot_info_t*)pObject;
g_return_if_fail( pObject != NULL );
g_return_if_fail( pValue != NULL );
pInfo->value_type = (KvpValueType)pValue;
}
static gint64
get_int64_val( gpointer pObject, const QofParam* param )
{
slot_info_t* pInfo = (slot_info_t*)pObject;
g_return_val_if_fail( pObject != NULL, 0 );
if( kvp_value_get_type( pInfo->pKvpValue ) == KVP_TYPE_GINT64 ) {
return kvp_value_get_gint64( pInfo->pKvpValue );
} else {
return 0;
}
}
static void
set_int64_val( gpointer pObject, gint64 value )
{
slot_info_t* pInfo = (slot_info_t*)pObject;
g_return_if_fail( pObject != NULL );
if( pInfo->value_type == KVP_TYPE_GINT64 ) {
kvp_frame_set_gint64( pInfo->pKvpFrame, pInfo->path->str, value );
}
}
static gpointer
get_string_val( gpointer pObject, const QofParam* param )
{
slot_info_t* pInfo = (slot_info_t*)pObject;
g_return_val_if_fail( pObject != NULL, NULL );
if( kvp_value_get_type( pInfo->pKvpValue ) == KVP_TYPE_STRING ) {
return (gpointer)kvp_value_get_string( pInfo->pKvpValue );
} else {
return NULL;
}
}
static void
set_string_val( gpointer pObject, gpointer pValue )
{
slot_info_t* pInfo = (slot_info_t*)pObject;
g_return_if_fail( pObject != NULL );
if( pInfo->value_type == KVP_TYPE_STRING && pValue != NULL ) {
kvp_frame_set_string( pInfo->pKvpFrame, pInfo->path->str, (const gchar*)pValue );
}
}
static gpointer
get_double_val( gpointer pObject, const QofParam* param )
{
slot_info_t* pInfo = (slot_info_t*)pObject;
static double d_val;
g_return_val_if_fail( pObject != NULL, NULL );
if( kvp_value_get_type( pInfo->pKvpValue ) == KVP_TYPE_DOUBLE ) {
d_val = kvp_value_get_double( pInfo->pKvpValue );
return (gpointer)&d_val;
} else {
return NULL;
}
}
static void
set_double_val( gpointer pObject, gpointer pValue )
{
slot_info_t* pInfo = (slot_info_t*)pObject;
g_return_if_fail( pObject != NULL );
if( pInfo->value_type == KVP_TYPE_DOUBLE && pValue != NULL ) {
kvp_frame_set_double( pInfo->pKvpFrame, pInfo->path->str, *(double*)pValue );
}
}
static Timespec
get_timespec_val( gpointer pObject, const QofParam* param )
{
slot_info_t* pInfo = (slot_info_t*)pObject;
g_return_val_if_fail( pObject != NULL, gnc_dmy2timespec( 1, 1, 1970 ) );
//if( kvp_value_get_type( pInfo->pKvpValue ) == KVP_TYPE_TIMESPEC ) {
return kvp_value_get_timespec( pInfo->pKvpValue );
}
static void
set_timespec_val( gpointer pObject, Timespec ts )
{
slot_info_t* pInfo = (slot_info_t*)pObject;
g_return_if_fail( pObject != NULL );
if( pInfo->value_type == KVP_TYPE_TIMESPEC ) {
kvp_frame_set_timespec( pInfo->pKvpFrame, pInfo->path->str, ts );
}
}
static gpointer
get_guid_val( gpointer pObject, const QofParam* param )
{
slot_info_t* pInfo = (slot_info_t*)pObject;
g_return_val_if_fail( pObject != NULL, NULL );
if( kvp_value_get_type( pInfo->pKvpValue ) == KVP_TYPE_GUID ) {
return (gpointer)kvp_value_get_guid( pInfo->pKvpValue );
} else {
return NULL;
}
}
static void
set_guid_val( gpointer pObject, gpointer pValue )
{
slot_info_t* pInfo = (slot_info_t*)pObject;
g_return_if_fail( pObject != NULL );
if( pInfo->value_type == KVP_TYPE_GUID && pValue != NULL ) {
kvp_frame_set_guid( pInfo->pKvpFrame, pInfo->path->str, (GUID*)pValue );
}
}
static gnc_numeric
get_numeric_val( gpointer pObject, const QofParam* param )
{
slot_info_t* pInfo = (slot_info_t*)pObject;
g_return_val_if_fail( pObject != NULL, gnc_numeric_zero() );
if( kvp_value_get_type( pInfo->pKvpValue ) == KVP_TYPE_NUMERIC ) {
return kvp_value_get_numeric( pInfo->pKvpValue );
} else {
return gnc_numeric_zero();
}
}
static void
set_numeric_val( gpointer pObject, gnc_numeric value )
{
slot_info_t* pInfo = (slot_info_t*)pObject;
g_return_if_fail( pObject != NULL );
if( pInfo->value_type == KVP_TYPE_NUMERIC ) {
kvp_frame_set_numeric( pInfo->pKvpFrame, pInfo->path->str, value );
}
}
static void
save_slot( const gchar* key, KvpValue* value, gpointer data )
{
slot_info_t* pSlot_info = (slot_info_t*)data;
gint curlen;
g_return_if_fail( key != NULL );
g_return_if_fail( value != NULL );
g_return_if_fail( data != NULL );
curlen = pSlot_info->path->len;
pSlot_info->pKvpValue = value;
if( curlen != 0 ) {
g_string_append( pSlot_info->path, "/" );
}
g_string_append( pSlot_info->path, key );
if( kvp_value_get_type( value ) == KVP_TYPE_FRAME ) {
KvpFrame* pKvpFrame = kvp_value_get_frame( value );
kvp_frame_for_each_slot( pKvpFrame, save_slot, pSlot_info );
} else {
(void)gnc_sql_do_db_operation( pSlot_info->be, OP_DB_INSERT, TABLE_NAME,
TABLE_NAME, pSlot_info, col_table );
}
g_string_truncate( pSlot_info->path, curlen );
}
void
gnc_sql_slots_save( GncSqlBackend* be, const GUID* guid, gboolean is_infant, KvpFrame* pFrame )
{
slot_info_t slot_info;
g_return_if_fail( be != NULL );
g_return_if_fail( guid != NULL );
g_return_if_fail( pFrame != NULL );
// If this is not saving into a new db, clear out the old saved slots first
if( !be->is_pristine_db && !is_infant ) {
gnc_sql_slots_delete( be, guid );
}
slot_info.be = be;
slot_info.guid = guid;
slot_info.path = g_string_new( "" );
kvp_frame_for_each_slot( pFrame, save_slot, &slot_info );
g_string_free( slot_info.path, TRUE );
}
void
gnc_sql_slots_delete( GncSqlBackend* be, const GUID* guid )
{
slot_info_t slot_info;
g_return_if_fail( be != NULL );
g_return_if_fail( guid != NULL );
slot_info.be = be;
slot_info.guid = guid;
(void)gnc_sql_do_db_operation( be, OP_DB_DELETE, TABLE_NAME,
TABLE_NAME, &slot_info, obj_guid_col_table );
}
static void
load_slot( GncSqlBackend* be, GncSqlRow* row, KvpFrame* pFrame )
{
slot_info_t slot_info;
g_return_if_fail( be != NULL );
g_return_if_fail( row != NULL );
g_return_if_fail( pFrame != NULL );
slot_info.be = be;
slot_info.pKvpFrame = pFrame;
slot_info.path = NULL;
gnc_sql_load_object( be, row, TABLE_NAME, &slot_info, col_table );
if( slot_info.path != NULL ) {
g_string_free( slot_info.path, TRUE );
}
}
void
gnc_sql_slots_load( GncSqlBackend* be, QofInstance* inst )
{
gchar* buf;
GncSqlResult* result;
gchar guid_buf[GUID_ENCODING_LENGTH+1];
gchar* field_name;
GncSqlStatement* stmt;
GValue value;
const GUID* guid;
KvpFrame* pFrame;
GError* error = NULL;
g_return_if_fail( be != NULL );
g_return_if_fail( inst != NULL );
guid = qof_instance_get_guid( inst );
pFrame = qof_instance_get_slots( inst );
guid_to_string_buff( guid, guid_buf );
memset( &value, 0, sizeof( value ) );
g_value_init( &value, G_TYPE_STRING );
g_value_set_string( &value, guid_buf );
buf = g_strdup_printf( "SELECT * FROM %s WHERE obj_guid='%s'", TABLE_NAME, guid_buf );
stmt = gnc_sql_create_statement_from_sql( be, buf );
result = gnc_sql_execute_select_statement( be, stmt );
gnc_sql_statement_dispose( stmt );
if( result != NULL ) {
GncSqlRow* row = gnc_sql_result_get_first_row( result );
while( row != NULL ) {
load_slot( be, row, pFrame );
row = gnc_sql_result_get_next_row( result );
}
gnc_sql_result_dispose( result );
}
}
static const GUID*
load_obj_guid( const GncSqlBackend* be, GncSqlRow* row )
{
static GUID guid;
g_return_val_if_fail( be != NULL, NULL );
g_return_val_if_fail( row != NULL, NULL );
gnc_sql_load_object( be, row, NULL, &guid, obj_guid_col_table );
return &guid;
}
static void
load_slot_for_list_item( GncSqlBackend* be, GncSqlRow* row, QofCollection* coll )
{
slot_info_t slot_info;
const GUID* guid;
QofInstance* inst;
g_return_if_fail( be != NULL );
g_return_if_fail( row != NULL );
g_return_if_fail( coll != NULL );
guid = load_obj_guid( be, row );
inst = qof_collection_lookup_entity( coll, guid );
slot_info.be = be;
slot_info.pKvpFrame = qof_instance_get_slots( inst );
slot_info.path = NULL;
gnc_sql_load_object( be, row, TABLE_NAME, &slot_info, col_table );
if( slot_info.path != NULL ) {
g_string_free( slot_info.path, TRUE );
}
}
void
gnc_sql_slots_load_for_list( GncSqlBackend* be, GList* list )
{
QofCollection* coll;
GncSqlStatement* stmt;
GString* sql;
gchar guid_buf[GUID_ENCODING_LENGTH+1];
gboolean first_guid = TRUE;
GncSqlResult* result;
gboolean single_item;
g_return_if_fail( be != NULL );
// Ignore empty list
if( list == NULL ) return;
coll = qof_instance_get_collection( QOF_INSTANCE(list->data) );
// Create the query for all slots for all items on the list
sql = g_string_sized_new( 40+(GUID_ENCODING_LENGTH+3)*g_list_length( list ) );
g_string_append_printf( sql, "SELECT * FROM %s WHERE %s ", TABLE_NAME, obj_guid_col_table[0].col_name );
if( g_list_length( list ) != 1 ) {
g_string_append( sql, "IN (" );
single_item = FALSE;
} else {
g_string_append( sql, "= " );
single_item = TRUE;
}
(void)gnc_sql_append_guid_list_to_sql( sql, list, G_MAXUINT );
if( !single_item ) {
g_string_append( sql, ")" );
}
// Execute the query and load the slots
stmt = gnc_sql_create_statement_from_sql( be, sql->str );
result = gnc_sql_execute_select_statement( be, stmt );
gnc_sql_statement_dispose( stmt );
if( result != NULL ) {
GncSqlRow* row = gnc_sql_result_get_first_row( result );
while( row != NULL ) {
load_slot_for_list_item( be, row, coll );
row = gnc_sql_result_get_next_row( result );
}
gnc_sql_result_dispose( result );
}
g_string_free( sql, FALSE );
}
/* ================================================================= */
static void
create_slots_tables( GncSqlBackend* be )
{
gboolean ok;
gint version;
g_return_if_fail( be != NULL );
version = gnc_sql_get_table_version( be, TABLE_NAME );
if( version == 0 ) {
gnc_sql_create_table( be, TABLE_NAME, TABLE_VERSION, col_table );
#if 0
// FIXME: Create index
ok = gnc_sql_create_index( be, "slots_guid_index", TABLE_NAME, obj_guid_col_table, &error );
if( !ok ) {
PERR( "Unable to create index: %s\n", error->message );
}
#endif
}
}
/* ================================================================= */
void
gnc_sql_init_slots_handler( void )
{
static GncSqlObjectBackend be_data =
{
GNC_SQL_BACKEND_VERSION,
GNC_ID_ACCOUNT,
NULL, /* commit - cannot occur */
NULL, /* initial_load - cannot occur */
create_slots_tables /* create_tables */
};
qof_object_register_backend( TABLE_NAME, GNC_SQL_BACKEND, &be_data );
}
/* ========================== END OF FILE ===================== */

View File

@ -0,0 +1,74 @@
/********************************************************************
* gnc-slots-sql.h: load and save data to SQL *
* *
* This program is free software; you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation; either version 2 of *
* the License, or (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License*
* along with this program; if not, contact: *
* *
* Free Software Foundation Voice: +1-617-542-5942 *
* 51 Franklin Street, Fifth Floor Fax: +1-617-542-2652 *
* Boston, MA 02110-1301, USA gnu@gnu.org *
\********************************************************************/
/** @file gnc-slots-sql.h
* @brief load and save accounts data to SQL
* @author Copyright (c) 2006-2008 Phil Longstaff <plongstaff@rogers.com>
*
* This file implements the top-level QofBackend API for saving/
* restoring data to/from an SQL database
*/
#ifndef GNC_SLOTS_SQL_H_
#define GNC_SLOTS_SQL_H_
#include "qof.h"
#include <gmodule.h>
/**
* gnc_sql_slots_save - Saves slots for an object to the db.
*
* @param be SQL backend
* @param guid Object guid
* @param is_infant Is this an infant object?
* @param pFrame Top-level KVP frame
*/
void gnc_sql_slots_save( GncSqlBackend* be, const GUID* guid,
gboolean is_infant, KvpFrame* pFrame );
/**
* gnc_sql_slots_delete - Deletes slots for an object from the db.
*
* @param be SQL backend
* @param guid Object guid
*/
void gnc_sql_slots_delete( GncSqlBackend* be, const GUID* guid );
/**
* gnc_sql_slots_load - Loads slots for an object from the db.
*
* @param be SQL backend
* @param guid Object guid
*/
void gnc_sql_slots_load( GncSqlBackend* be, QofInstance* inst );
/**
* gnc_sql_slots_load_for_list - Loads slots for a list of objects from the db.
* Loading slots for a list of objects can be faster than loading for one object
* at a time because fewer SQL queries are used.
*
* @param be SQL backend
* @param list List of objects
*/
void gnc_sql_slots_load_for_list( GncSqlBackend* be, GList* list );
void gnc_sql_init_slots_handler( void );
#endif /* GNC_SLOTS_SQL_H_ */

View File

@ -0,0 +1,752 @@
/********************************************************************
* gnc-transaction-sql.c: load and save data to SQL *
* *
* This program is free software; you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation; either version 2 of *
* the License, or (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License*
* along with this program; if not, contact: *
* *
* Free Software Foundation Voice: +1-617-542-5942 *
* 51 Franklin Street, Fifth Floor Fax: +1-617-542-2652 *
* Boston, MA 02110-1301, USA gnu@gnu.org *
\********************************************************************/
/** @file gnc-transaction-sql.c
* @brief load and save data to SQL
* @author Copyright (c) 2006-2008 Phil Longstaff <plongstaff@rogers.com>
*
* This file implements the top-level QofBackend API for saving/
* restoring data to/from an SQL db
*/
#include "config.h"
#include <glib.h>
#include "qof.h"
#include "qofquery-p.h"
#include "qofquerycore-p.h"
#include "Account.h"
#include "Transaction.h"
#include "gnc-lot.h"
#include "engine-helpers.h"
#include "gnc-backend-sql.h"
#include "gnc-transaction-sql.h"
#include "gnc-commodity.h"
#include "gnc-commodity-sql.h"
#include "gnc-slots-sql.h"
#include "gnc-engine.h"
static QofLogModule log_module = G_LOG_DOMAIN;
#define TRANSACTION_TABLE "transactions"
#define TX_TABLE_VERSION 1
#define SPLIT_TABLE "splits"
#define SPLIT_TABLE_VERSION 1
typedef struct {
GncSqlBackend* be;
const GUID* guid;
} split_info_t;
#define TX_MAX_NUM_LEN 2048
#define TX_MAX_DESCRIPTION_LEN 2048
static const GncSqlColumnTableEntry tx_col_table[] =
{
{ "guid", CT_GUID, 0, COL_NNUL|COL_PKEY, "guid" },
{ "currency_guid", CT_COMMODITYREF, 0, COL_NNUL, NULL, NULL,
(QofAccessFunc)xaccTransGetCurrency, (QofSetterFunc)xaccTransSetCurrency },
{ "num", CT_STRING, TX_MAX_NUM_LEN, COL_NNUL, NULL, NULL,
(QofAccessFunc)xaccTransGetNum, (QofSetterFunc)xaccTransSetNum },
{ "post_date", CT_TIMESPEC, 0, COL_NNUL, NULL, NULL,
(QofAccessFunc)xaccTransRetDatePostedTS, (QofSetterFunc)gnc_transaction_set_date_posted },
{ "enter_date", CT_TIMESPEC, 0, COL_NNUL, NULL, NULL,
(QofAccessFunc)xaccTransRetDateEnteredTS, (QofSetterFunc)gnc_transaction_set_date_entered },
{ "description", CT_STRING, TX_MAX_DESCRIPTION_LEN, 0, NULL, NULL,
(QofAccessFunc)xaccTransGetDescription, (QofSetterFunc)xaccTransSetDescription },
{ NULL }
};
static gpointer get_split_reconcile_state( gpointer pObject, const QofParam* param );
static void set_split_reconcile_state( gpointer pObject, gpointer pValue );
static void set_split_reconcile_date( gpointer pObject, Timespec ts );
static void set_split_lot( gpointer pObject, gpointer pLot );
#define SPLIT_MAX_MEMO_LEN 2048
#define SPLIT_MAX_ACTION_LEN 2048
static const GncSqlColumnTableEntry split_col_table[] =
{
{ "guid", CT_GUID, 0, COL_NNUL|COL_PKEY, "guid" },
{ "tx_guid", CT_TXREF, 0, COL_NNUL, NULL, SPLIT_TRANS },
{ "account_guid", CT_ACCOUNTREF, 0, COL_NNUL, NULL, SPLIT_ACCOUNT },
{ "memo", CT_STRING, SPLIT_MAX_MEMO_LEN, COL_NNUL, NULL, SPLIT_MEMO },
{ "action", CT_STRING, SPLIT_MAX_ACTION_LEN, COL_NNUL, NULL, SPLIT_ACTION },
{ "reconcile_state", CT_STRING, 1, COL_NNUL, NULL, NULL,
get_split_reconcile_state, set_split_reconcile_state },
{ "reconcile_date", CT_TIMESPEC, 0, COL_NNUL, NULL, NULL,
(QofAccessFunc)xaccSplitRetDateReconciledTS, (QofSetterFunc)set_split_reconcile_date },
{ "value", CT_NUMERIC, 0, COL_NNUL, NULL, SPLIT_VALUE },
{ "quantity", CT_NUMERIC, 0, COL_NNUL, NULL, SPLIT_AMOUNT },
{ "lot_guid", CT_LOTREF, 0, 0, NULL, NULL,
(QofAccessFunc)xaccSplitGetLot, set_split_lot },
{ NULL }
};
static const GncSqlColumnTableEntry guid_col_table[] =
{
{ "tx_guid", CT_GUID, 0, 0, "guid" },
{ NULL }
};
static void retrieve_numeric_value( gpointer pObject, gnc_numeric value );
/* ================================================================= */
static gpointer
get_split_reconcile_state( gpointer pObject, const QofParam* param )
{
const Split* pSplit = GNC_SPLIT(pObject);
static gchar c[2];
g_return_val_if_fail( pObject != NULL, NULL );
g_return_val_if_fail( GNC_IS_SPLIT(pObject), NULL );
c[0] = xaccSplitGetReconcile( pSplit );
c[1] = '\0';
return (gpointer)c;
}
static void
set_split_reconcile_state( gpointer pObject, gpointer pValue )
{
Split* pSplit = GNC_SPLIT(pObject);
const gchar* s = (const gchar*)pValue;
g_return_if_fail( pObject != NULL );
g_return_if_fail( GNC_IS_SPLIT(pObject) );
g_return_if_fail( pValue != NULL );
xaccSplitSetReconcile( pSplit, s[0] );
}
static void
set_split_reconcile_date( gpointer pObject, Timespec ts )
{
g_return_if_fail( pObject != NULL );
g_return_if_fail( GNC_IS_SPLIT(pObject) );
xaccSplitSetDateReconciledTS( GNC_SPLIT(pObject), &ts );
}
static void
retrieve_numeric_value( gpointer pObject, gnc_numeric value )
{
gnc_numeric* pResult = (gnc_numeric*)pObject;
g_return_if_fail( pObject != NULL );
*pResult = value;
}
static void
set_split_lot( gpointer pObject, gpointer pLot )
{
GNCLot* lot;
Split* split;
g_return_if_fail( pObject != NULL );
g_return_if_fail( GNC_IS_SPLIT(pObject) );
if( pLot == NULL ) return;
g_return_if_fail( GNC_IS_LOT(pLot) );
split = GNC_SPLIT(pObject);
lot = GNC_LOT(pLot);
gnc_lot_add_split( lot, split );
}
// Table to retrieve just the quantity
static GncSqlColumnTableEntry quantity_table[] =
{
{ "quantity", CT_NUMERIC, 0, COL_NNUL, NULL, NULL, NULL, (QofSetterFunc)retrieve_numeric_value },
{ NULL }
};
static gnc_numeric
get_gnc_numeric_from_row( GncSqlBackend* be, GncSqlRow* row )
{
gnc_numeric val = gnc_numeric_zero();
g_return_val_if_fail( be != NULL, val );
g_return_val_if_fail( row != NULL, val );
gnc_sql_load_object( be, row, NULL, &val, quantity_table );
return val;
}
static Split*
load_single_split( GncSqlBackend* be, GncSqlRow* row )
{
const GUID* guid;
GUID split_guid;
Split* pSplit;
g_return_val_if_fail( be != NULL, NULL );
g_return_val_if_fail( row != NULL, NULL );
guid = gnc_sql_load_guid( be, row );
split_guid = *guid;
pSplit = xaccSplitLookup( &split_guid, be->primary_book );
if( pSplit == NULL ) {
pSplit = xaccMallocSplit( be->primary_book );
}
/* If the split is dirty, don't overwrite it */
if( !qof_instance_is_dirty( QOF_INSTANCE(pSplit) ) ) {
gnc_sql_load_object( be, row, GNC_ID_SPLIT, pSplit, split_col_table );
}
g_assert( pSplit == xaccSplitLookup( &split_guid, be->primary_book ) );
return pSplit;
}
static void
load_all_splits_for_tx( GncSqlBackend* be, const GUID* tx_guid )
{
GncSqlResult* result;
gchar guid_buf[GUID_ENCODING_LENGTH+1];
GncSqlStatement* stmt;
GValue value;
gchar* buf;
GError* error = NULL;
g_return_if_fail( be != NULL );
g_return_if_fail( tx_guid != NULL );
guid_to_string_buff( tx_guid, guid_buf );
memset( &value, 0, sizeof( GValue ) );
g_value_init( &value, G_TYPE_STRING );
g_value_set_string( &value, guid_buf );
buf = g_strdup_printf( "SELECT * FROM %s WHERE tx_guid='%s'", SPLIT_TABLE, guid_buf );
stmt = gnc_sql_create_statement_from_sql( be, buf );
g_free( buf );
result = gnc_sql_execute_select_statement( be, stmt );
gnc_sql_statement_dispose( stmt );
if( result != NULL ) {
int r;
GList* list = NULL;
GncSqlRow* row;
row = gnc_sql_result_get_first_row( result );
while( row != NULL ) {
Split* s;
s = load_single_split( be, row );
if( s != NULL ) {
list = g_list_append( list, s );
}
row = gnc_sql_result_get_next_row( result );
}
gnc_sql_result_dispose( result );
if( list != NULL ) {
gnc_sql_slots_load_for_list( be, list );
}
}
}
static void
load_splits_for_tx_list( GncSqlBackend* be, GList* list )
{
GString* sql;
QofCollection* col;
GncSqlResult* result;
gboolean first_guid = TRUE;
g_return_if_fail( be != NULL );
if( list == NULL ) return;
sql = g_string_sized_new( 40+(GUID_ENCODING_LENGTH+3)*g_list_length( list ) );
g_string_append_printf( sql, "SELECT * FROM %s WHERE %s IN (", SPLIT_TABLE, guid_col_table[0].col_name );
(void)gnc_sql_append_guid_list_to_sql( sql, list, G_MAXUINT );
g_string_append( sql, ")" );
// Execute the query and load the splits
result = gnc_sql_execute_select_sql( be, sql->str );
if( result != NULL ) {
GList* list = NULL;
GncSqlRow* row;
row = gnc_sql_result_get_first_row( result );
while( row != NULL ) {
Split* s;
s = load_single_split( be, row );
if( s != NULL ) {
list = g_list_append( list, s );
}
row = gnc_sql_result_get_next_row( result );
}
if( list != NULL ) {
gnc_sql_slots_load_for_list( be, list );
}
gnc_sql_result_dispose( result );
}
g_string_free( sql, FALSE );
}
static Transaction*
load_single_tx( GncSqlBackend* be, GncSqlRow* row )
{
const GUID* guid;
GUID tx_guid;
Transaction* pTx;
g_return_val_if_fail( be != NULL, NULL );
g_return_val_if_fail( row != NULL, NULL );
guid = gnc_sql_load_guid( be, row );
tx_guid = *guid;
pTx = xaccTransLookup( &tx_guid, be->primary_book );
if( pTx == NULL ) {
pTx = xaccMallocTransaction( be->primary_book );
}
xaccTransBeginEdit( pTx );
gnc_sql_load_object( be, row, GNC_ID_TRANS, pTx, tx_col_table );
g_assert( pTx == xaccTransLookup( &tx_guid, be->primary_book ) );
return pTx;
}
static void
query_transactions( GncSqlBackend* be, GncSqlStatement* stmt )
{
GncSqlResult* result;
g_return_if_fail( be != NULL );
g_return_if_fail( stmt != NULL );
result = gnc_sql_execute_select_statement( be, stmt );
if( result != NULL ) {
GList* tx_list = NULL;
GList* node;
GncSqlRow* row;
Transaction* tx;
row = gnc_sql_result_get_first_row( result );
while( row != NULL ) {
tx = load_single_tx( be, row );
if( tx != NULL ) {
tx_list = g_list_append( tx_list, tx );
}
row = gnc_sql_result_get_next_row( result );
}
gnc_sql_result_dispose( result );
if( tx_list != NULL ) {
gnc_sql_slots_load_for_list( be, tx_list );
load_splits_for_tx_list( be, tx_list );
}
// Commit all of the transactions
for( node = tx_list; node != NULL; node = node->next ) {
Transaction* pTx = GNC_TRANSACTION(node->data);
xaccTransCommitEdit( pTx );
}
}
}
static void
load_tx_by_guid( GncSqlBackend* be, GUID* tx_guid )
{
GncSqlStatement* stmt;
gchar* sql;
gchar guid_buf[GUID_ENCODING_LENGTH+1];
g_return_if_fail( be != NULL );
g_return_if_fail( tx_guid != NULL );
guid_to_string_buff( tx_guid, guid_buf );
sql = g_strdup_printf( "SELECT * FROM %s WHERE guid = %s", TRANSACTION_TABLE, guid_buf );
stmt = gnc_sql_create_statement_from_sql( be, sql );
query_transactions( be, stmt );
gnc_sql_statement_dispose( stmt );
}
/* ================================================================= */
static void
load_all_tx( GncSqlBackend* be )
{
gchar* sql;
GncSqlStatement* stmt;
g_return_if_fail( be != NULL );
sql = g_strdup_printf( "SELECT * FROM %s", TRANSACTION_TABLE );
stmt = gnc_sql_create_statement_from_sql( be, sql );
query_transactions( be, stmt );
gnc_sql_statement_dispose( stmt );
}
/* ================================================================= */
static void
create_transaction_tables( GncSqlBackend* be )
{
gint version;
g_return_if_fail( be != NULL );
version = gnc_sql_get_table_version( be, TRANSACTION_TABLE );
if( version == 0 ) {
gnc_sql_create_table( be, TRANSACTION_TABLE, TX_TABLE_VERSION, tx_col_table );
}
version = gnc_sql_get_table_version( be, SPLIT_TABLE );
if( version == 0 ) {
gnc_sql_create_table( be, SPLIT_TABLE, SPLIT_TABLE_VERSION, split_col_table );
}
}
/* ================================================================= */
static void
delete_split_slots_cb( gpointer data, gpointer user_data )
{
split_info_t* split_info = (split_info_t*)user_data;
Split* pSplit = GNC_SPLIT(data);
g_return_if_fail( data != NULL );
g_return_if_fail( GNC_IS_SPLIT(data) );
g_return_if_fail( user_data != NULL );
gnc_sql_slots_delete( split_info->be,
qof_instance_get_guid( QOF_INSTANCE(pSplit) ) );
}
static void
delete_splits( GncSqlBackend* be, Transaction* pTx )
{
split_info_t split_info;
g_return_if_fail( be != NULL );
g_return_if_fail( pTx != NULL );
(void)gnc_sql_do_db_operation( be, OP_DB_DELETE, SPLIT_TABLE,
SPLIT_TABLE, pTx, guid_col_table );
split_info.be = be;
g_list_foreach( xaccTransGetSplitList( pTx ), delete_split_slots_cb, &split_info );
}
static void
commit_split( GncSqlBackend* be, QofInstance* inst )
{
gint op;
gboolean is_infant;
g_return_if_fail( inst != NULL );
g_return_if_fail( be != NULL );
is_infant = qof_instance_get_infant( inst );
if( qof_instance_get_destroying( inst ) ) {
op = OP_DB_DELETE;
} else if( be->is_pristine_db || is_infant ) {
op = OP_DB_INSERT;
} else {
op = OP_DB_UPDATE;
}
(void)gnc_sql_do_db_operation( be, op, SPLIT_TABLE, GNC_ID_SPLIT, inst, split_col_table );
gnc_sql_slots_save( be,
qof_instance_get_guid( inst ),
is_infant,
qof_instance_get_slots( inst ) );
}
static void
save_split_cb( gpointer data, gpointer user_data )
{
split_info_t* split_info = (split_info_t*)user_data;
Split* pSplit = GNC_SPLIT(data);
g_return_if_fail( data != NULL );
g_return_if_fail( GNC_IS_SPLIT(data) );
g_return_if_fail( user_data != NULL );
commit_split( split_info->be, QOF_INSTANCE(pSplit) );
}
static void
save_splits( GncSqlBackend* be, const GUID* tx_guid, SplitList* pSplitList )
{
split_info_t split_info;
g_return_if_fail( be != NULL );
g_return_if_fail( tx_guid != NULL );
g_return_if_fail( pSplitList != NULL );
split_info.be = be;
split_info.guid = tx_guid;
g_list_foreach( pSplitList, save_split_cb, &split_info );
}
static void
save_transaction( GncSqlBackend* be, Transaction* pTx, gboolean do_save_splits )
{
const GUID* guid;
gint op;
gboolean is_infant;
QofInstance* inst;
g_return_if_fail( be != NULL );
g_return_if_fail( pTx != NULL );
inst = QOF_INSTANCE(pTx);
is_infant = qof_instance_get_infant( inst );
if( qof_instance_get_destroying( inst ) ) {
op = OP_DB_DELETE;
} else if( be->is_pristine_db || is_infant ) {
op = OP_DB_INSERT;
} else {
op = OP_DB_UPDATE;
}
if( op != OP_DB_DELETE ) {
// Ensure the commodity is in the db
gnc_sql_save_commodity( be, xaccTransGetCurrency( pTx ) );
}
(void)gnc_sql_do_db_operation( be, op, TRANSACTION_TABLE, GNC_ID_TRANS, pTx, tx_col_table );
// Commit slots and splits
guid = qof_instance_get_guid( inst );
if( !qof_instance_get_destroying(inst) ) {
gnc_sql_slots_save( be, guid, is_infant, qof_instance_get_slots( inst ) );
if( do_save_splits ) {
save_splits( be, guid, xaccTransGetSplitList( pTx ) );
}
} else {
gnc_sql_slots_delete( be, guid );
delete_splits( be, pTx );
}
}
void
gnc_sql_save_transaction( GncSqlBackend* be, QofInstance* inst )
{
g_return_if_fail( be != NULL );
g_return_if_fail( inst != NULL );
g_return_if_fail( GNC_IS_TRANS(inst) );
save_transaction( be, GNC_TRANS(inst), TRUE );
}
static void
commit_transaction( GncSqlBackend* be, QofInstance* inst )
{
g_return_if_fail( be != NULL );
g_return_if_fail( inst != NULL );
g_return_if_fail( GNC_IS_TRANS(inst) );
save_transaction( be, GNC_TRANS(inst), FALSE );
}
/* ================================================================= */
static const GUID*
get_guid_from_query( QofQuery* pQuery )
{
GList* pOrTerms;
GList* pAndTerms;
GList* andTerm;
QofQueryTerm* pTerm;
QofQueryPredData* pPredData;
GSList* pParamPath;
g_return_val_if_fail( pQuery != NULL, NULL );
pOrTerms = qof_query_get_terms( pQuery );
pAndTerms = (GList*)pOrTerms->data;
andTerm = pAndTerms->next;
pTerm = (QofQueryTerm*)andTerm->data;
pPredData = qof_query_term_get_pred_data( pTerm );
pParamPath = qof_query_term_get_param_path( pTerm );
if( strcmp( pPredData->type_name, "guid" ) == 0 ) {
query_guid_t pData = (query_guid_t)pPredData;
return pData->guids->data;
} else {
return NULL;
}
}
static gpointer
compile_split_query( GncSqlBackend* be, QofQuery* pQuery )
{
GString* sql;
const GUID* acct_guid;
gchar guid_buf[GUID_ENCODING_LENGTH+1];
GncSqlResult* result;
gchar* buf;
g_return_val_if_fail( be != NULL, NULL );
g_return_val_if_fail( pQuery != NULL, NULL );
acct_guid = get_guid_from_query( pQuery );
guid_to_string_buff( acct_guid, guid_buf );
sql = g_string_new( "" );
g_string_printf( sql, "SELECT DISTINCT tx_guid FROM %s WHERE account_guid='%s'", SPLIT_TABLE, guid_buf );
result = gnc_sql_execute_select_sql( be, sql->str );
if( result != NULL ) {
int numRows;
int r;
GncSqlRow* row;
numRows = gnc_sql_result_get_num_rows( result );
sql = g_string_sized_new( 40+(GUID_ENCODING_LENGTH+3)*numRows );
if( numRows != 1 ) {
g_string_printf( sql, "SELECT * FROM %s WHERE guid IN (", TRANSACTION_TABLE );
} else {
g_string_printf( sql, "SELECT * FROM %s WHERE guid =", TRANSACTION_TABLE );
}
row = gnc_sql_result_get_first_row( result );
for( r = 0; row != NULL; r++ ) {
const GUID* guid;
guid = gnc_sql_load_tx_guid( be, row );
guid_to_string_buff( guid, guid_buf );
if( r != 0 ) {
g_string_append( sql, "," );
}
g_string_append( sql, "'" );
g_string_append( sql, guid_buf );
g_string_append( sql, "'" );
row = gnc_sql_result_get_next_row( result );
}
gnc_sql_result_dispose( result );
if( numRows != 1 ) {
g_string_append( sql, ")" );
}
}
buf = sql->str;
g_string_free( sql, FALSE );
return buf;
}
static void
run_split_query( GncSqlBackend* be, gpointer pQuery )
{
GncSqlStatement* stmt;
gchar* sql;
g_return_if_fail( be != NULL );
g_return_if_fail( pQuery != NULL );
sql = (gchar*)pQuery;
stmt = gnc_sql_create_statement_from_sql( be, sql );
query_transactions( be, stmt );
gnc_sql_statement_dispose( stmt );
}
static void
free_split_query( GncSqlBackend* be, gpointer pQuery )
{
g_return_if_fail( be != NULL );
g_return_if_fail( pQuery != NULL );
g_free( pQuery );
}
/* ----------------------------------------------------------------- */
static void
load_tx_guid( const GncSqlBackend* be, GncSqlRow* row,
QofSetterFunc setter, gpointer pObject,
const GncSqlColumnTableEntry* table_row )
{
const GValue* val;
GUID guid;
const GUID* pGuid;
Transaction* tx = NULL;
g_return_if_fail( be != NULL );
g_return_if_fail( row != NULL );
g_return_if_fail( pObject != NULL );
g_return_if_fail( table_row != NULL );
val = gnc_sql_row_get_value_at_col_name( row, table_row->col_name );
if( val == NULL ) {
pGuid = NULL;
} else {
string_to_guid( g_value_get_string( val ), &guid );
pGuid = &guid;
}
if( pGuid != NULL ) {
tx = xaccTransLookup( pGuid, be->primary_book );
}
if( table_row->gobj_param_name != NULL ) {
g_object_set( pObject, table_row->gobj_param_name, tx, NULL );
} else {
(*setter)( pObject, (const gpointer)tx );
}
}
static col_type_handler_t tx_guid_handler
= { load_tx_guid,
gnc_sql_add_objectref_guid_col_info_to_list,
gnc_sql_add_colname_to_list,
gnc_sql_add_gvalue_objectref_guid_to_slist };
/* ================================================================= */
void
gnc_sql_init_transaction_handler( void )
{
static GncSqlObjectBackend be_data_tx =
{
GNC_SQL_BACKEND_VERSION,
GNC_ID_TRANS,
commit_transaction, /* commit */
load_all_tx, /* initial_load */
create_transaction_tables /* create tables */
};
static GncSqlObjectBackend be_data_split =
{
GNC_SQL_BACKEND_VERSION,
GNC_ID_SPLIT,
commit_split, /* commit */
NULL, /* initial_load */
NULL, /* create tables */
compile_split_query,
run_split_query,
free_split_query
};
qof_object_register_backend( GNC_ID_TRANS, GNC_SQL_BACKEND, &be_data_tx );
qof_object_register_backend( GNC_ID_SPLIT, GNC_SQL_BACKEND, &be_data_split );
gnc_sql_register_col_type_handler( CT_TXREF, &tx_guid_handler );
}
/* ========================== END OF FILE ===================== */

View File

@ -0,0 +1,51 @@
/********************************************************************
* gnc-transaction-sql.h: load and save data to SQL *
* *
* This program is free software; you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation; either version 2 of *
* the License, or (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License*
* along with this program; if not, contact: *
* *
* Free Software Foundation Voice: +1-617-542-5942 *
* 51 Franklin Street, Fifth Floor Fax: +1-617-542-2652 *
* Boston, MA 02110-1301, USA gnu@gnu.org *
\********************************************************************/
/** @file gnc-transaction-sql.h
* @brief load and save data to SQL
* @author Copyright (c) 2006-2008 Phil Longstaff <plongstaff@rogers.com>
*
* This file implements the top-level QofBackend API for saving/
* restoring data to/from an SQL database
*/
#ifndef GNC_TRANSACTION_SQL_H_
#define GNC_TRANSACTION_SQL_H_
#include "qof.h"
#include <gmodule.h>
void gnc_sql_init_transaction_handler( void );
void gnc_sql_transaction_commit_splits( GncSqlBackend* be, Transaction* pTx );
void gnc_sql_save_transaction( GncSqlBackend* be, QofInstance* inst );
void gnc_sql_get_account_balances( GncSqlBackend* be, Account* pAccount,
gnc_numeric* start_balance,
gnc_numeric* cleared_balance,
gnc_numeric* reconciled_balance );
typedef struct {
Account* acct;
gnc_numeric start_balance;
gnc_numeric cleared_balance;
gnc_numeric reconciled_balance;
} acct_balances_t;
GList* gnc_sql_get_account_balances_for_list( GncSqlBackend* be, GList* list );
#endif /* GNC_TRANSACTION_SQL_H_ */

View File

@ -0,0 +1,61 @@
SUBDIRS = .
test_column_types_SOURCES = \
${top_srcdir}/src/backend/sql/gnc-backend-sql.c \
${top_srcdir}/src/backend/sql/gnc-account-sql.c \
${top_srcdir}/src/backend/sql/gnc-book-sql.c \
${top_srcdir}/src/backend/sql/gnc-budget-sql.c \
${top_srcdir}/src/backend/sql/gnc-commodity-sql.c \
${top_srcdir}/src/backend/sql/gnc-lots-sql.c \
${top_srcdir}/src/backend/sql/gnc-price-sql.c \
${top_srcdir}/src/backend/sql/gnc-recurrence-sql.c \
${top_srcdir}/src/backend/sql/gnc-schedxaction-sql.c \
${top_srcdir}/src/backend/sql/gnc-slots-sql.c \
${top_srcdir}/src/backend/sql/gnc-transaction-sql.c \
test-column-types.c
TESTS = \
test-column-types
GNC_TEST_DEPS := \
--gnc-module-dir ${top_builddir}/src/engine \
--guile-load-dir ${top_builddir}/src/engine \
--library-dir ${top_builddir}/lib/libqof/qof \
--library-dir ${top_builddir}/src/core-utils \
--library-dir ${top_builddir}/src/gnc-module \
--library-dir ${top_builddir}/src/engine \
--library-dir ${top_builddir}/src/backend/sql
TESTS_ENVIRONMENT := \
GNC_ACCOUNT_PATH=${top_srcdir}/accounts/C \
SRCDIR=${srcdir} \
$(shell ${top_srcdir}/src/gnc-test-env --no-exports ${GNC_TEST_DEPS})
check_PROGRAMS = \
test-column-types
#noinst_HEADERS = test-file-stuff.h
LDADD = ${top_builddir}/src/test-core/libgncmod-test.la \
${top_builddir}/src/gnc-module/libgnc-module.la \
${top_builddir}/src/engine/libgncmod-engine.la \
${top_builddir}/src/engine/test-core/libgncmod-test-engine.la \
${top_builddir}/src/core-utils/libgnc-core-utils.la \
${QOF_LIBS} \
${top_builddir}/lib/libc/libc-missing.la
AM_CFLAGS = \
-I${top_srcdir}/lib/libc \
-I${top_srcdir}/src \
-I${top_srcdir}/src/core-utils \
-I${top_srcdir}/src/gnc-module \
-I${top_srcdir}/src/test-core \
-I${top_srcdir}/src/engine \
-I${top_srcdir}/src/engine/test-core \
-I${top_srcdir}/src/backend/sql \
${GLIB_CFLAGS} \
${QOF_CFLAGS} \
${GUILE_INCS} \
${GCONF_CFLAGS}
INCLUDES = -DG_LOG_DOMAIN=\"gnc.backend.sql\"

View File

@ -0,0 +1,46 @@
/***************************************************************************
* test-column-types.c
*
* Tests the basic SQL column types
*
* Copyright 2008 Phil Longstaff
* plongstaff@rogers.com
****************************************************************************/
/*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA.
*/
#include "config.h"
#include "qof.h"
#include "cashobjects.h"
#include "test-stuff.h"
#include "gnc-backend-sql.h"
int main( int argc, char ** argv )
{
qof_init();
cashobjects_register();
gnc_sql_init( NULL );
/* do_test(
qof_load_backend_library ("../.libs/", GNC_LIB_NAME),
" loading gnc-backend-gda GModule failed");
*/
print_test_results();
qof_close();
exit( get_rv() );
}

View File

@ -32,6 +32,7 @@ gnucash: gnucash.in ${top_builddir}/config.status Makefile
rm -f $@.tmp rm -f $@.tmp
sed < $< > $@.tmp \ sed < $< > $@.tmp \
-e 's#@-BIN_DIR-@#${bindir}#g' \ -e 's#@-BIN_DIR-@#${bindir}#g' \
-e 's#@-GNC_DBD_DIR-@#${GNC_DBD_DIR}#g' \
-e 's#@-GNC_GUILE_MODULE_DIR-@#${GNC_SHAREDIR}/guile-modules#g' \ -e 's#@-GNC_GUILE_MODULE_DIR-@#${GNC_SHAREDIR}/guile-modules#g' \
-e 's#@-GNC_SCM_INSTALL_DIR-@#${GNC_SCM_INSTALL_DIR}#g' \ -e 's#@-GNC_SCM_INSTALL_DIR-@#${GNC_SCM_INSTALL_DIR}#g' \
-e 's#@-GNC_LIB_INSTALLDIR-@#${libdir}#' \ -e 's#@-GNC_LIB_INSTALLDIR-@#${libdir}#' \
@ -40,10 +41,11 @@ gnucash: gnucash.in ${top_builddir}/config.status Makefile
mv $@.tmp $@ mv $@.tmp $@
chmod u+x $@ chmod u+x $@
gnucash-valgrind: gnucash-valgrind.in ${top_builddir}/config.status Makefile gnucash-gdb: gnucash-gdb.in ${top_builddir}/config.status Makefile
rm -f $@.tmp rm -f $@.tmp
sed < $< > $@.tmp \ sed < $< > $@.tmp \
-e 's#@-BIN_DIR-@#${bindir}#g' \ -e 's#@-BIN_DIR-@#${bindir}#g' \
-e 's#@-GNC_DBD_DIR-@#${GNC_DBD_DIR}#g' \
-e 's#@-GNC_GUILE_MODULE_DIR-@#${GNC_SHAREDIR}/guile-modules#g' \ -e 's#@-GNC_GUILE_MODULE_DIR-@#${GNC_SHAREDIR}/guile-modules#g' \
-e 's#@-GNC_SCM_INSTALL_DIR-@#${GNC_SCM_INSTALL_DIR}#g' \ -e 's#@-GNC_SCM_INSTALL_DIR-@#${GNC_SCM_INSTALL_DIR}#g' \
-e 's#@-GNC_LIB_INSTALLDIR-@#${libdir}#' \ -e 's#@-GNC_LIB_INSTALLDIR-@#${libdir}#' \
@ -52,7 +54,20 @@ gnucash-valgrind: gnucash-valgrind.in ${top_builddir}/config.status Makefile
mv $@.tmp $@ mv $@.tmp $@
chmod u+x $@ chmod u+x $@
CLEANFILES = $(BUILT_SOURCES) gnucash gnucash-valgrind gnucash-valgrind: gnucash-valgrind.in ${top_builddir}/config.status Makefile
rm -f $@.tmp
sed < $< > $@.tmp \
-e 's#@-BIN_DIR-@#${bindir}#g' \
-e 's#@-GNC_DBD_DIR-@#${GNC_DBD_DIR}#g' \
-e 's#@-GNC_GUILE_MODULE_DIR-@#${GNC_SHAREDIR}/guile-modules#g' \
-e 's#@-GNC_SCM_INSTALL_DIR-@#${GNC_SCM_INSTALL_DIR}#g' \
-e 's#@-GNC_LIB_INSTALLDIR-@#${libdir}#' \
-e 's#@-GNC_PKGLIB_INSTALLDIR-@#${pkglibdir}#g' \
-e "s#@-TOP_SRC_DIR-@#`pwd`/${top_srcdir}#g"
mv $@.tmp $@
chmod u+x $@
CLEANFILES = $(BUILT_SOURCES) gnucash gnucash-valgrind gnucash-gdb
# We handle gnucash scripts in a somewhat unexpected way, but we do # We handle gnucash scripts in a somewhat unexpected way, but we do
# this so that a user who doesn't necessarily have the right # this so that a user who doesn't necessarily have the right
@ -71,13 +86,13 @@ CLEANFILES = $(BUILT_SOURCES) gnucash gnucash-valgrind
# by these top-level "common" scripts. # by these top-level "common" scripts.
gnc_common_scripts = gnucash-env gnucash-make-guids gnc_common_scripts = gnucash-env gnucash-make-guids
bin_SCRIPTS = ${gnc_common_scripts} update-gnucash-gconf gnucash gnucash-valgrind bin_SCRIPTS = ${gnc_common_scripts} update-gnucash-gconf gnucash gnucash-valgrind gnucash-gdb
# if you change gncoverridedir, make sure you change ./overrides/Makefile.am too. # if you change gncoverridedir, make sure you change ./overrides/Makefile.am too.
gncoverridesdir = ${GNC_LIBEXECDIR}/overrides gncoverridesdir = ${GNC_LIBEXECDIR}/overrides
EXTRA_DIST = generate-gnc-script update-gnucash-gconf.in \ EXTRA_DIST = generate-gnc-script update-gnucash-gconf.in \
gnucash.in gnucash-valgrind.in gnucash.in gnucash-valgrind.in gnucash-gdb.in
## Gnucash scripts -- real code is in overrides, these just get you there. ## Gnucash scripts -- real code is in overrides, these just get you there.
${gnc_common_scripts}: generate-gnc-script ${top_builddir}/config.status ${gnc_common_scripts}: generate-gnc-script ${top_builddir}/config.status

32
src/bin/gnucash-gdb.in Normal file
View File

@ -0,0 +1,32 @@
#!/bin/sh
PATH="@-BIN_DIR-@:${PATH}"
export PATH
GUILE_WARN_DEPRECATED="no"
export GUILE_WARN_DEPRECATED
GNC_MODULE_PATH="@-GNC_PKGLIB_INSTALLDIR-@:${GNC_MODULE_PATH}"
EXTRA_PATH="${EXTRA_PATH}:@-GNC_GUILE_MODULE_DIR-@"
EXTRA_PATH="${EXTRA_PATH}:@-GNC_SCM_INSTALL_DIR-@"
GUILE_LOAD_PATH="${EXTRA_PATH}:${GUILE_LOAD_PATH}"
EXTRA_LIBS="${GNC_MODULE_PATH}"
EXTRA_LIBS="${EXTRA_LIBS}:@-GNC_LIB_INSTALLDIR-@"
EXTRA_LIBS="${EXTRA_LIBS}:@-GNC_PKGLIB_INSTALLDIR-@"
LD_LIBRARY_PATH="${EXTRA_LIBS}:${LD_LIBRARY_PATH}"
TOP_SRC_DIR="@-TOP_SRC_DIR-@"
GNC_DBD_DIR="@-GNC_DBD_DIR-@"
export GNC_MODULE_PATH
export GUILE_LOAD_PATH
export LD_LIBRARY_PATH
export GNC_DBD_DIR
#
# Other potentially useful options, particularly for valgrind-2.x:
# --tool=memcheck --trace-children=yes
#
exec gdb gnucash-bin "$@"

View File

@ -18,19 +18,25 @@ EXTRA_LIBS="${EXTRA_LIBS}:@-GNC_PKGLIB_INSTALLDIR-@"
LD_LIBRARY_PATH="${EXTRA_LIBS}:${LD_LIBRARY_PATH}" LD_LIBRARY_PATH="${EXTRA_LIBS}:${LD_LIBRARY_PATH}"
TOP_SRC_DIR="@-TOP_SRC_DIR-@" TOP_SRC_DIR="@-TOP_SRC_DIR-@"
GNC_DBD_DIR="@-GNC_DBD_DIR-@"
export GNC_MODULE_PATH export GNC_MODULE_PATH
export GUILE_LOAD_PATH export GUILE_LOAD_PATH
export LD_LIBRARY_PATH export LD_LIBRARY_PATH
export GNC_DBD_DIR
# #
# Other potentially useful options, particularly for valgrind-2.x: # Other potentially useful options, particularly for valgrind-2.x:
# --tool=memcheck --trace-children=yes # --tool=memcheck --trace-children=yes
# #
exec valgrind -v \ exec valgrind -v \
--suppressions=${TOP_SRC_DIR}/src/valgrind-gnucash.supp \ --suppressions=${TOP_SRC_DIR}/src/valgrind-gnucash.supp \
--suppressions=${TOP_SRC_DIR}/src/valgrind-glib.supp \
--suppressions=${TOP_SRC_DIR}/src/valgrind-libfontconfig.supp \
--suppressions=${TOP_SRC_DIR}/src/valgrind-libgda.supp \
--suppressions=${TOP_SRC_DIR}/src/valgrind-libguile.supp \
--num-callers=25 \
--error-limit=no \ --error-limit=no \
--tool=callgrind \ --tool=memcheck \
--instr-atstart=no \ --leak-check=full \
--collect-atstart=no \
gnucash-bin "$@" gnucash-bin "$@"

View File

@ -18,10 +18,12 @@ EXTRA_LIBS="${EXTRA_LIBS}@-PATH_SEPARATOR-@@-GNC_PKGLIB_INSTALLDIR-@"
LD_LIBRARY_PATH="${EXTRA_LIBS}@-PATH_SEPARATOR-@${LD_LIBRARY_PATH}" LD_LIBRARY_PATH="${EXTRA_LIBS}@-PATH_SEPARATOR-@${LD_LIBRARY_PATH}"
DYLD_LIBRARY_PATH="${EXTRA_LIBS}@-PATH_SEPARATOR-@${DYLD_LIBRARY_PATH}" DYLD_LIBRARY_PATH="${EXTRA_LIBS}@-PATH_SEPARATOR-@${DYLD_LIBRARY_PATH}"
GNC_DBD_DIR="@-GNC_DBD_DIR-@"
export GNC_MODULE_PATH export GNC_MODULE_PATH
export GUILE_LOAD_PATH export GUILE_LOAD_PATH
export LD_LIBRARY_PATH export LD_LIBRARY_PATH
export DYLD_LIBRARY_PATH export DYLD_LIBRARY_PATH
export GNC_DBD_DIR
exec gnucash-bin "$@" exec gnucash-bin "$@"

View File

@ -1,4 +1,4 @@
SUBDIRS = . test file SUBDIRS = . sql test file
pkglib_LTLIBRARIES = libgncmod-business-core.la pkglib_LTLIBRARIES = libgncmod-business-core.la

View File

@ -1,6 +1,6 @@
SUBDIRS = . SUBDIRS = .
pkglib_LTLIBRARIES = libgncmod-business-backend-file.la pkglib_LTLIBRARIES = libgncmod-business-backend-xml.la
AM_CFLAGS = \ AM_CFLAGS = \
-I${top_srcdir}/src \ -I${top_srcdir}/src \
@ -13,8 +13,8 @@ AM_CFLAGS = \
${QOF_CFLAGS} \ ${QOF_CFLAGS} \
${GLIB_CFLAGS} ${GLIB_CFLAGS}
libgncmod_business_backend_file_la_SOURCES = \ libgncmod_business_backend_xml_la_SOURCES = \
gncmod-business-backend-file.c \ gncmod-business-backend-xml.c \
gnc-address-xml-v2.c \ gnc-address-xml-v2.c \
gnc-bill-term-xml-v2.c \ gnc-bill-term-xml-v2.c \
gnc-customer-xml-v2.c \ gnc-customer-xml-v2.c \
@ -41,11 +41,11 @@ noinst_HEADERS = \
gnc-vendor-xml-v2.h \ gnc-vendor-xml-v2.h \
xml-helpers.h xml-helpers.h
libgncmod_business_backend_file_la_LDFLAGS = -module -avoid-version libgncmod_business_backend_xml_la_LDFLAGS = -module -avoid-version
libgncmod_business_backend_file_la_LIBADD = \ libgncmod_business_backend_xml_la_LIBADD = \
${top_builddir}/src/business/business-core/libgncmod-business-core.la \ ${top_builddir}/src/business/business-core/libgncmod-business-core.la \
${top_builddir}/src/backend/file/libgnc-backend-file-utils.la \ ${top_builddir}/src/backend/file/libgnc-backend-xml-utils.la \
${top_builddir}/src/engine/libgncmod-engine.la \ ${top_builddir}/src/engine/libgncmod-engine.la \
${top_builddir}/src/gnc-module/libgnc-module.la \ ${top_builddir}/src/gnc-module/libgnc-module.la \
${LIBXML2_LIBS} \ ${LIBXML2_LIBS} \

View File

@ -0,0 +1,112 @@
/*********************************************************************
* gncmod-business-backend-file.c
* module definition/initialization for the file backend module
*
* Copyright (c) 2002 Derek Atkins <warlord@MIT.EDU>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, contact:
*
* Free Software Foundation Voice: +1-617-542-5942
* 51 Franklin Street, Fifth Floor Fax: +1-617-542-2652
* Boston, MA 02110-1301, USA gnu@gnu.org
*
*********************************************************************/
#include "config.h"
#include <gmodule.h>
#include "gnc-module.h"
#include "gnc-module-api.h"
#include "gnc-engine.h"
#include "io-gncxml-v2.h"
#include "gnc-address-xml-v2.h"
#include "gnc-bill-term-xml-v2.h"
#include "gnc-customer-xml-v2.h"
#include "gnc-employee-xml-v2.h"
#include "gnc-entry-xml-v2.h"
#include "gnc-invoice-xml-v2.h"
#include "gnc-job-xml-v2.h"
#include "gnc-order-xml-v2.h"
#include "gnc-owner-xml-v2.h"
#include "gnc-tax-table-xml-v2.h"
#include "gnc-vendor-xml-v2.h"
GNC_MODULE_API_DECL(libgncmod_business_backend_xml)
/* version of the gnc module system interface we require */
int libgncmod_business_backend_xml_gnc_module_system_interface = 0;
/* module versioning uses libtool semantics. */
int libgncmod_business_backend_xml_gnc_module_current = 0;
int libgncmod_business_backend_xml_gnc_module_revision = 0;
int libgncmod_business_backend_xml_gnc_module_age = 0;
static GNCModule bus_core;
static GNCModule file;
char *
libgncmod_business_backend_xml_gnc_module_path(void)
{
return g_strdup("gnucash/business-core-xml");
}
char *
libgncmod_business_backend_xml_gnc_module_description(void)
{
return g_strdup("The XML (v2) parsers for GnuCash business objects");
}
int
libgncmod_business_backend_xml_gnc_module_init(int refcount)
{
if(!gnc_engine_is_initialized()) { return FALSE; }
bus_core = gnc_module_load("gnucash/business-core", 0);
if(!bus_core) return FALSE;
if (refcount == 0) {
/* Initialize our pointers into the backend subsystem */
gnc_address_xml_initialize ();
gnc_billterm_xml_initialize ();
gnc_customer_xml_initialize ();
gnc_employee_xml_initialize ();
gnc_entry_xml_initialize ();
gnc_invoice_xml_initialize ();
gnc_job_xml_initialize ();
gnc_order_xml_initialize ();
gnc_owner_xml_initialize ();
gnc_taxtable_xml_initialize ();
gnc_vendor_xml_initialize ();
}
return TRUE;
}
int
libgncmod_business_backend_xml_gnc_module_end(int refcount)
{
int unload = TRUE;
if (bus_core)
unload = gnc_module_unload(bus_core);
if (refcount == 0) {
bus_core = NULL;
file = NULL;
}
return unload;
}

View File

@ -127,7 +127,7 @@ qofAddressSetOwner(GncAddress *addr, QofInstance *ent)
} }
static QofInstance* static QofInstance*
qofAddressGetOwner(GncAddress *addr) qofAddressGetOwner(const GncAddress *addr)
{ {
if(!addr) { return NULL; } if(!addr) { return NULL; }
@ -135,7 +135,7 @@ qofAddressGetOwner(GncAddress *addr)
} }
GncAddress * GncAddress *
gncCloneAddress (GncAddress *from, QofInstance *new_parent, QofBook *book) gncCloneAddress (const GncAddress *from, QofInstance *new_parent, QofBook *book)
{ {
GncAddress *addr; GncAddress *addr;

View File

@ -33,7 +33,7 @@
gboolean gncAddressRegister (void); gboolean gncAddressRegister (void);
/** Make a copy of the address, setting the parent to 'new_parent' */ /** Make a copy of the address, setting the parent to 'new_parent' */
GncAddress * gncCloneAddress (GncAddress *from, QofInstance *new_parent, QofBook *book); GncAddress * gncCloneAddress (const GncAddress *from, QofInstance *new_parent, QofBook *book);
#endif /* GNC_ADDRESSP_H_ */ #endif /* GNC_ADDRESSP_H_ */

View File

@ -367,7 +367,9 @@ void gncBillTermSetParent (GncBillTerm *term, GncBillTerm *parent)
if (parent) if (parent)
gncBillTermAddChild(parent, term); gncBillTermAddChild(parent, term);
term->refcount = 0; term->refcount = 0;
gncBillTermMakeInvisible (term); if( parent != NULL ) {
gncBillTermMakeInvisible (term);
}
gncBillTermCommitEdit (term); gncBillTermCommitEdit (term);
} }
@ -467,19 +469,19 @@ GList * gncBillTermGetTerms (QofBook *book)
return bi->terms; return bi->terms;
} }
const char *gncBillTermGetName (GncBillTerm *term) const char *gncBillTermGetName (const GncBillTerm *term)
{ {
if (!term) return NULL; if (!term) return NULL;
return term->name; return term->name;
} }
const char *gncBillTermGetDescription (GncBillTerm *term) const char *gncBillTermGetDescription (const GncBillTerm *term)
{ {
if (!term) return NULL; if (!term) return NULL;
return term->desc; return term->desc;
} }
GncBillTermType gncBillTermGetType (GncBillTerm *term) GncBillTermType gncBillTermGetType (const GncBillTerm *term)
{ {
if (!term) return 0; if (!term) return 0;
return term->type; return term->type;
@ -489,37 +491,37 @@ GncBillTermType gncBillTermGetType (GncBillTerm *term)
AS_STRING_FUNC(GncBillTermType, ENUM_TERMS_TYPE) AS_STRING_FUNC(GncBillTermType, ENUM_TERMS_TYPE)
static static
const char* qofBillTermGetType (GncBillTerm *term) const char* qofBillTermGetType (const GncBillTerm *term)
{ {
if (!term) { return NULL; } if (!term) { return NULL; }
return GncBillTermTypeasString(term->type); return GncBillTermTypeasString(term->type);
} }
gint gncBillTermGetDueDays (GncBillTerm *term) gint gncBillTermGetDueDays (const GncBillTerm *term)
{ {
if (!term) return 0; if (!term) return 0;
return term->due_days; return term->due_days;
} }
gint gncBillTermGetDiscountDays (GncBillTerm *term) gint gncBillTermGetDiscountDays (const GncBillTerm *term)
{ {
if (!term) return 0; if (!term) return 0;
return term->disc_days; return term->disc_days;
} }
gnc_numeric gncBillTermGetDiscount (GncBillTerm *term) gnc_numeric gncBillTermGetDiscount (const GncBillTerm *term)
{ {
if (!term) return gnc_numeric_zero (); if (!term) return gnc_numeric_zero ();
return term->discount; return term->discount;
} }
gint gncBillTermGetCutoff (GncBillTerm *term) gint gncBillTermGetCutoff (const GncBillTerm *term)
{ {
if (!term) return 0; if (!term) return 0;
return term->cutoff; return term->cutoff;
} }
static GncBillTerm *gncBillTermCopy (GncBillTerm *term) static GncBillTerm *gncBillTermCopy (const GncBillTerm *term)
{ {
GncBillTerm *t; GncBillTerm *t;
@ -557,25 +559,25 @@ GncBillTerm *gncBillTermReturnChild (GncBillTerm *term, gboolean make_new)
return child; return child;
} }
GncBillTerm *gncBillTermGetParent (GncBillTerm *term) GncBillTerm *gncBillTermGetParent (const GncBillTerm *term)
{ {
if (!term) return NULL; if (!term) return NULL;
return term->parent; return term->parent;
} }
gint64 gncBillTermGetRefcount (GncBillTerm *term) gint64 gncBillTermGetRefcount (const GncBillTerm *term)
{ {
if (!term) return 0; if (!term) return 0;
return term->refcount; return term->refcount;
} }
gboolean gncBillTermGetInvisible (GncBillTerm *term) gboolean gncBillTermGetInvisible (const GncBillTerm *term)
{ {
if (!term) return FALSE; if (!term) return FALSE;
return term->invisible; return term->invisible;
} }
int gncBillTermCompare (GncBillTerm *a, GncBillTerm *b) int gncBillTermCompare (const GncBillTerm *a, const GncBillTerm *b)
{ {
int ret; int ret;
@ -589,7 +591,7 @@ int gncBillTermCompare (GncBillTerm *a, GncBillTerm *b)
return safe_strcmp (a->desc, b->desc); return safe_strcmp (a->desc, b->desc);
} }
gboolean gncBillTermIsDirty (GncBillTerm *term) gboolean gncBillTermIsDirty (const GncBillTerm *term)
{ {
if (!term) return FALSE; if (!term) return FALSE;
return qof_instance_get_dirty_flag(term); return qof_instance_get_dirty_flag(term);
@ -605,7 +607,7 @@ gboolean gncBillTermIsDirty (GncBillTerm *term)
* XXX explain this, the logic is totally opaque to me. * XXX explain this, the logic is totally opaque to me.
*/ */
static void static void
compute_monthyear (GncBillTerm *term, Timespec post_date, compute_monthyear (const GncBillTerm *term, Timespec post_date,
int *month, int *year) int *month, int *year)
{ {
int iday, imonth, iyear; int iday, imonth, iyear;
@ -638,7 +640,7 @@ compute_monthyear (GncBillTerm *term, Timespec post_date,
/* XXX explain this, the logic is totally opaque to me. */ /* XXX explain this, the logic is totally opaque to me. */
static Timespec static Timespec
compute_time (GncBillTerm *term, Timespec post_date, int days) compute_time (const GncBillTerm *term, Timespec post_date, int days)
{ {
Timespec res = post_date; Timespec res = post_date;
int day, month, year; int day, month, year;
@ -659,7 +661,7 @@ compute_time (GncBillTerm *term, Timespec post_date, int days)
} }
Timespec Timespec
gncBillTermComputeDueDate (GncBillTerm *term, Timespec post_date) gncBillTermComputeDueDate (const GncBillTerm *term, Timespec post_date)
{ {
Timespec res = post_date; Timespec res = post_date;
if (!term) return res; if (!term) return res;
@ -668,7 +670,7 @@ gncBillTermComputeDueDate (GncBillTerm *term, Timespec post_date)
} }
Timespec Timespec
gncBillTermComputeDiscountDate (GncBillTerm *term, Timespec post_date) gncBillTermComputeDiscountDate (const GncBillTerm *term, Timespec post_date)
{ {
Timespec res = post_date; Timespec res = post_date;
if (!term) return res; if (!term) return res;

View File

@ -124,30 +124,30 @@ void gncBillTermSetCutoff (GncBillTerm *term, gint cutoff);
GncBillTerm *gncBillTermLookupByName (QofBook *book, const char *name); GncBillTerm *gncBillTermLookupByName (QofBook *book, const char *name);
GList * gncBillTermGetTerms (QofBook *book); GList * gncBillTermGetTerms (QofBook *book);
const char *gncBillTermGetName (GncBillTerm *term); const char *gncBillTermGetName (const GncBillTerm *term);
const char *gncBillTermGetDescription (GncBillTerm *term); const char *gncBillTermGetDescription (const GncBillTerm *term);
GncBillTermType gncBillTermGetType (GncBillTerm *term); GncBillTermType gncBillTermGetType (const GncBillTerm *term);
gint gncBillTermGetDueDays (GncBillTerm *term); gint gncBillTermGetDueDays (const GncBillTerm *term);
gint gncBillTermGetDiscountDays (GncBillTerm *term); gint gncBillTermGetDiscountDays (const GncBillTerm *term);
gnc_numeric gncBillTermGetDiscount (GncBillTerm *term); gnc_numeric gncBillTermGetDiscount (const GncBillTerm *term);
gint gncBillTermGetCutoff (GncBillTerm *term); gint gncBillTermGetCutoff (const GncBillTerm *term);
gboolean gncBillTermIsDirty (GncBillTerm *term); gboolean gncBillTermIsDirty (const GncBillTerm *term);
GncBillTerm *gncBillTermGetParent (GncBillTerm *term); GncBillTerm *gncBillTermGetParent (const GncBillTerm *term);
GncBillTerm *gncBillTermReturnChild (GncBillTerm *term, gboolean make_new); GncBillTerm *gncBillTermReturnChild (GncBillTerm *term, gboolean make_new);
#define gncBillTermGetChild(t) gncBillTermReturnChild((t),FALSE) #define gncBillTermGetChild(t) gncBillTermReturnChild((t),FALSE)
gint64 gncBillTermGetRefcount (GncBillTerm *term); gint64 gncBillTermGetRefcount (const GncBillTerm *term);
/** @} */ /** @} */
int gncBillTermCompare (GncBillTerm *a, GncBillTerm *b); int gncBillTermCompare (const GncBillTerm *a, const GncBillTerm *b);
/********************************************************/ /********************************************************/
/* functions to compute dates from Bill Terms */ /* functions to compute dates from Bill Terms */
/* Compute the due date and discount dates from the post date */ /* Compute the due date and discount dates from the post date */
Timespec gncBillTermComputeDueDate (GncBillTerm *term, Timespec post_date); Timespec gncBillTermComputeDueDate (const GncBillTerm *term, Timespec post_date);
Timespec gncBillTermComputeDiscountDate (GncBillTerm *term, Timespec post_date); Timespec gncBillTermComputeDiscountDate (const GncBillTerm *term, Timespec post_date);
/* deprecated */ /* deprecated */
#define gncBillTermGetGUID(x) qof_instance_get_guid (QOF_INSTANCE(x)) #define gncBillTermGetGUID(x) qof_instance_get_guid (QOF_INSTANCE(x))

View File

@ -38,7 +38,7 @@ void gncBillTermSetChild (GncBillTerm *term, GncBillTerm *child);
void gncBillTermSetRefcount (GncBillTerm *term, gint64 refcount); void gncBillTermSetRefcount (GncBillTerm *term, gint64 refcount);
void gncBillTermMakeInvisible (GncBillTerm *term); void gncBillTermMakeInvisible (GncBillTerm *term);
gboolean gncBillTermGetInvisible (GncBillTerm *term); gboolean gncBillTermGetInvisible (const GncBillTerm *term);
/** The gncCloneBillTerm() routine makes a copy of the indicated /** The gncCloneBillTerm() routine makes a copy of the indicated
* bill term, placing it in the indicated book. It copies * bill term, placing it in the indicated book. It copies

View File

@ -418,19 +418,19 @@ void gncCustomerCommitEdit (GncCustomer *cust)
/* ============================================================== */ /* ============================================================== */
/* Get Functions */ /* Get Functions */
const char * gncCustomerGetID (GncCustomer *cust) const char * gncCustomerGetID (const GncCustomer *cust)
{ {
if (!cust) return NULL; if (!cust) return NULL;
return cust->id; return cust->id;
} }
const char * gncCustomerGetName (GncCustomer *cust) const char * gncCustomerGetName (const GncCustomer *cust)
{ {
if (!cust) return NULL; if (!cust) return NULL;
return cust->name; return cust->name;
} }
GncAddress * gncCustomerGetAddr (GncCustomer *cust) GncAddress * gncCustomerGetAddr (const GncCustomer *cust)
{ {
if (!cust) return NULL; if (!cust) return NULL;
return cust->addr; return cust->addr;
@ -470,67 +470,67 @@ qofCustomerSetShipAddr (GncCustomer *cust, QofInstance *ship_addr_ent)
gncCustomerCommitEdit(cust); gncCustomerCommitEdit(cust);
} }
GncAddress * gncCustomerGetShipAddr (GncCustomer *cust) GncAddress * gncCustomerGetShipAddr (const GncCustomer *cust)
{ {
if (!cust) return NULL; if (!cust) return NULL;
return cust->shipaddr; return cust->shipaddr;
} }
const char * gncCustomerGetNotes (GncCustomer *cust) const char * gncCustomerGetNotes (const GncCustomer *cust)
{ {
if (!cust) return NULL; if (!cust) return NULL;
return cust->notes; return cust->notes;
} }
GncBillTerm * gncCustomerGetTerms (GncCustomer *cust) GncBillTerm * gncCustomerGetTerms (const GncCustomer *cust)
{ {
if (!cust) return NULL; if (!cust) return NULL;
return cust->terms; return cust->terms;
} }
GncTaxIncluded gncCustomerGetTaxIncluded (GncCustomer *cust) GncTaxIncluded gncCustomerGetTaxIncluded (const GncCustomer *cust)
{ {
if (!cust) return GNC_TAXINCLUDED_USEGLOBAL; if (!cust) return GNC_TAXINCLUDED_USEGLOBAL;
return cust->taxincluded; return cust->taxincluded;
} }
gnc_commodity * gncCustomerGetCurrency (GncCustomer *cust) gnc_commodity * gncCustomerGetCurrency (const GncCustomer *cust)
{ {
if (!cust) return NULL; if (!cust) return NULL;
return cust->currency; return cust->currency;
} }
gboolean gncCustomerGetActive (GncCustomer *cust) gboolean gncCustomerGetActive (const GncCustomer *cust)
{ {
if (!cust) return FALSE; if (!cust) return FALSE;
return cust->active; return cust->active;
} }
gnc_numeric gncCustomerGetDiscount (GncCustomer *cust) gnc_numeric gncCustomerGetDiscount (const GncCustomer *cust)
{ {
if (!cust) return gnc_numeric_zero(); if (!cust) return gnc_numeric_zero();
return cust->discount; return cust->discount;
} }
gnc_numeric gncCustomerGetCredit (GncCustomer *cust) gnc_numeric gncCustomerGetCredit (const GncCustomer *cust)
{ {
if (!cust) return gnc_numeric_zero(); if (!cust) return gnc_numeric_zero();
return cust->credit; return cust->credit;
} }
gboolean gncCustomerGetTaxTableOverride (GncCustomer *customer) gboolean gncCustomerGetTaxTableOverride (const GncCustomer *customer)
{ {
if (!customer) return FALSE; if (!customer) return FALSE;
return customer->taxtable_override; return customer->taxtable_override;
} }
GncTaxTable* gncCustomerGetTaxTable (GncCustomer *customer) GncTaxTable* gncCustomerGetTaxTable (const GncCustomer *customer)
{ {
if (!customer) return NULL; if (!customer) return NULL;
return customer->taxtable; return customer->taxtable;
} }
GList * gncCustomerGetJoblist (GncCustomer *cust, gboolean show_all) GList * gncCustomerGetJoblist (const GncCustomer *cust, gboolean show_all)
{ {
if (!cust) return NULL; if (!cust) return NULL;
@ -557,7 +557,7 @@ gboolean gncCustomerIsDirty (GncCustomer *cust)
/* Other functions */ /* Other functions */
int gncCustomerCompare (GncCustomer *a, GncCustomer *b) int gncCustomerCompare (const GncCustomer *a, const GncCustomer *b)
{ {
if (!a && !b) return 0; if (!a && !b) return 0;
if (!a && b) return 1; if (!a && b) return 1;

View File

@ -118,26 +118,26 @@ void gncCustomerRemoveJob (GncCustomer *customer, GncJob *job);
#define gncCustomerLookup(book,guid) \ #define gncCustomerLookup(book,guid) \
QOF_BOOK_LOOKUP_ENTITY((book),(guid),GNC_ID_CUSTOMER, GncCustomer) QOF_BOOK_LOOKUP_ENTITY((book),(guid),GNC_ID_CUSTOMER, GncCustomer)
const char * gncCustomerGetID (GncCustomer *customer); const char * gncCustomerGetID (const GncCustomer *customer);
const char * gncCustomerGetName (GncCustomer *customer); const char * gncCustomerGetName (const GncCustomer *customer);
GncAddress * gncCustomerGetAddr (GncCustomer *customer); GncAddress * gncCustomerGetAddr (const GncCustomer *customer);
GncAddress * gncCustomerGetShipAddr (GncCustomer *customer); GncAddress * gncCustomerGetShipAddr (const GncCustomer *customer);
const char * gncCustomerGetNotes (GncCustomer *customer); const char * gncCustomerGetNotes (const GncCustomer *customer);
GncBillTerm * gncCustomerGetTerms (GncCustomer *customer); GncBillTerm * gncCustomerGetTerms (const GncCustomer *customer);
GncTaxIncluded gncCustomerGetTaxIncluded (GncCustomer *customer); GncTaxIncluded gncCustomerGetTaxIncluded (const GncCustomer *customer);
gboolean gncCustomerGetActive (GncCustomer *customer); gboolean gncCustomerGetActive (const GncCustomer *customer);
gnc_numeric gncCustomerGetDiscount (GncCustomer *customer); gnc_numeric gncCustomerGetDiscount (const GncCustomer *customer);
gnc_numeric gncCustomerGetCredit (GncCustomer *customer); gnc_numeric gncCustomerGetCredit (const GncCustomer *customer);
gnc_commodity * gncCustomerGetCurrency (GncCustomer *customer); gnc_commodity * gncCustomerGetCurrency (const GncCustomer *customer);
gboolean gncCustomerGetTaxTableOverride (GncCustomer *customer); gboolean gncCustomerGetTaxTableOverride (const GncCustomer *customer);
GncTaxTable* gncCustomerGetTaxTable (GncCustomer *customer); GncTaxTable* gncCustomerGetTaxTable (const GncCustomer *customer);
GList * gncCustomerGetJoblist (GncCustomer *customer, gboolean show_all); GList * gncCustomerGetJoblist (const GncCustomer *customer, gboolean show_all);
/** @} */ /** @} */
gboolean gncCustomerIsDirty (GncCustomer *customer); gboolean gncCustomerIsDirty (GncCustomer *customer);
int gncCustomerCompare (GncCustomer *a, GncCustomer *b); int gncCustomerCompare (const GncCustomer *a, const GncCustomer *b);
#define CUSTOMER_ID "id" #define CUSTOMER_ID "id"
#define CUSTOMER_NAME "name" #define CUSTOMER_NAME "name"

View File

@ -299,67 +299,67 @@ qofEmployeeSetAddr (GncEmployee *employee, QofInstance *addr_ent)
/* ============================================================== */ /* ============================================================== */
/* Get Functions */ /* Get Functions */
const char * gncEmployeeGetID (GncEmployee *employee) const char * gncEmployeeGetID (const GncEmployee *employee)
{ {
if (!employee) return NULL; if (!employee) return NULL;
return employee->id; return employee->id;
} }
const char * gncEmployeeGetUsername (GncEmployee *employee) const char * gncEmployeeGetUsername (const GncEmployee *employee)
{ {
if (!employee) return NULL; if (!employee) return NULL;
return employee->username; return employee->username;
} }
GncAddress * gncEmployeeGetAddr (GncEmployee *employee) GncAddress * gncEmployeeGetAddr (const GncEmployee *employee)
{ {
if (!employee) return NULL; if (!employee) return NULL;
return employee->addr; return employee->addr;
} }
const char * gncEmployeeGetLanguage (GncEmployee *employee) const char * gncEmployeeGetLanguage (const GncEmployee *employee)
{ {
if (!employee) return NULL; if (!employee) return NULL;
return employee->language; return employee->language;
} }
const char * gncEmployeeGetAcl (GncEmployee *employee) const char * gncEmployeeGetAcl (const GncEmployee *employee)
{ {
if (!employee) return NULL; if (!employee) return NULL;
return employee->acl; return employee->acl;
} }
gnc_numeric gncEmployeeGetWorkday (GncEmployee *employee) gnc_numeric gncEmployeeGetWorkday (const GncEmployee *employee)
{ {
if (!employee) return gnc_numeric_zero(); if (!employee) return gnc_numeric_zero();
return employee->workday; return employee->workday;
} }
gnc_numeric gncEmployeeGetRate (GncEmployee *employee) gnc_numeric gncEmployeeGetRate (const GncEmployee *employee)
{ {
if (!employee) return gnc_numeric_zero(); if (!employee) return gnc_numeric_zero();
return employee->rate; return employee->rate;
} }
gnc_commodity * gncEmployeeGetCurrency (GncEmployee *employee) gnc_commodity * gncEmployeeGetCurrency (const GncEmployee *employee)
{ {
if (!employee) return NULL; if (!employee) return NULL;
return employee->currency; return employee->currency;
} }
gboolean gncEmployeeGetActive (GncEmployee *employee) gboolean gncEmployeeGetActive (const GncEmployee *employee)
{ {
if (!employee) return FALSE; if (!employee) return FALSE;
return employee->active; return employee->active;
} }
Account * gncEmployeeGetCCard (GncEmployee *employee) Account * gncEmployeeGetCCard (const GncEmployee *employee)
{ {
if (!employee) return NULL; if (!employee) return NULL;
return employee->ccard_acc; return employee->ccard_acc;
} }
gboolean gncEmployeeIsDirty (GncEmployee *employee) gboolean gncEmployeeIsDirty (const GncEmployee *employee)
{ {
if (!employee) return FALSE; if (!employee) return FALSE;
return (qof_instance_get_dirty_flag(employee) return (qof_instance_get_dirty_flag(employee)
@ -399,7 +399,7 @@ void gncEmployeeCommitEdit (GncEmployee *employee)
/* ============================================================== */ /* ============================================================== */
/* Other functions */ /* Other functions */
int gncEmployeeCompare (GncEmployee *a, GncEmployee *b) int gncEmployeeCompare (const GncEmployee *a, const GncEmployee *b)
{ {
if (!a && !b) return 0; if (!a && !b) return 0;
if (!a && b) return 1; if (!a && b) return 1;

View File

@ -59,7 +59,7 @@ GncEmployee *gncEmployeeCreate (QofBook *book);
void gncEmployeeDestroy (GncEmployee *employee); void gncEmployeeDestroy (GncEmployee *employee);
void gncEmployeeBeginEdit (GncEmployee *employee); void gncEmployeeBeginEdit (GncEmployee *employee);
void gncEmployeeCommitEdit (GncEmployee *employee); void gncEmployeeCommitEdit (GncEmployee *employee);
int gncEmployeeCompare (GncEmployee *a, GncEmployee *b); int gncEmployeeCompare (const GncEmployee *a, const GncEmployee *b);
/** @} */ /** @} */
/** @name Set Functions /** @name Set Functions
@ -80,16 +80,16 @@ void qofEmployeeSetAddr (GncEmployee *employee, QofInstance *addr_ent);
/** @name Get Functions /** @name Get Functions
@{ */ @{ */
QofBook * gncEmployeeGetBook (GncEmployee *employee); QofBook * gncEmployeeGetBook (GncEmployee *employee);
const char * gncEmployeeGetID (GncEmployee *employee); const char * gncEmployeeGetID (const GncEmployee *employee);
const char * gncEmployeeGetUsername (GncEmployee *employee); const char * gncEmployeeGetUsername (const GncEmployee *employee);
GncAddress * gncEmployeeGetAddr (GncEmployee *employee); GncAddress * gncEmployeeGetAddr (const GncEmployee *employee);
const char * gncEmployeeGetLanguage (GncEmployee *employee); const char * gncEmployeeGetLanguage (const GncEmployee *employee);
const char * gncEmployeeGetAcl (GncEmployee *employee); const char * gncEmployeeGetAcl (const GncEmployee *employee);
gnc_numeric gncEmployeeGetWorkday (GncEmployee *employee); gnc_numeric gncEmployeeGetWorkday (const GncEmployee *employee);
gnc_numeric gncEmployeeGetRate (GncEmployee *employee); gnc_numeric gncEmployeeGetRate (const GncEmployee *employee);
gnc_commodity * gncEmployeeGetCurrency (GncEmployee *employee); gnc_commodity * gncEmployeeGetCurrency (const GncEmployee *employee);
gboolean gncEmployeeGetActive (GncEmployee *employee); gboolean gncEmployeeGetActive (const GncEmployee *employee);
Account * gncEmployeeGetCCard (GncEmployee *employee); Account * gncEmployeeGetCCard (const GncEmployee *employee);
/** @} */ /** @} */
@ -102,7 +102,7 @@ Account * gncEmployeeGetCCard (GncEmployee *employee);
#define gncEmployeeLookup(book,guid) \ #define gncEmployeeLookup(book,guid) \
QOF_BOOK_LOOKUP_ENTITY((book),(guid),GNC_ID_EMPLOYEE, GncEmployee) QOF_BOOK_LOOKUP_ENTITY((book),(guid),GNC_ID_EMPLOYEE, GncEmployee)
gboolean gncEmployeeIsDirty (GncEmployee *employee); gboolean gncEmployeeIsDirty (const GncEmployee *employee);
#define EMPLOYEE_ID "id" #define EMPLOYEE_ID "id"
#define EMPLOYEE_USERNAME "username" #define EMPLOYEE_USERNAME "username"

View File

@ -658,39 +658,39 @@ void gncEntryCopy (const GncEntry *src, GncEntry *dest)
/* ================================================================ */ /* ================================================================ */
/* Get Functions */ /* Get Functions */
Timespec gncEntryGetDate (GncEntry *entry) Timespec gncEntryGetDate (const GncEntry *entry)
{ {
Timespec ts; ts.tv_sec = 0; ts.tv_nsec = 0; Timespec ts; ts.tv_sec = 0; ts.tv_nsec = 0;
if (!entry) return ts; if (!entry) return ts;
return entry->date; return entry->date;
} }
Timespec gncEntryGetDateEntered (GncEntry *entry) Timespec gncEntryGetDateEntered (const GncEntry *entry)
{ {
Timespec ts; ts.tv_sec = 0; ts.tv_nsec = 0; Timespec ts; ts.tv_sec = 0; ts.tv_nsec = 0;
if (!entry) return ts; if (!entry) return ts;
return entry->date_entered; return entry->date_entered;
} }
const char * gncEntryGetDescription (GncEntry *entry) const char * gncEntryGetDescription (const GncEntry *entry)
{ {
if (!entry) return NULL; if (!entry) return NULL;
return entry->desc; return entry->desc;
} }
const char * gncEntryGetAction (GncEntry *entry) const char * gncEntryGetAction (const GncEntry *entry)
{ {
if (!entry) return NULL; if (!entry) return NULL;
return entry->action; return entry->action;
} }
const char * gncEntryGetNotes (GncEntry *entry) const char * gncEntryGetNotes (const GncEntry *entry)
{ {
if (!entry) return NULL; if (!entry) return NULL;
return entry->notes; return entry->notes;
} }
gnc_numeric gncEntryGetQuantity (GncEntry *entry) gnc_numeric gncEntryGetQuantity (const GncEntry *entry)
{ {
if (!entry) return gnc_numeric_zero(); if (!entry) return gnc_numeric_zero();
return entry->quantity; return entry->quantity;
@ -698,37 +698,37 @@ gnc_numeric gncEntryGetQuantity (GncEntry *entry)
/* Customer Invoice */ /* Customer Invoice */
Account * gncEntryGetInvAccount (GncEntry *entry) Account * gncEntryGetInvAccount (const GncEntry *entry)
{ {
if (!entry) return NULL; if (!entry) return NULL;
return entry->i_account; return entry->i_account;
} }
gnc_numeric gncEntryGetInvPrice (GncEntry *entry) gnc_numeric gncEntryGetInvPrice (const GncEntry *entry)
{ {
if (!entry) return gnc_numeric_zero(); if (!entry) return gnc_numeric_zero();
return entry->i_price; return entry->i_price;
} }
gnc_numeric gncEntryGetInvDiscount (GncEntry *entry) gnc_numeric gncEntryGetInvDiscount (const GncEntry *entry)
{ {
if (!entry) return gnc_numeric_zero(); if (!entry) return gnc_numeric_zero();
return entry->i_discount; return entry->i_discount;
} }
GncAmountType gncEntryGetInvDiscountType (GncEntry *entry) GncAmountType gncEntryGetInvDiscountType (const GncEntry *entry)
{ {
if (!entry) return 0; if (!entry) return 0;
return entry->i_disc_type; return entry->i_disc_type;
} }
GncDiscountHow gncEntryGetInvDiscountHow (GncEntry *entry) GncDiscountHow gncEntryGetInvDiscountHow (const GncEntry *entry)
{ {
if (!entry) return 0; if (!entry) return 0;
return entry->i_disc_how; return entry->i_disc_how;
} }
char* qofEntryGetInvDiscType (GncEntry *entry) char* qofEntryGetInvDiscType (const GncEntry *entry)
{ {
char *type_string; char *type_string;
@ -737,7 +737,7 @@ char* qofEntryGetInvDiscType (GncEntry *entry)
return type_string; return type_string;
} }
char* qofEntryGetInvDiscHow (GncEntry *entry) char* qofEntryGetInvDiscHow (const GncEntry *entry)
{ {
char *type_string; char *type_string;
@ -746,19 +746,19 @@ char* qofEntryGetInvDiscHow (GncEntry *entry)
return type_string; return type_string;
} }
gboolean gncEntryGetInvTaxable (GncEntry *entry) gboolean gncEntryGetInvTaxable (const GncEntry *entry)
{ {
if (!entry) return FALSE; if (!entry) return FALSE;
return entry->i_taxable; return entry->i_taxable;
} }
gboolean gncEntryGetInvTaxIncluded (GncEntry *entry) gboolean gncEntryGetInvTaxIncluded (const GncEntry *entry)
{ {
if (!entry) return FALSE; if (!entry) return FALSE;
return entry->i_taxincluded; return entry->i_taxincluded;
} }
GncTaxTable * gncEntryGetInvTaxTable (GncEntry *entry) GncTaxTable * gncEntryGetInvTaxTable (const GncEntry *entry)
{ {
if (!entry) return NULL; if (!entry) return NULL;
return entry->i_tax_table; return entry->i_tax_table;
@ -766,37 +766,37 @@ GncTaxTable * gncEntryGetInvTaxTable (GncEntry *entry)
/* vendor bills */ /* vendor bills */
Account * gncEntryGetBillAccount (GncEntry *entry) Account * gncEntryGetBillAccount (const GncEntry *entry)
{ {
if (!entry) return NULL; if (!entry) return NULL;
return entry->b_account; return entry->b_account;
} }
gnc_numeric gncEntryGetBillPrice (GncEntry *entry) gnc_numeric gncEntryGetBillPrice (const GncEntry *entry)
{ {
if (!entry) return gnc_numeric_zero(); if (!entry) return gnc_numeric_zero();
return entry->b_price; return entry->b_price;
} }
gboolean gncEntryGetBillTaxable (GncEntry *entry) gboolean gncEntryGetBillTaxable (const GncEntry *entry)
{ {
if (!entry) return FALSE; if (!entry) return FALSE;
return entry->b_taxable; return entry->b_taxable;
} }
gboolean gncEntryGetBillTaxIncluded (GncEntry *entry) gboolean gncEntryGetBillTaxIncluded (const GncEntry *entry)
{ {
if (!entry) return FALSE; if (!entry) return FALSE;
return entry->b_taxincluded; return entry->b_taxincluded;
} }
GncTaxTable * gncEntryGetBillTaxTable (GncEntry *entry) GncTaxTable * gncEntryGetBillTaxTable (const GncEntry *entry)
{ {
if (!entry) return NULL; if (!entry) return NULL;
return entry->b_tax_table; return entry->b_tax_table;
} }
gboolean gncEntryGetBillable (GncEntry *entry) gboolean gncEntryGetBillable (const GncEntry *entry)
{ {
if (!entry) return FALSE; if (!entry) return FALSE;
return entry->billable; return entry->billable;
@ -808,25 +808,25 @@ GncOwner * gncEntryGetBillTo (GncEntry *entry)
return &entry->billto; return &entry->billto;
} }
GncEntryPaymentType gncEntryGetBillPayment (GncEntry* entry) GncEntryPaymentType gncEntryGetBillPayment (const GncEntry* entry)
{ {
if (!entry) return 0; if (!entry) return 0;
return entry->b_payment; return entry->b_payment;
} }
GncInvoice * gncEntryGetInvoice (GncEntry *entry) GncInvoice * gncEntryGetInvoice (const GncEntry *entry)
{ {
if (!entry) return NULL; if (!entry) return NULL;
return entry->invoice; return entry->invoice;
} }
GncInvoice * gncEntryGetBill (GncEntry *entry) GncInvoice * gncEntryGetBill (const GncEntry *entry)
{ {
if (!entry) return NULL; if (!entry) return NULL;
return entry->bill; return entry->bill;
} }
GncOrder * gncEntryGetOrder (GncEntry *entry) GncOrder * gncEntryGetOrder (const GncEntry *entry)
{ {
if (!entry) return NULL; if (!entry) return NULL;
return entry->order; return entry->order;
@ -867,7 +867,7 @@ GncOrder * gncEntryGetOrder (GncEntry *entry)
* to let a consumer know how much they saved. * to let a consumer know how much they saved.
*/ */
void gncEntryComputeValue (gnc_numeric qty, gnc_numeric price, void gncEntryComputeValue (gnc_numeric qty, gnc_numeric price,
GncTaxTable *tax_table, gboolean tax_included, const GncTaxTable *tax_table, gboolean tax_included,
gnc_numeric discount, GncAmountType discount_type, gnc_numeric discount, GncAmountType discount_type,
GncDiscountHow discount_how, int SCU, GncDiscountHow discount_how, int SCU,
gnc_numeric *value, gnc_numeric *discount_value, gnc_numeric *value, gnc_numeric *discount_value,
@ -1044,7 +1044,7 @@ void gncEntryComputeValue (gnc_numeric qty, gnc_numeric price,
} }
static int static int
get_entry_commodity_denom (GncEntry *entry) get_entry_commodity_denom (const GncEntry *entry)
{ {
gnc_commodity *c; gnc_commodity *c;
if (!entry) if (!entry)
@ -1178,7 +1178,7 @@ gnc_numeric gncEntryReturnDiscountValue (GncEntry *entry, gboolean is_inv)
} }
/* XXXX this exsitnace of this routine is just wrong */ /* XXXX this exsitnace of this routine is just wrong */
gboolean gncEntryIsOpen (GncEntry *entry) gboolean gncEntryIsOpen (const GncEntry *entry)
{ {
if (!entry) return FALSE; if (!entry) return FALSE;
return (qof_instance_get_editlevel(entry) > 0); return (qof_instance_get_editlevel(entry) > 0);
@ -1211,7 +1211,7 @@ void gncEntryCommitEdit (GncEntry *entry)
gncEntryOnDone, entry_free); gncEntryOnDone, entry_free);
} }
int gncEntryCompare (GncEntry *a, GncEntry *b) int gncEntryCompare (const GncEntry *a, const GncEntry *b)
{ {
int compare; int compare;

View File

@ -135,39 +135,39 @@ void gncEntrySetBillPayment (GncEntry *entry, GncEntryPaymentType type);
/* GET FUNCTIONS */ /* GET FUNCTIONS */
/** @name Generic (shared) data /** @name Generic (shared) data
@{ */ @{ */
Timespec gncEntryGetDate (GncEntry *entry); Timespec gncEntryGetDate (const GncEntry *entry);
Timespec gncEntryGetDateEntered (GncEntry *entry); Timespec gncEntryGetDateEntered (const GncEntry *entry);
const char * gncEntryGetDescription (GncEntry *entry); const char * gncEntryGetDescription (const GncEntry *entry);
const char * gncEntryGetAction (GncEntry *entry); const char * gncEntryGetAction (const GncEntry *entry);
const char * gncEntryGetNotes (GncEntry *notes); const char * gncEntryGetNotes (const GncEntry *notes);
gnc_numeric gncEntryGetQuantity (GncEntry *entry); gnc_numeric gncEntryGetQuantity (const GncEntry *entry);
/** @} */ /** @} */
/** @name Customer Invoices /** @name Customer Invoices
@{ */ @{ */
Account * gncEntryGetInvAccount (GncEntry *entry); Account * gncEntryGetInvAccount (const GncEntry *entry);
gnc_numeric gncEntryGetInvPrice (GncEntry *entry); gnc_numeric gncEntryGetInvPrice (const GncEntry *entry);
gnc_numeric gncEntryGetInvDiscount (GncEntry *entry); gnc_numeric gncEntryGetInvDiscount (const GncEntry *entry);
GncAmountType gncEntryGetInvDiscountType (GncEntry *entry); GncAmountType gncEntryGetInvDiscountType (const GncEntry *entry);
GncDiscountHow gncEntryGetInvDiscountHow (GncEntry *entry); GncDiscountHow gncEntryGetInvDiscountHow (const GncEntry *entry);
char* qofEntryGetInvDiscType (GncEntry *entry); char* qofEntryGetInvDiscType (const GncEntry *entry);
char* qofEntryGetInvDiscHow (GncEntry *entry); char* qofEntryGetInvDiscHow (const GncEntry *entry);
gboolean gncEntryGetInvTaxable (GncEntry *entry); gboolean gncEntryGetInvTaxable (const GncEntry *entry);
gboolean gncEntryGetInvTaxIncluded (GncEntry *entry); gboolean gncEntryGetInvTaxIncluded (const GncEntry *entry);
GncTaxTable * gncEntryGetInvTaxTable (GncEntry *entry); GncTaxTable * gncEntryGetInvTaxTable (const GncEntry *entry);
/** @} */ /** @} */
/** @name Vendor Bills (and Employee Expenses) /** @name Vendor Bills (and Employee Expenses)
@{ */ @{ */
Account * gncEntryGetBillAccount (GncEntry *entry); Account * gncEntryGetBillAccount (const GncEntry *entry);
gnc_numeric gncEntryGetBillPrice (GncEntry *entry); gnc_numeric gncEntryGetBillPrice (const GncEntry *entry);
gboolean gncEntryGetBillTaxable (GncEntry *entry); gboolean gncEntryGetBillTaxable (const GncEntry *entry);
gboolean gncEntryGetBillTaxIncluded (GncEntry *entry); gboolean gncEntryGetBillTaxIncluded (const GncEntry *entry);
GncTaxTable * gncEntryGetBillTaxTable (GncEntry *entry); GncTaxTable * gncEntryGetBillTaxTable (const GncEntry *entry);
gboolean gncEntryGetBillable (GncEntry *entry); gboolean gncEntryGetBillable (const GncEntry *entry);
GncOwner *gncEntryGetBillTo (GncEntry *entry); GncOwner *gncEntryGetBillTo (GncEntry *entry);
GncEntryPaymentType gncEntryGetBillPayment (GncEntry* entry); GncEntryPaymentType gncEntryGetBillPayment (const GncEntry* entry);
/** @} */ /** @} */
void gncEntryCopy (const GncEntry *src, GncEntry *dest); void gncEntryCopy (const GncEntry *src, GncEntry *dest);
@ -201,7 +201,7 @@ void gncEntryGetValue (GncEntry *entry, gboolean is_inv, gnc_numeric *value,
GList **tax_values); GList **tax_values);
void gncEntryComputeValue (gnc_numeric qty, gnc_numeric price, void gncEntryComputeValue (gnc_numeric qty, gnc_numeric price,
GncTaxTable *tax_table, gboolean tax_included, const GncTaxTable *tax_table, gboolean tax_included,
gnc_numeric discount, GncAmountType discount_type, gnc_numeric discount, GncAmountType discount_type,
GncDiscountHow discount_how, int SCU, GncDiscountHow discount_how, int SCU,
/* return values */ /* return values */
@ -210,9 +210,9 @@ void gncEntryComputeValue (gnc_numeric qty, gnc_numeric price,
/** @} */ /** @} */
GncOrder * gncEntryGetOrder (GncEntry *entry); GncOrder * gncEntryGetOrder (const GncEntry *entry);
GncInvoice * gncEntryGetInvoice (GncEntry *entry); GncInvoice * gncEntryGetInvoice (const GncEntry *entry);
GncInvoice * gncEntryGetBill (GncEntry *entry); GncInvoice * gncEntryGetBill (const GncEntry *entry);
/** Return a pointer to the instance gncEntry that is identified /** Return a pointer to the instance gncEntry that is identified
* by the guid, and is residing in the book. Returns NULL if the * by the guid, and is residing in the book. Returns NULL if the
@ -223,10 +223,10 @@ GncInvoice * gncEntryGetBill (GncEntry *entry);
#define gncEntryLookup(book,guid) \ #define gncEntryLookup(book,guid) \
QOF_BOOK_LOOKUP_ENTITY((book),(guid),GNC_ID_ENTRY, GncEntry) QOF_BOOK_LOOKUP_ENTITY((book),(guid),GNC_ID_ENTRY, GncEntry)
gboolean gncEntryIsOpen (GncEntry *entry); gboolean gncEntryIsOpen (const GncEntry *entry);
void gncEntryBeginEdit (GncEntry *entry); void gncEntryBeginEdit (GncEntry *entry);
void gncEntryCommitEdit (GncEntry *entry); void gncEntryCommitEdit (GncEntry *entry);
int gncEntryCompare (GncEntry *a, GncEntry *b); int gncEntryCompare (const GncEntry *a, const GncEntry *b);
#define ENTRY_DATE "date" #define ENTRY_DATE "date"
#define ENTRY_DATE_ENTERED "date-entered" #define ENTRY_DATE_ENTERED "date-entered"

View File

@ -469,7 +469,7 @@ void gncInvoiceSortEntries (GncInvoice *invoice)
/* ================================================================== */ /* ================================================================== */
/* Get Functions */ /* Get Functions */
const char * gncInvoiceGetID (GncInvoice *invoice) const char * gncInvoiceGetID (const GncInvoice *invoice)
{ {
if (!invoice) return NULL; if (!invoice) return NULL;
return invoice->id; return invoice->id;
@ -501,21 +501,21 @@ qofInvoiceGetBillTo (GncInvoice *invoice)
return QOF_INSTANCE(billto); return QOF_INSTANCE(billto);
} }
Timespec gncInvoiceGetDateOpened (GncInvoice *invoice) Timespec gncInvoiceGetDateOpened (const GncInvoice *invoice)
{ {
Timespec ts; ts.tv_sec = 0; ts.tv_nsec = 0; Timespec ts; ts.tv_sec = 0; ts.tv_nsec = 0;
if (!invoice) return ts; if (!invoice) return ts;
return invoice->date_opened; return invoice->date_opened;
} }
Timespec gncInvoiceGetDatePosted (GncInvoice *invoice) Timespec gncInvoiceGetDatePosted (const GncInvoice *invoice)
{ {
Timespec ts; ts.tv_sec = 0; ts.tv_nsec = 0; Timespec ts; ts.tv_sec = 0; ts.tv_nsec = 0;
if (!invoice) return ts; if (!invoice) return ts;
return invoice->date_posted; return invoice->date_posted;
} }
Timespec gncInvoiceGetDateDue (GncInvoice *invoice) Timespec gncInvoiceGetDateDue (const GncInvoice *invoice)
{ {
Transaction *txn; Transaction *txn;
Timespec ts; ts.tv_sec = 0; ts.tv_nsec = 0; Timespec ts; ts.tv_sec = 0; ts.tv_nsec = 0;
@ -525,19 +525,19 @@ Timespec gncInvoiceGetDateDue (GncInvoice *invoice)
return xaccTransRetDateDueTS (txn); return xaccTransRetDateDueTS (txn);
} }
GncBillTerm * gncInvoiceGetTerms (GncInvoice *invoice) GncBillTerm * gncInvoiceGetTerms (const GncInvoice *invoice)
{ {
if (!invoice) return 0; if (!invoice) return NULL;
return invoice->terms; return invoice->terms;
} }
const char * gncInvoiceGetBillingID (GncInvoice *invoice) const char * gncInvoiceGetBillingID (const GncInvoice *invoice)
{ {
if (!invoice) return 0; if (!invoice) return NULL;
return invoice->billing_id; return invoice->billing_id;
} }
const char * gncInvoiceGetNotes (GncInvoice *invoice) const char * gncInvoiceGetNotes (const GncInvoice *invoice)
{ {
if (!invoice) return NULL; if (!invoice) return NULL;
return invoice->notes; return invoice->notes;
@ -629,7 +629,7 @@ const char * gncInvoiceGetType (GncInvoice *invoice)
} }
} }
gnc_commodity * gncInvoiceGetCurrency (GncInvoice *invoice) gnc_commodity * gncInvoiceGetCurrency (const GncInvoice *invoice)
{ {
if (!invoice) return NULL; if (!invoice) return NULL;
return invoice->currency; return invoice->currency;
@ -641,32 +641,32 @@ GncOwner * gncInvoiceGetBillTo (GncInvoice *invoice)
return &invoice->billto; return &invoice->billto;
} }
GNCLot * gncInvoiceGetPostedLot (GncInvoice *invoice) GNCLot * gncInvoiceGetPostedLot (const GncInvoice *invoice)
{ {
if (!invoice) return NULL; if (!invoice) return NULL;
return invoice->posted_lot; return invoice->posted_lot;
} }
Transaction * gncInvoiceGetPostedTxn (GncInvoice *invoice) Transaction * gncInvoiceGetPostedTxn (const GncInvoice *invoice)
{ {
if (!invoice) return NULL; if (!invoice) return NULL;
return invoice->posted_txn; return invoice->posted_txn;
} }
Account * gncInvoiceGetPostedAcc (GncInvoice *invoice) Account * gncInvoiceGetPostedAcc (const GncInvoice *invoice)
{ {
if (!invoice) return NULL; if (!invoice) return NULL;
return invoice->posted_acc; return invoice->posted_acc;
} }
gboolean gncInvoiceGetActive (GncInvoice *invoice) gboolean gncInvoiceGetActive (const GncInvoice *invoice)
{ {
if (!invoice) return FALSE; if (!invoice) return FALSE;
return invoice->active; return invoice->active;
} }
gnc_numeric gncInvoiceGetToChargeAmount (GncInvoice *invoice) gnc_numeric gncInvoiceGetToChargeAmount (const GncInvoice *invoice)
{ {
if (!invoice) return gnc_numeric_zero(); if (!invoice) return gnc_numeric_zero();
return invoice->to_charge_amount; return invoice->to_charge_amount;
@ -724,7 +724,7 @@ qofInvoiceSetEntries(GncInvoice *invoice, QofCollection *entry_coll)
} }
static GncJob* static GncJob*
qofInvoiceGetJob (GncInvoice *invoice) qofInvoiceGetJob (const GncInvoice *invoice)
{ {
if(!invoice) { return NULL; } if(!invoice) { return NULL; }
return invoice->job; return invoice->job;
@ -806,7 +806,7 @@ gncInvoiceAttachToTxn (GncInvoice *invoice, Transaction *txn)
} }
GncInvoice * GncInvoice *
gncInvoiceGetInvoiceFromTxn (Transaction *txn) gncInvoiceGetInvoiceFromTxn (const Transaction *txn)
{ {
KvpFrame *kvp; KvpFrame *kvp;
KvpValue *value; KvpValue *value;
@ -1454,20 +1454,20 @@ gncOwnerApplyPayment (GncOwner *owner, GncInvoice* invoice,
return txn; return txn;
} }
static gboolean gncInvoiceDateExists (Timespec *date) static gboolean gncInvoiceDateExists (const Timespec *date)
{ {
g_return_val_if_fail (date, FALSE); g_return_val_if_fail (date, FALSE);
if (date->tv_sec || date->tv_nsec) return TRUE; if (date->tv_sec || date->tv_nsec) return TRUE;
return FALSE; return FALSE;
} }
gboolean gncInvoiceIsPosted (GncInvoice *invoice) gboolean gncInvoiceIsPosted (const GncInvoice *invoice)
{ {
if (!invoice) return FALSE; if (!invoice) return FALSE;
return gncInvoiceDateExists (&(invoice->date_posted)); return gncInvoiceDateExists (&(invoice->date_posted));
} }
gboolean gncInvoiceIsPaid (GncInvoice *invoice) gboolean gncInvoiceIsPaid (const GncInvoice *invoice)
{ {
if (!invoice) return FALSE; if (!invoice) return FALSE;
if (!invoice->posted_lot) return FALSE; if (!invoice->posted_lot) return FALSE;
@ -1501,7 +1501,7 @@ void gncInvoiceCommitEdit (GncInvoice *invoice)
gncInvoiceOnDone, invoice_free); gncInvoiceOnDone, invoice_free);
} }
int gncInvoiceCompare (GncInvoice *a, GncInvoice *b) int gncInvoiceCompare (const GncInvoice *a, const GncInvoice *b)
{ {
int compare; int compare;

View File

@ -97,23 +97,23 @@ void gncInvoiceSortEntries (GncInvoice *invoice);
/** @name Get Functions /** @name Get Functions
@{ */ @{ */
const char * gncInvoiceGetID (GncInvoice *invoice); const char * gncInvoiceGetID (const GncInvoice *invoice);
GncOwner * gncInvoiceGetOwner (GncInvoice *invoice); GncOwner * gncInvoiceGetOwner (GncInvoice *invoice);
Timespec gncInvoiceGetDateOpened (GncInvoice *invoice); Timespec gncInvoiceGetDateOpened (const GncInvoice *invoice);
Timespec gncInvoiceGetDatePosted (GncInvoice *invoice); Timespec gncInvoiceGetDatePosted (const GncInvoice *invoice);
Timespec gncInvoiceGetDateDue (GncInvoice *invoice); Timespec gncInvoiceGetDateDue (const GncInvoice *invoice);
GncBillTerm * gncInvoiceGetTerms (GncInvoice *invoice); GncBillTerm * gncInvoiceGetTerms (const GncInvoice *invoice);
const char * gncInvoiceGetBillingID (GncInvoice *invoice); const char * gncInvoiceGetBillingID (const GncInvoice *invoice);
const char * gncInvoiceGetNotes (GncInvoice *invoice); const char * gncInvoiceGetNotes (const GncInvoice *invoice);
const char * gncInvoiceGetType (GncInvoice *invoice); const char * gncInvoiceGetType (GncInvoice *invoice);
gnc_commodity * gncInvoiceGetCurrency (GncInvoice *invoice); gnc_commodity * gncInvoiceGetCurrency (const GncInvoice *invoice);
GncOwner * gncInvoiceGetBillTo (GncInvoice *invoice); GncOwner * gncInvoiceGetBillTo (GncInvoice *invoice);
gnc_numeric gncInvoiceGetToChargeAmount (GncInvoice *invoice); gnc_numeric gncInvoiceGetToChargeAmount (const GncInvoice *invoice);
gboolean gncInvoiceGetActive (GncInvoice *invoice); gboolean gncInvoiceGetActive (const GncInvoice *invoice);
GNCLot * gncInvoiceGetPostedLot (GncInvoice *invoice); GNCLot * gncInvoiceGetPostedLot (const GncInvoice *invoice);
Transaction * gncInvoiceGetPostedTxn (GncInvoice *invoice); Transaction * gncInvoiceGetPostedTxn (const GncInvoice *invoice);
Account * gncInvoiceGetPostedAcc (GncInvoice *invoice); Account * gncInvoiceGetPostedAcc (const GncInvoice *invoice);
/** @} */ /** @} */
/** return the "total" amount of the invoice */ /** return the "total" amount of the invoice */
@ -165,7 +165,7 @@ gncOwnerApplyPayment (GncOwner *owner, GncInvoice *invoice,
/** Given a transaction, find and return the Invoice */ /** Given a transaction, find and return the Invoice */
GncInvoice * gncInvoiceGetInvoiceFromTxn (Transaction *txn); GncInvoice * gncInvoiceGetInvoiceFromTxn (const Transaction *txn);
/** Given a LOT, find and return the Invoice attached to the lot */ /** Given a LOT, find and return the Invoice attached to the lot */
GncInvoice * gncInvoiceGetInvoiceFromLot (GNCLot *lot); GncInvoice * gncInvoiceGetInvoiceFromLot (GNCLot *lot);
@ -181,9 +181,9 @@ GncInvoice * gncInvoiceGetInvoiceFromLot (GNCLot *lot);
void gncInvoiceBeginEdit (GncInvoice *invoice); void gncInvoiceBeginEdit (GncInvoice *invoice);
void gncInvoiceCommitEdit (GncInvoice *invoice); void gncInvoiceCommitEdit (GncInvoice *invoice);
int gncInvoiceCompare (GncInvoice *a, GncInvoice *b); int gncInvoiceCompare (const GncInvoice *a, const GncInvoice *b);
gboolean gncInvoiceIsPosted (GncInvoice *invoice); gboolean gncInvoiceIsPosted (const GncInvoice *invoice);
gboolean gncInvoiceIsPaid (GncInvoice *invoice); gboolean gncInvoiceIsPaid (const GncInvoice *invoice);
#define INVOICE_ID "id" #define INVOICE_ID "id"
#define INVOICE_OWNER "owner" #define INVOICE_OWNER "owner"

View File

@ -307,19 +307,19 @@ void gncJobCommitEdit (GncJob *job)
/* ================================================================== */ /* ================================================================== */
/* Get Functions */ /* Get Functions */
const char * gncJobGetID (GncJob *job) const char * gncJobGetID (const GncJob *job)
{ {
if (!job) return NULL; if (!job) return NULL;
return job->id; return job->id;
} }
const char * gncJobGetName (GncJob *job) const char * gncJobGetName (const GncJob *job)
{ {
if (!job) return NULL; if (!job) return NULL;
return job->name; return job->name;
} }
const char * gncJobGetReference (GncJob *job) const char * gncJobGetReference (const GncJob *job)
{ {
if (!job) return NULL; if (!job) return NULL;
return job->desc; return job->desc;
@ -331,7 +331,7 @@ GncOwner * gncJobGetOwner (GncJob *job)
return &(job->owner); return &(job->owner);
} }
gboolean gncJobGetActive (GncJob *job) gboolean gncJobGetActive (const GncJob *job)
{ {
if (!job) return FALSE; if (!job) return FALSE;
return job->active; return job->active;

View File

@ -76,13 +76,13 @@ void gncJobCommitEdit (GncJob *job);
@{ @{
*/ */
const char * gncJobGetID (GncJob *job); const char * gncJobGetID (const GncJob *job);
const char * gncJobGetName (GncJob *job); const char * gncJobGetName (const GncJob *job);
const char * gncJobGetReference (GncJob *job); const char * gncJobGetReference (const GncJob *job);
GncOwner * gncJobGetOwner (GncJob *job); GncOwner * gncJobGetOwner (GncJob *job);
/** @} */ /** @} */
gboolean gncJobGetActive (GncJob *job); gboolean gncJobGetActive (const GncJob *job);
/** Return a pointer to the instance gncJob that is identified /** Return a pointer to the instance gncJob that is identified
* by the guid, and is residing in the book. Returns NULL if the * by the guid, and is residing in the book. Returns NULL if the

View File

@ -293,7 +293,7 @@ void gncOrderRemoveEntry (GncOrder *order, GncEntry *entry)
/* Get Functions */ /* Get Functions */
const char * gncOrderGetID (GncOrder *order) const char * gncOrderGetID (const GncOrder *order)
{ {
if (!order) return NULL; if (!order) return NULL;
return order->id; return order->id;
@ -305,33 +305,33 @@ GncOwner * gncOrderGetOwner (GncOrder *order)
return &order->owner; return &order->owner;
} }
Timespec gncOrderGetDateOpened (GncOrder *order) Timespec gncOrderGetDateOpened (const GncOrder *order)
{ {
Timespec ts; ts.tv_sec = 0; ts.tv_nsec = 0; Timespec ts; ts.tv_sec = 0; ts.tv_nsec = 0;
if (!order) return ts; if (!order) return ts;
return order->opened; return order->opened;
} }
Timespec gncOrderGetDateClosed (GncOrder *order) Timespec gncOrderGetDateClosed (const GncOrder *order)
{ {
Timespec ts; ts.tv_sec = 0; ts.tv_nsec = 0; Timespec ts; ts.tv_sec = 0; ts.tv_nsec = 0;
if (!order) return ts; if (!order) return ts;
return order->closed; return order->closed;
} }
const char * gncOrderGetNotes (GncOrder *order) const char * gncOrderGetNotes (const GncOrder *order)
{ {
if (!order) return NULL; if (!order) return NULL;
return order->notes; return order->notes;
} }
const char * gncOrderGetReference (GncOrder *order) const char * gncOrderGetReference (const GncOrder *order)
{ {
if (!order) return NULL; if (!order) return NULL;
return order->reference; return order->reference;
} }
gboolean gncOrderGetActive (GncOrder *order) gboolean gncOrderGetActive (const GncOrder *order)
{ {
if (!order) return FALSE; if (!order) return FALSE;
return order->active; return order->active;
@ -344,7 +344,7 @@ GList * gncOrderGetEntries (GncOrder *order)
return order->entries; return order->entries;
} }
gboolean gncOrderIsClosed (GncOrder *order) gboolean gncOrderIsClosed (const GncOrder *order)
{ {
if (!order) return FALSE; if (!order) return FALSE;
if (order->closed.tv_sec || order->closed.tv_nsec) return TRUE; if (order->closed.tv_sec || order->closed.tv_nsec) return TRUE;
@ -378,7 +378,7 @@ void gncOrderCommitEdit (GncOrder *order)
gncOrderOnDone, order_free); gncOrderOnDone, order_free);
} }
int gncOrderCompare (GncOrder *a, GncOrder *b) int gncOrderCompare (const GncOrder *a, const GncOrder *b)
{ {
int compare; int compare;

View File

@ -78,22 +78,22 @@ void gncOrderRemoveEntry (GncOrder *order, GncEntry *entry);
/* Get Functions */ /* Get Functions */
const char * gncOrderGetID (GncOrder *order); const char * gncOrderGetID (const GncOrder *order);
GncOwner * gncOrderGetOwner (GncOrder *order); GncOwner * gncOrderGetOwner (GncOrder *order);
Timespec gncOrderGetDateOpened (GncOrder *order); Timespec gncOrderGetDateOpened (const GncOrder *order);
Timespec gncOrderGetDateClosed (GncOrder *order); Timespec gncOrderGetDateClosed (const GncOrder *order);
const char * gncOrderGetNotes (GncOrder *order); const char * gncOrderGetNotes (const GncOrder *order);
const char * gncOrderGetReference (GncOrder *order); const char * gncOrderGetReference (const GncOrder *order);
gboolean gncOrderGetActive (GncOrder *order); gboolean gncOrderGetActive (const GncOrder *order);
/* Get the list Entries */ /* Get the list Entries */
GList * gncOrderGetEntries (GncOrder *order); GList * gncOrderGetEntries (GncOrder *order);
void gncOrderBeginEdit (GncOrder *order); void gncOrderBeginEdit (GncOrder *order);
void gncOrderCommitEdit (GncOrder *order); void gncOrderCommitEdit (GncOrder *order);
int gncOrderCompare (GncOrder *a, GncOrder *b); int gncOrderCompare (const GncOrder *a, const GncOrder *b);
gboolean gncOrderIsClosed (GncOrder *order); gboolean gncOrderIsClosed (const GncOrder *order);
/** Return a pointer to the instance gncOrder that is identified /** Return a pointer to the instance gncOrder that is identified
* by the guid, and is residing in the book. Returns NULL if the * by the guid, and is residing in the book. Returns NULL if the

View File

@ -103,7 +103,7 @@ GncOwnerType gncOwnerGetType (const GncOwner *owner)
} }
QofIdType QofIdType
qofOwnerGetType(GncOwner *owner) qofOwnerGetType(const GncOwner *owner)
{ {
QofIdType type; QofIdType type;
@ -139,7 +139,7 @@ qofOwnerGetType(GncOwner *owner)
} }
QofInstance* QofInstance*
qofOwnerGetOwner (GncOwner *owner) qofOwnerGetOwner (const GncOwner *owner)
{ {
QofInstance *ent; QofInstance *ent;
@ -234,7 +234,7 @@ GncEmployee * gncOwnerGetEmployee (const GncOwner *owner)
return owner->owner.employee; return owner->owner.employee;
} }
gnc_commodity * gncOwnerGetCurrency (GncOwner *owner) gnc_commodity * gncOwnerGetCurrency (const GncOwner *owner)
{ {
if (!owner) return NULL; if (!owner) return NULL;
switch (owner->type) { switch (owner->type) {
@ -297,7 +297,7 @@ gboolean gncOwnerEqual (const GncOwner *a, const GncOwner *b)
return (a->owner.undefined == b->owner.undefined); return (a->owner.undefined == b->owner.undefined);
} }
const char * gncOwnerGetName (GncOwner *owner) const char * gncOwnerGetName (const GncOwner *owner)
{ {
if (!owner) return NULL; if (!owner) return NULL;
switch (owner->type) { switch (owner->type) {
@ -316,7 +316,7 @@ const char * gncOwnerGetName (GncOwner *owner)
} }
} }
const GUID * gncOwnerGetGUID (GncOwner *owner) const GUID * gncOwnerGetGUID (const GncOwner *owner)
{ {
if (!owner) return NULL; if (!owner) return NULL;
@ -393,7 +393,7 @@ const GUID * gncOwnerGetEndGUID (GncOwner *owner)
return gncOwnerGetGUID (owner); return gncOwnerGetGUID (owner);
} }
void gncOwnerAttachToLot (GncOwner *owner, GNCLot *lot) void gncOwnerAttachToLot (const GncOwner *owner, GNCLot *lot)
{ {
KvpFrame *kvp; KvpFrame *kvp;
KvpValue *value; KvpValue *value;
@ -458,7 +458,7 @@ gboolean gncOwnerGetOwnerFromLot (GNCLot *lot, GncOwner *owner)
return (owner->owner.undefined != NULL); return (owner->owner.undefined != NULL);
} }
gboolean gncOwnerIsValid (GncOwner *owner) gboolean gncOwnerIsValid (const GncOwner *owner)
{ {
if (!owner) return FALSE; if (!owner) return FALSE;
return (owner->owner.undefined != NULL); return (owner->owner.undefined != NULL);

View File

@ -61,9 +61,9 @@ to QOF as they can be used by objects like GncInvoice.
@{ @{
*/ */
/** return the type for the collection. */ /** return the type for the collection. */
QofIdType qofOwnerGetType(GncOwner *owner); QofIdType qofOwnerGetType(const GncOwner *owner);
/** return the owner itself as an entity. */ /** return the owner itself as an entity. */
QofInstance* qofOwnerGetOwner (GncOwner *owner); QofInstance* qofOwnerGetOwner (const GncOwner *owner);
/** set the owner from the entity. */ /** set the owner from the entity. */
void qofOwnerSetEntity (GncOwner *owner, QofInstance *ent); void qofOwnerSetEntity (GncOwner *owner, QofInstance *ent);
@ -112,14 +112,14 @@ void gncOwnerCopy (const GncOwner *src, GncOwner *dest);
gboolean gncOwnerEqual (const GncOwner *a, const GncOwner *b); gboolean gncOwnerEqual (const GncOwner *a, const GncOwner *b);
int gncOwnerCompare (const GncOwner *a, const GncOwner *b); int gncOwnerCompare (const GncOwner *a, const GncOwner *b);
const char * gncOwnerGetName (GncOwner *owner); const char * gncOwnerGetName (const GncOwner *owner);
gnc_commodity * gncOwnerGetCurrency (GncOwner *owner); gnc_commodity * gncOwnerGetCurrency (const GncOwner *owner);
/** Get the GUID of the immediate owner */ /** Get the GUID of the immediate owner */
const GUID * gncOwnerGetGUID (GncOwner *owner); const GUID * gncOwnerGetGUID (const GncOwner *owner);
GUID gncOwnerRetGUID (GncOwner *owner); GUID gncOwnerRetGUID (GncOwner *owner);
gboolean gncOwnerIsValid (GncOwner *owner); gboolean gncOwnerIsValid (const GncOwner *owner);
/** /**
* Get the "parent" Owner or GUID thereof. The "parent" owner * Get the "parent" Owner or GUID thereof. The "parent" owner
@ -129,7 +129,7 @@ GncOwner * gncOwnerGetEndOwner (GncOwner *owner);
const GUID * gncOwnerGetEndGUID (GncOwner *owner); const GUID * gncOwnerGetEndGUID (GncOwner *owner);
/** attach an owner to a lot */ /** attach an owner to a lot */
void gncOwnerAttachToLot (GncOwner *owner, GNCLot *lot); void gncOwnerAttachToLot (const GncOwner *owner, GNCLot *lot);
/** Get the owner from the lot. If an owner is found in the lot, /** Get the owner from the lot. If an owner is found in the lot,
* fill in "owner" and return TRUE. Otherwise return FALSE. * fill in "owner" and return TRUE. Otherwise return FALSE.

View File

@ -66,7 +66,7 @@ struct _book_info
GList * tables; /* visible tables */ GList * tables; /* visible tables */
}; };
static GncTaxTableEntry * CloneTaxEntry (GncTaxTableEntry*, QofBook *); static GncTaxTableEntry * CloneTaxEntry (const GncTaxTableEntry*, QofBook *);
static QofLogModule log_module = GNC_MOD_BUSINESS; static QofLogModule log_module = GNC_MOD_BUSINESS;
@ -194,7 +194,7 @@ gncTaxTableAddChild (GncTaxTable *table, GncTaxTable *child)
} }
static inline void static inline void
gncTaxTableRemoveChild (GncTaxTable *table, GncTaxTable *child) gncTaxTableRemoveChild (GncTaxTable *table, const GncTaxTable *child)
{ {
g_return_if_fail(table); g_return_if_fail(table);
g_return_if_fail(child); g_return_if_fail(child);
@ -291,7 +291,7 @@ gncCloneTaxTable (GncTaxTable *from, QofBook *book)
} }
GncTaxTable * GncTaxTable *
gncTaxTableObtainTwin (GncTaxTable *from, QofBook *book) gncTaxTableObtainTwin (const GncTaxTable *from, QofBook *book)
{ {
GncTaxTable *table; GncTaxTable *table;
if (!from) return NULL; if (!from) return NULL;
@ -370,7 +370,7 @@ void gncTaxTableEntryDestroy (GncTaxTableEntry *entry)
* we set it above, when cloning the table). * we set it above, when cloning the table).
*/ */
static GncTaxTableEntry * static GncTaxTableEntry *
CloneTaxEntry (GncTaxTableEntry*from, QofBook *book) CloneTaxEntry (const GncTaxTableEntry*from, QofBook *book)
{ {
QofInstance *acc; QofInstance *acc;
GncTaxTableEntry *entry; GncTaxTableEntry *entry;
@ -575,13 +575,13 @@ GList * gncTaxTableGetTables (QofBook *book)
return bi->tables; return bi->tables;
} }
const char *gncTaxTableGetName (GncTaxTable *table) const char *gncTaxTableGetName (const GncTaxTable *table)
{ {
if (!table) return NULL; if (!table) return NULL;
return table->name; return table->name;
} }
static GncTaxTableEntry *gncTaxTableEntryCopy (GncTaxTableEntry *entry) static GncTaxTableEntry *gncTaxTableEntryCopy (const GncTaxTableEntry *entry)
{ {
GncTaxTableEntry *e; GncTaxTableEntry *e;
if (!entry) return NULL; if (!entry) return NULL;
@ -594,7 +594,7 @@ static GncTaxTableEntry *gncTaxTableEntryCopy (GncTaxTableEntry *entry)
return e; return e;
} }
static GncTaxTable *gncTaxTableCopy (GncTaxTable *table) static GncTaxTable *gncTaxTableCopy (const GncTaxTable *table)
{ {
GncTaxTable *t; GncTaxTable *t;
GList *list; GList *list;
@ -626,56 +626,62 @@ GncTaxTable *gncTaxTableReturnChild (GncTaxTable *table, gboolean make_new)
return child; return child;
} }
GncTaxTable *gncTaxTableGetParent (GncTaxTable *table) GncTaxTable *gncTaxTableGetParent (const GncTaxTable *table)
{ {
if (!table) return NULL; if (!table) return NULL;
return table->parent; return table->parent;
} }
GList *gncTaxTableGetEntries (GncTaxTable *table) GList *gncTaxTableGetEntries (const GncTaxTable *table)
{ {
if (!table) return NULL; if (!table) return NULL;
return table->entries; return table->entries;
} }
gint64 gncTaxTableGetRefcount (GncTaxTable *table) gint64 gncTaxTableGetRefcount (const GncTaxTable *table)
{ {
if (!table) return 0; if (!table) return 0;
return table->refcount; return table->refcount;
} }
Timespec gncTaxTableLastModified (GncTaxTable *table) Timespec gncTaxTableLastModified (const GncTaxTable *table)
{ {
Timespec ts = { 0 , 0 }; Timespec ts = { 0 , 0 };
if (!table) return ts; if (!table) return ts;
return table->modtime; return table->modtime;
} }
gboolean gncTaxTableGetInvisible (GncTaxTable *table) gboolean gncTaxTableGetInvisible (const GncTaxTable *table)
{ {
if (!table) return FALSE; if (!table) return FALSE;
return table->invisible; return table->invisible;
} }
Account * gncTaxTableEntryGetAccount (GncTaxTableEntry *entry) Account * gncTaxTableEntryGetAccount (const GncTaxTableEntry *entry)
{ {
if (!entry) return NULL; if (!entry) return NULL;
return entry->account; return entry->account;
} }
GncAmountType gncTaxTableEntryGetType (GncTaxTableEntry *entry) GncAmountType gncTaxTableEntryGetType (const GncTaxTableEntry *entry)
{ {
if (!entry) return 0; if (!entry) return 0;
return entry->type; return entry->type;
} }
gnc_numeric gncTaxTableEntryGetAmount (GncTaxTableEntry *entry) gnc_numeric gncTaxTableEntryGetAmount (const GncTaxTableEntry *entry)
{ {
if (!entry) return gnc_numeric_zero(); if (!entry) return gnc_numeric_zero();
return entry->amount; return entry->amount;
} }
int gncTaxTableEntryCompare (GncTaxTableEntry *a, GncTaxTableEntry *b) GncTaxTable* gncTaxTableEntryGetTable( const GncTaxTableEntry* entry )
{
if (!entry) return NULL;
return entry->table;
}
int gncTaxTableEntryCompare (const GncTaxTableEntry *a, const GncTaxTableEntry *b)
{ {
char *name_a, *name_b; char *name_a, *name_b;
int retval; int retval;
@ -696,7 +702,7 @@ int gncTaxTableEntryCompare (GncTaxTableEntry *a, GncTaxTableEntry *b)
return gnc_numeric_compare (a->amount, b->amount); return gnc_numeric_compare (a->amount, b->amount);
} }
int gncTaxTableCompare (GncTaxTable *a, GncTaxTable *b) int gncTaxTableCompare (const GncTaxTable *a, const GncTaxTable *b)
{ {
if (!a && !b) return 0; if (!a && !b) return 0;
if (!a) return -1; if (!a) return -1;

View File

@ -149,21 +149,21 @@ GncTaxTable *gncTaxTableLookupByName (QofBook *book, const char *name);
GList * gncTaxTableGetTables (QofBook *book); GList * gncTaxTableGetTables (QofBook *book);
const char *gncTaxTableGetName (GncTaxTable *table); const char *gncTaxTableGetName (const GncTaxTable *table);
GncTaxTable *gncTaxTableGetParent (GncTaxTable *table); GncTaxTable *gncTaxTableGetParent (const GncTaxTable *table);
GncTaxTable *gncTaxTableReturnChild (GncTaxTable *table, gboolean make_new); GncTaxTable *gncTaxTableReturnChild (GncTaxTable *table, gboolean make_new);
#define gncTaxTableGetChild(t) gncTaxTableReturnChild((t),FALSE) #define gncTaxTableGetChild(t) gncTaxTableReturnChild((t),FALSE)
GList *gncTaxTableGetEntries (GncTaxTable *table); GList *gncTaxTableGetEntries (const GncTaxTable *table);
gint64 gncTaxTableGetRefcount (GncTaxTable *table); gint64 gncTaxTableGetRefcount (const GncTaxTable *table);
Timespec gncTaxTableLastModified (GncTaxTable *table); Timespec gncTaxTableLastModified (const GncTaxTable *table);
Account * gncTaxTableEntryGetAccount (GncTaxTableEntry *entry); Account * gncTaxTableEntryGetAccount (const GncTaxTableEntry *entry);
GncAmountType gncTaxTableEntryGetType (GncTaxTableEntry *entry); GncAmountType gncTaxTableEntryGetType (const GncTaxTableEntry *entry);
gnc_numeric gncTaxTableEntryGetAmount (GncTaxTableEntry *entry); gnc_numeric gncTaxTableEntryGetAmount (const GncTaxTableEntry *entry);
/** @} */ /** @} */
int gncTaxTableCompare (GncTaxTable *a, GncTaxTable *b); int gncTaxTableCompare (const GncTaxTable *a, const GncTaxTable *b);
int gncTaxTableEntryCompare (GncTaxTableEntry *a, GncTaxTableEntry *b); int gncTaxTableEntryCompare (const GncTaxTableEntry *a, const GncTaxTableEntry *b);
/************************************************/ /************************************************/

View File

@ -38,7 +38,7 @@ void gncTaxTableSetChild (GncTaxTable *table, GncTaxTable *child);
void gncTaxTableSetRefcount (GncTaxTable *table, gint64 refcount); void gncTaxTableSetRefcount (GncTaxTable *table, gint64 refcount);
void gncTaxTableMakeInvisible (GncTaxTable *table); void gncTaxTableMakeInvisible (GncTaxTable *table);
gboolean gncTaxTableGetInvisible (GncTaxTable *table); gboolean gncTaxTableGetInvisible (const GncTaxTable *table);
/** The gncCloneTaxTable() routine makes a copy of the indicated /** The gncCloneTaxTable() routine makes a copy of the indicated
* tax table, placing it in the indicated book. It copies * tax table, placing it in the indicated book. It copies
@ -61,7 +61,9 @@ GncTaxTable * gncCloneTaxTable (GncTaxTable *from, QofBook *book);
* it from the other Get routines, which work in fundamentally * it from the other Get routines, which work in fundamentally
* different ways. * different ways.
*/ */
GncTaxTable * gncTaxTableObtainTwin (GncTaxTable *from, QofBook *book); GncTaxTable * gncTaxTableObtainTwin (const GncTaxTable *from, QofBook *book);
GncTaxTable* gncTaxTableEntryGetTable( const GncTaxTableEntry* entry );
#define gncTaxTableSetGUID(E,G) qof_instance_set_guid(QOF_INSTANCE(E),(G)) #define gncTaxTableSetGUID(E,G) qof_instance_set_guid(QOF_INSTANCE(E),(G))

View File

@ -346,68 +346,68 @@ qofVendorSetTaxIncluded(GncVendor *vendor, const char* type_string)
/* ============================================================== */ /* ============================================================== */
/* Get Functions */ /* Get Functions */
const char * gncVendorGetID (GncVendor *vendor) const char * gncVendorGetID (const GncVendor *vendor)
{ {
if (!vendor) return NULL; if (!vendor) return NULL;
return vendor->id; return vendor->id;
} }
const char * gncVendorGetName (GncVendor *vendor) const char * gncVendorGetName (const GncVendor *vendor)
{ {
if (!vendor) return NULL; if (!vendor) return NULL;
return vendor->name; return vendor->name;
} }
GncAddress * gncVendorGetAddr (GncVendor *vendor) GncAddress * gncVendorGetAddr (const GncVendor *vendor)
{ {
if (!vendor) return NULL; if (!vendor) return NULL;
return vendor->addr; return vendor->addr;
} }
const char * gncVendorGetNotes (GncVendor *vendor) const char * gncVendorGetNotes (const GncVendor *vendor)
{ {
if (!vendor) return NULL; if (!vendor) return NULL;
return vendor->notes; return vendor->notes;
} }
GncBillTerm * gncVendorGetTerms (GncVendor *vendor) GncBillTerm * gncVendorGetTerms (const GncVendor *vendor)
{ {
if (!vendor) return 0; if (!vendor) return 0;
return vendor->terms; return vendor->terms;
} }
GncTaxIncluded gncVendorGetTaxIncluded (GncVendor *vendor) GncTaxIncluded gncVendorGetTaxIncluded (const GncVendor *vendor)
{ {
if (!vendor) return GNC_TAXINCLUDED_USEGLOBAL; if (!vendor) return GNC_TAXINCLUDED_USEGLOBAL;
return vendor->taxincluded; return vendor->taxincluded;
} }
gnc_commodity * gncVendorGetCurrency (GncVendor *vendor) gnc_commodity * gncVendorGetCurrency (const GncVendor *vendor)
{ {
if (!vendor) return NULL; if (!vendor) return NULL;
return vendor->currency; return vendor->currency;
} }
gboolean gncVendorGetActive (GncVendor *vendor) gboolean gncVendorGetActive (const GncVendor *vendor)
{ {
if (!vendor) return FALSE; if (!vendor) return FALSE;
return vendor->active; return vendor->active;
} }
gboolean gncVendorGetTaxTableOverride (GncVendor *vendor) gboolean gncVendorGetTaxTableOverride (const GncVendor *vendor)
{ {
if (!vendor) return FALSE; if (!vendor) return FALSE;
return vendor->taxtable_override; return vendor->taxtable_override;
} }
GncTaxTable* gncVendorGetTaxTable (GncVendor *vendor) GncTaxTable* gncVendorGetTaxTable (const GncVendor *vendor)
{ {
if (!vendor) return NULL; if (!vendor) return NULL;
return vendor->taxtable; return vendor->taxtable;
} }
static const char* static const char*
qofVendorGetTaxIncluded(GncVendor *vendor) qofVendorGetTaxIncluded(const GncVendor *vendor)
{ {
return gncTaxIncludedTypeToString(vendor->taxincluded); return gncTaxIncludedTypeToString(vendor->taxincluded);
} }
@ -475,7 +475,7 @@ void gncVendorCommitEdit (GncVendor *vendor)
/* ============================================================== */ /* ============================================================== */
/* Other functions */ /* Other functions */
int gncVendorCompare (GncVendor *a, GncVendor *b) int gncVendorCompare (const GncVendor *a, const GncVendor *b)
{ {
if (!a && !b) return 0; if (!a && !b) return 0;
if (!a && b) return 1; if (!a && b) return 1;
@ -484,7 +484,7 @@ int gncVendorCompare (GncVendor *a, GncVendor *b)
return(strcmp(a->name, b->name)); return(strcmp(a->name, b->name));
} }
GList * gncVendorGetJoblist (GncVendor *vendor, gboolean show_all) GList * gncVendorGetJoblist (const GncVendor *vendor, gboolean show_all)
{ {
if (!vendor) return NULL; if (!vendor) return NULL;
@ -501,7 +501,7 @@ GList * gncVendorGetJoblist (GncVendor *vendor, gboolean show_all)
} }
} }
gboolean gncVendorIsDirty (GncVendor *vendor) gboolean gncVendorIsDirty (const GncVendor *vendor)
{ {
if (!vendor) return FALSE; if (!vendor) return FALSE;
return (qof_instance_get_dirty_flag(vendor) return (qof_instance_get_dirty_flag(vendor)

View File

@ -86,25 +86,25 @@ void gncVendorCommitEdit (GncVendor *vendor);
@{ @{
*/ */
const char * gncVendorGetID (GncVendor *vendor); const char * gncVendorGetID (const GncVendor *vendor);
const char * gncVendorGetName (GncVendor *vendor); const char * gncVendorGetName (const GncVendor *vendor);
GncAddress * gncVendorGetAddr (GncVendor *vendor); GncAddress * gncVendorGetAddr (const GncVendor *vendor);
const char * gncVendorGetNotes (GncVendor *vendor); const char * gncVendorGetNotes (const GncVendor *vendor);
GncBillTerm * gncVendorGetTerms (GncVendor *vendor); GncBillTerm * gncVendorGetTerms (const GncVendor *vendor);
GncTaxIncluded gncVendorGetTaxIncluded (GncVendor *vendor); GncTaxIncluded gncVendorGetTaxIncluded (const GncVendor *vendor);
gnc_commodity * gncVendorGetCurrency (GncVendor *vendor); gnc_commodity * gncVendorGetCurrency (const GncVendor *vendor);
gboolean gncVendorGetActive (GncVendor *vendor); gboolean gncVendorGetActive (const GncVendor *vendor);
gboolean gncVendorGetTaxTableOverride (GncVendor *vendor); gboolean gncVendorGetTaxTableOverride (const GncVendor *vendor);
GncTaxTable* gncVendorGetTaxTable (GncVendor *vendor); GncTaxTable* gncVendorGetTaxTable (const GncVendor *vendor);
/** @} */ /** @} */
/** XXX should be renamed to RetJobList to be consistent with /** XXX should be renamed to RetJobList to be consistent with
* other usage, since caller must free the copied list * other usage, since caller must free the copied list
*/ */
GList * gncVendorGetJoblist (GncVendor *vendor, gboolean show_all); GList * gncVendorGetJoblist (const GncVendor *vendor, gboolean show_all);
gboolean gncVendorIsDirty (GncVendor *vendor); gboolean gncVendorIsDirty (const GncVendor *vendor);
int gncVendorCompare (GncVendor *a, GncVendor *b); int gncVendorCompare (const GncVendor *a, const GncVendor *b);
/** Return a pointer to the instance gncVendor that is identified /** Return a pointer to the instance gncVendor that is identified
* by the guid, and is residing in the book. Returns NULL if the * by the guid, and is residing in the book. Returns NULL if the

View File

@ -0,0 +1,54 @@
SUBDIRS = .
pkglib_LTLIBRARIES = libgncmod-business-backend-sql.la
AM_CFLAGS = \
-I${top_srcdir}/src \
-I${top_srcdir}/src/backend \
-I${top_srcdir}/src/backend/sql \
-I${top_srcdir}/src/engine \
-I${top_srcdir}/src/gnc-module \
-I${top_srcdir}/src/business/business-core \
${QOF_CFLAGS} \
${GLIB_CFLAGS} \
${LIBGDA_CFLAGS}
libgncmod_business_backend_sql_la_SOURCES = \
gncmod-business-backend-sql.c \
gnc-address-sql.c \
gnc-bill-term-sql.c \
gnc-customer-sql.c \
gnc-employee-sql.c \
gnc-entry-sql.c \
gnc-invoice-sql.c \
gnc-job-sql.c \
gnc-order-sql.c \
gnc-owner-sql.c \
gnc-tax-table-sql.c \
gnc-vendor-sql.c
noinst_HEADERS = \
gnc-address-sql.h \
gnc-bill-term-sql.h \
gnc-customer-sql.h \
gnc-employee-sql.h \
gnc-entry-sql.h \
gnc-invoice-sql.h \
gnc-job-sql.h \
gnc-order-sql.h \
gnc-owner-sql.h \
gnc-tax-table-sql.h \
gnc-vendor-sql.h
libgncmod_business_backend_sql_la_LDFLAGS = -module -avoid-version
libgncmod_business_backend_sql_la_LIBADD = \
${top_builddir}/src/business/business-core/libgncmod-business-core.la \
${top_builddir}/src/backend/sql/libgnc-backend-sql.la \
${top_builddir}/src/engine/libgncmod-engine.la \
${top_builddir}/src/gnc-module/libgnc-module.la \
${QOF_LIBS} \
${GLIB_LIBS} \
${LIBGDA_LIBS}
INCLUDES = -DG_LOG_DOMAIN=\"gnc.backend.sql\"

View File

@ -0,0 +1,212 @@
/********************************************************************\
* gnc-address-sql.c -- address sql backend implementation *
* *
* This program is free software; you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation; either version 2 of *
* the License, or (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License*
* along with this program; if not, contact: *
* *
* Free Software Foundation Voice: +1-617-542-5942 *
* 51 Franklin Street, Fifth Floor Fax: +1-617-542-2652 *
* Boston, MA 02110-1301, USA gnu@gnu.org *
* *
\********************************************************************/
/** @file gnc-address-sql.c
* @brief load and save address data to SQL
* @author Copyright (c) 2007-2008 Phil Longstaff <plongstaff@rogers.com>
*
* This file implements the top-level QofBackend API for saving/
* restoring data to/from an SQL database
*/
#include "config.h"
#include <glib.h>
#include <stdlib.h>
#include <string.h>
#include "gnc-engine.h"
#include "gnc-backend-sql.h"
#include "gnc-address-sql.h"
static QofLogModule log_module = G_LOG_DOMAIN;
#define ADDRESS_MAX_NAME_LEN 1024
#define ADDRESS_MAX_ADDRESS_LINE_LEN 1024
#define ADDRESS_MAX_PHONE_LEN 128
#define ADDRESS_MAX_FAX_LEN 128
#define ADDRESS_MAX_EMAIL_LEN 256
static GncSqlColumnTableEntry col_table[] =
{
{ "name", CT_STRING, ADDRESS_MAX_NAME_LEN, COL_NNUL, NULL, ADDRESS_NAME },
{ "addr1", CT_STRING, ADDRESS_MAX_ADDRESS_LINE_LEN, COL_NNUL, NULL, ADDRESS_ONE },
{ "addr2", CT_STRING, ADDRESS_MAX_ADDRESS_LINE_LEN, COL_NNUL, NULL, ADDRESS_TWO },
{ "addr3", CT_STRING, ADDRESS_MAX_ADDRESS_LINE_LEN, COL_NNUL, NULL, ADDRESS_THREE },
{ "addr4", CT_STRING, ADDRESS_MAX_ADDRESS_LINE_LEN, COL_NNUL, NULL, ADDRESS_FOUR },
{ "phone", CT_STRING, ADDRESS_MAX_PHONE_LEN, COL_NNUL, NULL, ADDRESS_PHONE },
{ "fax", CT_STRING, ADDRESS_MAX_FAX_LEN, COL_NNUL, NULL, ADDRESS_FAX },
{ "email", CT_STRING, ADDRESS_MAX_EMAIL_LEN, COL_NNUL, NULL, ADDRESS_EMAIL },
{ NULL }
};
typedef void (*AddressSetterFunc)( gpointer, GncAddress* );
typedef GncAddress* (*AddressGetterFunc)( const gpointer );
static void
load_address( const GncSqlBackend* be, GncSqlRow* row,
QofSetterFunc setter, gpointer pObject,
const GncSqlColumnTableEntry* table_row )
{
const GValue* val;
gchar* buf;
GncAddress* addr;
AddressSetterFunc a_setter = (AddressSetterFunc)setter;
const GncSqlColumnTableEntry* subtable;
const gchar* s;
g_return_if_fail( be != NULL );
g_return_if_fail( row != NULL );
g_return_if_fail( pObject != NULL );
g_return_if_fail( table_row != NULL );
addr = gncAddressCreate( be->primary_book, NULL );
for( subtable = col_table; subtable->col_name != NULL; subtable++ ) {
buf = g_strdup_printf( "%s_%s", table_row->col_name, subtable->col_name );
val = gnc_sql_row_get_value_at_col_name( row, buf );
g_free( buf );
if( val == NULL ) {
s = NULL;
} else {
s = g_value_get_string( val );
}
if( subtable->gobj_param_name != NULL ) {
g_object_set( addr, subtable->gobj_param_name, s, NULL );
} else {
if( subtable->qof_param_name != NULL ) {
setter = qof_class_get_parameter_setter( GNC_ID_ADDRESS, subtable->qof_param_name );
} else {
setter = subtable->setter;
}
(*setter)( addr, (const gpointer)s );
}
}
(*a_setter)( pObject, addr );
}
static void
add_address_col_info_to_list( const GncSqlBackend* be, const GncSqlColumnTableEntry* table_row,
GList** pList )
{
GncSqlColumnInfo* info;
gchar* buf;
const GncSqlColumnTableEntry* subtable_row;
const gchar* type;
g_return_if_fail( be != NULL );
g_return_if_fail( table_row != NULL );
g_return_if_fail( pList != NULL );
for( subtable_row = col_table; subtable_row->col_name != NULL; subtable_row++ ) {
buf = g_strdup_printf( "%s_%s", table_row->col_name, subtable_row->col_name );
info = g_new0( GncSqlColumnInfo, 1 );
info->name = buf;
info->type_name = gnc_sql_connection_get_column_type_name( be->conn,
G_TYPE_STRING, subtable_row->size );
info->is_primary_key = (table_row->flags & COL_PKEY) ? TRUE : FALSE;
info->size = subtable_row->size;
info->null_allowed = (table_row->flags & COL_NNUL) ? FALSE : TRUE;
*pList = g_list_append( *pList, info );
}
}
static void
add_address_colname_to_list( const GncSqlColumnTableEntry* table_row, GList** pList )
{
gnc_sql_add_subtable_colnames_to_list( table_row, col_table, pList );
}
static void
get_gvalue_address( const GncSqlBackend* be, QofIdTypeConst obj_name, const gpointer pObject,
const GncSqlColumnTableEntry* table_row, GValue* value )
{
AddressGetterFunc getter;
GncAddress* addr;
g_return_if_fail( be != NULL );
g_return_if_fail( obj_name != NULL );
g_return_if_fail( pObject != NULL );
g_return_if_fail( table_row != NULL );
g_return_if_fail( value != NULL );
memset( value, 0, sizeof( GValue ) );
getter = (AddressGetterFunc)gnc_sql_get_getter( obj_name, table_row );
addr = (*getter)( pObject );
g_value_init( value, gnc_address_get_type() );
g_value_set_object( value, addr );
}
static void
add_gvalue_address_to_slist( const GncSqlBackend* be, QofIdTypeConst obj_name,
const gpointer pObject, const GncSqlColumnTableEntry* table_row, GSList** pList )
{
GValue value;
GValue* subfield_value;
GncAddress* addr;
gchar* s;
QofAccessFunc getter;
const GncSqlColumnTableEntry* subtable_row;
g_return_if_fail( be != NULL );
g_return_if_fail( obj_name != NULL );
g_return_if_fail( pObject != NULL );
g_return_if_fail( table_row != NULL );
memset( &value, 0, sizeof( GValue ) );
get_gvalue_address( be, obj_name, pObject, table_row, &value );
if( G_VALUE_TYPE(&value) != 0 ) {
addr = g_value_get_object( &value );
for( subtable_row = col_table; subtable_row->col_name != NULL; subtable_row++ ) {
subfield_value = g_new0( GValue, 1 );
if( subtable_row->gobj_param_name != NULL ) {
g_object_get( addr, subtable_row->gobj_param_name, &s, NULL );
} else {
getter = gnc_sql_get_getter( GNC_ID_ADDRESS, subtable_row );
s = (gchar*)(*getter)( addr, NULL );
}
g_value_init( subfield_value, G_TYPE_STRING );
if( s ) {
g_value_set_string( subfield_value, s );
} else {
g_value_set_string( subfield_value, "NULL" );
}
(*pList) = g_slist_append( (*pList), subfield_value );
}
}
}
static col_type_handler_t address_handler
= { load_address,
add_address_col_info_to_list,
add_address_colname_to_list,
add_gvalue_address_to_slist };
/* ================================================================= */
void
gnc_address_sql_initialize( void )
{
gnc_sql_register_col_type_handler( CT_ADDRESS, &address_handler );
}
/* ========================== END OF FILE ===================== */

View File

@ -0,0 +1,38 @@
/* gnc-address-sql.h -- Address SQL header
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, contact:
*
* Free Software Foundation Voice: +1-617-542-5942
* 51 Franklin Street, Fifth Floor Fax: +1-617-542-2652
* Boston, MA 02110-1301, USA gnu@gnu.org
*/
/** @file gnc-address-sql.h
* @brief load and save address data to SQL
* @author Copyright (c) 2007-2008 Phil Longstaff <plongstaff@rogers.com>
*
* This file implements the top-level QofBackend API for saving/
* restoring data to/from an SQL database
*/
#ifndef GNC_ADDRESS_SQL_H
#define GNC_ADDRESS_SQL_H
#include "gncAddress.h"
#define CT_ADDRESS "address"
void gnc_address_sql_initialize( void );
#endif /* GNC_ADDRESS_SQL_H */

View File

@ -0,0 +1,242 @@
/********************************************************************\
* gnc-bill-term-sql.c -- billing term sql backend *
* *
* This program is free software; you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation; either version 2 of *
* the License, or (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License*
* along with this program; if not, contact: *
* *
* Free Software Foundation Voice: +1-617-542-5942 *
* 51 Franklin Street, Fifth Floor Fax: +1-617-542-2652 *
* Boston, MA 02110-1301, USA gnu@gnu.org *
* *
\********************************************************************/
/** @file gnc-bill-term-sql.c
* @brief load and save address data to SQL
* @author Copyright (c) 2007-2008 Phil Longstaff <plongstaff@rogers.com>
*
* This file implements the top-level QofBackend API for saving/
* restoring data to/from an SQL database
*/
#include "config.h"
#include <glib.h>
#include <stdlib.h>
#include <string.h>
#include "gnc-backend-sql.h"
#include "gnc-slots-sql.h"
#include "gncBillTermP.h"
#include "gncInvoice.h"
#include "gnc-bill-term-sql.h"
#include "qof.h"
#define _GNC_MOD_NAME GNC_ID_BILLTERM
static QofLogModule log_module = G_LOG_DOMAIN;
#define MAX_NAME_LEN 2048
#define MAX_DESCRIPTION_LEN 2048
#define MAX_TYPE_LEN 2048
static void set_invisible( gpointer data, gboolean value );
#define TABLE_NAME "billterms"
#define TABLE_VERSION 1
static GncSqlColumnTableEntry col_table[] =
{
{ "guid", CT_GUID, 0, COL_NNUL|COL_PKEY, "guid" },
{ "name", CT_STRING, MAX_NAME_LEN, COL_NNUL, NULL, GNC_BILLTERM_NAME },
{ "description", CT_STRING, MAX_DESCRIPTION_LEN, COL_NNUL, NULL, GNC_BILLTERM_DESC },
{ "refcount", CT_INT, 0, COL_NNUL, NULL, NULL,
(QofAccessFunc)gncBillTermGetRefcount, (QofSetterFunc)gncBillTermSetRefcount },
{ "invisible", CT_BOOLEAN, 0, COL_NNUL, NULL, NULL,
(QofAccessFunc)gncBillTermGetInvisible, (QofSetterFunc)set_invisible },
{ "parent", CT_BILLTERMREF, 0, 0, NULL, NULL,
(QofAccessFunc)gncBillTermGetParent, (QofSetterFunc)gncBillTermSetParent },
{ "child", CT_BILLTERMREF, 0, 0, NULL, NULL,
(QofAccessFunc)gncBillTermReturnChild, (QofSetterFunc)gncBillTermSetChild },
{ "type", CT_STRING, MAX_TYPE_LEN, COL_NNUL, NULL, GNC_BILLTERM_TYPE },
{ "duedays", CT_INT, 0, 0, 0, GNC_BILLTERM_DUEDAYS },
{ "discountdays", CT_INT, 0, 0, 0, GNC_BILLTERM_DISCDAYS },
{ "discount", CT_NUMERIC, 0, 0, 0, GNC_BILLTERM_DISCOUNT },
{ "cutoff", CT_INT, 0, 0, 0, GNC_BILLTERM_CUTOFF },
{ NULL }
};
static void
set_invisible( gpointer data, gboolean value )
{
GncBillTerm* term = GNC_BILLTERM(data);
g_return_if_fail( term != NULL );
if( value ) {
gncBillTermMakeInvisible( term );
}
}
static GncBillTerm*
load_single_billterm( GncSqlBackend* be, GncSqlRow* row )
{
const GUID* guid;
GncBillTerm* pBillTerm;
g_return_val_if_fail( be != NULL, NULL );
g_return_val_if_fail( row != NULL, NULL );
guid = gnc_sql_load_guid( be, row );
pBillTerm = gncBillTermLookup( be->primary_book, guid );
if( pBillTerm == NULL ) {
pBillTerm = gncBillTermCreate( be->primary_book );
}
gnc_sql_load_object( be, row, GNC_ID_BILLTERM, pBillTerm, col_table );
qof_instance_mark_clean( QOF_INSTANCE(pBillTerm) );
return pBillTerm;
}
static void
load_all_billterms( GncSqlBackend* be )
{
GncSqlStatement* stmt;
GncSqlResult* result;
QofBook* pBook;
g_return_if_fail( be != NULL );
pBook = be->primary_book;
stmt = gnc_sql_create_select_statement( be, TABLE_NAME );
result = gnc_sql_execute_select_statement( be, stmt );
gnc_sql_statement_dispose( stmt );
if( result != NULL ) {
GncSqlRow* row;
GList* list = NULL;
row = gnc_sql_result_get_first_row( result );
while( row != NULL ) {
GncBillTerm* pBillTerm = load_single_billterm( be, row );
if( pBillTerm != NULL ) {
list = g_list_append( list, pBillTerm );
}
row = gnc_sql_result_get_next_row( result );
}
gnc_sql_result_dispose( result );
if( list != NULL ) {
gnc_sql_slots_load_for_list( be, list );
}
}
}
/* ================================================================= */
static void
do_save_billterm( QofInstance* inst, gpointer p2 )
{
gnc_sql_save_billterm( (GncSqlBackend*)p2, inst );
}
static void
write_billterms( GncSqlBackend* be )
{
g_return_if_fail( be != NULL );
qof_object_foreach( GNC_ID_BILLTERM, be->primary_book, do_save_billterm, (gpointer)be );
}
/* ================================================================= */
static void
create_billterm_tables( GncSqlBackend* be )
{
gint version;
g_return_if_fail( be != NULL );
version = gnc_sql_get_table_version( be, TABLE_NAME );
if( version == 0 ) {
gnc_sql_create_table( be, TABLE_NAME, TABLE_VERSION, col_table );
}
}
/* ================================================================= */
void
gnc_sql_save_billterm( GncSqlBackend* be, QofInstance* inst )
{
g_return_if_fail( inst != NULL );
g_return_if_fail( GNC_IS_BILLTERM(inst) );
g_return_if_fail( be != NULL );
gnc_sql_commit_standard_item( be, inst, TABLE_NAME, GNC_ID_BILLTERM, col_table );
}
/* ================================================================= */
static void
load_billterm_guid( const GncSqlBackend* be, GncSqlRow* row,
QofSetterFunc setter, gpointer pObject,
const GncSqlColumnTableEntry* table_row )
{
const GValue* val;
GUID guid;
const GUID* pGuid;
GncBillTerm* term = NULL;
g_return_if_fail( be != NULL );
g_return_if_fail( row != NULL );
g_return_if_fail( pObject != NULL );
g_return_if_fail( table_row != NULL );
val = gnc_sql_row_get_value_at_col_name( row, table_row->col_name );
if( val == NULL || !G_VALUE_HOLDS_STRING( val ) || g_value_get_string( val ) == NULL ) {
pGuid = NULL;
} else {
string_to_guid( g_value_get_string( val ), &guid );
pGuid = &guid;
}
if( pGuid != NULL ) {
term = gncBillTermLookup( be->primary_book, pGuid );
}
if( table_row->gobj_param_name != NULL ) {
g_object_set( pObject, table_row->gobj_param_name, term, NULL );
} else {
(*setter)( pObject, (const gpointer)term );
}
}
static col_type_handler_t billterm_guid_handler
= { load_billterm_guid,
gnc_sql_add_objectref_guid_col_info_to_list,
gnc_sql_add_colname_to_list,
gnc_sql_add_gvalue_objectref_guid_to_slist };
/* ================================================================= */
void
gnc_billterm_sql_initialize( void )
{
static GncSqlObjectBackend be_data =
{
GNC_SQL_BACKEND_VERSION,
GNC_ID_BILLTERM,
gnc_sql_save_billterm, /* commit */
load_all_billterms, /* initial_load */
create_billterm_tables, /* create_tables */
NULL, NULL, NULL,
write_billterms /* write */
};
qof_object_register_backend( GNC_ID_BILLTERM, GNC_SQL_BACKEND, &be_data );
gnc_sql_register_col_type_handler( CT_BILLTERMREF, &billterm_guid_handler );
}
/* ========================== END OF FILE ===================== */

View File

@ -0,0 +1,40 @@
/*
* gnc-bill-term-sql.h -- billing term sql backend
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, contact:
*
* Free Software Foundation Voice: +1-617-542-5942
* 51 Franklin Street, Fifth Floor Fax: +1-617-542-2652
* Boston, MA 02110-1301, USA gnu@gnu.org
*/
/** @file gnc-bill-term-sql.h
* @brief load and save accounts data to SQL
* @author Copyright (c) 2006-2008 Phil Longstaff <plongstaff@rogers.com>
*
* This file implements the top-level QofBackend API for saving/
* restoring data to/from an SQL database
*/
#ifndef GNC_BILLTERM_SQL_H
#define GNC_BILLTERM_SQL_H
#include "gncBillTerm.h"
#define CT_BILLTERMREF "billterm"
void gnc_billterm_sql_initialize( void );
void gnc_sql_save_billterm( GncSqlBackend* be, QofInstance* inst );
#endif /* GNC_BILLTERM_SQL_H */

View File

@ -0,0 +1,216 @@
/********************************************************************\
* gnc-customer-sql.c -- customer sql backend *
* *
* This program is free software; you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation; either version 2 of *
* the License, or (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License*
* along with this program; if not, contact: *
* *
* Free Software Foundation Voice: +1-617-542-5942 *
* 51 Franklin Street, Fifth Floor Fax: +1-617-542-2652 *
* Boston, MA 02110-1301, USA gnu@gnu.org *
* *
\********************************************************************/
/** @file gnc-customer-sql.c
* @brief load and save address data to SQL
* @author Copyright (c) 2007-2008 Phil Longstaff <plongstaff@rogers.com>
*
* This file implements the top-level QofBackend API for saving/
* restoring data to/from an SQL database
*/
#include "config.h"
#include <glib.h>
#include <stdlib.h>
#include <string.h>
#include "gnc-backend-sql.h"
#include "gnc-slots-sql.h"
#include "gncBillTermP.h"
#include "gncCustomerP.h"
#include "gncTaxTableP.h"
#include "gnc-customer-sql.h"
#include "gnc-address-sql.h"
#include "gnc-bill-term-sql.h"
#include "gnc-tax-table-sql.h"
#define _GNC_MOD_NAME GNC_ID_CUSTOMER
static QofLogModule log_module = G_LOG_DOMAIN;
#define TABLE_NAME "customers"
#define TABLE_VERSION 1
#define MAX_NAME_LEN 2048
#define MAX_ID_LEN 2048
#define MAX_NOTES_LEN 2048
static GncSqlColumnTableEntry col_table[] =
{
{ "guid", CT_GUID, 0, COL_NNUL|COL_PKEY, "guid" },
{ "name", CT_STRING, MAX_NAME_LEN, COL_NNUL, NULL, CUSTOMER_NAME },
{ "id", CT_STRING, MAX_ID_LEN, COL_NNUL, NULL, CUSTOMER_ID },
{ "notes", CT_STRING, MAX_NOTES_LEN, COL_NNUL, NULL, CUSTOMER_NOTES },
{ "active", CT_BOOLEAN, 0, COL_NNUL, NULL, QOF_PARAM_ACTIVE },
{ "discount", CT_NUMERIC, 0, COL_NNUL, NULL, CUSTOMER_DISCOUNT },
{ "credit", CT_NUMERIC, 0, COL_NNUL, NULL, CUSTOMER_CREDIT },
{ "currency", CT_COMMODITYREF, 0, COL_NNUL, NULL, NULL,
(QofAccessFunc)gncCustomerGetCurrency, (QofSetterFunc)gncCustomerSetCurrency },
{ "tax_override", CT_BOOLEAN, 0, COL_NNUL, NULL, CUSTOMER_TT_OVER },
{ "addr", CT_ADDRESS, 0, 0, NULL, CUSTOMER_ADDR },
{ "shipaddr", CT_ADDRESS, 0, 0, NULL, CUSTOMER_SHIPADDR },
{ "terms", CT_BILLTERMREF, 0, 0, NULL, CUSTOMER_TERMS },
{ "tax_included", CT_INT, 0, 0, NULL, NULL,
(QofAccessFunc)gncCustomerGetTaxIncluded, (QofSetterFunc)gncCustomerSetTaxIncluded },
{ "taxtable", CT_TAXTABLEREF, 0, 0, NULL, NULL,
(QofAccessFunc)gncCustomerGetTaxTable, (QofSetterFunc)gncCustomerSetTaxTable },
{ NULL }
};
static GncCustomer*
load_single_customer( GncSqlBackend* be, GncSqlRow* row )
{
const GUID* guid;
GncCustomer* pCustomer;
g_return_val_if_fail( be != NULL, NULL );
g_return_val_if_fail( row != NULL, NULL );
guid = gnc_sql_load_guid( be, row );
pCustomer = gncCustomerLookup( be->primary_book, guid );
if( pCustomer == NULL ) {
pCustomer = gncCustomerCreate( be->primary_book );
}
gnc_sql_load_object( be, row, GNC_ID_CUSTOMER, pCustomer, col_table );
qof_instance_mark_clean( QOF_INSTANCE(pCustomer) );
return pCustomer;
}
static void
load_all_customers( GncSqlBackend* be )
{
GncSqlStatement* stmt;
GncSqlResult* result;
QofBook* pBook;
g_return_if_fail( be != NULL );
pBook = be->primary_book;
stmt = gnc_sql_create_select_statement( be, TABLE_NAME );
result = gnc_sql_execute_select_statement( be, stmt );
gnc_sql_statement_dispose( stmt );
if( result != NULL ) {
GList* list = NULL;
GncSqlRow* row;
row = gnc_sql_result_get_first_row( result );
while( row != NULL ) {
GncCustomer* pCustomer = load_single_customer( be, row );
if( pCustomer != NULL ) {
list = g_list_append( list, pCustomer );
}
row = gnc_sql_result_get_next_row( result );
}
gnc_sql_result_dispose( result );
if( list != NULL ) {
gnc_sql_slots_load_for_list( be, list );
}
}
}
/* ================================================================= */
static void
create_customer_tables( GncSqlBackend* be )
{
gint version;
g_return_if_fail( be != NULL );
version = gnc_sql_get_table_version( be, TABLE_NAME );
if( version == 0 ) {
gnc_sql_create_table( be, TABLE_NAME, TABLE_VERSION, col_table );
}
}
/* ================================================================= */
static void
save_customer( GncSqlBackend* be, QofInstance* inst )
{
g_return_if_fail( inst != NULL );
g_return_if_fail( GNC_CUSTOMER(inst) );
g_return_if_fail( be != NULL );
gnc_sql_commit_standard_item( be, inst, TABLE_NAME, GNC_ID_CUSTOMER, col_table );
}
/* ================================================================= */
static gboolean
customer_should_be_saved( GncCustomer *customer )
{
const char *id;
g_return_val_if_fail( customer != NULL, FALSE );
/* Make sure this is a valid customer before we save it -- should have an ID */
id = gncCustomerGetID( customer );
if( id == NULL || *id == '\0' ) {
return FALSE;
}
return TRUE;
}
static void
write_single_customer( QofInstance *term_p, gpointer be_p )
{
GncSqlBackend* be = (GncSqlBackend*)be_p;
g_return_if_fail( term_p != NULL );
g_return_if_fail( GNC_IS_CUSTOMER(term_p) );
g_return_if_fail( be_p != NULL );
if( customer_should_be_saved( GNC_CUSTOMER(term_p) ) ) {
save_customer( be, term_p );
}
}
static void
write_customers( GncSqlBackend* be )
{
g_return_if_fail( be != NULL );
qof_object_foreach( GNC_ID_CUSTOMER, be->primary_book, write_single_customer, (gpointer)be );
}
/* ================================================================= */
void
gnc_customer_sql_initialize( void )
{
static GncSqlObjectBackend be_data =
{
GNC_SQL_BACKEND_VERSION,
GNC_ID_CUSTOMER,
save_customer, /* commit */
load_all_customers, /* initial_load */
create_customer_tables, /* create_tables */
NULL, NULL, NULL,
write_customers /* write */
};
qof_object_register_backend( GNC_ID_CUSTOMER, GNC_SQL_BACKEND, &be_data );
}
/* ========================== END OF FILE ===================== */

View File

@ -0,0 +1,35 @@
/*
* gnc-customer-sql.h -- customer sql backend
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, contact:
*
* Free Software Foundation Voice: +1-617-542-5942
* 51 Franklin Street, Fifth Floor Fax: +1-617-542-2652
* Boston, MA 02110-1301, USA gnu@gnu.org
*/
/** @file gnc-customer-sql.h
* @brief load and save customer data to SQL
* @author Copyright (c) 2007-2008 Phil Longstaff <plongstaff@rogers.com>
*
* This file implements the top-level QofBackend API for saving/
* restoring data to/from an SQL database
*/
#ifndef GNC_CUSTOMER_SQL_H
#define GNC_CUSTOMER_SQL_H
void gnc_customer_sql_initialize( void );
#endif /* GNC_CUSTOMER_SQL_H */

View File

@ -0,0 +1,240 @@
/********************************************************************\
* gnc-employee-sql.c -- employee sql implementation *
* *
* This program is free software; you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation; either version 2 of *
* the License, or (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License*
* along with this program; if not, contact: *
* *
* Free Software Foundation Voice: +1-617-542-5942 *
* 51 Franklin Street, Fifth Floor Fax: +1-617-542-2652 *
* Boston, MA 02110-1301, USA gnu@gnu.org *
* *
\********************************************************************/
/** @file gnc-employee-sql.c
* @brief load and save address data to SQL
* @author Copyright (c) 2007-2008 Phil Longstaff <plongstaff@rogers.com>
*
* This file implements the top-level QofBackend API for saving/
* restoring data to/from an SQL database
*/
#include "config.h"
#include <glib.h>
#include <stdlib.h>
#include <string.h>
#include "gnc-commodity.h"
#include "gnc-backend-sql.h"
#include "gnc-slots-sql.h"
#include "gnc-commodity-sql.h"
#include "gncEmployeeP.h"
#include "gnc-employee-sql.h"
#include "gnc-address-sql.h"
#define _GNC_MOD_NAME GNC_ID_EMPLOYEE
static QofLogModule log_module = G_LOG_DOMAIN;
#define MAX_USERNAME_LEN 2048
#define MAX_ID_LEN 2048
#define MAX_LANGUAGE_LEN 2048
#define MAX_ACL_LEN 2048
#define TABLE_NAME "employees"
#define TABLE_VERSION 1
static GncSqlColumnTableEntry col_table[] =
{
{ "guid", CT_GUID, 0, COL_NNUL|COL_PKEY, "guid" },
{ "username", CT_STRING, MAX_USERNAME_LEN, COL_NNUL, NULL, EMPLOYEE_USERNAME },
{ "id", CT_STRING, MAX_ID_LEN, COL_NNUL, NULL, EMPLOYEE_ID },
{ "language", CT_STRING, MAX_LANGUAGE_LEN, COL_NNUL, NULL, EMPLOYEE_LANGUAGE },
{ "acl", CT_STRING, MAX_ACL_LEN, COL_NNUL, NULL, EMPLOYEE_ACL },
{ "active", CT_BOOLEAN, 0, COL_NNUL, NULL, QOF_PARAM_ACTIVE },
{ "currency", CT_COMMODITYREF, 0, COL_NNUL, NULL, NULL,
(QofAccessFunc)gncEmployeeGetCurrency, (QofSetterFunc)gncEmployeeSetCurrency },
{ "ccard_guid", CT_ACCOUNTREF, 0, 0, NULL, EMPLOYEE_CC },
{ "workday", CT_NUMERIC, 0, COL_NNUL, NULL, EMPLOYEE_WORKDAY },
{ "rate", CT_NUMERIC, 0, COL_NNUL, NULL, EMPLOYEE_RATE },
{ "addr", CT_ADDRESS, 0, 0, NULL, EMPLOYEE_ADDR },
{ NULL }
};
static GncEmployee*
load_single_employee( GncSqlBackend* be, GncSqlRow* row )
{
const GUID* guid;
GncEmployee* pEmployee;
g_return_val_if_fail( be != NULL, NULL );
g_return_val_if_fail( row != NULL, NULL );
guid = gnc_sql_load_guid( be, row );
pEmployee = gncEmployeeLookup( be->primary_book, guid );
if( pEmployee == NULL ) {
pEmployee = gncEmployeeCreate( be->primary_book );
}
gnc_sql_load_object( be, row, GNC_ID_EMPLOYEE, pEmployee, col_table );
qof_instance_mark_clean( QOF_INSTANCE(pEmployee) );
return pEmployee;
}
static void
load_all_employees( GncSqlBackend* be )
{
GncSqlStatement* stmt;
GncSqlResult* result;
QofBook* pBook;
gnc_commodity_table* pTable;
g_return_if_fail( be != NULL );
pBook = be->primary_book;
pTable = gnc_commodity_table_get_table( pBook );
stmt = gnc_sql_create_select_statement( be, TABLE_NAME );
result = gnc_sql_execute_select_statement( be, stmt );
gnc_sql_statement_dispose( stmt );
if( result != NULL ) {
GncSqlRow* row;
GList* list = NULL;
row = gnc_sql_result_get_first_row( result );
while( row != NULL ) {
GncEmployee* pEmployee = load_single_employee( be, row );
if( pEmployee != NULL ) {
list = g_list_append( list, pEmployee );
}
row = gnc_sql_result_get_next_row( result );
}
gnc_sql_result_dispose( result );
if( list != NULL ) {
gnc_sql_slots_load_for_list( be, list );
}
}
}
/* ================================================================= */
static void
create_employee_tables( GncSqlBackend* be )
{
gint version;
g_return_if_fail( be != NULL );
version = gnc_sql_get_table_version( be, TABLE_NAME );
if( version == 0 ) {
gnc_sql_create_table( be, TABLE_NAME, TABLE_VERSION, col_table );
}
}
/* ================================================================= */
static void
save_employee( GncSqlBackend* be, QofInstance* inst )
{
GncEmployee* emp;
const GUID* guid;
gint op;
gboolean is_infant;
g_return_if_fail( inst != NULL );
g_return_if_fail( GNC_IS_EMPLOYEE(inst) );
g_return_if_fail( be != NULL );
emp = GNC_EMPLOYEE(inst);
is_infant = qof_instance_get_infant( inst );
if( qof_instance_get_destroying( inst ) ) {
op = OP_DB_DELETE;
} else if( be->is_pristine_db || is_infant ) {
op = OP_DB_INSERT;
} else {
op = OP_DB_UPDATE;
}
if( op != OP_DB_DELETE ) {
// Ensure the commodity is in the db
gnc_sql_save_commodity( be, gncEmployeeGetCurrency( emp ) );
}
(void)gnc_sql_do_db_operation( be, op, TABLE_NAME, GNC_ID_EMPLOYEE, emp, col_table );
// Now, commit or delete any slots
guid = qof_instance_get_guid( inst );
if( !qof_instance_get_destroying(inst) ) {
gnc_sql_slots_save( be, guid, is_infant, qof_instance_get_slots( inst ) );
} else {
gnc_sql_slots_delete( be, guid );
}
}
/* ================================================================= */
static gboolean
employee_should_be_saved( GncEmployee *employee )
{
const char *id;
g_return_val_if_fail( employee != NULL, FALSE );
/* make sure this is a valid employee before we save it -- should have an ID */
id = gncEmployeeGetID( employee );
if( id == NULL || *id == '\0' ) {
return FALSE;
}
return TRUE;
}
static void
write_single_employee( QofInstance *term_p, gpointer be_p )
{
GncSqlBackend* be = (GncSqlBackend*)be_p;
g_return_if_fail( term_p != NULL );
g_return_if_fail( GNC_IS_EMPLOYEE(term_p) );
g_return_if_fail( be_p != NULL );
if( employee_should_be_saved( GNC_EMPLOYEE(term_p) ) ) {
save_employee( be, term_p );
}
}
static void
write_employees( GncSqlBackend* be )
{
g_return_if_fail( be != NULL );
qof_object_foreach( GNC_ID_EMPLOYEE, be->primary_book, write_single_employee, (gpointer)be );
}
/* ================================================================= */
void
gnc_employee_sql_initialize( void )
{
static GncSqlObjectBackend be_data =
{
GNC_SQL_BACKEND_VERSION,
GNC_ID_EMPLOYEE,
save_employee, /* commit */
load_all_employees, /* initial_load */
create_employee_tables, /* create_tables */
NULL, NULL, NULL,
write_employees /* write */
};
qof_object_register_backend( GNC_ID_EMPLOYEE, GNC_SQL_BACKEND, &be_data );
}
/* ========================== END OF FILE ===================== */

View File

@ -0,0 +1,35 @@
/*
* gnc-employee-sql.h -- employee sql backend
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, contact:
*
* Free Software Foundation Voice: +1-617-542-5942
* 51 Franklin Street, Fifth Floor Fax: +1-617-542-2652
* Boston, MA 02110-1301, USA gnu@gnu.org
*/
/** @file gnc-employee-sql.h
* @brief load and save employee data to SQL
* @author Copyright (c) 2007-2008 Phil Longstaff <plongstaff@rogers.com>
*
* This file implements the top-level QofBackend API for saving/
* restoring data to/from an SQL database
*/
#ifndef GNC_EMPLOYEE_SQL_H
#define GNC_EMPLOYEE_SQL_H
void gnc_employee_sql_initialize( void );
#endif /* GNC_EMPLOYEE_SQL_H */

View File

@ -0,0 +1,223 @@
/********************************************************************\
* gnc-entry-sql.c -- entry sql backend *
* *
* This program is free software; you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation; either version 2 of *
* the License, or (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License*
* along with this program; if not, contact: *
* *
* Free Software Foundation Voice: +1-617-542-5942 *
* 51 Franklin Street, Fifth Floor Fax: +1-617-542-2652 *
* Boston, MA 02110-1301, USA gnu@gnu.org *
* *
\********************************************************************/
/** @file gnc-entry-sql.c
* @brief load and save address data to SQL
* @author Copyright (c) 2007-2008 Phil Longstaff <plongstaff@rogers.com>
*
* This file implements the top-level QofBackend API for saving/
* restoring data to/from an SQL database
*/
#include "config.h"
#include <glib.h>
#include <stdlib.h>
#include <string.h>
#include "gnc-backend-sql.h"
#include "gnc-slots-sql.h"
#include "gncEntryP.h"
#include "gncOrderP.h"
#include "gncInvoiceP.h"
#include "gncTaxTableP.h"
#include "gnc-bill-term-sql.h"
#include "gnc-entry-sql.h"
#include "gnc-invoice-sql.h"
#include "gnc-order-sql.h"
#include "gnc-owner-sql.h"
#include "gnc-tax-table-sql.h"
#define _GNC_MOD_NAME GNC_ID_ENTRY
static QofLogModule log_module = G_LOG_DOMAIN;
#define TABLE_NAME "entries"
#define TABLE_VERSION 1
#define MAX_DESCRIPTION_LEN 2048
#define MAX_ACTION_LEN 2048
#define MAX_NOTES_LEN 2048
#define MAX_DISCTYPE_LEN 2048
#define MAX_DISCHOW_LEN 2048
static GncSqlColumnTableEntry col_table[] =
{
{ "guid", CT_GUID, 0, COL_NNUL|COL_PKEY, "guid" },
{ "date", CT_TIMESPEC, 0, COL_NNUL, NULL, ENTRY_DATE },
{ "entered", CT_TIMESPEC, 0, COL_NNUL, NULL, ENTRY_DATE_ENTERED },
{ "description", CT_STRING, MAX_DESCRIPTION_LEN, 0, NULL, ENTRY_DESC },
{ "action", CT_STRING, MAX_ACTION_LEN, 0, NULL, ENTRY_ACTION },
{ "notes", CT_STRING, MAX_NOTES_LEN, 0, NULL, ENTRY_NOTES },
{ "quantity", CT_NUMERIC, 0, 0, NULL, ENTRY_QTY },
{ "i_acct", CT_ACCOUNTREF, 0, 0, NULL, ENTRY_IACCT },
{ "i_price", CT_NUMERIC, 0, 0, NULL, ENTRY_IPRICE },
{ "i_discount", CT_NUMERIC, 0, 0, NULL, NULL,
(QofAccessFunc)gncEntryGetInvDiscount, (QofSetterFunc)gncEntrySetInvDiscount },
{ "invoice", CT_INVOICEREF, 0, 0, NULL, NULL,
(QofAccessFunc)gncEntryGetInvoice, (QofSetterFunc)gncEntrySetInvoice },
{ "i_disc_type", CT_STRING, MAX_DISCTYPE_LEN, 0, NULL, ENTRY_INV_DISC_TYPE },
{ "i_disc_how", CT_STRING, MAX_DISCHOW_LEN, 0, NULL, ENTRY_INV_DISC_HOW },
{ "i_taxable", CT_BOOLEAN, 0, 0, NULL, ENTRY_INV_TAXABLE },
{ "i_taxincluded", CT_BOOLEAN, 0, 0, NULL, ENTRY_INV_TAX_INC },
{ "i_taxtable", CT_TAXTABLEREF, 0, 0, NULL, NULL,
(QofAccessFunc)gncEntryGetInvTaxTable, (QofSetterFunc)gncEntrySetInvTaxTable },
{ "b_acct", CT_ACCOUNTREF, 0, 0, NULL, ENTRY_BACCT },
{ "b_price", CT_NUMERIC, 0, 0, NULL, ENTRY_BPRICE },
{ "bill", CT_INVOICEREF, 0, 0, NULL, NULL,
(QofAccessFunc)gncEntryGetBill, (QofSetterFunc)gncEntrySetBill },
{ "b_taxable", CT_BOOLEAN, 0, 0, NULL, ENTRY_BILL_TAXABLE },
{ "b_taxincluded", CT_BOOLEAN, 0, 0, NULL, ENTRY_BILL_TAX_INC },
{ "b_taxtable", CT_TAXTABLEREF, 0, 0, NULL, NULL,
(QofAccessFunc)gncEntryGetBillTaxTable, (QofSetterFunc)gncEntrySetBillTaxTable },
{ "b_paytype", CT_INT, 0, 0, NULL, NULL,
(QofAccessFunc)gncEntryGetBillPayment, (QofSetterFunc)gncEntrySetBillPayment },
{ "billable", CT_BOOLEAN, 0, 0, NULL, ENTRY_BILLABLE },
{ "billto", CT_OWNERREF, 0, 0, NULL, ENTRY_BILLTO },
{ "order_guid", CT_ORDERREF, 0, 0, NULL, NULL,
(QofAccessFunc)gncEntryGetOrder, (QofSetterFunc)gncEntrySetOrder },
{ NULL }
};
static GncEntry*
load_single_entry( GncSqlBackend* be, GncSqlRow* row )
{
const GUID* guid;
GncEntry* pEntry;
g_return_val_if_fail( be != NULL, NULL );
g_return_val_if_fail( row != NULL, NULL );
guid = gnc_sql_load_guid( be, row );
pEntry = gncEntryLookup( be->primary_book, guid );
if( pEntry == NULL ) {
pEntry = gncEntryCreate( be->primary_book );
}
gnc_sql_load_object( be, row, GNC_ID_ENTRY, pEntry, col_table );
qof_instance_mark_clean( QOF_INSTANCE(pEntry) );
return pEntry;
}
static void
load_all_entries( GncSqlBackend* be )
{
GncSqlStatement* stmt;
GncSqlResult* result;
QofBook* pBook;
g_return_if_fail( be != NULL );
pBook = be->primary_book;
stmt = gnc_sql_create_select_statement( be, TABLE_NAME );
result = gnc_sql_execute_select_statement( be, stmt );
gnc_sql_statement_dispose( stmt );
if( result != NULL ) {
GncSqlRow* row;
GList* list = NULL;
row = gnc_sql_result_get_first_row( result );
while( row != NULL ) {
GncEntry* pEntry = load_single_entry( be, row );
if( pEntry != NULL ) {
list = g_list_append( list, pEntry );
}
row = gnc_sql_result_get_next_row( result );
}
gnc_sql_result_dispose( result );
if( list != NULL ) {
gnc_sql_slots_load_for_list( be, list );
}
}
}
/* ================================================================= */
static void
create_entry_tables( GncSqlBackend* be )
{
gint version;
g_return_if_fail( be != NULL );
version = gnc_sql_get_table_version( be, TABLE_NAME );
if( version == 0 ) {
gnc_sql_create_table( be, TABLE_NAME, TABLE_VERSION, col_table );
}
}
/* ================================================================= */
static void
save_entry( GncSqlBackend* be, QofInstance* inst )
{
g_return_if_fail( inst != NULL );
g_return_if_fail( GNC_IS_ENTRY(inst) );
g_return_if_fail( be != NULL );
gnc_sql_commit_standard_item( be, inst, TABLE_NAME, GNC_ID_ENTRY, col_table );
}
/* ================================================================= */
static void
write_single_entry( QofInstance *term_p, gpointer be_p )
{
GncSqlBackend* be = (GncSqlBackend*)be_p;
GncEntry* entry = GNC_ENTRY(term_p);
g_return_if_fail( term_p != NULL );
g_return_if_fail( GNC_IS_ENTRY(term_p) );
g_return_if_fail( be_p != NULL );
/* Only save if attached */
if( gncEntryGetOrder( entry ) != NULL || gncEntryGetInvoice( entry ) != NULL ||
gncEntryGetBill( entry ) != NULL ) {
save_entry( be, term_p );
}
}
static void
write_entries( GncSqlBackend* be )
{
g_return_if_fail( be != NULL );
qof_object_foreach( GNC_ID_ENTRY, be->primary_book, write_single_entry, (gpointer)be );
}
/* ================================================================= */
void
gnc_entry_sql_initialize( void )
{
static GncSqlObjectBackend be_data =
{
GNC_SQL_BACKEND_VERSION,
GNC_ID_ENTRY,
save_entry, /* commit */
load_all_entries, /* initial_load */
create_entry_tables, /* create_tables */
NULL, NULL, NULL,
write_entries /* write */
};
qof_object_register_backend( GNC_ID_ENTRY, GNC_SQL_BACKEND, &be_data );
}
/* ========================== END OF FILE ===================== */

View File

@ -0,0 +1,35 @@
/*
* gnc-entry-sql.h -- entry sql backend
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, contact:
*
* Free Software Foundation Voice: +1-617-542-5942
* 51 Franklin Street, Fifth Floor Fax: +1-617-542-2652
* Boston, MA 02110-1301, USA gnu@gnu.org
*/
/** @file gnc-entry-sql.h
* @brief load and save entry data to SQL
* @author Copyright (c) 2007-2008 Phil Longstaff <plongstaff@rogers.com>
*
* This file implements the top-level QofBackend API for saving/
* restoring data to/from an SQL database
*/
#ifndef GNC_ENTRY_SQL_H
#define GNC_ENTRY_SQL_H
void gnc_entry_sql_initialize( void );
#endif /* GNC_ENTRY_SQL_H */

View File

@ -0,0 +1,288 @@
/********************************************************************\
* gnc-invoice-sql.c - invoice sql backend *
* *
* This program is free software; you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation; either version 2 of *
* the License, or (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License*
* along with this program; if not, contact: *
* *
* Free Software Foundation Voice: +1-617-542-5942 *
* 51 Franklin Street, Fifth Floor Fax: +1-617-542-2652 *
* Boston, MA 02110-1301, USA gnu@gnu.org *
* *
\********************************************************************/
/** @file gnc-invoice-sql.c
* @brief load and save address data to SQL
* @author Copyright (c) 2007-2008 Phil Longstaff <plongstaff@rogers.com>
*
* This file implements the top-level QofBackend API for saving/
* restoring data to/from an SQL database
*/
#include "config.h"
#include <glib.h>
#include <stdlib.h>
#include <string.h>
#include "gnc-commodity.h"
#include "gnc-backend-sql.h"
#include "gnc-commodity-sql.h"
#include "gnc-slots-sql.h"
#include "gncBillTermP.h"
#include "gncInvoiceP.h"
#include "gnc-invoice-sql.h"
#include "gnc-owner-sql.h"
#include "gnc-bill-term-sql.h"
#define _GNC_MOD_NAME GNC_ID_INVOICE
static QofLogModule log_module = G_LOG_DOMAIN;
#define TABLE_NAME "invoices"
#define TABLE_VERSION 1
#define MAX_ID_LEN 2048
#define MAX_NOTES_LEN 2048
#define MAX_BILLING_ID_LEN 2048
static GncSqlColumnTableEntry col_table[] =
{
{ "guid", CT_GUID, 0, COL_NNUL|COL_PKEY, "guid" },
{ "id", CT_STRING, MAX_ID_LEN, COL_NNUL, NULL, INVOICE_ID },
{ "date_opened", CT_TIMESPEC, 0, COL_NNUL, NULL, INVOICE_OPENED },
{ "date_posted", CT_TIMESPEC, 0, 0, NULL, INVOICE_POSTED },
{ "notes", CT_STRING, MAX_NOTES_LEN, COL_NNUL, NULL, INVOICE_NOTES },
{ "active", CT_BOOLEAN, 0, COL_NNUL, NULL, QOF_PARAM_ACTIVE },
{ "currency", CT_COMMODITYREF, 0, COL_NNUL, NULL, NULL,
(QofAccessFunc)gncInvoiceGetCurrency, (QofSetterFunc)gncInvoiceSetCurrency },
{ "owner", CT_OWNERREF, 0, 0, NULL, NULL,
(QofAccessFunc)gncInvoiceGetOwner, (QofSetterFunc)gncInvoiceSetOwner },
{ "terms", CT_BILLTERMREF, 0, 0, NULL, INVOICE_TERMS },
{ "billing_id", CT_STRING, MAX_BILLING_ID_LEN, 0, NULL, INVOICE_BILLINGID },
{ "post_txn", CT_TXREF, 0, 0, NULL, INVOICE_POST_TXN },
{ "post_lot", CT_LOTREF, 0, 0, NULL, NULL,
(QofAccessFunc)gncInvoiceGetPostedLot, (QofSetterFunc)gncInvoiceSetPostedLot },
{ "post_acc", CT_ACCOUNTREF, 0, 0, NULL, INVOICE_ACC },
{ "billto", CT_OWNERREF, 0, 0, NULL, NULL,
(QofAccessFunc)gncInvoiceGetBillTo, (QofSetterFunc)gncInvoiceSetBillTo },
{ "charge_amt", CT_NUMERIC, 0, 0, NULL, NULL,
(QofAccessFunc)gncInvoiceGetToChargeAmount, (QofSetterFunc)gncInvoiceSetToChargeAmount },
{ NULL }
};
static GncInvoice*
load_single_invoice( GncSqlBackend* be, GncSqlRow* row )
{
const GUID* guid;
GncInvoice* pInvoice;
g_return_val_if_fail( be != NULL, NULL );
g_return_val_if_fail( row != NULL, NULL );
guid = gnc_sql_load_guid( be, row );
pInvoice = gncInvoiceLookup( be->primary_book, guid );
if( pInvoice == NULL ) {
pInvoice = gncInvoiceCreate( be->primary_book );
}
gnc_sql_load_object( be, row, GNC_ID_INVOICE, pInvoice, col_table );
qof_instance_mark_clean( QOF_INSTANCE(pInvoice) );
return pInvoice;
}
static void
load_all_invoices( GncSqlBackend* be )
{
GncSqlStatement* stmt;
GncSqlResult* result;
QofBook* pBook;
g_return_if_fail( be != NULL );
pBook = be->primary_book;
stmt = gnc_sql_create_select_statement( be, TABLE_NAME );
result = gnc_sql_execute_select_statement( be, stmt );
gnc_sql_statement_dispose( stmt );
if( result != NULL ) {
GncSqlRow* row;
GList* list = NULL;
row = gnc_sql_result_get_first_row( result );
while( row != NULL ) {
GncInvoice* pInvoice = load_single_invoice( be, row );
if( pInvoice != NULL ) {
list = g_list_append( list, pInvoice );
}
row = gnc_sql_result_get_next_row( result );
}
gnc_sql_result_dispose( result );
if( list != NULL ) {
gnc_sql_slots_load_for_list( be, list );
}
}
}
/* ================================================================= */
static void
create_invoice_tables( GncSqlBackend* be )
{
gint version;
g_return_if_fail( be != NULL );
version = gnc_sql_get_table_version( be, TABLE_NAME );
if( version == 0 ) {
gnc_sql_create_table( be, TABLE_NAME, TABLE_VERSION, col_table );
}
}
/* ================================================================= */
static void
save_invoice( GncSqlBackend* be, QofInstance* inst )
{
const GUID* guid;
GncInvoice* invoice;
gint op;
gboolean is_infant;
g_return_if_fail( inst != NULL );
g_return_if_fail( GNC_IS_INVOICE(inst) );
g_return_if_fail( be != NULL );
invoice = GNC_INVOICE(inst);
is_infant = qof_instance_get_infant( inst );
if( qof_instance_get_destroying( inst ) ) {
op = OP_DB_DELETE;
} else if( be->is_pristine_db || is_infant ) {
op = OP_DB_INSERT;
} else {
op = OP_DB_UPDATE;
}
if( op != OP_DB_DELETE ) {
// Ensure the commodity is in the db
gnc_sql_save_commodity( be, gncInvoiceGetCurrency( invoice ) );
}
(void)gnc_sql_do_db_operation( be, op, TABLE_NAME, GNC_ID_INVOICE, inst, col_table );
// Now, commit or delete any slots
guid = qof_instance_get_guid( inst );
if( !qof_instance_get_destroying(inst) ) {
gnc_sql_slots_save( be, guid, is_infant, qof_instance_get_slots( inst ) );
} else {
gnc_sql_slots_delete( be, guid );
}
}
/* ================================================================= */
static gboolean
invoice_should_be_saved( GncInvoice *invoice )
{
const char *id;
g_return_val_if_fail( invoice != NULL, FALSE );
/* make sure this is a valid invoice before we save it -- should have an ID */
id = gncInvoiceGetID( invoice );
if( id == NULL || *id == '\0' ) {
return FALSE;
}
return TRUE;
}
static void
write_single_invoice( QofInstance *term_p, gpointer be_p )
{
GncSqlBackend* be = (GncSqlBackend*)be_p;
g_return_if_fail( term_p != NULL );
g_return_if_fail( GNC_IS_INVOICE(term_p) );
g_return_if_fail( be_p != NULL );
if( invoice_should_be_saved( GNC_INVOICE(term_p) ) ) {
save_invoice( be, term_p );
}
}
static void
write_invoices( GncSqlBackend* be )
{
g_return_if_fail( be != NULL );
qof_object_foreach( GNC_ID_INVOICE, be->primary_book, write_single_invoice, (gpointer)be );
}
/* ================================================================= */
static void
load_invoice_guid( const GncSqlBackend* be, GncSqlRow* row,
QofSetterFunc setter, gpointer pObject,
const GncSqlColumnTableEntry* table_row )
{
const GValue* val;
GUID guid;
const GUID* pGuid;
GncInvoice* invoice = NULL;
g_return_if_fail( be != NULL );
g_return_if_fail( row != NULL );
g_return_if_fail( pObject != NULL );
g_return_if_fail( table_row != NULL );
val = gnc_sql_row_get_value_at_col_name( row, table_row->col_name );
if( val == NULL || !G_VALUE_HOLDS_STRING( val ) || g_value_get_string( val ) == NULL ) {
pGuid = NULL;
} else {
string_to_guid( g_value_get_string( val ), &guid );
pGuid = &guid;
}
if( pGuid != NULL ) {
invoice = gncInvoiceLookup( be->primary_book, pGuid );
}
if( table_row->gobj_param_name != NULL ) {
g_object_set( pObject, table_row->gobj_param_name, invoice, NULL );
} else {
(*setter)( pObject, (const gpointer)invoice );
}
}
static col_type_handler_t invoice_guid_handler
= { load_invoice_guid,
gnc_sql_add_objectref_guid_col_info_to_list,
gnc_sql_add_colname_to_list,
gnc_sql_add_gvalue_objectref_guid_to_slist };
/* ================================================================= */
void
gnc_invoice_sql_initialize( void )
{
static GncSqlObjectBackend be_data =
{
GNC_SQL_BACKEND_VERSION,
GNC_ID_INVOICE,
save_invoice, /* commit */
load_all_invoices, /* initial_load */
create_invoice_tables, /* create_tables */
NULL, NULL, NULL,
write_invoices /* write */
};
qof_object_register_backend( GNC_ID_INVOICE, GNC_SQL_BACKEND, &be_data );
gnc_sql_register_col_type_handler( CT_INVOICEREF, &invoice_guid_handler );
}
/* ========================== END OF FILE ===================== */

View File

@ -0,0 +1,37 @@
/*
* gnc-invoice-sql.h -- invoice sql backend
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, contact:
*
* Free Software Foundation Voice: +1-617-542-5942
* 51 Franklin Street, Fifth Floor Fax: +1-617-542-2652
* Boston, MA 02110-1301, USA gnu@gnu.org
*/
/** @file gnc-invoice-sql.h
* @brief load and save invoice data to SQL
* @author Copyright (c) 2007-2008 Phil Longstaff <plongstaff@rogers.com>
*
* This file implements the top-level QofBackend API for saving/
* restoring data to/from an SQL database
*/
#ifndef GNC_INVOICE_SQL_H
#define GNC_INVOICE_SQL_H
#define CT_INVOICEREF "invoice"
void gnc_invoice_sql_initialize( void );
#endif /* GNC_INVOICE_SQL_H */

View File

@ -0,0 +1,203 @@
/********************************************************************\
* gnc-job-sql.c -- job sql backend *
* *
* This program is free software; you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation; either version 2 of *
* the License, or (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License*
* along with this program; if not, contact: *
* *
* Free Software Foundation Voice: +1-617-542-5942 *
* 51 Franklin Street, Fifth Floor Fax: +1-617-542-2652 *
* Boston, MA 02110-1301, USA gnu@gnu.org *
* *
\********************************************************************/
/** @file gnc-job-sql.c
* @brief load and save address data to SQL
* @author Copyright (c) 2007-2008 Phil Longstaff <plongstaff@rogers.com>
*
* This file implements the top-level QofBackend API for saving/
* restoring data to/from an SQL database
*/
#include "config.h"
#include <glib.h>
#include <stdlib.h>
#include <string.h>
#include "gnc-backend-sql.h"
#include "gnc-slots-sql.h"
#include "gncJobP.h"
#include "gnc-job-sql.h"
#include "gnc-owner-sql.h"
#define _GNC_MOD_NAME GNC_ID_JOB
static QofLogModule log_module = G_LOG_DOMAIN;
#define TABLE_NAME "jobs"
#define TABLE_VERSION 1
#define MAX_ID_LEN 2048
#define MAX_NAME_LEN 2048
#define MAX_REFERENCE_LEN 2048
static GncSqlColumnTableEntry col_table[] =
{
{ "guid", CT_GUID, 0, COL_NNUL|COL_PKEY, "guid" },
{ "id", CT_STRING, MAX_ID_LEN, COL_NNUL, NULL, JOB_ID },
{ "name", CT_STRING, MAX_NAME_LEN, COL_NNUL, NULL, JOB_NAME },
{ "reference", CT_STRING, MAX_REFERENCE_LEN, COL_NNUL, NULL, JOB_REFERENCE },
{ "active", CT_BOOLEAN, 0, COL_NNUL, NULL, NULL,
(QofAccessFunc)gncJobGetActive, (QofSetterFunc)gncJobSetActive },
{ "owner", CT_OWNERREF, 0, COL_NNUL, NULL, NULL,
(QofAccessFunc)gncJobGetOwner, (QofSetterFunc)gncJobSetOwner },
{ NULL }
};
static GncJob*
load_single_job( GncSqlBackend* be, GncSqlRow* row )
{
const GUID* guid;
GncJob* pJob;
g_return_val_if_fail( be != NULL, NULL );
g_return_val_if_fail( row != NULL, NULL );
guid = gnc_sql_load_guid( be, row );
pJob = gncJobLookup( be->primary_book, guid );
if( pJob == NULL ) {
pJob = gncJobCreate( be->primary_book );
}
gnc_sql_load_object( be, row, GNC_ID_JOB, pJob, col_table );
qof_instance_mark_clean( QOF_INSTANCE(pJob) );
return pJob;
}
static void
load_all_jobs( GncSqlBackend* be )
{
GncSqlStatement* stmt;
GncSqlResult* result;
QofBook* pBook;
g_return_if_fail( be != NULL );
pBook = be->primary_book;
stmt = gnc_sql_create_select_statement( be, TABLE_NAME );
result = gnc_sql_execute_select_statement( be, stmt );
gnc_sql_statement_dispose( stmt );
if( result != NULL ) {
GncSqlRow* row;
GList* list = NULL;
row = gnc_sql_result_get_first_row( result );
while( row != NULL ) {
GncJob* pJob = load_single_job( be, row );
if( pJob != NULL ) {
list = g_list_append( list, pJob );
}
row = gnc_sql_result_get_next_row( result );
}
gnc_sql_result_dispose( result );
if( list != NULL ) {
gnc_sql_slots_load_for_list( be, list );
}
}
}
/* ================================================================= */
static void
create_job_tables( GncSqlBackend* be )
{
gint version;
g_return_if_fail( be != NULL );
version = gnc_sql_get_table_version( be, TABLE_NAME );
if( version == 0 ) {
gnc_sql_create_table( be, TABLE_NAME, TABLE_VERSION, col_table );
}
}
/* ================================================================= */
static void
save_job( GncSqlBackend* be, QofInstance* inst )
{
g_return_if_fail( inst != NULL );
g_return_if_fail( GNC_IS_JOB(inst) );
g_return_if_fail( be != NULL );
gnc_sql_commit_standard_item( be, inst, TABLE_NAME, GNC_ID_JOB, col_table );
}
/* ================================================================= */
static gboolean
job_should_be_saved( GncJob *job )
{
const char *id;
g_return_val_if_fail( job != NULL, FALSE );
/* make sure this is a valid job before we save it -- should have an ID */
id = gncJobGetID( job );
if( id == NULL || *id == '\0' ) {
return FALSE;
}
return TRUE;
}
static void
write_single_job( QofInstance *term_p, gpointer be_p )
{
GncSqlBackend* be = (GncSqlBackend*)be_p;
g_return_if_fail( term_p != NULL );
g_return_if_fail( GNC_IS_JOB(term_p) );
g_return_if_fail( be_p != NULL );
if( job_should_be_saved( GNC_JOB(term_p) ) ) {
save_job( be, term_p );
}
}
static void
write_jobs( GncSqlBackend* be )
{
g_return_if_fail( be != NULL );
qof_object_foreach( GNC_ID_JOB, be->primary_book, write_single_job, (gpointer)be );
}
/* ================================================================= */
void
gnc_job_sql_initialize( void )
{
static GncSqlObjectBackend be_data =
{
GNC_SQL_BACKEND_VERSION,
GNC_ID_JOB,
save_job, /* commit */
load_all_jobs, /* initial_load */
create_job_tables, /* create_tables */
NULL, NULL, NULL,
write_jobs /* write */
};
qof_object_register_backend( GNC_ID_JOB, GNC_SQL_BACKEND, &be_data );
}
/* ========================== END OF FILE ===================== */

View File

@ -0,0 +1,35 @@
/*
* gnc-job-sql.h -- job sql backend
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, contact:
*
* Free Software Foundation Voice: +1-617-542-5942
* 51 Franklin Street, Fifth Floor Fax: +1-617-542-2652
* Boston, MA 02110-1301, USA gnu@gnu.org
*/
/** @file gnc-job-sql.h
* @brief load and save job data to SQL
* @author Copyright (c) 2007-2008 Phil Longstaff <plongstaff@rogers.com>
*
* This file implements the top-level QofBackend API for saving/
* restoring data to/from an SQL database
*/
#ifndef GNC_JOB_SQL_H
#define GNC_JOB_SQL_H
void gnc_job_sql_initialize( void );
#endif /* GNC_JOB_SQL_H */

Some files were not shown because too many files have changed in this diff Show More