]>
git.proxmox.com Git - libgit2.git/blob - src/odb_mempack.c
2 * Copyright (C) the libgit2 contributors. All rights reserved.
4 * This file is part of libgit2, distributed under the GNU GPL v2 with
5 * a Linking Exception. For full terms see the included COPYING file.
9 #include "git2/object.h"
10 #include "git2/sys/odb_backend.h"
17 #include "git2/odb_backend.h"
18 #include "git2/types.h"
19 #include "git2/pack.h"
30 struct memory_packer_db
{
31 git_odb_backend parent
;
33 git_array_t(struct memobject
*) commits
;
36 static int impl__write(git_odb_backend
*_backend
, const git_oid
*oid
, const void *data
, size_t len
, git_otype type
)
38 struct memory_packer_db
*db
= (struct memory_packer_db
*)_backend
;
39 struct memobject
*obj
= NULL
;
44 pos
= kh_put(oid
, db
->objects
, oid
, &rval
);
51 GITERR_CHECK_ALLOC_ADD(&alloc_len
, sizeof(struct memobject
), len
);
52 obj
= git__malloc(alloc_len
);
53 GITERR_CHECK_ALLOC(obj
);
55 memcpy(obj
->data
, data
, len
);
56 git_oid_cpy(&obj
->oid
, oid
);
60 kh_key(db
->objects
, pos
) = &obj
->oid
;
61 kh_val(db
->objects
, pos
) = obj
;
63 if (type
== GIT_OBJ_COMMIT
) {
64 struct memobject
**store
= git_array_alloc(db
->commits
);
65 GITERR_CHECK_ALLOC(store
);
72 static int impl__exists(git_odb_backend
*backend
, const git_oid
*oid
)
74 struct memory_packer_db
*db
= (struct memory_packer_db
*)backend
;
77 pos
= kh_get(oid
, db
->objects
, oid
);
78 if (pos
!= kh_end(db
->objects
))
84 static int impl__read(void **buffer_p
, size_t *len_p
, git_otype
*type_p
, git_odb_backend
*backend
, const git_oid
*oid
)
86 struct memory_packer_db
*db
= (struct memory_packer_db
*)backend
;
87 struct memobject
*obj
= NULL
;
90 pos
= kh_get(oid
, db
->objects
, oid
);
91 if (pos
== kh_end(db
->objects
))
94 obj
= kh_val(db
->objects
, pos
);
98 *buffer_p
= git__malloc(obj
->len
);
99 GITERR_CHECK_ALLOC(*buffer_p
);
101 memcpy(*buffer_p
, obj
->data
, obj
->len
);
105 static int impl__read_header(size_t *len_p
, git_otype
*type_p
, git_odb_backend
*backend
, const git_oid
*oid
)
107 struct memory_packer_db
*db
= (struct memory_packer_db
*)backend
;
108 struct memobject
*obj
= NULL
;
111 pos
= kh_get(oid
, db
->objects
, oid
);
112 if (pos
== kh_end(db
->objects
))
113 return GIT_ENOTFOUND
;
115 obj
= kh_val(db
->objects
, pos
);
122 int git_mempack_dump(git_buf
*pack
, git_repository
*repo
, git_odb_backend
*_backend
)
124 struct memory_packer_db
*db
= (struct memory_packer_db
*)_backend
;
125 git_packbuilder
*packbuilder
;
129 if (git_packbuilder_new(&packbuilder
, repo
) < 0)
132 for (i
= 0; i
< db
->commits
.size
; ++i
) {
133 struct memobject
*commit
= db
->commits
.ptr
[i
];
135 err
= git_packbuilder_insert_commit(packbuilder
, &commit
->oid
);
140 err
= git_packbuilder_write_buf(pack
, packbuilder
);
143 git_packbuilder_free(packbuilder
);
147 void git_mempack_reset(git_odb_backend
*_backend
)
149 struct memory_packer_db
*db
= (struct memory_packer_db
*)_backend
;
150 struct memobject
*object
= NULL
;
152 kh_foreach_value(db
->objects
, object
, {
156 git_array_clear(db
->commits
);
158 git_oidmap_free(db
->objects
);
159 db
->objects
= git_oidmap_alloc();
162 static void impl__free(git_odb_backend
*_backend
)
164 git_mempack_reset(_backend
);
168 int git_mempack_new(git_odb_backend
**out
)
170 struct memory_packer_db
*db
;
174 db
= git__calloc(1, sizeof(struct memory_packer_db
));
175 GITERR_CHECK_ALLOC(db
);
177 db
->objects
= git_oidmap_alloc();
179 db
->parent
.read
= &impl__read
;
180 db
->parent
.write
= &impl__write
;
181 db
->parent
.read_header
= &impl__read_header
;
182 db
->parent
.exists
= &impl__exists
;
183 db
->parent
.free
= &impl__free
;
185 *out
= (git_odb_backend
*)db
;