From 12c7f6a1c512558f73a0175a7f3d6f5d52f41ffb Mon Sep 17 00:00:00 2001 From: Mark Callaghan Date: Wed, 30 May 2007 23:48:36 +0000 Subject: [PATCH] Simple SWIG interface --- configure.in | 9 ++ lladd/transactional.h | 3 + m4/ac_pkg_swig.m4 | 127 +++++++++++++++++ m4/ac_python_devel.m4 | 269 +++++++++++++++++++++++++++++++++++++ m4/swig_enable_cxx.m4 | 56 ++++++++ m4/swig_python.m4 | 67 +++++++++ src/lladd/transactional2.c | 9 ++ utilities/Makefile.am | 6 + utilities/swig/Makefile.am | 13 ++ utilities/swig/__init__.py | 0 utilities/swig/ex1.py | 46 +++++++ utilities/swig/lladd.i | 39 ++++++ 12 files changed, 644 insertions(+) create mode 100644 m4/ac_pkg_swig.m4 create mode 100644 m4/ac_python_devel.m4 create mode 100644 m4/swig_enable_cxx.m4 create mode 100644 m4/swig_python.m4 create mode 100644 utilities/swig/Makefile.am create mode 100644 utilities/swig/__init__.py create mode 100644 utilities/swig/ex1.py create mode 100644 utilities/swig/lladd.i diff --git a/configure.in b/configure.in index d197925..b838a8c 100644 --- a/configure.in +++ b/configure.in @@ -20,6 +20,14 @@ AC_PROG_AWK AC_PROG_RANLIB # Checks for libraries. +# For SWIG & Python +# AC_PROG_LIBTOOL +AM_PATH_PYTHON(2.3) +AC_PROG_SWIG(1.3) +SWIG_ENABLE_CXX +SWIG_PYTHON +AM_CONDITIONAL(HAVE_SWIG, test x"$have_swig" = "xyes") + #AM_PATH_CHECK(,[have_check="yes"], # AC_MSG_WARN([Check not found; cannot run unit tests!]) # [have_check="no"]) @@ -232,6 +240,7 @@ AC_CONFIG_FILES([Makefile test/monotree/Makefile test/pobj/Makefile utilities/Makefile + utilities/swig/Makefile examples/Makefile ]) AC_OUTPUT diff --git a/lladd/transactional.h b/lladd/transactional.h index f47137c..60959cf 100644 --- a/lladd/transactional.h +++ b/lladd/transactional.h @@ -475,6 +475,8 @@ int Tbegin(); */ compensated_function void Tupdate(int xid, recordid rid, const void *dat, int op); +compensated_function void TupdateStr(int xid, recordid rid, + const char *dat, int op); compensated_function void TupdateRaw(int xid, recordid rid, const void *dat, int op); compensated_function void TupdateDeferred(int xid, recordid rid, @@ -485,6 +487,7 @@ compensated_function void TupdateDeferred(int xid, recordid rid, * @param dat buffer into which data goes */ compensated_function void Tread(int xid, recordid rid, void *dat); +compensated_function void TreadStr(int xid, recordid rid, char *dat); void TreadUnlocked(int xid, recordid rid, void *dat); /** diff --git a/m4/ac_pkg_swig.m4 b/m4/ac_pkg_swig.m4 new file mode 100644 index 0000000..3e3867d --- /dev/null +++ b/m4/ac_pkg_swig.m4 @@ -0,0 +1,127 @@ +##### http://autoconf-archive.cryp.to/ac_pkg_swig.html +# +# SYNOPSIS +# +# AC_PROG_SWIG([major.minor.micro]) +# +# DESCRIPTION +# +# This macro searches for a SWIG installation on your system. If +# found you should call SWIG via $(SWIG). You can use the optional +# first argument to check if the version of the available SWIG is +# greater than or equal to the value of the argument. It should have +# the format: N[.N[.N]] (N is a number between 0 and 999. Only the +# first N is mandatory.) +# +# If the version argument is given (e.g. 1.3.17), AC_PROG_SWIG checks +# that the swig package is this version number or higher. +# +# In configure.in, use as: +# +# AC_PROG_SWIG(1.3.17) +# SWIG_ENABLE_CXX +# SWIG_MULTI_MODULE_SUPPORT +# SWIG_PYTHON +# +# LAST MODIFICATION +# +# 2006-10-22 +# +# COPYLEFT +# +# Copyright (c) 2006 Sebastian Huber +# Copyright (c) 2006 Alan W. Irwin +# Copyright (c) 2006 Rafael Laboissiere +# Copyright (c) 2006 Andrew Collier +# +# 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., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. +# +# As a special exception, the respective Autoconf Macro's copyright +# owner gives unlimited permission to copy, distribute and modify the +# configure scripts that are the output of Autoconf when processing +# the Macro. You need not follow the terms of the GNU General Public +# License when using or distributing such scripts, even though +# portions of the text of the Macro appear in them. The GNU General +# Public License (GPL) does govern all other use of the material that +# constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the +# Autoconf Macro released by the Autoconf Macro Archive. When you +# make and distribute a modified version of the Autoconf Macro, you +# may extend this special exception to the GPL to apply to your +# modified version as well. + +AC_DEFUN([AC_PROG_SWIG],[ + AC_PATH_PROG([SWIG],[swig]) + have_swig="no" + if test -z "$SWIG" ; then + AC_MSG_WARN([cannot find 'swig' program. You should look at http://www.swig.org]) + SWIG='echo "Error: SWIG is not installed. You should look at http://www.swig.org" ; false' + elif test -n "$1" ; then + AC_MSG_CHECKING([for SWIG version]) + [swig_version=`$SWIG -version 2>&1 | grep 'SWIG Version' | sed 's/.*\([0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\).*/\1/g'`] + AC_MSG_RESULT([$swig_version]) + if test -n "$swig_version" ; then + # Calculate the required version number components + [required=$1] + [required_major=`echo $required | sed 's/[^0-9].*//'`] + if test -z "$required_major" ; then + [required_major=0] + fi + [required=`echo $required | sed 's/[0-9]*[^0-9]//'`] + [required_minor=`echo $required | sed 's/[^0-9].*//'`] + if test -z "$required_minor" ; then + [required_minor=0] + fi + [required=`echo $required | sed 's/[0-9]*[^0-9]//'`] + [required_patch=`echo $required | sed 's/[^0-9].*//'`] + if test -z "$required_patch" ; then + [required_patch=0] + fi + # Calculate the available version number components + [available=$swig_version] + [available_major=`echo $available | sed 's/[^0-9].*//'`] + if test -z "$available_major" ; then + [available_major=0] + fi + [available=`echo $available | sed 's/[0-9]*[^0-9]//'`] + [available_minor=`echo $available | sed 's/[^0-9].*//'`] + if test -z "$available_minor" ; then + [available_minor=0] + fi + [available=`echo $available | sed 's/[0-9]*[^0-9]//'`] + [available_patch=`echo $available | sed 's/[^0-9].*//'`] + if test -z "$available_patch" ; then + [available_patch=0] + fi + if test $available_major -ne $required_major \ + -o $available_minor -ne $required_minor \ + -o $available_patch -lt $required_patch ; then + AC_MSG_WARN([SWIG version >= $1 is required. You have $swig_version. You should look at http://www.swig.org]) + SWIG='echo "Error: SWIG version >= $1 is required. You have '"$swig_version"'. You should look at http://www.swig.org" ; false' + else + AC_MSG_NOTICE([SWIG executable is '$SWIG']) + SWIG_LIB=`$SWIG -swiglib` + AC_MSG_NOTICE([SWIG library directory is '$SWIG_LIB']) + have_swig="yes" + fi + else + AC_MSG_WARN([cannot determine SWIG version]) + SWIG='echo "Error: Cannot determine SWIG version. You should look at http://www.swig.org" ; false' + fi + fi + AC_SUBST([SWIG_LIB]) +]) diff --git a/m4/ac_python_devel.m4 b/m4/ac_python_devel.m4 new file mode 100644 index 0000000..eb17f29 --- /dev/null +++ b/m4/ac_python_devel.m4 @@ -0,0 +1,269 @@ +##### http://autoconf-archive.cryp.to/ac_python_devel.html +# +# SYNOPSIS +# +# AC_PYTHON_DEVEL([version]) +# +# DESCRIPTION +# +# Note: Defines as a precious variable "PYTHON_VERSION". Don't +# override it in your configure.ac. +# +# This macro checks for Python and tries to get the include path to +# 'Python.h'. It provides the $(PYTHON_CPPFLAGS) and +# $(PYTHON_LDFLAGS) output variables. It also exports +# $(PYTHON_EXTRA_LIBS) and $(PYTHON_EXTRA_LDFLAGS) for embedding +# Python in your code. +# +# You can search for some particular version of Python by passing a +# parameter to this macro, for example ">= '2.3.1'", or "== '2.4'". +# Please note that you *have* to pass also an operator along with the +# version to match, and pay special attention to the single quotes +# surrounding the version number. Don't use "PYTHON_VERSION" for +# this: that environment variable is declared as precious and thus +# reserved for the end-user. +# +# This macro should work for all versions of Python >= 2.1.0. As an +# end user, you can disable the check for the python version by +# setting the PYTHON_NOVERSIONCHECK environment variable to something +# else than the empty string. +# +# If you need to use this macro for an older Python version, please +# contact the authors. We're always open for feedback. +# +# LAST MODIFICATION +# +# 2006-10-22 +# +# COPYLEFT +# +# Copyright (c) 2006 Sebastian Huber +# Copyright (c) 2006 Alan W. Irwin +# Copyright (c) 2006 Rafael Laboissiere +# Copyright (c) 2006 Andrew Collier +# Copyright (c) 2006 Matteo Settenvini +# Copyright (c) 2006 Horst Knorr +# +# 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., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. +# +# As a special exception, the respective Autoconf Macro's copyright +# owner gives unlimited permission to copy, distribute and modify the +# configure scripts that are the output of Autoconf when processing +# the Macro. You need not follow the terms of the GNU General Public +# License when using or distributing such scripts, even though +# portions of the text of the Macro appear in them. The GNU General +# Public License (GPL) does govern all other use of the material that +# constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the +# Autoconf Macro released by the Autoconf Macro Archive. When you +# make and distribute a modified version of the Autoconf Macro, you +# may extend this special exception to the GPL to apply to your +# modified version as well. + +AC_DEFUN([AC_PYTHON_DEVEL],[ + # + # Allow the use of a (user set) custom python version + # + AC_ARG_VAR([PYTHON_VERSION],[The installed Python + version to use, for example '2.3'. This string + will be appended to the Python interpreter + canonical name.]) + + AC_PATH_PROG([PYTHON],[python[$PYTHON_VERSION]]) + if test -z "$PYTHON"; then + AC_MSG_ERROR([Cannot find python$PYTHON_VERSION in your system path]) + PYTHON_VERSION="" + fi + + # + # Check for a version of Python >= 2.1.0 + # + AC_MSG_CHECKING([for a version of Python >= '2.1.0']) + ac_supports_python_ver=`$PYTHON -c "import sys, string; \ + ver = string.split(sys.version)[[0]]; \ + print ver >= '2.1.0'"` + if test "$ac_supports_python_ver" != "True"; then + if test -z "$PYTHON_NOVERSIONCHECK"; then + AC_MSG_RESULT([no]) + AC_MSG_FAILURE([ +This version of the AC@&t@_PYTHON_DEVEL macro +doesn't work properly with versions of Python before +2.1.0. You may need to re-run configure, setting the +variables PYTHON_CPPFLAGS, PYTHON_LDFLAGS, PYTHON_SITE_PKG, +PYTHON_EXTRA_LIBS and PYTHON_EXTRA_LDFLAGS by hand. +Moreover, to disable this check, set PYTHON_NOVERSIONCHECK +to something else than an empty string. +]) + else + AC_MSG_RESULT([skip at user request]) + fi + else + AC_MSG_RESULT([yes]) + fi + + # + # if the macro parameter ``version'' is set, honour it + # + if test -n "$1"; then + AC_MSG_CHECKING([for a version of Python $1]) + ac_supports_python_ver=`$PYTHON -c "import sys, string; \ + ver = string.split(sys.version)[[0]]; \ + print ver $1"` + if test "$ac_supports_python_ver" = "True"; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + AC_MSG_ERROR([this package requires Python $1. +If you have it installed, but it isn't the default Python +interpreter in your system path, please pass the PYTHON_VERSION +variable to configure. See ``configure --help'' for reference. +]) + PYTHON_VERSION="" + fi + fi + + # + # Check if you have distutils, else fail + # + AC_MSG_CHECKING([for the distutils Python package]) + ac_distutils_result=`$PYTHON -c "import distutils" 2>&1` + if test -z "$ac_distutils_result"; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + AC_MSG_ERROR([cannot import Python module "distutils". +Please check your Python installation. The error was: +$ac_distutils_result]) + PYTHON_VERSION="" + fi + + # + # Check for Python include path + # + AC_MSG_CHECKING([for Python include path]) + if test -z "$PYTHON_CPPFLAGS"; then + python_path=`$PYTHON -c "import distutils.sysconfig; \ + print distutils.sysconfig.get_python_inc();"` + if test -n "${python_path}"; then + python_path="-I$python_path" + fi + PYTHON_CPPFLAGS=$python_path + fi + AC_MSG_RESULT([$PYTHON_CPPFLAGS]) + AC_SUBST([PYTHON_CPPFLAGS]) + + # + # Check for Python library path + # + AC_MSG_CHECKING([for Python library path]) + if test -z "$PYTHON_LDFLAGS"; then + # (makes two attempts to ensure we've got a version number + # from the interpreter) + py_version=`$PYTHON -c "from distutils.sysconfig import *; \ + from string import join; \ + print join(get_config_vars('VERSION'))"` + if test "$py_version" == "[None]"; then + if test -n "$PYTHON_VERSION"; then + py_version=$PYTHON_VERSION + else + py_version=`$PYTHON -c "import sys; \ + print sys.version[[:3]]"` + fi + fi + + PYTHON_LDFLAGS=`$PYTHON -c "from distutils.sysconfig import *; \ + from string import join; \ + print '-L' + get_python_lib(0,1), \ + '-lpython';"`$py_version + fi + AC_MSG_RESULT([$PYTHON_LDFLAGS]) + AC_SUBST([PYTHON_LDFLAGS]) + + # + # Check for site packages + # + AC_MSG_CHECKING([for Python site-packages path]) + if test -z "$PYTHON_SITE_PKG"; then + PYTHON_SITE_PKG=`$PYTHON -c "import distutils.sysconfig; \ + print distutils.sysconfig.get_python_lib(0,0);"` + fi + AC_MSG_RESULT([$PYTHON_SITE_PKG]) + AC_SUBST([PYTHON_SITE_PKG]) + + # + # libraries which must be linked in when embedding + # + AC_MSG_CHECKING(python extra libraries) + if test -z "$PYTHON_EXTRA_LIBS"; then + PYTHON_EXTRA_LIBS=`$PYTHON -c "import distutils.sysconfig; \ + conf = distutils.sysconfig.get_config_var; \ + print conf('LOCALMODLIBS'), conf('LIBS')"` + fi + AC_MSG_RESULT([$PYTHON_EXTRA_LIBS]) + AC_SUBST(PYTHON_EXTRA_LIBS) + + # + # linking flags needed when embedding + # + AC_MSG_CHECKING(python extra linking flags) + if test -z "$PYTHON_EXTRA_LDFLAGS"; then + PYTHON_EXTRA_LDFLAGS=`$PYTHON -c "import distutils.sysconfig; \ + conf = distutils.sysconfig.get_config_var; \ + print conf('LINKFORSHARED')"` + fi + AC_MSG_RESULT([$PYTHON_EXTRA_LDFLAGS]) + AC_SUBST(PYTHON_EXTRA_LDFLAGS) + + # + # final check to see if everything compiles alright + # + AC_MSG_CHECKING([consistency of all components of python development environment]) + AC_LANG_PUSH([C]) + # save current global flags + LIBS="$ac_save_LIBS $PYTHON_LDFLAGS" + CPPFLAGS="$ac_save_CPPFLAGS $PYTHON_CPPFLAGS" + AC_TRY_LINK([ + #include + ],[ + Py_Initialize(); + ],[pythonexists=yes],[pythonexists=no]) + + AC_MSG_RESULT([$pythonexists]) + + if test ! "$pythonexists" = "yes"; then + AC_MSG_ERROR([ + Could not link test program to Python. Maybe the main Python library has been + installed in some non-standard library path. If so, pass it to configure, + via the LDFLAGS environment variable. + Example: ./configure LDFLAGS="-L/usr/non-standard-path/python/lib" + ============================================================================ + ERROR! + You probably have to install the development version of the Python package + for your distribution. The exact name of this package varies among them. + ============================================================================ + ]) + PYTHON_VERSION="" + fi + AC_LANG_POP + # turn back to default flags + CPPFLAGS="$ac_save_CPPFLAGS" + LIBS="$ac_save_LIBS" + + # + # all done! + # +]) diff --git a/m4/swig_enable_cxx.m4 b/m4/swig_enable_cxx.m4 new file mode 100644 index 0000000..39ae932 --- /dev/null +++ b/m4/swig_enable_cxx.m4 @@ -0,0 +1,56 @@ +##### http://autoconf-archive.cryp.to/swig_enable_cxx.html +# +# SYNOPSIS +# +# SWIG_ENABLE_CXX +# +# DESCRIPTION +# +# Enable SWIG C++ support. This affects all invocations of $(SWIG). +# +# LAST MODIFICATION +# +# 2006-10-22 +# +# COPYLEFT +# +# Copyright (c) 2006 Sebastian Huber +# Copyright (c) 2006 Alan W. Irwin +# Copyright (c) 2006 Rafael Laboissiere +# Copyright (c) 2006 Andrew Collier +# +# 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., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. +# +# As a special exception, the respective Autoconf Macro's copyright +# owner gives unlimited permission to copy, distribute and modify the +# configure scripts that are the output of Autoconf when processing +# the Macro. You need not follow the terms of the GNU General Public +# License when using or distributing such scripts, even though +# portions of the text of the Macro appear in them. The GNU General +# Public License (GPL) does govern all other use of the material that +# constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the +# Autoconf Macro released by the Autoconf Macro Archive. When you +# make and distribute a modified version of the Autoconf Macro, you +# may extend this special exception to the GPL to apply to your +# modified version as well. + +AC_DEFUN([SWIG_ENABLE_CXX],[ + AC_REQUIRE([AC_PROG_SWIG]) + AC_REQUIRE([AC_PROG_CXX]) + SWIG="$SWIG -c++" +]) diff --git a/m4/swig_python.m4 b/m4/swig_python.m4 new file mode 100644 index 0000000..0eccd59 --- /dev/null +++ b/m4/swig_python.m4 @@ -0,0 +1,67 @@ +##### http://autoconf-archive.cryp.to/swig_python.html +# +# SYNOPSIS +# +# SWIG_PYTHON([use-shadow-classes = {no, yes}]) +# +# DESCRIPTION +# +# Checks for Python and provides the $(SWIG_PYTHON_CPPFLAGS), and +# $(SWIG_PYTHON_OPT) output variables. +# +# $(SWIG_PYTHON_OPT) contains all necessary SWIG options to generate +# code for Python. Shadow classes are enabled unless the value of the +# optional first argument is exactly 'no'. If you need multi module +# support (provided by the SWIG_MULTI_MODULE_SUPPORT macro) use +# $(SWIG_PYTHON_LIBS) to link against the appropriate library. It +# contains the SWIG Python runtime library that is needed by the type +# check system for example. +# +# LAST MODIFICATION +# +# 2006-10-22 +# +# COPYLEFT +# +# Copyright (c) 2006 Sebastian Huber +# Copyright (c) 2006 Alan W. Irwin +# Copyright (c) 2006 Rafael Laboissiere +# Copyright (c) 2006 Andrew Collier +# +# 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., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. +# +# As a special exception, the respective Autoconf Macro's copyright +# owner gives unlimited permission to copy, distribute and modify the +# configure scripts that are the output of Autoconf when processing +# the Macro. You need not follow the terms of the GNU General Public +# License when using or distributing such scripts, even though +# portions of the text of the Macro appear in them. The GNU General +# Public License (GPL) does govern all other use of the material that +# constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the +# Autoconf Macro released by the Autoconf Macro Archive. When you +# make and distribute a modified version of the Autoconf Macro, you +# may extend this special exception to the GPL to apply to your +# modified version as well. + +AC_DEFUN([SWIG_PYTHON],[ + AC_REQUIRE([AC_PROG_SWIG]) + AC_REQUIRE([AC_PYTHON_DEVEL]) + test "x$1" != "xno" || swig_shadow=" -noproxy" + AC_SUBST([SWIG_PYTHON_OPT],[-python$swig_shadow]) + AC_SUBST([SWIG_PYTHON_CPPFLAGS],[$PYTHON_CPPFLAGS]) +]) diff --git a/src/lladd/transactional2.c b/src/lladd/transactional2.c index b5a678e..2856947 100644 --- a/src/lladd/transactional2.c +++ b/src/lladd/transactional2.c @@ -244,6 +244,11 @@ compensated_function void TupdateRaw(int xid, recordid rid, releasePage(p); } +compensated_function void TupdateStr(int xid, recordid rid, + const char *dat, int op) { + Tupdate(xid, rid, dat, op); +} + compensated_function void Tupdate(int xid, recordid rid, const void *dat, int op) { Page * p = loadPage(xid, rid.page); @@ -286,6 +291,10 @@ void TreadUnlocked(int xid, recordid rid, void * dat) { releasePage(p); } +compensated_function void TreadStr(int xid, recordid rid, char * dat) { + Tread(xid, rid, dat); +} + compensated_function void Tread(int xid, recordid rid, void * dat) { Page * p; try { diff --git a/utilities/Makefile.am b/utilities/Makefile.am index 797f896..9ffd59f 100644 --- a/utilities/Makefile.am +++ b/utilities/Makefile.am @@ -4,3 +4,9 @@ LDADD=$(top_builddir)/src/lladd/liblladd.a \ $(top_builddir)/src/libdfa/librw.a bin_PROGRAMS=logfile_dump run_recovery truncate_log AM_CFLAGS=${GLOBAL_CFLAGS} + +SUBDIRS = + +if HAVE_SWIG +SUBDIRS += swig +endif diff --git a/utilities/swig/Makefile.am b/utilities/swig/Makefile.am new file mode 100644 index 0000000..2c24e27 --- /dev/null +++ b/utilities/swig/Makefile.am @@ -0,0 +1,13 @@ + +BUILT_SOURCES = lladd_wrap.cc + +all: $(BUILD_SOURCES) +pkgpython_PYTHON = lladd.py +pkgpyexec_LTLIBRARIES = _lladd.la +_lladd_la_SOURCES = lladd_wrap.cc +_lladd_la_CPPFLAGS = $(SWIG_PYTHON_CPPFLAGS) -I$(top_srcdir) -I$(top_srcdir)/src +_lladd_la_LDFLAGS = -module +_lladd_la_LIBADD = $(top_srcdir)/src/lladd/liblladd.a $(top_srcdir)/src/libdfa/librw.a + +lladd_wrap.cc : lladd.i + $(SWIG) $(SWIG_PYTHON_OPT) -I$(top_srcdir)/src -I$(top_srcdir) -o $@ $< diff --git a/utilities/swig/__init__.py b/utilities/swig/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/utilities/swig/ex1.py b/utilities/swig/ex1.py new file mode 100644 index 0000000..c12f76e --- /dev/null +++ b/utilities/swig/ex1.py @@ -0,0 +1,46 @@ +#!/usr/bin/python2.4 +# + +"""Example 1 in Python +""" + +import lladd +import sys +import array + +def runit(argv): + print "init" + lladd.Tinit() + + # First transaction, for writing + print "begin & alloc" + xid = lladd.Tbegin(); + record_id = lladd.Talloc(xid, 4); + + print "update" + write_data = array.array('l', (42,)) + data_out = write_data.tostring() + assert len(data_out) == 4 + + lladd.TupdateStr(xid, record_id, data_out, lladd.OPERATION_SET) + lladd.Tcommit(xid) + + # Second transaction, for reading + print "read" + xid = lladd.Tbegin() + + # Read from Stasis into memory for data_in + data_in = '1234' + lladd.TreadStr(xid, record_id, data_in) + read_data = array.array('l', data_in) + assert read_data[0] == 42 + + print "done" + lladd.Tdealloc(xid, record_id) + lladd.Tabort(xid) + + lladd.Tdeinit() + + +if __name__ == "__main__": + runit(sys.argv) diff --git a/utilities/swig/lladd.i b/utilities/swig/lladd.i new file mode 100644 index 0000000..a2b504a --- /dev/null +++ b/utilities/swig/lladd.i @@ -0,0 +1,39 @@ +%module lladd +%{ +#include "lladd/transactional.h" +%} + +extern int Tinit(); +extern int Tdeinit(); + +extern int Tbegin(); + +extern void Tupdate(int xid, recordid rid, const void *dat, int op); +extern void TupdateStr(int xid, recordid rid, const char *dat, int op); +extern void TupdateRaw(int xid, recordid rid, const void *dat, int op); + +extern void Tread(int xid, recordid rid, void *dat); +extern void TreadStr(int xid, recordid rid, char *dat); + +extern void TreadUnlocked(int xid, recordid rid, void *dat); + +extern int Tcommit(int xid); +extern int Tabort(int xid); + +extern void Trevive(int xid, long lsn); + +extern void TsetXIDCount(int xid); + +extern int TisActiveTransaction(int xid); + +extern lsn_t transactions_minRecLSN(); + +extern int TdurabilityLevel(); + +extern recordid Talloc(int xid, unsigned long size); +extern recordid TallocFromPage(int xid, long page, unsigned long size); +extern void Tdealloc(int xid, recordid rid); + +%include "lladd/constants.h" + +