# Erlang client for Antiodote
[![Build Status](https://travis-ci.org/AntidoteDB/antidote-erlang-client.svg?branch=master)](https://travis-ci.org/AntidoteDB/antidote-erlang-client)
## Interface for transactions
* start\_transaction (Pid, timestamp, properties) --> transaction\_descriptor
starts a new transaction and returns a transaction_descriptor which is a transaction identifier to be used with further operations of the transaction. timestamp provides the causality information. properties is a list of configurable parameters for the transaction. Currently only property supported which specifies to use static or interactive transactions.
Example:
Clock = term_to_binary(ignore), %% First time there is no clock information
{ok, TxId} = start_transaction(Pid, Clock, [{static=true}]). %% Use static transactions
* read\_objects (Pid, [bound\_object], transaction\_descriptor) --> {ok, Vals}
reads a set of keys.
Example:
{ok, [Val1, Val2]} = ([O1, O2], TxId),
Value = antidotec_counter:value(Val1). %% Assuming O1 is of type counter
* update\_objects (Pid, [{bound\_object, operation, op_parameters}], transaction\_descriptor) -> ok
update a set of object with the specified operations. operation is any allowed (upstream) operation on the crdt type for bound\_object, op\_parameters are parameters to the operation.
Example:
Obj = antidotec_counter:increment(1, antidotec_counter:new()),
ok = antidotec_pb:update_objects(Pid,
antidotec_counter:to_ops(BObj, Obj),
TxId).
* abort\_transaction (Pid, transaction_descriptor)
aborts a transaction
* commit\_transaction (Pid, transaction_descriptor) --> {ok,timestamp} OR aborted
## Example
%% Starts pb socket
{ok, Pid} = antidotec_pb_socket:start(?ADDRESS, ?PORT),
BObj = {Key, riak_dt_pncounter, Bucket},
Obj = antidotec_counter:increment(Amount, antidotec_counter:new()),
{ok, TxId} = antidotec_pb:start_transaction(Pid, term_to_binary(ignore), {}),
ok = antidotec_pb:update_objects(Pid,
antidotec_counter:to_ops(BObj, Obj),
TxId),
{ok, TimeStamp} = antidotec_pb:commit_transaction(Pid, TxId),
%% Use TimeStamp for subsequent transactions if required
{ok, TxId2} = antidotec_pb:start_transaction(Pid, TimeStamp, [{static=true}]),
...
...
%% Close pb socket
_Disconnected = antidotec_pb_socket:stop(Pid),