odb: split `struct odb_transaction` into separate header

The current ODB transaction interface is colocated with other ODB
interfaces in "odb.{c,h}". Subsequent commits will expand `struct
odb_transaction` to support write operations on the transaction
directly. To keep things organized and prevent "odb.{c,h}" from becoming
more unwieldy, split out `struct odb_transaction` into a separate
header.

Signed-off-by: Justin Tobler <jltobler@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
main
Justin Tobler 2026-05-14 13:37:34 -05:00 committed by Junio C Hamano
parent 270e10ad6d
commit 5f6744d3eb
12 changed files with 74 additions and 56 deletions

View File

@ -1219,6 +1219,7 @@ LIB_OBJS += odb.o
LIB_OBJS += odb/source.o
LIB_OBJS += odb/source-files.o
LIB_OBJS += odb/streaming.o
LIB_OBJS += odb/transaction.o
LIB_OBJS += oid-array.o
LIB_OBJS += oidmap.o
LIB_OBJS += oidset.o

View File

@ -16,6 +16,7 @@
#include "run-command.h"
#include "object-file.h"
#include "odb.h"
#include "odb/transaction.h"
#include "parse-options.h"
#include "path.h"
#include "preload-index.h"

View File

@ -9,6 +9,7 @@
#include "hex.h"
#include "object-file.h"
#include "odb.h"
#include "odb/transaction.h"
#include "object.h"
#include "delta.h"
#include "pack.h"

View File

@ -19,6 +19,7 @@
#include "tree-walk.h"
#include "object-file.h"
#include "odb.h"
#include "odb/transaction.h"
#include "refs.h"
#include "resolve-undo.h"
#include "parse-options.h"

View File

@ -10,6 +10,7 @@
#include "cache-tree.h"
#include "object-file.h"
#include "odb.h"
#include "odb/transaction.h"
#include "read-cache-ll.h"
#include "replace-object.h"
#include "repository.h"

View File

@ -405,6 +405,7 @@ libgit_sources = [
'odb/source.c',
'odb/source-files.c',
'odb/streaming.c',
'odb/transaction.c',
'oid-array.c',
'oidmap.c',
'oidset.c',

View File

@ -21,6 +21,7 @@
#include "object-file.h"
#include "odb.h"
#include "odb/streaming.h"
#include "odb/transaction.h"
#include "oidtree.h"
#include "pack.h"
#include "packfile.h"

25
odb.c
View File

@ -1069,28 +1069,3 @@ void odb_reprepare(struct object_database *o)

obj_read_unlock();
}

struct odb_transaction *odb_transaction_begin(struct object_database *odb)
{
if (odb->transaction)
return NULL;

odb->transaction = odb_transaction_files_begin(odb->sources);

return odb->transaction;
}

void odb_transaction_commit(struct odb_transaction *transaction)
{
if (!transaction)
return;

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

transaction->commit(transaction);
transaction->source->odb->transaction = NULL;
free(transaction);
}

31
odb.h
View File

@ -35,24 +35,6 @@ struct packed_git;
struct packfile_store;
struct cached_object_entry;

/*
* A transaction may be started for an object database prior to writing new
* objects via odb_transaction_begin(). These objects are not committed until
* odb_transaction_commit() is invoked. Only a single transaction may be pending
* at a time.
*
* Each ODB source is expected to implement its own transaction handling.
*/
struct odb_transaction;
typedef void (*odb_transaction_commit_fn)(struct odb_transaction *transaction);
struct odb_transaction {
/* The ODB source the transaction is opened against. */
struct odb_source *source;

/* The ODB source specific callback invoked to commit a transaction. */
odb_transaction_commit_fn commit;
};

/*
* The object database encapsulates access to objects in a repository. It
* manages one or more sources that store the actual objects which are
@ -154,19 +136,6 @@ void odb_close(struct object_database *o);
*/
void odb_reprepare(struct object_database *o);

/*
* Starts an ODB transaction. Subsequent objects are written to the transaction
* and not committed until odb_transaction_commit() is invoked on the
* transaction. If the ODB already has a pending transaction, NULL is returned.
*/
struct odb_transaction *odb_transaction_begin(struct object_database *odb);

/*
* Commits an ODB transaction making the written objects visible. If the
* specified transaction is NULL, the function is a no-op.
*/
void odb_transaction_commit(struct odb_transaction *transaction);

/*
* Find source by its object directory path. Returns a `NULL` pointer in case
* the source could not be found.

28
odb/transaction.c Normal file
View File

@ -0,0 +1,28 @@
#include "git-compat-util.h"
#include "object-file.h"
#include "odb/transaction.h"

struct odb_transaction *odb_transaction_begin(struct object_database *odb)
{
if (odb->transaction)
return NULL;

odb->transaction = odb_transaction_files_begin(odb->sources);

return odb->transaction;
}

void odb_transaction_commit(struct odb_transaction *transaction)
{
if (!transaction)
return;

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

transaction->commit(transaction);
transaction->source->odb->transaction = NULL;
free(transaction);
}

38
odb/transaction.h Normal file
View File

@ -0,0 +1,38 @@
#ifndef ODB_TRANSACTION_H
#define ODB_TRANSACTION_H

#include "odb.h"
#include "odb/source.h"

/*
* A transaction may be started for an object database prior to writing new
* objects via odb_transaction_begin(). These objects are not committed until
* odb_transaction_commit() is invoked. Only a single transaction may be pending
* at a time.
*
* Each ODB source is expected to implement its own transaction handling.
*/
struct odb_transaction;
typedef void (*odb_transaction_commit_fn)(struct odb_transaction *transaction);
struct odb_transaction {
/* The ODB source the transaction is opened against. */
struct odb_source *source;

/* The ODB source specific callback invoked to commit a transaction. */
odb_transaction_commit_fn commit;
};

/*
* Starts an ODB transaction. Subsequent objects are written to the transaction
* and not committed until odb_transaction_commit() is invoked on the
* transaction. If the ODB already has a pending transaction, NULL is returned.
*/
struct odb_transaction *odb_transaction_begin(struct object_database *odb);

/*
* Commits an ODB transaction making the written objects visible. If the
* specified transaction is NULL, the function is a no-op.
*/
void odb_transaction_commit(struct odb_transaction *transaction);

#endif

View File

@ -20,6 +20,7 @@
#include "dir.h"
#include "object-file.h"
#include "odb.h"
#include "odb/transaction.h"
#include "oid-array.h"
#include "tree.h"
#include "commit.h"