[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