Skip to content

Instantly share code, notes, and snippets.

@wdshin
Created January 6, 2021 07:52
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save wdshin/7f0df340ddc84de31414b22c00ed950a to your computer and use it in GitHub Desktop.
Save wdshin/7f0df340ddc84de31414b22c00ed950a to your computer and use it in GitHub Desktop.
cql_counter.erl
%%%-------------------------------------------------------------------
%%% @author 신원동 <wdshin@CTO-Wondong-Shin.local>
%%% @copyright (C) 2015, 신원동
%%% @doc
%%%
%%% @end
%%% Created : 31 Aug 2015 by 신원동 <wdshin@CTO-Wondong-Shin.local>
%%%-------------------------------------------------------------------
-module(cql_counter).
%% API
-export([]).
-compile(export_all).
%%%===================================================================
%%% API
%%%===================================================================
%%--------------------------------------------------------------------
%% @doc
%% @spec
%% @end
%%--------------------------------------------------------------------
%%%===================================================================
%%% Internal functions
%%%===================================================================
get_table() ->
<<"fly.bucket_key_counter">>.
get_table2() ->
<<"fly.bucket_key_counter2">>.
create_tables() ->
C = cql:client(),
create_tables_to(C),
ok.
create_tables(dse5) ->
C5 = cql:client_dse5(),
create_tables_to(C5),
ok.
create_tables_to(C) ->
cql:create_table_to(
C,
get_table(),
[ { bucket , text } ,
{ key , text },
{ counter_value, counter }
]
,
[ bucket , key ]
),
cql:create_table_to(
C,
get_table2(),
[ { bucket , text } ,
{ key , text },
{ key2 , text },
{ counter_value, counter }
]
,
[ bucket , key , key2 ]
).
drop_tables() ->
cql:drop_table(get_table()),
cql:drop_table(get_table2()).
migrate() ->
create_tables(dse5),
C = cql:client_dse5(),
Fun = fun({Cli,Tab},X) ->
cql:update_to(Cli,Tab,
[ { counter_value , { counter, m_kv:get_integer(counter_value,X) } } ],
[ { bucket , m_kv:get_binary(bucket,X) },
{ key, m_kv:get_binary(key,X) } ] )
end,
Done = cql:for_list_fetch_do(get_table(),[bucket,key,counter_value],Fun,
{C,get_table()}),
m_logger:log("~p ~p migrated ~p from ~p ",[?MODULE,?LINE,Done,get_table()]),
Fun2 = fun({Cli,Tab},X) ->
cql:update_to(Cli,Tab,
[ { counter_value , { counter, m_kv:get_integer(counter_value,X) } } ],
[ { bucket , m_kv:get_binary(bucket,X) },
{ key, m_kv:get_binary(key,X) } ,
{ key2, m_kv:get_binary(key2,X) } ] )
end,
Done2 = cql:for_list_fetch_do(get_table2(),[bucket,key,counter_value],Fun2,
{C,get_table2()}),
m_logger:log("~p ~p migrated ~p from ~p ",[?MODULE,?LINE,Done2,get_table2()]),
ok.
inc(Bucket,Key) when is_binary(Bucket) andalso Bucket =/= <<"">> andalso is_binary(Key) andalso Key =/= <<"">> ->
CounterTable= get_table(),
SQL = << <<"update ">>/binary, CounterTable/binary, <<" set counter_value = counter_value + 1 where bucket = '">>/binary,
Bucket/binary, <<"' and key = '">>/binary , Key/binary , <<"';">>/binary >>,
C = cql:client(),
R = cql:run_query(C,SQL),
cql:close_client(C),
case R of
{ ok , _ } ->
ok;
_ ->
m_logger:log(warning,"~p ~p inc_count ~p ~p ~s ~p",[?MODULE,?LINE,Bucket,Key,SQL,R]),
R
end;
inc(_,_) ->
{ error, invalid_bucket_key }.
inc2(Bucket,Key,Key2) when is_binary(Bucket) andalso is_binary(Key) andalso is_binary(Key2)->
CounterTable= get_table2(),
SQL = << <<"update ">>/binary, CounterTable/binary, <<" set counter_value = counter_value + 1 where bucket = '">>/binary,
Bucket/binary, <<"' and key = '">>/binary , Key/binary , <<"' and key2 = '">>/binary, Key2/binary , <<"';">>/binary >>,
C = cql:client(),
R = cql:run_query(C,SQL),
cql:close_client(C),
case R of
{ ok , _ } ->
ok;
_ ->
m_logger:log(warning,"~p ~p inc_count2 ~p ~p ~p ~s ~p",[?MODULE,?LINE,Bucket,Key,Key2,SQL,R]),
R
end.
dec(Bucket,Key) when is_binary(Bucket) andalso is_binary(Key) ->
CounterTable= get_table(),
SQL = << <<"update ">>/binary, CounterTable/binary, <<" set counter_value = counter_value - 1 where bucket = '">>/binary,
Bucket/binary, <<"' and key = '">>/binary , Key/binary , <<"';">>/binary >>,
C = cql:client(),
R = cql:run_query(C,SQL),
cql:close_client(C),
case R of
{ ok , _ } ->
ok;
_ ->
m_logger:log(warning,"~p ~p dec_count ~p ~p ~s ~p",[?MODULE,?LINE,Bucket,Key,SQL,R]),
R
end.
dec2(Bucket,Key,Key2) when is_binary(Bucket) andalso is_binary(Key) ->
CounterTable= get_table2(),
SQL = << <<"update ">>/binary, CounterTable/binary, <<" set counter_value = counter_value - 1 where bucket = '">>/binary,
Bucket/binary, <<"' and key = '">>/binary , Key/binary , <<"' and key2 = '">>/binary, Key2/binary , <<"';">>/binary >>,
C = cql:client(),
R = cql:run_query(C,SQL),
cql:close_client(C),
case R of
{ ok , _ } ->
ok;
_ ->
m_logger:log(warning,"~p ~p dec_count2 ~p ~p ~p ~s ~p",[?MODULE,?LINE,Bucket,Key,Key2,SQL,R]),
R
end.
zero(Bucket,Key) when is_binary(Bucket) andalso is_binary(Key) ->
MyCounter = m_conv:any_to_binary(get(Bucket,Key)),
CounterTable= get_table(),
SQL = << <<"update ">>/binary, CounterTable/binary, <<" set counter_value = counter_value - ">>/binary, MyCounter/binary, <<" where bucket = '">>/binary,
Bucket/binary, <<"' and key = '">>/binary , Key/binary , <<"';">>/binary >>,
C = cql:client(),
R = cql:run_query(C,SQL),
cql:close_client(C),
case R of
{ ok , _ } ->
ok;
_ ->
m_logger:log(warning,"~p ~p dec_count ~p ~p ~s ~p",[?MODULE,?LINE,Bucket,Key,SQL,R]),
R
end.
add(Bucket,Key,Add) when is_binary(Bucket) andalso is_binary(Key) andalso is_integer(Add) andalso Add =:= 0 ->
ok;
add(Bucket,Key,Add) when is_binary(Bucket) andalso is_binary(Key) andalso is_integer(Add) andalso Add =:= 1 ->
inc(Bucket,Key);
add(Bucket,Key,Add) when is_binary(Bucket) andalso is_binary(Key) andalso is_integer(Add) andalso Add =:= -1 ->
dec(Bucket,Key);
add(Bucket,Key,Add) when is_binary(Bucket) andalso is_binary(Key) andalso is_integer(Add) andalso Add > 1 ->
CounterTable= get_table(),
AddBin = list_to_binary(integer_to_list(Add)),
SQL = << <<"update ">>/binary, CounterTable/binary, <<" set counter_value = counter_value + ">>/binary,
AddBin/binary , <<" where bucket = '">>/binary,
Bucket/binary, <<"' and key = '">>/binary , Key/binary , <<"';">>/binary >>,
C = cql:client(),
R = cql:run_query(C,SQL),
cql:close_client(C),
case R of
{ ok , _ } ->
ok;
_ ->
m_logger:log(warning,"~p ~p add_count ~p ~p ~p ~s ~p",[?MODULE,?LINE,Bucket,Key,Add,SQL,R]),
R
end;
add(Bucket,Key,Add) when is_binary(Bucket) andalso is_binary(Key) andalso is_integer(Add) andalso Add < -1 ->
CounterTable= get_table(),
AddBin = list_to_binary(integer_to_list(-Add)),
SQL = << <<"update ">>/binary, CounterTable/binary, <<" set counter_value = counter_value - ">>/binary,
AddBin/binary , <<" where bucket = '">>/binary,
Bucket/binary, <<"' and key = '">>/binary , Key/binary , <<"';">>/binary >>,
C = cql:client(),
R = cql:run_query(C,SQL),
cql:close_client(C),
case R of
{ ok , _ } ->
ok;
_ ->
m_logger:log(warning,"~p ~p add_count ~p ~p ~p ~s ~p",[?MODULE,?LINE,Bucket,Key,Add,SQL,R]),
R
end.
add2(Bucket,Key,Key2,Add) when is_binary(Bucket) andalso is_binary(Key) andalso is_binary(Key2) andalso is_integer(Add) andalso Add =:= 0 ->
ok;
add2(Bucket,Key,Key2,Add) when is_binary(Bucket) andalso is_binary(Key) andalso is_binary(Key2) andalso is_integer(Add) andalso Add =:= 1 ->
inc2(Bucket,Key,Key2);
add2(Bucket,Key,Key2,Add) when is_binary(Bucket) andalso is_binary(Key) andalso is_binary(Key2) andalso is_integer(Add) andalso Add =:= -1 ->
dec2(Bucket,Key,Key2);
add2(Bucket,Key,Key2,Add) when is_binary(Bucket) andalso is_binary(Key) andalso is_binary(Key2) andalso is_integer(Add) andalso Add > 1 ->
CounterTable= get_table2(),
AddBin = list_to_binary(integer_to_list(Add)),
SQL = << <<"update ">>/binary, CounterTable/binary, <<" set counter_value = counter_value + ">>/binary,
AddBin/binary , <<" where bucket = '">>/binary,
Bucket/binary, <<"' and key = '">>/binary , Key/binary , <<"' and key2 = '">>/binary , Key2/binary , <<"';">>/binary >>,
C = cql:client(),
R = cql:run_query(C,SQL),
cql:close_client(C),
case R of
{ ok , _ } ->
ok;
_ ->
m_logger:log(warning,"~p ~p add_count ~p ~p ~p ~p ~s ~p",[?MODULE,?LINE,Bucket,Key,Key2,Add,SQL,R]),
R
end;
add2(Bucket,Key,Key2,Add) when is_binary(Bucket) andalso is_binary(Key) andalso is_integer(Add) andalso Add < -1 ->
CounterTable= get_table2(),
AddBin = list_to_binary(integer_to_list(-Add)),
SQL = << <<"update ">>/binary, CounterTable/binary, <<" set counter_value = counter_value - ">>/binary,
AddBin/binary , <<" where bucket = '">>/binary,
Bucket/binary, <<"' and key = '">>/binary , Key/binary , <<"' and key2 = '">>/binary , Key2/binary , <<"';">>/binary >>,
C = cql:client(),
R = cql:run_query(C,SQL),
cql:close_client(C),
case R of
{ ok , _ } ->
ok;
_ ->
m_logger:log(warning,"~p ~p add_count2 ~p ~p ~p ~p ~s ~p",[?MODULE,?LINE,Bucket,Key,Key2,Add,SQL,R]),
R
end.
get(Bucket,Key) ->
CounterTable= get_table(),
SQL = << <<"select counter_value from ">>/binary, CounterTable/binary , <<" where bucket = '">>/binary,
Bucket/binary, <<"' and key = '">>/binary , Key/binary , <<"';">>/binary >>,
C = cql:client(),
Ret = cql:run_query(C,SQL),
cql:close_client(C),
case Ret of
{ ok , Result } ->
Row = cql:head(Result),
case Row of
empty_dataset ->
0;
_ ->
R_counter_value = proplists:get_value(counter_value, Row,0),
R_counter_value
end;
_ ->
0
end.
get2(Bucket,Key,Key2) ->
CounterTable= get_table2(),
SQL = << <<"select counter_value from ">>/binary, CounterTable/binary , <<" where bucket = '">>/binary,
Bucket/binary, <<"' and key = '">>/binary , Key/binary , <<"' and key2 = '">>/binary , Key2/binary, <<"';">>/binary >>,
C = cql:client(),
Ret = cql:run_query(C,SQL),
cql:close_client(C),
case Ret of
{ ok , Result } ->
Row = cql:head(Result),
case Row of
empty_dataset ->
0;
_ ->
R_counter_value = proplists:get_value(counter_value, Row,0),
R_counter_value
end;
_ ->
0
end.
reset(Bucket,Key) ->
cql:delete(get_table(),[ { <<"bucket">> , Bucket } , { <<"key">> , Key } ]).
reset2(Bucket,Key,Key2) ->
cql:delete(get_table2(),[ { <<"bucket">> , Bucket } , { <<"key">> , Key } , { <<"key2">> , Key2 } ]).
inc_get(Bucket,Key) when is_binary(Bucket) andalso is_binary(Key) ->
inc(Bucket,Key),
get(Bucket,Key).
inc_get2(Bucket,Key,Key2) when is_binary(Bucket) andalso is_binary(Key) ->
inc2(Bucket,Key,Key2),
get2(Bucket,Key,Key2).
dec_get(Bucket,Key) when is_binary(Bucket) andalso is_binary(Key) ->
inc(Bucket,Key),
get(Bucket,Key).
dec_get2(Bucket,Key,Key2) when is_binary(Bucket) andalso is_binary(Key) ->
inc2(Bucket,Key,Key2),
get2(Bucket,Key,Key2).
add_get(Bucket,Key,Add) when is_binary(Bucket) andalso is_binary(Key) ->
add(Bucket,Key,Add),
get(Bucket,Key).
add_get(Bucket,Key,Key2,Add) when is_binary(Bucket) andalso is_binary(Key) ->
add2(Bucket,Key,Key2,Add),
get2(Bucket,Key,Key2).
test() ->
ok.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment