summaryrefslogtreecommitdiff
path: root/odb/transaction.c
blob: f6f20088ec1fded6344ea3dbbbb669703e2e0556 (plain)
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
#include "git-compat-util.h"
#include "gettext.h"
#include "odb/source.h"
#include "odb/transaction.h"

int odb_transaction_begin(struct object_database *odb,
			  struct odb_transaction **out,
			  enum odb_transaction_flags flags)
{
	int ret;

	if (odb->transaction)
		return error(_("object database transaction already pending"));

	ret = odb_source_begin_transaction(odb->sources, out, flags);
	if (!ret)
		odb->transaction = *out;

	return ret;
}

int odb_transaction_commit(struct odb_transaction *transaction)
{
	int ret;

	if (!transaction)
		return 0;

	/*
	 * Ensure the transaction ending matches the pending transaction.
	 */
	ASSERT(transaction == transaction->source->odb->transaction);

	ret = transaction->commit(transaction);
	transaction->source->odb->transaction = NULL;

	return ret;
}

int odb_transaction_finalize(struct odb_transaction *transaction)
{
	int ret = 0;

	if (!transaction)
		return 0;

	if (transaction->finalize)
		ret = transaction->finalize(transaction);

	free(transaction);

	return ret;
}

int odb_transaction_write_object_stream(struct odb_transaction *transaction,
					struct odb_stream *stream,
					struct object_id *oid)
{
	return transaction->write_object_stream(transaction, stream, oid);
}

int odb_transaction_write_pack(struct odb_transaction *transaction, int pack_fd,
			       struct strbuf *err_msg,
			       const struct odb_transaction_write_pack_opts *opts)
{
	return transaction->write_pack(transaction, pack_fd, err_msg, opts);
}

int odb_transaction_env(struct odb_transaction *transaction, struct strvec *env)
{
	if (!transaction)
		return 0;

	return transaction->env(transaction, env);
}