diff options
author | Simon MacMullen <simon@rabbitmq.com> | 2010-11-24 13:27:24 +0000 |
---|---|---|
committer | Simon MacMullen <simon@rabbitmq.com> | 2010-11-24 13:27:24 +0000 |
commit | 51698df1f20b14df26b47df1a6b26a96eefd4049 (patch) | |
tree | 70f9d4b838439cd91862420fdab40059f8812196 | |
parent | 99a0a09b6736eb6e535f54efa834c31dccc7a427 (diff) | |
download | rabbitmq-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.hrl | 1 | ||||
-rw-r--r-- | src/rabbit_upgrade_functions.erl | 43 |
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. |