Did you know ... Search Documentation:
Packs (add-ons) for SWI-Prolog

Package "docstore"

Title:Document-oriented database for Prolog
Rating:Not rated. Create the first rating!
Latest version:2.0.2
SHA1 sum:6b418a6588b573b9e167fa2d87bb60fe9e8ae521
Author:Raivo Laanemets http://rlaanemets.com/
Home page:https://github.com/rla/docstore

Reviews

No reviews. Create the first review!.

Details by download location

VersionSHA1#DownloadsURL
0.0.1ed7ca9d321531ecded1ea3eb9f3966df926a97f51http://packs.rlaanemets.com/docstore/docstore-0.0.1.tgz
0.0.2c9760609d0ccb6e090d256462df2c2e7665dd26c2http://packs.rlaanemets.com/docstore/docstore-0.0.2.tgz
1.0.0879f68afb116e3781fa769bf099ce7324121c7f34http://packs.rlaanemets.com/docstore/docstore-1.0.0.tgz
1.0.1856a70d1f8e1978d7a8ab330756246af4bacaa9a28http://packs.rlaanemets.com/docstore/docstore-1.0.1.tgz
2.0.029908cb4c5170e35cb55bd44ed3ce86ae570fc7a1http://packs.rlaanemets.com/docstore/docstore-2.0.0.tgz
2.0.1fca7287b20b6b25e0a99a3a0d95844edd978dddc123http://packs.rlaanemets.com/docstore/docstore-2.0.1.tgz
2.0.26b418a6588b573b9e167fa2d87bb60fe9e8ae52142http://packs.rlaanemets.com/docstore/docstore-2.0.2.tgz

docstore

Document-oriented transactional in-memory database for SWI-Prolog. Documents are represented using dicts and are organized into collections. Each document is assigned an unique identifier ($id) that can be later used to retrieve/update/remove the document.

Data is stored in-memory and database changes are journaled onto the disk. This works similar to persistency.pl except that the high-level interface is different (documents vs. predicates) and the library is thread-safe. The library supports transactions and hooks (before_save, before_remove).

![Build Status](https://travis-ci.org/rla/docstore)

Example usage

Open database:

?- ds_open('test.db').
true.

Insert some data:

?- ds_insert(vehicle{year: 1926, make: chrysler, model: imperial}).
?- ds_insert(vehicle{year: 1953, make: chevrolet, model: corvette}).
?- ds_insert(vehicle{year: 1954, make: cadillac, model: fleetwood}).

Query all documents in a collection:

?- ds_all(vehicle, List).
List = [
    vehicle{'$id':'f3012622-cacb-4d7f-a22a-c36305274a80',
        make:chrysler, model:imperial, year:1926},
    vehicle{'$id':'23418d47-5835-41ff-a6b8-8748f3b2163e',
        make:chevrolet, model:corvette, year:1953},
    vehicle{'$id':'8c79f80f-d43e-4fad-a1bb-5fca23a195e0',
        make:cadillac, model:fleetwood, year:1954}].

Query by condition:

?- ds_find(vehicle, year=1953, List).
List = [
    vehicle{'$id':'23418d47-5835-41ff-a6b8-8748f3b2163e',
        make:chevrolet, model:corvette, year:1953}].

Update:

?- ds_update(vehicle{'$id':'23418d47-5835-41ff-a6b8-8748f3b2163e', year: 1954}).
?- ds_col_get(vehicle, '23418d47-5835-41ff-a6b8-8748f3b2163e', Vehicle).
Vehicle = vehicle{'$id':'23418d47-5835-41ff-a6b8-8748f3b2163e',
    make:chevrolet, model:corvette, year:1954}.

Remove:

?- ds_col_remove(vehicle, '23418d47-5835-41ff-a6b8-8748f3b2163e').
?- ds_all(vehicle, List).
List = [
    vehicle{'$id':'f3012622-cacb-4d7f-a22a-c36305274a80',
        make:chrysler, model:imperial, year:1926},
    vehicle{'$id':'8c79f80f-d43e-4fad-a1bb-5fca23a195e0',
        make:cadillac, model:fleetwood, year:1954}].

Transactions

Transactions are built-in to guarantee database consistency. Each predicate that modifies database (such as ds_insert) starts implicit transaction. Transactions can be nested. In that case only the outer transaction has effect. To use explicit transaction, use ds_transactional/1. Example:

fail_test:-
    ds_insert(vehicle{year: 1926, make: chrysler, model: imperial}),
    fail.

Running this through ds_transactional/1 causes no changes made by ds_insert to be persisted as the predicate ends with fail. Same would happen when the predicate threw an exception.

Hooks

Two kinds of hooks are supported: before save and before remove. Hooks are registered using the ds_hook/3 predicate. Hook that fails or throws an exception will abort the current transaction. Transactions inside hooks are joined with the currently running transaction.

Installation

Requires SWI-Prolog 7.x.

pack_install(docstore).

Changelog

  • 2021-01-23 version 2.0.2 - fix load_tx_begin not being a predicate indicator.
  • 2014-04-22 version 1.0.1 - use dot notation instead of get_dict_ex/3.
  • 2014-01-02 version 1.0.0 - switch to dicts, more tests, transactions.
  • 2013-12-23 versions 0.0.1/0.0.2 - docstore working with option lists.

Version 2.x

API documentation

See http://packs.rlaanemets.com/docstore/doc/.

Debugging

Enable debugging with debug(docstore) on the console.

Known issues

  • Disk representation is not very compact. This could be improved.
  • before_save hooks are only given updated values not whole document. This might change.

Bug reports/feature requests

Please send bug reports/feature request through the GitHub project page.

License

The MIT License.

Contents of pack "docstore"

Pack contains 7 files holding a total of 44.8K bytes.