If you use rebar just add
{deps, [
{q, ".*", {git, "git://github.com/michaelwittig/erlang-q.git", {tag, "v0.1.2"}}}
]}.
to your dependencies.
A Q connection in Erlang is a gen_server.
{ok, Pid} = q:connect(<<"localhost">>, 5000).
2 = q:execute(Pid, <<"1+1">>).
q:close(Pid).
{ok, Pid} = q:connect(<<"localhost">>, 5000).
15 = q:execute(Pid, <<"sum">>, q_ipcp:serialize_ints([1, 2, 3, 4, 5])).
q:close(Pid).
After you subscribe, incoming data is distributed using the gen_event behaviour.
Events are {q, Table, Data}
. If you want to print the data to sysour you can use q_demo_handler module.
{ok, Pid} = q:connect({q_demo_handler, []}, <<"localhost">>, 5000).
q:subscribe(Pid, <<"trade">>, <<"TEST">>).
Keep in mind that null values in Q are deserialized to atom null in Erlang.
1b => true
0b => false
q_ipcp:serialize_boolean(true) => 1b
q_ipcp:serialize_boolean(false) => 0b
0a369037-75d3-b24d-6721-5a1d44d4bed5 => <<10, 54, 144, 55, 117, 211, 178, 77, 103, 33, 90, 29, 68, 212, 190, 213>>
0Ng => null
q_ipcp:serialize_guid(<<10, 54, 144, 55, 117, 211, 178, 77, 103, 33, 90, 29, 68, 212, 190, 213>>) => 0a369037-75d3-b24d-6721-5a1d44d4bed5
q_ipcp:serialize_guid(null) => 0Ng
0x01 => <<1>>
q_ipcp:serialize_byte(<<1>>) => 0x01
1h => 1
0Nh => null
q_ipcp:serialize_short(1) => 1h
q_ipcp:serialize_short(null) => 0Nh
1i => 1
0Ni => null
q_ipcp:serialize_int(1) => 1i
q_ipcp:serialize_int(null) => 0Ni
1j => 1
0Nj => null
q_ipcp:serialize_long(1) => 1j
q_ipcp:serialize_long(null) => 0Nj
1.0e => 1.0
0Ne => null
q_ipcp:serialize_real(1.0) => 1.0e
q_ipcp:serialize_long(null) => 0Ne
1.0f => 1.0
0Nf => null
q_ipcp:serialize_float(1.0) => 1.0f
q_ipcp:serialize_float(null) => 0Nf
"a" => <<"a">>
q_ipcp:serialize_char(<<"a">>) => "a"
`a => <<"a">>
` => null
q_ipcp:serialize_symbol(a) => `a
q_ipcp:serialize_symbol(<<"a">>) => `a
q_ipcp:serialize_symbol(null) => `
2014.06.23D11:34:39.412547000 => 456838479412547000
0Np => null
q_ipcp:serialize_timestamp(456838479412547000) => 014.06.23D11:34:39.412547000
q_ipcp:serialize_timestamp(null) => 0Np
2014.01m => 168 % months since 2000.01
0Nm => null
q_ipcp:serialize_month(168) => 2014.01m
q_ipcp:serialize_month(null) => 0Nm
2014.01.01 => 5114 % days since 2000.01.01
0Nd => null
q_ipcp:serialize_date(5114) => 2014.01.01
q_ipcp:serialize_date(null) => 0Nd
2014.06.23T11:49:31.533 => 4662535674435194874
0Nz => null
q_ipcp:serialize_datetime(4662535674435194874) => 2014.06.23T11:49:31.533
q_ipcp:serialize_datetime(null) => 0Nz
00:01:00.000000000 => 60000000000
0Nn => null
q_ipcp:serialize_timespan(60000000000) => 00:01:00.000000000
q_ipcp:serialize_timespan(null) => 0Nn
00:01 => 1
0Nu => null
q_ipcp:serialize_minute(1) => 00:01
q_ipcp:serialize_minute(null) => 0Nu
00:00:01 => 1
0Nv => null
q_ipcp:serialize_second(1) => 00:00:01
q_ipcp:serialize_second(null) => 0Nv
00:00:00.001 => 1
0Nt => null
q_ipcp:serialize_time(1) => 00:00:00.001
q_ipcp:serialize_time(null) => 0Nt
(1j; 1b; `a) => [1, true, a]
() => []
q_ipcp:serialize_generallist([q_ipcp:serialize_long(1), q_ipcp:serialize_boolean(true), q_ipcp:serialize_symbol(a)])) => (1j; 1b; `a)
The items of a list are deserialized like described in the type.
(1i;2i;3i) => [1, 2, 3]
Each q_ipcp:serialize_TYPE(VALUE)
has a counterpart for lists q_ipcp:serialize_TYPEs([VALUE1, VALUE2])
q_ipcp:serialize_floats([1.0, 2.0, 3.0]) => (1.0f; 2.0f; 3.0f)
Each key value pair is represented as a tuple {Key, Value}
. The keys are values of a dict are deserialized like described in the type.
(`a`b)!(2 3) => [{<<"a">>, 2}, {<<"b">>, 3}]
NOT YET SUPPORTED
To handle tables in Erlang you should use q_table module.
([] a:enlist 2; b:enlist 3) => [{<<"a">>, [2]}, {<<"b">>, [3]}]
NOT YET SUPPORTED
If you want to create a Pull-Request please make sure that make test
runs without failures.
make test
make doc
- time types helper
- decompression of received bytes if they are compressed
- simple Erlang (de)serialization