[m-users.] Accessing a Relational Database and Purity

Julien Fischer jfischer at opturion.com
Wed Nov 14 13:39:20 AEDT 2018


On Wed, 14 Nov 2018, Zoltan Somogyi wrote:

> On Tue, 13 Nov 2018 20:05:41 -0600, X Y <ayrnieu at gmail.com> wrote:
>> Just pass io through your C FFI functions, as in
>> https://github.com/jrfondren/getr-mercury/blob/master/rusage.m , and
>> then add the promise_pure flag.
>
> That is one way. Another approach is to
>
> - define a dummy type named something like db_state,
> - pass a di/uo pair of db_state arguments through every predicate
>  that accesses the database,
> - create a unique db_state at the start of a transaction, and require
>  a unique db_state to be given back at the end of transaction.
>  This can be done using impure code that implements a pure
>  interface, which in this case is a database transaction.
>
> This ensures that all access to the database is part of a transaction.
>
> For much more detail on this, see the paper "Database transactions
> in a purely declarative logic programming language", which is available
> at http://mercurylang.org/documentation/papers.html#mu_96_45.

For a concrete example of the ideas in that paper, take a look at the
ODBC binding in extras/odbc.

Julien.


More information about the users mailing list