summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSimon MacMullen <simon@rabbitmq.com>2010-11-24 13:27:24 +0000
committerSimon MacMullen <simon@rabbitmq.com>2010-11-24 13:27:24 +0000
commitbf662d6d6551ff2ac30372b37f76333910ea45f6 (patch)
tree70f9d4b838439cd91862420fdab40059f8812196 /src
parentaa397d37163ad150c4489fc68e4143dad75809ad (diff)
downloadrabbitmq-server-git-bf662d6d6551ff2ac30372b37f76333910ea45f6.tar.gz
Mnesia upgrade to convert user to internal_user records. Painful since the built-in Mnesia upgrade system does not let us change the type in a table.
Diffstat (limited to 'src')
-rw-r--r--src/rabbit_upgrade_functions.erl43
1 files changed, 43 insertions, 0 deletions
diff --git a/src/rabbit_upgrade_functions.erl b/src/rabbit_upgrade_functions.erl
index 1c56d51dd8..f1fbbfa431 100644
--- a/src/rabbit_upgrade_functions.erl
+++ b/src/rabbit_upgrade_functions.erl
@@ -27,6 +27,7 @@
-rabbit_upgrade({remove_user_scope, []}).
-rabbit_upgrade({hash_passwords, []}).
-rabbit_upgrade({add_ip_to_listener, []}).
+-rabbit_upgrade({user_to_internal_user, []}).
%% -------------------------------------------------------------------
@@ -35,6 +36,7 @@
-spec(remove_user_scope/0 :: () -> 'ok').
-spec(hash_passwords/0 :: () -> 'ok').
-spec(add_ip_to_listener/0 :: () -> 'ok').
+-spec(user_to_internal_user/0 :: () -> 'ok').
-endif.
@@ -71,8 +73,49 @@ add_ip_to_listener() ->
end,
[node, protocol, host, ip_address, port]).
+user_to_internal_user() ->
+ mnesia_by_copy(
+ rabbit_user,
+ fun({user, Username, PasswordHash, IsAdmin}) ->
+ {internal_user, Username, PasswordHash, IsAdmin}
+ end,
+ [username, password_hash, is_admin],
+ internal_user).
+
%%--------------------------------------------------------------------
mnesia(TableName, Fun, FieldList) ->
{atomic, ok} = mnesia:transform_table(TableName, Fun, FieldList),
ok.
+
+%% The above does not work to change a table's key or record
+%% type. This attempts to do the same, but by copying to a temporary
+%% table and back.
+mnesia_by_copy(TableName, Fun, FieldList, NewRecordName) ->
+ TableNameTmp = list_to_atom(atom_to_list(TableName) ++ "_tmp"),
+ CopyOne = fun(From, To, K, F) ->
+ [Row] = mnesia:read(From, K),
+ ok = mnesia:write(To, F(Row), write)
+ end,
+ CopyAll = fun(From, To, F) ->
+ {atomic, _} = mnesia:transaction(
+ fun() ->
+ [CopyOne(From, To, K, F)
+ || K <- mnesia:all_keys(From)]
+ end)
+ end,
+ Create = fun(T) ->
+ {atomic, ok} = mnesia:create_table(
+ T,
+ [{record_name, NewRecordName},
+ {attributes, FieldList},
+ {disc_copies, [node()]}]),
+ ok = mnesia:wait_for_tables([T], infinity)
+ end,
+ Create(TableNameTmp),
+ CopyAll(TableName, TableNameTmp, Fun),
+ {atomic, ok} = mnesia:delete_table(TableName),
+ Create(TableName),
+ CopyAll(TableNameTmp, TableName, fun(X) -> X end),
+ {atomic, ok} = mnesia:delete_table(TableNameTmp),
+ ok.