*/
#include "common.h"
+
#include "git2/object.h"
#include "git2/sys/odb_backend.h"
-#include "fileops.h"
+#include "git2/sys/mempack.h"
+#include "futils.h"
#include "hash.h"
#include "odb.h"
#include "array.h"
#include "git2/types.h"
#include "git2/pack.h"
-GIT__USE_OIDMAP
-
struct memobject {
git_oid oid;
size_t len;
- git_otype type;
- char data[];
+ git_object_t type;
+ char data[GIT_FLEX_ARRAY];
};
struct memory_packer_db {
git_array_t(struct memobject *) commits;
};
-static int impl__write(git_odb_backend *_backend, const git_oid *oid, const void *data, size_t len, git_otype type)
+static int impl__write(git_odb_backend *_backend, const git_oid *oid, const void *data, size_t len, git_object_t type)
{
struct memory_packer_db *db = (struct memory_packer_db *)_backend;
- struct memobject *obj = NULL;
- khiter_t pos;
+ struct memobject *obj = NULL;
size_t alloc_len;
- int rval;
-
- pos = kh_put(oid, db->objects, oid, &rval);
- if (rval < 0)
- return -1;
- if (rval == 0)
+ if (git_oidmap_exists(db->objects, oid))
return 0;
- GITERR_CHECK_ALLOC_ADD(&alloc_len, sizeof(struct memobject), len);
+ GIT_ERROR_CHECK_ALLOC_ADD(&alloc_len, sizeof(struct memobject), len);
obj = git__malloc(alloc_len);
- GITERR_CHECK_ALLOC(obj);
+ GIT_ERROR_CHECK_ALLOC(obj);
memcpy(obj->data, data, len);
git_oid_cpy(&obj->oid, oid);
obj->len = len;
obj->type = type;
- kh_key(db->objects, pos) = &obj->oid;
- kh_val(db->objects, pos) = obj;
+ if (git_oidmap_set(db->objects, &obj->oid, obj) < 0)
+ return -1;
- if (type == GIT_OBJ_COMMIT) {
+ if (type == GIT_OBJECT_COMMIT) {
struct memobject **store = git_array_alloc(db->commits);
- GITERR_CHECK_ALLOC(store);
+ GIT_ERROR_CHECK_ALLOC(store);
*store = obj;
}
static int impl__exists(git_odb_backend *backend, const git_oid *oid)
{
struct memory_packer_db *db = (struct memory_packer_db *)backend;
- khiter_t pos;
- pos = kh_get(oid, db->objects, oid);
- if (pos != kh_end(db->objects))
- return 1;
-
- return 0;
+ return git_oidmap_exists(db->objects, oid);
}
-static int impl__read(void **buffer_p, size_t *len_p, git_otype *type_p, git_odb_backend *backend, const git_oid *oid)
+static int impl__read(void **buffer_p, size_t *len_p, git_object_t *type_p, git_odb_backend *backend, const git_oid *oid)
{
struct memory_packer_db *db = (struct memory_packer_db *)backend;
- struct memobject *obj = NULL;
- khiter_t pos;
+ struct memobject *obj;
- pos = kh_get(oid, db->objects, oid);
- if (pos == kh_end(db->objects))
+ if ((obj = git_oidmap_get(db->objects, oid)) == NULL)
return GIT_ENOTFOUND;
- obj = kh_val(db->objects, pos);
-
*len_p = obj->len;
*type_p = obj->type;
*buffer_p = git__malloc(obj->len);
- GITERR_CHECK_ALLOC(*buffer_p);
+ GIT_ERROR_CHECK_ALLOC(*buffer_p);
memcpy(*buffer_p, obj->data, obj->len);
return 0;
}
-static int impl__read_header(size_t *len_p, git_otype *type_p, git_odb_backend *backend, const git_oid *oid)
+static int impl__read_header(size_t *len_p, git_object_t *type_p, git_odb_backend *backend, const git_oid *oid)
{
struct memory_packer_db *db = (struct memory_packer_db *)backend;
- struct memobject *obj = NULL;
- khiter_t pos;
+ struct memobject *obj;
- pos = kh_get(oid, db->objects, oid);
- if (pos == kh_end(db->objects))
+ if ((obj = git_oidmap_get(db->objects, oid)) == NULL)
return GIT_ENOTFOUND;
- obj = kh_val(db->objects, pos);
-
*len_p = obj->len;
*type_p = obj->type;
return 0;
return err;
}
-void git_mempack_reset(git_odb_backend *_backend)
+int git_mempack_reset(git_odb_backend *_backend)
{
struct memory_packer_db *db = (struct memory_packer_db *)_backend;
struct memobject *object = NULL;
- kh_foreach_value(db->objects, object, {
+ git_oidmap_foreach_value(db->objects, object, {
git__free(object);
});
git_array_clear(db->commits);
git_oidmap_clear(db->objects);
+
+ return 0;
}
static void impl__free(git_odb_backend *_backend)
{
struct memory_packer_db *db = (struct memory_packer_db *)_backend;
+ git_mempack_reset(_backend);
git_oidmap_free(db->objects);
git__free(db);
}
assert(out);
db = git__calloc(1, sizeof(struct memory_packer_db));
- GITERR_CHECK_ALLOC(db);
+ GIT_ERROR_CHECK_ALLOC(db);
- db->objects = git_oidmap_alloc();
+ if (git_oidmap_new(&db->objects) < 0)
+ return -1;
+ db->parent.version = GIT_ODB_BACKEND_VERSION;
db->parent.read = &impl__read;
db->parent.write = &impl__write;
db->parent.read_header = &impl__read_header;