Преобразование базы c JS в Perl - PullRequest
0 голосов
/ 28 января 2020

В настоящее время я пытаюсь преобразовать функцию PostgreSQL из JS в Perl, поскольку расширение PLV8 недоступно в моей среде.

Оригинал JS / PLV8 код, который у меня есть:

CREATE OR REPLACE FUNCTION plays_users_stats_trigger()
  RETURNS trigger AS $$

    if (TG_OP === 'UPDATE' && OLD.user_id !== NEW.user_id)
      throw new Error('Update of user_id not allowed');

    var userId, gross = 0, net = 0, num = 0;
    var bet, cashOut, bonus;

    // Add new values.
    if (NEW) {
      userId  = NEW.user_id;
      bet     = NEW.bet;
      bonus   = NEW.bonus || 0;
      cashOut = NEW.cash_out || 0;

      gross  += Math.max(cashOut - bet, 0) + bonus;
      net    += (cashOut - bet) + bonus;
      num    += 1;
    }

    // Subtract old values
    if (OLD) {
      userId  = OLD.user_id;
      bet     = OLD.bet;
      bonus   = OLD.bonus || 0;
      cashOut = OLD.cash_out || 0;

      gross  -= Math.max(cashOut - bet, 0) + bonus;
      net    -= (cashOut - bet) + bonus;
      num    -= 1;
    }

    var sql =
      'UPDATE users ' +
      '  SET gross_profit = gross_profit + $1, ' +
      '      net_profit   = net_profit   + $2, ' +
      '      games_played = games_played + $3 ' +
      '  WHERE id = $4';
    var par = [gross,net,num,userId];
    plv8.execute(sql,par);
$$ LANGUAGE plv8;

Несмотря на то, что я новичок в Perl Я изо всех сил пытаюсь получить правильную функциональность, текущий код, который я получил:

CREATE OR REPLACE FUNCTION plays_users_stats_trigger() RETURNS trigger AS $$
    if($_TD->{event} = 'UPDATE' && $_TD->{old}{i}->user_id != $_TD->{new}{i}->user_id) {
        die('Update of user_id not allowed: %, at %',$_TD,now());
    }

    my $userId = undef;
    my $gross = 0; 
    my $net = 0; 
    my $num = 0;
    my $bet = undef;
    my $cashOut = undef;
    my $bonus = undef;

    if($OLD) {
        $userId = $OLD->user_id;
        $bet = $OLD->bet;
        $bonus = $OLD->bonus || 0;
        $cashOut = $OLD->cash_out || 0;
        $gross -= max($cashOut - $bet, 0) + $bonus;
        $net -= ($cashOut - $bet) + $bonus;
        $num -= 1;
    } elsif($NEW) {
        $userId = $NEW->user_id;
        $bet = $NEW->bet;
        $bonus = $NEW->bonus || 0;
        $cashOut = $NEW->cash_out || 0;
        $gross += max($cashOut - $bet, 0) + $bonus;
        $net += ($cashOut - $bet) + $bonus;
        $num += 1;
    }

    $sql = 'UPDATE users SET gross_profit = gross_profit + $1, net_profit = net_profit + $2, games_played = games_played + $3 WHERE id = $4';
    spi_exec_prepared($sql, [$gross, $net, $num, $userId]);

$$ LANGUAGE plperl;

1 Ответ

0 голосов
/ 28 января 2020

Я не знаком с PostgreSQL, но, глядя на ваш пример кода, вот несколько комментариев:

  • $TG_OP = 'UPDATE': сравнение строк в Perl выполняется с eq оператор
  • $OLD.user_id !== $NEW.user_id: числовое сравнение для неравенства должно выполняться с использованием оператора !=
  • null, вероятно, должно быть undef.
  • $userId = OLD.user_id: похоже, $OLD это объект (глядя на ваш код)? Тогда вам, вероятно, следует получить доступ к атрибуту user_id, используя что-то вроде $OLD->user_id. То же самое относится ко всем другим доступам к атрибутам с использованием оператора точки . в Javascript; это, вероятно, оператор -> в Perl.
  • NOTICE 'Update of user_id not allowed: %, at %': вы можете выдать исключение в Perl, используя функцию die
  • IF .. . ELSE: в Perl это if ... else
  • Math.max($cashOut - $bet, 0): в Perl вы можете использовать max из модуля List::Util
...