1/*
2 * This Source Code Form is subject to the terms of the Mozilla Public
3 * License, v. 2.0. If a copy of the MPL was not distributed with this
4 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
5 *
6 * Copyright 1997 - July 2008 CWI, August 2008 - 2019 MonetDB B.V.
7 */
8
9/*
10 * @a M.L. Kersten, P. Boncz
11 * @+ Transaction management
12 * In the philosophy of Monet, transaction management overhead should only
13 * be paid when necessary. Transaction management is for this purpose
14 * implemented as a module.
15 * This code base is largely absolute and should be re-considered when
16 * serious OLTP is being supported.
17 * Note, however, the SQL front-end obeys transaction semantics.
18 *
19 */
20#include "monetdb_config.h"
21#include "gdk.h"
22#include "mal.h"
23#include "mal_interpreter.h"
24#include "bat5.h"
25
26mal_export str TRNglobal_sync(bit *ret);
27mal_export str TRNglobal_abort(bit *ret);
28mal_export str TRNglobal_commit(bit *ret);
29mal_export str TRNtrans_clean(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr p);
30mal_export str TRNtrans_abort(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr p);
31mal_export str TRNtrans_commit(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr p);
32mal_export str TRNsubcommit(bit *ret, bat *bid);
33
34#include "mal_exception.h"
35str
36TRNglobal_sync(bit *ret)
37{
38 *ret = BBPsync(getBBPsize(), NULL) == GDK_SUCCEED;
39 return MAL_SUCCEED;
40}
41
42str
43TRNglobal_abort(bit *ret)
44{
45 TMabort();
46 *ret = TRUE;
47 return MAL_SUCCEED;
48}
49
50str
51TRNglobal_commit(bit *ret)
52{
53 *ret = TMcommit()?FALSE:TRUE;
54 return MAL_SUCCEED;
55}
56str
57TRNsubcommit(bit *ret, bat *bid)
58{
59 BAT *b;
60 b= BATdescriptor(*bid);
61 if( b == NULL)
62 throw(MAL, "transaction.subcommit", SQLSTATE(HY002) RUNTIME_OBJECT_MISSING);
63 *ret = TMsubcommit(b) == GDK_SUCCEED;
64 BBPunfix(b->batCacheid);
65 return MAL_SUCCEED;
66}
67
68str
69TRNtrans_clean(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr p)
70{
71 int i;
72 bat *bid;
73 BAT *b;
74
75 (void) cntxt;
76 (void) mb;
77 for (i = p->retc; i < p->argc; i++) {
78 bid = getArgReference_bat(stk, p, i);
79 if ((b = BATdescriptor(*bid)) == NULL) {
80 throw(MAL, "transaction.commit", SQLSTATE(HY002) RUNTIME_OBJECT_MISSING);
81 }
82
83 BATfakeCommit(b);
84 BBPunfix(b->batCacheid);
85 }
86 return MAL_SUCCEED;
87}
88
89str
90TRNtrans_abort(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr p)
91{
92 int i;
93 bat *bid;
94 BAT *b;
95
96 (void) cntxt;
97 (void) mb;
98 for (i = p->retc; i < p->argc; i++) {
99 bid = getArgReference_bat(stk, p, i);
100 if ((b = BATdescriptor(*bid)) == NULL) {
101 throw(MAL, "transaction.abort", SQLSTATE(HY002) RUNTIME_OBJECT_MISSING);
102 }
103 BATundo(b);
104 BBPunfix(b->batCacheid);
105 }
106 return MAL_SUCCEED;
107}
108
109str
110TRNtrans_commit(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr p)
111{
112 int i;
113 bat *bid;
114 BAT *b;
115
116 (void) cntxt;
117 (void) mb;
118 for (i = p->retc; i < p->argc; i++) {
119 bid = getArgReference_bat(stk, p, i);
120 if ((b = BATdescriptor(*bid)) == NULL) {
121 throw(MAL, "transaction.commit", SQLSTATE(HY002) RUNTIME_OBJECT_MISSING);
122 }
123 BATcommit(b);
124 BBPunfix(b->batCacheid);
125 }
126 return MAL_SUCCEED;
127}
128