blob: 9dcf378fbb6228f78cbc3e66f5be7bd3c500ad6b (
plain)
- CREATE OR REPLACE FUNCTION form_close(in_session_id int, in_form_id int)
- RETURNS BOOL AS
- $$
- BEGIN
- SELECT * FROM open_forms
- WHERE session_id = in_session_id AND id = in_form_id;
- IF FOUND THEN
- DELETE FROM open_forms
- WHERE session_id = in_session_id AND id = in_form_id;
- RETURN TRUE;
- ELSE RETURN FALSE;
- END IF;
- END;
- $$ language plpgsql;
- CREATE OR REPLACE FUNCTION form_open(in_session_id int)
- RETURNS INT AS
- $$
- BEGIN
- INSERT INTO open_forms (session_id) VALUES (in_session_id);
- RETURN currval('form_id_seq');
- END;
- $$ LANGUAGE PLPGSQL;
- CREATE OR REPLACE FUNCTION session_check(in_session_id int, in_token text)
- RETURNS session AS
- $$
- DECLARE out_row session%ROWTYPE;
- BEGIN
- DELETE FROM session
- WHERE last_used < now() - coalesce((SELECT value FROM defaults
- WHERE setting_key = 'timeout')::interval,
- '90 minutes'::interval);
- UPDATE session
- SET last_used = now()
- WHERE session_id = in_session_id
- AND token = in_token
- AND last_used > now() - (SELECT value FROM defaults
- WHERE setting_key = 'timeout')::interval
- AND users_id = (select id from users
- where username = SESSION_USER);
- IF FOUND THEN
- SELECT * INTO out_row FROM session WHERE session_id = in_session_id;
- ELSE
- DELETE FROM SESSION
- WHERE users_id IN (select id from users
- where username = SESSION_USER);
- -- the above query also releases all discretionary locks by the
- -- session
- IF NOT FOUND THEN
- PERFORM id FROM users WHERE username = SESSION_USER;
- IF NOT FOUND THEN
- RAISE EXCEPTION 'User Not Known';
- END IF;
-
- END IF;
- INSERT INTO session(users_id, token, last_used, transaction_id)
- SELECT id, md5(random()::text), now(), 0
- FROM users WHERE username = SESSION_USER;
- -- TODO-- remove transaction_id field from session table
- SELECT * INTO out_row FROM session
- WHERE session_id = currval('session_session_id_seq');
- END IF;
- RETURN out_row;
- END;
- $$ LANGUAGE PLPGSQL;
- COMMENT ON FUNCTION session_check(int, text) IS
- $$ Return code is 0 for failure, 1 for success. $$;
- CREATE OR REPLACE FUNCTION unlock_all() RETURNS BOOL AS
- $$
- BEGIN
- UPDATE transactions SET locked_by = NULL
- where locked_by IN
- (select session_id from session WHERE users_id =
- (SELECT id FROM users WHERE username = SESSION_USER));
- RETURN FOUND;
- END;
- $$ LANGUAGE PLPGSQL;
- CREATE OR REPLACE FUNCTION unlock(in_id int) RETURNS BOOL AS $$
- BEGIN
- UPDATE transactions SET locked_by = NULL WHERE id = in_id
- AND locked_by IN (SELECT session_id FROM session WHERE users_id =
- (SELECT id FROM users WHERE username = SESSION_USER));
- RETURN FOUND;
- END;
- $$ LANGUAGE PLPGSQL;
|