-
Notifications
You must be signed in to change notification settings - Fork 125
/
db_private.opa
121 lines (97 loc) · 3.68 KB
/
db_private.opa
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
/*
Copyright © 2011 MLstate
This file is part of OPA.
OPA is free software: you can redistribute it and/or modify it under the
terms of the GNU Affero General Public License, version 3, as published by
the Free Software Foundation.
OPA 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 Affero General Public License for
more details.
You should have received a copy of the GNU Affero General Public License
along with OPA. If not, see <http://www.gnu.org/licenses/>.
*/
/**
* Utility functions on database paths.
*
* @category DATABASE
* @author Louis Gesbert, 2010
* @destination PUBLIC
* @stability UNSTABLE
*/
/**
* This contains bindings that are needed by the database access generation
* engine of OPA. Shouldn't be used by hand.
*/
/* These types come from libqml's mlbsl. We just ensure OPA knows about them here
* so that it won't complain when encoutering them in intermediate code */
@opacapi type badoplink_database = external
@opacapi type badoplink_transaction = external
type badoplink_revision = external
@opacapi type badoplink_db_path_key = external
@opacapi type badoplink_path = external
@opacapi type badoplink_data_d = external
@opacapi type badoplink_db_partial_key = external
@opacapi type badoplink_node_config = external
@opacapi type badop_engine_database_options = external
@opacapi type badop_engine_t = external
@opacapi type path_t('a,'path_kind) = external
@opacapi type path_embedded_obj = external
@opacapi type path_embed_info = external
@opacapi type path_val_p = external
@opacapi type path_ref_p = external
@opacapi type transactions_t('a) = external
@opacapi type dbgraph_diff = external
// The following needs to be defined for dbgen !
exception_transaction_failure = { Transaction_failure }
Db_private = {{
/**
* Low-level transaction handling.
*
* Database operations can only be performed inside a transaction. If none is specified,
* the compiler automatically introduces them -- for each operations, for the time being.
* This is inefficient, and transactions can be added explicitly with this module.
*
* Note that writes are asynchronous and only verified at the time of commit.
*/
Transactions = {{
/**
* Starts a new transaction from a database and a value
*/
start = %%transactions_start%%
/**
* [continue(tr,f,fallback)] applies [f] to the data held in transaction [tr],
* or [fallback] if either [f] fails or there was already a failure in previous
* operations in [tr]. Database operations performed by [f] will be done within
* the transaction
*/
continue = %%transactions_continue%%
/**
* Commits the transaction to the database, validating its operations and making
* them permanent and visible to the others. Returns the value held in the transaction.
* If there was a failure, the transaction is rolled back and performs no changes ; the
* returned value is that of [fallback] functions
*/
commit = %%transactions_commit%%
/**
* Wipe out the transaction and return its fallback value
*/
abort = %%transactions_abort%%
/**
* From within a transaction, forces it to fail. Outside of a transaction, returns its
* argument unchanged.
*/
fail =
bp = %%transactions_fail%%
db,x -> bp(db,"Transaction manually aborted",x)
/**
* Gives out the value within a transaction. Use wisely, since this contradicts the
* global monadic design for transactions.
*/
get_value = %%transactions.get_value%%
}}
/**
* Same as Db.export_to_xml . For backwards-compat only
*/
export_to_xml = %%dbser.dump_db%%
}}