В игре для 2-х игроков, я пытаюсь, чтобы пропустить поворот игрока, вызвав следующую хранимую функцию:Update 1 из 2-х колонок - в зависимости от состояния
CREATE OR REPLACE FUNCTION skip_game(
IN in_uid integer, -- player id
IN in_gid integer) -- game id
RETURNS void AS
$func$
BEGIN
UPDATE games
SET stamp1 = extract('epoch' from current_timestamp)
WHERE gid = in_gid
AND player1 = in_uid
AND stamp1 < stamp2; -- it is player1's turn
IF NOT FOUND THEN
UPDATE games
SET stamp2 = extract('epoch' from current_timestamp)
WHERE gid = in_gid
AND player2 = in_uid
AND stamp2 < stamp1; -- it is player2's turn
END IF;
END
$func$ LANGUAGE plpgsql;
ли, пожалуйста, можно объединить два выше UPDATE-операторов до одного - и установить либо stamp1
, либо stamp2
в текущую эпоху, в зависимости от состояния?
Кроме того, я не понимаю, почему PostgreSQL 9.5 всегда сообщает обновляемый 1 row
- событие, если я вызываю эту функцию с недопустимыми аргументами?
# select skip_game(1, 1);
skip_game
-----------------
(1 row)
# select skip_game(95, 95);
skip_game
-----------------
(1 row)
Вот games
таблицы (я использую эпохи целые числа для stamp
колонн для облегчения связи с мобильным приложением на стороне клиента - которая использует SQLite):
CREATE TABLE games (
gid SERIAL PRIMARY KEY,
created TIMESTAMP NOT NULL,
player1 INTEGER REFERENCES users(uid) ON DELETE CASCADE NOT NULL,
player2 INTEGER REFERENCES users(uid) ON DELETE CASCADE,
stamp1 INTEGER, -- timestamp of the last turn
stamp2 INTEGER, -- timestamp of the last turn
letters1 VARCHAR(7) NOT NULL,
letters2 VARCHAR(7) NOT NULL,
letters VARCHAR(116) NOT NULL,
board VARCHAR(225) NOT NULL,
style INTEGER NOT NULL CHECK (1 <= style AND style <= 4)
);