Как обновить таблицу Mnesia в Erlang - PullRequest
4 голосов
/ 04 марта 2012

У меня небольшая проблема с моим кодом.У меня есть таблица, содержащая информацию об автомобиле, имя, цену и количество, поэтому я пытаюсь создать функцию с именем buy, которая будет использоваться для покупки определенного автомобиля.Когда пользователь покупает, например, 5 автомобилей BMW, ему позвонят buy_car(bmw,5).Теперь после этого я хочу обновить новое значение количества для автомобилей BMW.

Моя попытка ниже, но я не могу обойти ее, я новичок в Erlang.

buy_car(X,Ncars) ->

    F = fun() ->

        %% ----first i find the number of car X available in the shop
        [Xcars] = mnesia:read({car,X}),
        Nc = Xcars#car.quantity,
        Leftcars = Xcars#car{quantity = Nc - Ncars},

        %% ---now we update the database
        mnesia:write(Leftcars),

    end,
    mnesia:transaction(F).

Пожалуйста, помогите мне с тем, как я могу написать функцию, которая покупает автомобили в магазине.

Ответы [ 2 ]

6 голосов
/ 05 марта 2012

Но ваша реализация работает нормально, за исключением того, что вы добавили недопустимую запятую после mnesia: write (Leftcars). Вот код, который работает (я попробовал вашу реализацию как buy_car2).

-module(q).

-export([setup/0, buy_car/2, buy_car2/2]).

-record(car, {brand, quantity}).

setup() ->
    mnesia:start(),
    mnesia:create_table(car, [{attributes, record_info(fields, car)}]),
    mnesia:transaction(fun() -> mnesia:write(#car{brand=bmw, quantity=1000}) end).

buy_car(Brand, Ncars) ->
    F = fun() ->
         [Car] = mnesia:read(car, Brand), % crash if the car is missing
         mnesia:write(Car#car{quantity = Car#car.quantity - Ncars})
    end,
    mnesia:transaction(F).

buy_car2(X,Ncars) ->
    F = fun() ->
        %% ----first i find the number of car X available in the shop
        [Xcars] = mnesia:read({car,X}),
        Nc = Xcars#car.quantity,
        Leftcars = Xcars#car{quantity = Nc - Ncars},
        %% ---now we update the database
        mnesia:write(Leftcars)
    end,
    mnesia:transaction(F).
0 голосов
/ 04 марта 2012

Я бы сделал что-то вроде ниже:

Considering the record is defined as :
-record(car_record, {car, quantity}).

The following function will update the data:
buy_car(X,NCars) ->
    Row = #car_record{car = X, quantity = NCars}.
    mnesia:ets(fun()-> mnesia:dirty_write(Row) end),
    mnesia:change_table_copy_type(guiding_data, node(), disc_copies).

Чтобы использовать описанный выше метод, таблица мнезий должна быть создана как ram_copies без узлов репликации. Кроме того, если происходит много обновлений, возможно, вы не захотите копировать ram_copies на диск для каждого обновления из-за проблем с производительностью, скорее вы будете делать это по времени.

...