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 | bf662d6d6551ff2ac30372b37f76333910ea45f6 (patch) | |
| tree | 70f9d4b838439cd91862420fdab40059f8812196 /src | |
| parent | aa397d37163ad150c4489fc68e4143dad75809ad (diff) | |
| download | rabbitmq-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.erl | 43 |
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. |
