summaryrefslogtreecommitdiff
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
commit51698df1f20b14df26b47df1a6b26a96eefd4049 (patch)
tree70f9d4b838439cd91862420fdab40059f8812196
parent99a0a09b6736eb6e535f54efa834c31dccc7a427 (diff)
downloadrabbitmq-server-51698df1f20b14df26b47df1a6b26a96eefd4049.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.
-rw-r--r--include/rabbit.hrl1
-rw-r--r--src/rabbit_upgrade_functions.erl43
2 files changed, 43 insertions, 1 deletions
diff --git a/include/rabbit.hrl b/include/rabbit.hrl
index 7dda9211..c45099e2 100644
--- a/include/rabbit.hrl
+++ b/include/rabbit.hrl
@@ -35,7 +35,6 @@
impl %% Scratch space for that module
}).
-%% TODO mnesia-upgrade this
-record(internal_user, {username, password_hash, is_admin}).
-record(permission, {configure, write, read}).
-record(user_vhost, {username, virtual_host}).
diff --git a/src/rabbit_upgrade_functions.erl b/src/rabbit_upgrade_functions.erl
index 1c56d51d..f1fbbfa4 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.