]>
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.
16 #include "pack-objects.h"
18 #include "git2/odb_backend.h"
19 #include "git2/object.h"
20 #include "git2/types.h"
21 #include "git2/pack.h"
22 #include "git2/sys/odb_backend.h"
23 #include "git2/sys/mempack.h"
29 char data
[GIT_FLEX_ARRAY
];
32 struct memory_packer_db
{
33 git_odb_backend parent
;
35 git_array_t(struct memobject
*) commits
;
38 static int impl__write(git_odb_backend
*_backend
, const git_oid
*oid
, const void *data
, size_t len
, git_object_t type
)
40 struct memory_packer_db
*db
= (struct memory_packer_db
*)_backend
;
41 struct memobject
*obj
= NULL
;
44 if (git_oidmap_exists(db
->objects
, oid
))
47 GIT_ERROR_CHECK_ALLOC_ADD(&alloc_len
, sizeof(struct memobject
), len
);
48 obj
= git__malloc(alloc_len
);
49 GIT_ERROR_CHECK_ALLOC(obj
);
51 memcpy(obj
->data
, data
, len
);
52 git_oid_cpy(&obj
->oid
, oid
);
56 if (git_oidmap_set(db
->objects
, &obj
->oid
, obj
) < 0)
59 if (type
== GIT_OBJECT_COMMIT
) {
60 struct memobject
**store
= git_array_alloc(db
->commits
);
61 GIT_ERROR_CHECK_ALLOC(store
);
68 static int impl__exists(git_odb_backend
*backend
, const git_oid
*oid
)
70 struct memory_packer_db
*db
= (struct memory_packer_db
*)backend
;
72 return git_oidmap_exists(db
->objects
, oid
);
75 static int impl__read(void **buffer_p
, size_t *len_p
, git_object_t
*type_p
, git_odb_backend
*backend
, const git_oid
*oid
)
77 struct memory_packer_db
*db
= (struct memory_packer_db
*)backend
;
78 struct memobject
*obj
;
80 if ((obj
= git_oidmap_get(db
->objects
, oid
)) == NULL
)
85 *buffer_p
= git__malloc(obj
->len
);
86 GIT_ERROR_CHECK_ALLOC(*buffer_p
);
88 memcpy(*buffer_p
, obj
->data
, obj
->len
);
92 static int impl__read_header(size_t *len_p
, git_object_t
*type_p
, git_odb_backend
*backend
, const git_oid
*oid
)
94 struct memory_packer_db
*db
= (struct memory_packer_db
*)backend
;
95 struct memobject
*obj
;
97 if ((obj
= git_oidmap_get(db
->objects
, oid
)) == NULL
)
105 static int git_mempack__dump(
107 git_repository
*repo
,
108 git_odb_backend
*_backend
)
110 struct memory_packer_db
*db
= (struct memory_packer_db
*)_backend
;
111 git_packbuilder
*packbuilder
;
115 if (git_packbuilder_new(&packbuilder
, repo
) < 0)
118 git_packbuilder_set_threads(packbuilder
, 0);
120 for (i
= 0; i
< db
->commits
.size
; ++i
) {
121 struct memobject
*commit
= db
->commits
.ptr
[i
];
123 err
= git_packbuilder_insert_commit(packbuilder
, &commit
->oid
);
128 err
= git_packbuilder__write_buf(pack
, packbuilder
);
131 git_packbuilder_free(packbuilder
);
135 int git_mempack_dump(
137 git_repository
*repo
,
138 git_odb_backend
*_backend
)
140 GIT_BUF_WRAP_PRIVATE(pack
, git_mempack__dump
, repo
, _backend
);
143 int git_mempack_reset(git_odb_backend
*_backend
)
145 struct memory_packer_db
*db
= (struct memory_packer_db
*)_backend
;
146 struct memobject
*object
= NULL
;
148 git_oidmap_foreach_value(db
->objects
, object
, {
152 git_array_clear(db
->commits
);
154 git_oidmap_clear(db
->objects
);
159 static void impl__free(git_odb_backend
*_backend
)
161 struct memory_packer_db
*db
= (struct memory_packer_db
*)_backend
;
163 git_mempack_reset(_backend
);
164 git_oidmap_free(db
->objects
);
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 GIT_ERROR_CHECK_ALLOC(db
);
177 if (git_oidmap_new(&db
->objects
) < 0)
180 db
->parent
.version
= GIT_ODB_BACKEND_VERSION
;
181 db
->parent
.read
= &impl__read
;
182 db
->parent
.write
= &impl__write
;
183 db
->parent
.read_header
= &impl__read_header
;
184 db
->parent
.exists
= &impl__exists
;
185 db
->parent
.free
= &impl__free
;
187 *out
= (git_odb_backend
*)db
;