summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSimon MacMullen <simon@rabbitmq.com>2010-10-18 16:59:20 +0100
committerSimon MacMullen <simon@rabbitmq.com>2010-10-18 16:59:20 +0100
commitfec42446f2b755b9eef1c4bfa0f6df8c7699bc2b (patch)
treecd3166ce1bf36416ff6a732b50fcc6483f0ad6bc /src
parent00d769801f00a60152a345a8e00c72a667b14db6 (diff)
downloadrabbitmq-server-git-fec42446f2b755b9eef1c4bfa0f6df8c7699bc2b.tar.gz
Add enough of a mechanism to allow us to update data in Mnesia but not the schema.
Diffstat (limited to 'src')
-rw-r--r--src/rabbit_mnesia.erl2
-rw-r--r--src/rabbit_upgrade.erl21
-rw-r--r--src/rabbit_upgrades.erl30
3 files changed, 33 insertions, 20 deletions
diff --git a/src/rabbit_mnesia.erl b/src/rabbit_mnesia.erl
index cd072b9cb4..9f08936757 100644
--- a/src/rabbit_mnesia.erl
+++ b/src/rabbit_mnesia.erl
@@ -287,6 +287,7 @@ check_schema_integrity() ->
check_table_integrity() ->
ok = wait_for_tables(),
+ rabbit_upgrade:maybe_upgrade(dir()),
case lists:all(fun ({Tab, TabDef}) ->
{_, Match} = proplists:lookup(match, TabDef),
read_test_table(Tab, Match)
@@ -378,7 +379,6 @@ init_db(ClusterNodes, Force) ->
[] ->
case mnesia:system_info(use_dir) of
true ->
- rabbit_upgrade:maybe_upgrade(dir()),
case check_schema_integrity() of
ok ->
ok;
diff --git a/src/rabbit_upgrade.erl b/src/rabbit_upgrade.erl
index 62658fbbd1..5f503fa244 100644
--- a/src/rabbit_upgrade.erl
+++ b/src/rabbit_upgrade.erl
@@ -31,6 +31,7 @@
-module(rabbit_upgrade).
-export([maybe_upgrade/1, write_version/1]).
+-export([mnesia_alter_column/3]).
-include("rabbit.hrl").
@@ -68,6 +69,26 @@ write_version(Dir) ->
digraph:delete(G),
ok.
+%% -------------------------------------------------------------------
+
+mnesia_alter_column(Table, Column, Fun) ->
+ {atomic, _} =
+ mnesia:transaction(
+ fun() ->
+ [mnesia_alter_column_for_key(Table, Column, Key, Fun)
+ || Key <- mnesia:all_keys(Table)]
+ end),
+ ok.
+
+mnesia_alter_column_for_key(Table, Column, Key, Fun) ->
+ Vals = mnesia:read(Table, Key, write),
+ ok = mnesia:delete(Table, Key, write),
+ [mnesia_alter_column_for_value(Table, Column, Val, Fun) || Val <- Vals].
+
+mnesia_alter_column_for_value(Table, Column, Val, Fun) ->
+ Val2 = setelement(Column + 1, Val, Fun(element(Column + 1, Val))),
+ mnesia:write(Table, Val2, write).
+
%% Graphs ------------------------------------------------------------
load_graph() ->
diff --git a/src/rabbit_upgrades.erl b/src/rabbit_upgrades.erl
index f6870068e6..50c97bb6bb 100644
--- a/src/rabbit_upgrades.erl
+++ b/src/rabbit_upgrades.erl
@@ -34,27 +34,19 @@
-compile([export_all]).
--rabbit_upgrade({foo, []}).
--rabbit_upgrade({bar, [foo]}).
--rabbit_upgrade({baz, [bar]}).
-
--rabbit_upgrade({remove_user_scope, [foo]}).
--rabbit_upgrade({remove_user_scope2, [remove_user_scope]}).
-
+-rabbit_upgrade({remove_user_scope, []}).
%%--------------------------------------------------------------------
-foo() ->
- ok.
+%% TODO this is just a hack, on branch bug23319 this should use the real
+%% permission record
+-record(permission2, {configure, write, read}).
remove_user_scope() ->
- ok.
-
-remove_user_scope2() ->
- ok.
-
-bar() ->
- ok.
-
-baz() ->
- ok.
+ rabbit_upgrade:mnesia_alter_column(
+ rabbit_user_permission, 2,
+ fun({permission, _Scope, Conf, Write, Read}) ->
+ #permission2{configure = Conf,
+ write = Write,
+ read = Read}
+ end).