| #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); | |
| } |