Raw
1 #include "git-compat-util.h"
2 #include "gettext.h"
3 #include "odb/source.h"
4 #include "odb/transaction.h"
5
6 int odb_transaction_begin(struct object_database *odb,
7 struct odb_transaction **out,
8 enum odb_transaction_flags flags)
9 {
10 int ret;
11
12 if (odb->transaction)
13 return error(_("object database transaction already pending"));
14
15 ret = odb_source_begin_transaction(odb->sources, out, flags);
16 if (!ret)
17 odb->transaction = *out;
18
19 return ret;
20 }
21
22 int odb_transaction_commit(struct odb_transaction *transaction)
23 {
24 int ret;
25
26 if (!transaction)
27 return 0;
28
29 /*
30 * Ensure the transaction ending matches the pending transaction.
31 */
32 ASSERT(transaction == transaction->source->odb->transaction);
33
34 ret = transaction->commit(transaction);
35 transaction->source->odb->transaction = NULL;
36 free(transaction);
37
38 return ret;
39 }
40
41 int odb_transaction_write_object_stream(struct odb_transaction *transaction,
42 struct odb_write_stream *stream,
43 size_t len, struct object_id *oid)
44 {
45 return transaction->write_object_stream(transaction, stream, len, oid);
46 }
47
48 int odb_transaction_env(struct odb_transaction *transaction, struct strvec *env)
49 {
50 if (!transaction)
51 return 0;
52
53 return transaction->env(transaction, env);
54 }