LIB_OBJS += odb.o
LIB_OBJS += odb/source.o
LIB_OBJS += odb/source-files.o
+LIB_OBJS += odb/source-inmemory.o
LIB_OBJS += odb/streaming.o
LIB_OBJS += odb/transaction.o
LIB_OBJS += oid-array.o
'odb.c',
'odb/source.c',
'odb/source-files.c',
+ 'odb/source-inmemory.c',
'odb/streaming.c',
'odb/transaction.c',
'oid-array.c',
#include "object-file.h"
#include "object-name.h"
#include "odb.h"
+#include "odb/source-inmemory.h"
#include "packfile.h"
#include "path.h"
#include "promisor-remote.h"
.type = OBJ_TREE,
.buf = "",
};
- const struct cached_object_entry *co = object_store->cached_objects;
+ const struct cached_object_entry *co = object_store->inmemory_objects->objects;
- for (size_t i = 0; i < object_store->cached_object_nr; i++, co++)
+ for (size_t i = 0; i < object_store->inmemory_objects->objects_nr; i++, co++)
if (oideq(&co->oid, oid))
return &co->value;
find_cached_object(odb, oid))
return 0;
- ALLOC_GROW(odb->cached_objects,
- odb->cached_object_nr + 1, odb->cached_object_alloc);
- co = &odb->cached_objects[odb->cached_object_nr++];
+ ALLOC_GROW(odb->inmemory_objects->objects,
+ odb->inmemory_objects->objects_nr + 1,
+ odb->inmemory_objects->objects_alloc);
+ co = &odb->inmemory_objects->objects[odb->inmemory_objects->objects_nr++];
co->value.size = len;
co->value.type = type;
co_buf = xmalloc(len);
o->sources = odb_source_new(o, primary_source, true);
o->sources_tail = &o->sources->next;
o->alternate_db = xstrdup_or_null(secondary_sources);
+ o->inmemory_objects = odb_source_inmemory_new(o);
free(to_free);
odb_close(o);
odb_free_sources(o);
- for (size_t i = 0; i < o->cached_object_nr; i++)
- free((char *) o->cached_objects[i].value.buf);
- free(o->cached_objects);
+ for (size_t i = 0; i < o->inmemory_objects->objects_nr; i++)
+ free((char *) o->inmemory_objects->objects[i].value.buf);
+ free(o->inmemory_objects->objects);
+ free(o->inmemory_objects->base.path);
+ free(o->inmemory_objects);
string_list_clear(&o->submodule_source_paths, 0);
#include "thread-utils.h"
struct cached_object_entry;
+struct odb_source_inmemory;
struct packed_git;
struct repository;
struct strbuf;
* to write them into the object store (e.g. a browse-only
* application).
*/
- struct cached_object_entry *cached_objects;
- size_t cached_object_nr, cached_object_alloc;
+ struct odb_source_inmemory *inmemory_objects;
/*
* A fast, rough count of the number of objects in the repository.
--- /dev/null
+#include "git-compat-util.h"
+#include "odb/source-inmemory.h"
+
+struct odb_source_inmemory *odb_source_inmemory_new(struct object_database *odb)
+{
+ struct odb_source_inmemory *source;
+
+ CALLOC_ARRAY(source, 1);
+ odb_source_init(&source->base, odb, ODB_SOURCE_INMEMORY, "source", false);
+
+ return source;
+}
--- /dev/null
+#ifndef ODB_SOURCE_INMEMORY_H
+#define ODB_SOURCE_INMEMORY_H
+
+#include "odb/source.h"
+
+struct cached_object_entry;
+
+/*
+ * An in-memory source that you can write objects to that shall be made
+ * available for reading, but that shouldn't ever be persisted to disk. Note
+ * that any objects written to this source will be stored in memory, so the
+ * number of objects you can store is limited by available system memory.
+ */
+struct odb_source_inmemory {
+ struct odb_source base;
+
+ struct cached_object_entry *objects;
+ size_t objects_nr, objects_alloc;
+};
+
+/* Create a new in-memory object database source. */
+struct odb_source_inmemory *odb_source_inmemory_new(struct object_database *odb);
+
+/*
+ * Cast the given object database source to the in-memory backend. This will
+ * cause a BUG in case the source doesn't use this backend.
+ */
+static inline struct odb_source_inmemory *odb_source_inmemory_downcast(struct odb_source *source)
+{
+ if (source->type != ODB_SOURCE_INMEMORY)
+ BUG("trying to downcast source of type '%d' to in-memory", source->type);
+ return container_of(source, struct odb_source_inmemory, base);
+}
+
+#endif
/* The "files" backend that uses loose objects and packfiles. */
ODB_SOURCE_FILES,
+
+ /* The "in-memory" backend that stores objects in memory. */
+ ODB_SOURCE_INMEMORY,
};
struct object_id;