-
Notifications
You must be signed in to change notification settings - Fork 0
/
test_mnesia.erl
113 lines (99 loc) · 2.89 KB
/
test_mnesia.erl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
-module(test_mnesia).
-export([do_this_once/0, add_shop_item/3, remove_row/1, add_design/2, add_cost/2, farmer/1, reset_tables/0, do/1]).
-record(shop, {item, quantity, cost}).
-record(cost, {name, price}).
-record(design, {name, cost}).
%routine to start the db and load the table sessions
%demo(select_shop) ->
% do(qlc:q([X || X <- mnesia:table(shop)])).
%automate db creation
do_this_once() ->
mnesia:create_schema([node()]),
mnesia:start(),
mnesia:create_table(shop, [{attributes, record_info(fields, shop)}, {disc_copies, [node() | nodes()]}]),
mnesia:create_table(cost, [{attributes, record_info(fields, cost)}]),
mnesia:create_table(design,[{attributes, record_info(fields, design)}]),
mnesia:stop().
% add a row to the design table
add_design(Name, Cost) ->
Row =#design{name =Name, cost = Cost},
F = fun() ->
mnesia:write(Row)
end,
mnesia:transaction(F).
%add a row to the cost table
add_cost(Name, Price) ->
Row = #cost{name = Name, price = Price},
F = fun() ->
mnesia:write(Row)
end,
mnesia:transaction(F).
% add a column to the shop table
add_shop_item(Name, Quantity, Cost) ->
Row = #shop{item = Name, quantity = Quantity, cost = Cost},
F =fun() ->
mnesia:write(Row)
end,
mnesia:transaction(F).
%hoe to remove a row (Item is the primary key of the table)
remove_row(Item)->
Oid ={shop, Item},
F = fun() ->
mnesia:delete(Oid)
end,
mnesia:transaction(F).
%Aborting a transaction
farmer(Nwant) ->
%% Nwant = The number of oranges the farmer wants
F = fun() ->
%% Find the number of apples the farmer has and should give to get oranges
[Apple] = mnesia:read({shop, apple}),
Napples = Apple#shop.quantity,
Apple1 = Apple#shop{quantity = Napples + 2*Nwant},
%% update the database
mnesia:write(Apple1),
%%Find rhe number of oranges
[Orange] = mnesia:read({shop, orange}),
NOranges = Orange#shop.quantity,
if NOranges >= Nwant ->
N1 =NOranges- Nwant,
Orange1 = Orange#shop{quantity = N1},
%% Update the database
mnesia:write(Orange1);
true ->
%%oops not enough oranges
mnesia:abort(Orange)
end
end,
mnesia:transaction(F).
% Loading test data
example_tables() ->
[%% The shop table
{shop, apple, 20, 2.3},
{shop, orange, 100,3.8},
{shop, pear, 200, 3.6},
{shop, banana, 420, 4.5},
{shop, potato, 456, 1.2},
% The cost table
{cost, apple, 1.5},
{cost, orange, 2.4},
{cost, pear, 2.2},
{cost, banana, 1.5},
{cost, potato, 0.6}
].
%This function writes data from the examples to mnesia
reset_tables() ->
mnesia:clear_table(shop),
mnesia:clear_table(cost),
F = fun() ->
lists:foreach(fun mnesia:write/1, example_tables())
end,
mnesia:transaction(F).
% The do function
do(Q) ->
F = fun() -> qlc:e(Q) end,
{atomic, Val} = mnesia:transaction(F),
Val.
%how to select specific data and view it from a table ?
%%demo(select_shop) ->
%%do(qlc:q([{X#shop.item, X#shop.quantity} || X <- mnesia:table(shop)])).