From 0127730f6bba357d4e4620991a5652fd48655465 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Mart=C3=ADn=20Nieto?= Date: Fri, 26 Apr 2013 14:32:07 +0200 Subject: [PATCH] Add geef_index:read_tree() --- c_src/geef.c | 3 ++- c_src/index.c | 19 +++++++++++++++++++ c_src/index.h | 2 +- src/geef_index.erl | 10 ++++++++-- src/geef_nif.erl | 6 +++++- 5 files changed, 35 insertions(+), 5 deletions(-) diff --git a/c_src/geef.c b/c_src/geef.c index e39e888..1a0d14d 100644 --- a/c_src/geef.c +++ b/c_src/geef.c @@ -147,7 +147,8 @@ static ErlNifFunc geef_funcs[] = {"index_write", 1, geef_index_write}, {"index_write_tree", 1, geef_index_write_tree}, {"index_write_tree", 2, geef_index_write_tree}, - {"index_clear", 1, geef_index_clear}, + {"index_clear", 1, geef_index_clear}, + {"index_read_tree", 2, geef_index_read_tree}, }; ERL_NIF_INIT(geef_nif, geef_funcs, load, NULL, upgrade, unload) diff --git a/c_src/index.c b/c_src/index.c index 938309d..f84ca4a 100644 --- a/c_src/index.c +++ b/c_src/index.c @@ -1,6 +1,7 @@ #include "geef.h" #include "oid.h" #include "index.h" +#include "object.h" #include #include @@ -73,6 +74,24 @@ geef_index_write_tree(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) return enif_make_tuple2(env, atoms.ok, enif_make_binary(env, &bin)); } +ERL_NIF_TERM +geef_index_read_tree(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) +{ + geef_index *index; + geef_object *tree; + + if (!enif_get_resource(env, argv[0], geef_index_type, (void **) &index)) + return enif_make_badarg(env); + + if (!enif_get_resource(env, argv[0], geef_object_type, (void **) &tree)) + return enif_make_badarg(env); + + if (git_index_read_tree(index->index, (git_tree *)tree->obj) < 0) + return geef_error(env); + + return atoms.ok; +} + ERL_NIF_TERM geef_index_clear(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) { diff --git a/c_src/index.h b/c_src/index.h index 6102296..adaf1e8 100644 --- a/c_src/index.h +++ b/c_src/index.h @@ -16,6 +16,6 @@ void geef_index_free(ErlNifEnv *env, void *cd); ERL_NIF_TERM geef_index_write(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]); ERL_NIF_TERM geef_index_write_tree(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]); ERL_NIF_TERM geef_index_clear(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]); - +ERL_NIF_TERM geef_index_read_tree(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]); #endif diff --git a/src/geef_index.erl b/src/geef_index.erl index 67cb89e..fe2f3c6 100644 --- a/src/geef_index.erl +++ b/src/geef_index.erl @@ -12,7 +12,7 @@ %% API -export([start_link/1]). --export([new/0, write/1, write_tree/1, write_tree/2, clear/1, stop/1]). +-export([new/0, write/1, write_tree/1, write_tree/2, clear/1, stop/1, read_tree/2]). %% gen_server callbacks -export([init/1, handle_call/3, handle_cast/2, handle_info/2, @@ -48,6 +48,9 @@ write_tree(Pid) -> write_tree(Pid, Repo) -> gen_server:call(Pid, {write_tree, Repo}). +read_tree(Pid, #object{type=tree, handle=TreeHandle}) -> + gen_server:call(Pid, {read_tree, TreeHandle}). + %% @doc Clear the contents of the index. -spec clear(pid()) -> ok. clear(Pid) -> @@ -86,7 +89,10 @@ handle_call(clear, _From, State = #state{handle=Handle}) -> Reply = geef_nif:index_clear(Handle), {reply, Reply, State}; handle_call(stop, _From, State) -> - {stop, normal, ok, State}. + {stop, normal, ok, State}; +handle_call({read_tree, TreeHandle}, _From, State = #state{handle=Handle}) -> + Reply = geef_nif:index_read_tree(Handle, TreeHandle), + {reply, Reply, State}. %% @private handle_cast(_Msg, State) -> diff --git a/src/geef_nif.erl b/src/geef_nif.erl index 9121ea3..99f0b58 100644 --- a/src/geef_nif.erl +++ b/src/geef_nif.erl @@ -23,7 +23,8 @@ -export([revwalk_new/1, revwalk_push/3, revwalk_next/1, revwalk_sorting/2, revwalk_reset/1]). % index --export([index_new/0, index_write/1, index_write_tree/1, index_write_tree/2, index_clear/1]). +-export([index_new/0, index_write/1, index_write_tree/1, index_write_tree/2, + index_clear/1, index_read_tree/2]). -on_load(load_enif/0). @@ -147,6 +148,9 @@ index_write_tree(_Handle) -> index_write_tree(_Handle, _RepoHandle) -> ?NIF_FN. +index_read_tree(_Handle, _TreeHandle) -> + ?NIF_FN. + index_clear(_Handle) -> ?NIF_FN.