WIP: encoding #p_srvr and #projection_v1, just starting. Damn tedious.
This commit is contained in:
parent
d3b0b7fdc5
commit
2068f70700
3 changed files with 172 additions and 7 deletions
|
@ -83,6 +83,15 @@ message Mpb_FileInfo {
|
||||||
required string file_name = 2;
|
required string file_name = 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// #p_srvr{} type
|
||||||
|
message Mpb_P_Srvr {
|
||||||
|
required string name = 1;
|
||||||
|
required string proto_mod = 2;
|
||||||
|
required string address = 3;
|
||||||
|
required string port = 4;
|
||||||
|
required bytes props = 5;
|
||||||
|
}
|
||||||
|
|
||||||
//////////////////////////////////////////
|
//////////////////////////////////////////
|
||||||
//
|
//
|
||||||
// requests & responses
|
// requests & responses
|
||||||
|
@ -97,7 +106,21 @@ message Mpb_ErrorResp {
|
||||||
optional bytes extra = 3;
|
optional bytes extra = 3;
|
||||||
}
|
}
|
||||||
|
|
||||||
// ping() request & response
|
//////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// High Level API requests:
|
||||||
|
//
|
||||||
|
// echo() : Mpb_EchoReq and Mpb_EchoResp
|
||||||
|
// auth() : Mpb_AuthReq and Mpb_AuthResp
|
||||||
|
// append_chunk() : Mpb_AppendChunkReq and Mpb_AppendChunkResp
|
||||||
|
// write_chunk() : Mpb_WriteChunkReq and Mpb_WriteChunkResp
|
||||||
|
// read_chunk() : Mpb_ReadChunkReq and Mpb_ReadChunkResp
|
||||||
|
// checksum_list() : Mpb_ChecksumListReq and Mpb_ChecksumListResp
|
||||||
|
// list_files() : Mpb_ListFilesReq and Mpb_ListFilesResp
|
||||||
|
//
|
||||||
|
//////////////////////////////////////////
|
||||||
|
|
||||||
|
// High level API: echo() request & response
|
||||||
|
|
||||||
message Mpb_EchoReq {
|
message Mpb_EchoReq {
|
||||||
optional string message = 1;
|
optional string message = 1;
|
||||||
|
@ -107,7 +130,7 @@ message Mpb_EchoResp {
|
||||||
optional string message = 1;
|
optional string message = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Authentication request & response
|
// High level API: auth() request & response (not yet implemented)
|
||||||
|
|
||||||
message Mpb_AuthReq {
|
message Mpb_AuthReq {
|
||||||
required bytes user = 1;
|
required bytes user = 1;
|
||||||
|
@ -119,7 +142,7 @@ message Mpb_AuthResp {
|
||||||
// TODO: not implemented yet
|
// TODO: not implemented yet
|
||||||
}
|
}
|
||||||
|
|
||||||
// append_chunk() request & response
|
// High level API: append_chunk() request & response
|
||||||
|
|
||||||
message Mpb_AppendChunkReq {
|
message Mpb_AppendChunkReq {
|
||||||
optional bytes placement_key = 1;
|
optional bytes placement_key = 1;
|
||||||
|
@ -135,7 +158,7 @@ message Mpb_AppendChunkResp {
|
||||||
optional Mpb_ChunkPos chunk_pos = 2;
|
optional Mpb_ChunkPos chunk_pos = 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
// write_chunk() request & response
|
// High level API: write_chunk() request & response
|
||||||
|
|
||||||
message Mpb_WriteChunkReq {
|
message Mpb_WriteChunkReq {
|
||||||
required string file = 1;
|
required string file = 1;
|
||||||
|
@ -148,7 +171,7 @@ message Mpb_WriteChunkResp {
|
||||||
required Mpb_GeneralStatusCode status = 1;
|
required Mpb_GeneralStatusCode status = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// read_chunk() request & response
|
// High level API: read_chunk() request & response
|
||||||
|
|
||||||
message Mpb_ReadChunkReq {
|
message Mpb_ReadChunkReq {
|
||||||
required string file = 1;
|
required string file = 1;
|
||||||
|
@ -167,7 +190,7 @@ message Mpb_ReadChunkResp {
|
||||||
optional Mpb_ChunkCSum csum = 3;
|
optional Mpb_ChunkCSum csum = 3;
|
||||||
}
|
}
|
||||||
|
|
||||||
// checksum_list() request & response
|
// High level API: checksum_list() request & response
|
||||||
|
|
||||||
message Mpb_ChecksumListReq {
|
message Mpb_ChecksumListReq {
|
||||||
required string file = 1;
|
required string file = 1;
|
||||||
|
@ -178,7 +201,7 @@ message Mpb_ChecksumListResp {
|
||||||
optional bytes chunk = 2;
|
optional bytes chunk = 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
// list_files() request & response
|
// High level API: list_files() request & response
|
||||||
|
|
||||||
message Mpb_ListFilesReq {
|
message Mpb_ListFilesReq {
|
||||||
}
|
}
|
||||||
|
|
125
src/machi_pb_wrap.erl
Normal file
125
src/machi_pb_wrap.erl
Normal file
|
@ -0,0 +1,125 @@
|
||||||
|
%% -------------------------------------------------------------------
|
||||||
|
%%
|
||||||
|
%% Machi: a small village of replicated files
|
||||||
|
%%
|
||||||
|
%% Copyright (c) 2014-2015 Basho Technologies, Inc. All Rights Reserved.
|
||||||
|
%%
|
||||||
|
%% This file is provided to you under the Apache License,
|
||||||
|
%% Version 2.0 (the "License"); you may not use this file
|
||||||
|
%% except in compliance with the License. You may obtain
|
||||||
|
%% a copy of the License at
|
||||||
|
%%
|
||||||
|
%% http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
%%
|
||||||
|
%% Unless required by applicable law or agreed to in writing,
|
||||||
|
%% software distributed under the License is distributed on an
|
||||||
|
%% "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
%% KIND, either express or implied. See the License for the
|
||||||
|
%% specific language governing permissions and limitations
|
||||||
|
%% under the License.
|
||||||
|
%%
|
||||||
|
%% -------------------------------------------------------------------
|
||||||
|
-module(machi_pb_wrap).
|
||||||
|
|
||||||
|
-include("machi_pb.hrl").
|
||||||
|
-include("machi_projection.hrl").
|
||||||
|
|
||||||
|
-export([enc_p_srvr/1, dec_p_srvr/1,
|
||||||
|
enc_projection_v1/1, dec_projection_v1/1]).
|
||||||
|
-ifdef(TEST).
|
||||||
|
-compile(export_all).
|
||||||
|
-endif. % TEST
|
||||||
|
|
||||||
|
enc_p_srvr(#p_srvr{name=Name,
|
||||||
|
proto_mod=ProtoMod,
|
||||||
|
address=Address,
|
||||||
|
port=Port,
|
||||||
|
props=Props}) ->
|
||||||
|
machi_pb:encode_mpb_p_srvr(#mpb_p_srvr{name=to_list(Name),
|
||||||
|
proto_mod=to_list(ProtoMod),
|
||||||
|
address=to_list(Address),
|
||||||
|
port=to_list(Port),
|
||||||
|
props=todo_enc_opaque(Props)}).
|
||||||
|
|
||||||
|
dec_p_srvr(Bin) ->
|
||||||
|
#mpb_p_srvr{name=Name,
|
||||||
|
proto_mod=ProtoMod,
|
||||||
|
address=Address,
|
||||||
|
port=Port,
|
||||||
|
props=Props} = machi_pb:decode_mpb_p_srvr(Bin),
|
||||||
|
#p_srvr{name=to_atom(Name),
|
||||||
|
proto_mod=to_atom(ProtoMod),
|
||||||
|
address=to_list(Address),
|
||||||
|
port=to_integer(Port),
|
||||||
|
props=todo_dec_opaque(Props)}.
|
||||||
|
|
||||||
|
enc_projection_v1(#projection_v1{dbg=Dbg,
|
||||||
|
dbg2=Dbg2,
|
||||||
|
members_dict=MembersDict} = P) ->
|
||||||
|
term_to_binary(P#projection_v1{dbg=enc_sexp(Dbg),
|
||||||
|
dbg2=enc_sexp(Dbg2),
|
||||||
|
members_dict=enc_members_dict(MembersDict)}).
|
||||||
|
|
||||||
|
dec_projection_v1(Bin) ->
|
||||||
|
P = #projection_v1{dbg=Dbg,
|
||||||
|
dbg2=Dbg2,
|
||||||
|
members_dict=MembersDict} = binary_to_term(Bin),
|
||||||
|
P#projection_v1{dbg=dec_sexp(Dbg),
|
||||||
|
dbg2=dec_sexp(Dbg2),
|
||||||
|
members_dict=dec_members_dict(MembersDict)}.
|
||||||
|
|
||||||
|
%%%%%%%%%%%%%%%%%%%
|
||||||
|
|
||||||
|
enc_sexp(T) ->
|
||||||
|
lists:flatten(io_lib:format("~w.", [T])).
|
||||||
|
|
||||||
|
dec_sexp(String) ->
|
||||||
|
{ok,Tks,_} = erl_scan:string(String),
|
||||||
|
{ok,E} = erl_parse:parse_exprs(Tks),
|
||||||
|
{value,Funs,_} = erl_eval:exprs(E,[]),
|
||||||
|
Funs.
|
||||||
|
|
||||||
|
enc_members_dict(D) ->
|
||||||
|
%% Use list_to_binary() here to "flatten" the serialized #p_srvr{}
|
||||||
|
[{K, list_to_binary(enc_p_srvr(V))} || {K, V} <- orddict:to_list(D)].
|
||||||
|
|
||||||
|
dec_members_dict(List) ->
|
||||||
|
orddict:from_list([{K, dec_p_srvr(V)} || {K, V} <- List]).
|
||||||
|
|
||||||
|
to_binary(X) when is_list(X) ->
|
||||||
|
list_to_binary(X);
|
||||||
|
to_binary(X) when is_integer(X) ->
|
||||||
|
list_to_binary(integer_to_list(X));
|
||||||
|
to_binary(X) when is_atom(X) ->
|
||||||
|
erlang:atom_to_binary(X, latin1);
|
||||||
|
to_binary(X) when is_binary(X) ->
|
||||||
|
X.
|
||||||
|
|
||||||
|
to_list(X) when is_atom(X) ->
|
||||||
|
atom_to_list(X);
|
||||||
|
to_list(X) when is_binary(X) ->
|
||||||
|
binary_to_list(X);
|
||||||
|
to_list(X) when is_integer(X) ->
|
||||||
|
integer_to_list(X);
|
||||||
|
to_list(X) when is_list(X) ->
|
||||||
|
X.
|
||||||
|
|
||||||
|
to_atom(X) when is_list(X) ->
|
||||||
|
list_to_atom(X);
|
||||||
|
to_atom(X) when is_binary(X) ->
|
||||||
|
erlang:binary_to_atom(X, latin1);
|
||||||
|
to_atom(X) when is_atom(X) ->
|
||||||
|
X.
|
||||||
|
|
||||||
|
to_integer(X) when is_list(X) ->
|
||||||
|
list_to_integer(X);
|
||||||
|
to_integer(X) when is_binary(X) ->
|
||||||
|
list_to_binary(binary_to_list(X));
|
||||||
|
to_integer(X) when is_integer(X) ->
|
||||||
|
X.
|
||||||
|
|
||||||
|
todo_enc_opaque(X) ->
|
||||||
|
erlang:term_to_binary(X).
|
||||||
|
|
||||||
|
todo_dec_opaque(X) ->
|
||||||
|
erlang:binary_to_term(X).
|
|
@ -22,6 +22,7 @@
|
||||||
-module(machi_pb_test).
|
-module(machi_pb_test).
|
||||||
|
|
||||||
-include("machi_pb.hrl").
|
-include("machi_pb.hrl").
|
||||||
|
-include("machi_projection.hrl").
|
||||||
|
|
||||||
-compile(export_all).
|
-compile(export_all).
|
||||||
|
|
||||||
|
@ -62,6 +63,22 @@ smoke_responses_test() ->
|
||||||
|
|
||||||
ok.
|
ok.
|
||||||
|
|
||||||
|
smoke_p_srvr_test() ->
|
||||||
|
P1 = #p_srvr{name=a, address="localhost", port=5555,
|
||||||
|
props=[{dir,"./data.a"}]},
|
||||||
|
P1 = machi_pb_wrap:dec_p_srvr(
|
||||||
|
list_to_binary(machi_pb_wrap:enc_p_srvr(P1))),
|
||||||
|
ok.
|
||||||
|
|
||||||
|
smoke_projection_v1_test() ->
|
||||||
|
P1 = #p_srvr{name=a, address="localhost", port=5555,
|
||||||
|
props=[{dir,"./data.a"}]},
|
||||||
|
D = orddict:from_list([ {P1#p_srvr.name, P1} ]),
|
||||||
|
Proj1 = machi_projection:new(a, D, [a], [], [], [{property, 42}]),
|
||||||
|
Proj1 = machi_pb_wrap:dec_projection_v1(
|
||||||
|
machi_pb_wrap:enc_projection_v1(Proj1)),
|
||||||
|
ok.
|
||||||
|
|
||||||
encdec_request(M) ->
|
encdec_request(M) ->
|
||||||
machi_pb:decode_mpb_request(
|
machi_pb:decode_mpb_request(
|
||||||
list_to_binary(machi_pb:encode_mpb_request(M))).
|
list_to_binary(machi_pb:encode_mpb_request(M))).
|
||||||
|
|
Loading…
Reference in a new issue