]>
git.proxmox.com Git - libgit2.git/blob - src/odb_mempack.c
d9b3a1824ddfec97e52e9e4e5514bcec910f0eab
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
;
43 pos
= kh_put(oid
, db
->objects
, oid
, &rval
);
50 obj
= git__malloc(sizeof(struct memobject
) + len
);
51 GITERR_CHECK_ALLOC(obj
);
53 memcpy(obj
->data
, data
, len
);
54 git_oid_cpy(&obj
->oid
, oid
);
58 kh_key(db
->objects
, pos
) = &obj
->oid
;
59 kh_val(db
->objects
, pos
) = obj
;
61 if (type
== GIT_OBJ_COMMIT
) {
62 struct memobject
**store
= git_array_alloc(db
->commits
);
63 GITERR_CHECK_ALLOC(store
);
70 static int impl__exists(git_odb_backend
*backend
, const git_oid
*oid
)
72 struct memory_packer_db
*db
= (struct memory_packer_db
*)backend
;
75 pos
= kh_get(oid
, db
->objects
, oid
);
76 if (pos
!= kh_end(db
->objects
))
82 static int impl__read(void **buffer_p
, size_t *len_p
, git_otype
*type_p
, git_odb_backend
*backend
, const git_oid
*oid
)
84 struct memory_packer_db
*db
= (struct memory_packer_db
*)backend
;
85 struct memobject
*obj
= NULL
;
88 pos
= kh_get(oid
, db
->objects
, oid
);
89 if (pos
== kh_end(db
->objects
))
92 obj
= kh_val(db
->objects
, pos
);
96 *buffer_p
= git__malloc(obj
->len
);
97 GITERR_CHECK_ALLOC(*buffer_p
);
99 memcpy(*buffer_p
, obj
->data
, obj
->len
);
103 static int impl__read_header(size_t *len_p
, git_otype
*type_p
, git_odb_backend
*backend
, const git_oid
*oid
)
105 struct memory_packer_db
*db
= (struct memory_packer_db
*)backend
;
106 struct memobject
*obj
= NULL
;
109 pos
= kh_get(oid
, db
->objects
, oid
);
110 if (pos
== kh_end(db
->objects
))
111 return GIT_ENOTFOUND
;
113 obj
= kh_val(db
->objects
, pos
);
120 int git_mempack_dump(git_buf
*pack
, git_repository
*repo
, git_odb_backend
*_backend
)
122 struct memory_packer_db
*db
= (struct memory_packer_db
*)_backend
;
123 git_packbuilder
*packbuilder
;
127 if (git_packbuilder_new(&packbuilder
, repo
) < 0)
130 for (i
= 0; i
< db
->commits
.size
; ++i
) {
131 struct memobject
*commit
= db
->commits
.ptr
[i
];
133 err
= git_packbuilder_insert_commit(packbuilder
, &commit
->oid
);
138 err
= git_packbuilder_write_buf(pack
, packbuilder
);
141 git_packbuilder_free(packbuilder
);
145 void git_mempack_reset(git_odb_backend
*_backend
)
147 struct memory_packer_db
*db
= (struct memory_packer_db
*)_backend
;
148 struct memobject
*object
= NULL
;
150 kh_foreach_value(db
->objects
, object
, {
154 git_array_clear(db
->commits
);
157 static void impl__free(git_odb_backend
*_backend
)
159 git_mempack_reset(_backend
);
163 int git_mempack_new(git_odb_backend
**out
)
165 struct memory_packer_db
*db
;
169 db
= git__calloc(1, sizeof(struct memory_packer_db
));
170 GITERR_CHECK_ALLOC(db
);
172 db
->objects
= git_oidmap_alloc();
174 db
->parent
.read
= &impl__read
;
175 db
->parent
.write
= &impl__write
;
176 db
->parent
.read_header
= &impl__read_header
;
177 db
->parent
.exists
= &impl__exists
;
178 db
->parent
.free
= &impl__free
;
180 *out
= (git_odb_backend
*)db
;