2015-03-17 5 views
3

Я хочу реализовать крюк postcommit для riak, который уменьшает счетчик на карте в другом ведре. Тем не менее, у меня возникают проблемы с типичными типами данных riak., связанный с riak datatypes в postcommit hooks

Вот меня пытаются от riak console:

([email protected])9>{ok, C} = riak:local_client(). 
{ok,{riak_client,['[email protected]',undefined]}} 
([email protected])10>{ok, Obj} = C:get({<<"product">>, <<"default">>}, <<"1">>). 
{ok,{r_object,{<<"product">>,<<"default">>}, 
      <<"1">>, 
      [{r_content,{dict,5,16,16,8,80,48, 
          {[],[],[],[],[],[],[],[],[],[],[],[],...}, 
          {{[],[],[],[], 
           [[<<"dot">>|{<<"#\tþù"...>>,{...}}]], 
           [],[],[],[],[],...}}}, 
         <<69,2,0,0,0,11,114,105,97,107,95,100,116,95,109,97,112, 
         77,1,...>>}], 
      [{<<35,9,254,249,108,41,151,242>>,{1,63593788980}}], 
      {dict,1,16,16,8,80,48, 
       {[],[],[],[],[],[],[],[],[],[],[],[],[],...}, 
       {{[],[],[],[],[],[],[],[],[],[],[],...}}}, 
      undefined}} 
([email protected])11> Mp = riak_object:get_value(O3). 
<<69,2,0,0,0,11,114,105,97,107,95,100,116,95,109,97,112, 
    77,1,131,80,0,0,0,206,120,1,203,96,...>> 
([email protected])12> MpP = riak_dt_map:from_binary(Mp). 
{error,invalid_binary} 

product ведро тип данных установлен map. У каждого сохраненного объекта должен быть счетчик с именем quantity, который я хотел бы уменьшить.

Однако я не могу найти документацию или образец кода, относящиеся к типам данных в контексте до или после фиксации. (на самом деле примеров любого рода мало). Я читал источник riak_client и riak_dt_map, но я новичок в erlang, поэтому я делаю медленный прогресс и буду признателен за помощь.

ответ

2

В r_объекте, который у вас есть, прямо не содержится riak_dt_map, скорее он содержит riak_kv_crdt, содержащий riak_dt_map, который, в свою очередь, содержит ваш счетчик.

Чтобы обновить счетчик, вам нужно будет сначала получить контекст с карты:

{{Context,_},_}=riak_kv_crdt:value(Obj,riak_dt_map). 

Затем построить операцию, чтобы увеличить счетчик с именем < < «имя» >> на карте, содержащейся в CRDT:

Op = {crdt_op,riak_dt_map,{update,[{update,{<<"name">>,riak_dt_emcntr},increment}]},Context}. 

И затем применить эту операцию к CRDT, обеспечивая актер ID, который вы хотите использовать для обновления vclock/версии вектора:

NewObj = riak_kv_crdt:update(Obj,Actor,Op). 

Результатом должен быть другой r_объект, который готов к отправке обратно для хранения.

 Смежные вопросы

  • Нет связанных вопросов^_^