MODULE = Git::Raw			PACKAGE = Git::Raw::Odb

Odb
new(class)
	SV *class

	PREINIT:
		int rc;
		Odb out;
		git_odb *odb;

	CODE:
		rc = git_odb_new(&odb);
		git_check_error(rc);

		Newxz(out, 1, git_raw_odb);
		out -> odb = odb;
		RETVAL = out;

	OUTPUT: RETVAL

Odb
open(class, directory)
	SV *class
	SV *directory

	PREINIT:
		int rc;
		Odb out;
		git_odb *odb;

	CODE:
		rc = git_odb_open(&odb,
			git_ensure_pv(directory, "directory")
		);
		git_check_error(rc);

		Newxz(out, 1, git_raw_odb);
		out -> odb = odb;
		RETVAL = out;

	OUTPUT: RETVAL

void
add_backend(self, backend, priority)
	Odb self
	SV *backend
	int priority

	PREINIT:
		int rc;

	CODE:
		rc = git_odb_add_backend(self -> odb,
			GIT_SV_TO_PTR(Odb::Backend, backend),
			priority
		);
		git_check_error(rc);

		if (!self -> backends)
			self -> backends = newAV();

		av_push(self -> backends, SvRV(backend));
		SvREFCNT_inc_NN(SvRV(backend));

void
add_alternate(self, backend, priority)
	Odb self
	SV *backend
	int priority

	PREINIT:
		int rc;

	CODE:
		rc = git_odb_add_alternate(self -> odb,
			GIT_SV_TO_PTR(Odb::Backend, backend),
			priority
		);
		git_check_error(rc);

		if (!self -> backends)
			self -> backends = newAV();

		av_push(self -> backends, SvRV(backend));
		SvREFCNT_inc_NN(SvRV(backend));

SV *
backend_count(self)
	Odb self

	CODE:
		RETVAL = newSVuv(git_odb_num_backends(self -> odb));

	OUTPUT: RETVAL

void
foreach(self, cb)
	Odb self
	SV *cb

	PREINIT:
		int rc;

	CODE:
		rc = git_odb_foreach(self -> odb,
			git_odb_foreach_cbb,
			git_ensure_cv(cb, "callback")
		);
		if (rc != GIT_EUSER)
			git_check_error(rc);

Odb_Object
read(self, id)
	Odb self
	SV *id

	PREINIT:
		int rc;

		git_oid oid;

		STRLEN len;
		const char *id_str;

		Odb_Object obj;

	INIT:
		id_str = git_ensure_pv_with_len(id, "id", &len);

	CODE:
		rc = git_oid_fromstrn(&oid, id_str, len);
		git_check_error(rc);

		rc = git_odb_read_prefix(&obj, self -> odb, &oid, len);
		if (rc == GIT_ENOTFOUND)
			XSRETURN_UNDEF;
		git_check_error(rc);

		RETVAL = obj;

	OUTPUT: RETVAL

SV *
write(self, data, type)
	Odb self
	SV *data
	SV *type

	PREINIT:
		int rc;
		git_oid id;

		STRLEN len;
		const char *d;

	CODE:
		d = git_ensure_pv_with_len(data, "data", &len);

		rc = git_odb_write(&id, self -> odb, d, len,
			git_ensure_iv(type, "type")
		);
		git_check_error(rc);

		RETVAL = git_oid_to_sv(&id);

	OUTPUT: RETVAL

void
refresh(self)
	Odb self

	CODE:
		git_odb_refresh(self -> odb);

SV *
hash (self, data, type)
	SV *self
	SV *data
	SV *type

	PREINIT:
		int rc;
		git_oid id;

		STRLEN len;
		const char *d;

	CODE:
		d = git_ensure_pv_with_len(data, "data", &len);

		rc = git_odb_hash(&id, d, len,
			git_ensure_iv(type, "type")
		);
		git_check_error(rc);

		RETVAL = git_oid_to_sv(&id);

	OUTPUT: RETVAL

void
DESTROY(self)
	SV* self

	PREINIT:
		Odb odb;

	CODE:
		odb = GIT_SV_TO_PTR(Odb, self);
		git_odb_free(odb -> odb);

		if (odb -> backends)
			av_undef(odb -> backends);

		Safefree(odb);
		SvREFCNT_dec(GIT_SV_TO_MAGIC(self));