summaryrefslogtreecommitdiff
path: root/sql/modules/Session.sql
blob: 4adf20d8874a322084e68f13f558d99459472107 (plain)
  1. CREATE OR REPLACE FUNCTION form_check(in_session_id int, in_form_id int)
  2. RETURNS BOOL AS
  3. $$
  4. BEGIN
  5. SELECT * FROM open_forms
  6. WHERE session_id = in_session_id AND id = in_form_id;
  7. IF FOUND THEN
  8. DELETE FROM open_forms
  9. WHERE session_id = in_session_id AND id = in_form_id;
  10. RETURN TRUE;
  11. ELSE RETURN FALSE;
  12. END;
  13. $$ language plpgsql;
  14. CREATE OR REPLACE FUNCTION form_open(in_session_id int)
  15. RETURNS INT AS
  16. $$
  17. BEGIN
  18. INSERT INTO open_forms (session_id) VALUES (in_session_id);
  19. RETURN currval('form_id_seq');
  20. END;
  21. $$ LANGUAGE PLPGSQL
  22. CREATE OR REPLACE FUNCTION session_check(in_session_id int, in_token text)
  23. RETURNS session AS
  24. $$
  25. DECLARE out_row session%ROWTYPE;
  26. BEGIN
  27. UPDATE session
  28. SET last_used = now()
  29. WHERE session_id = in_session_id
  30. AND token = in_token
  31. AND last_used > now() - (SELECT value FROM defaults
  32. WHERE setting_key = 'timeout')::interval
  33. AND users_id = (select id from users
  34. where username = SESSION_USER);
  35. IF FOUND THEN
  36. SELECT * INTO out_row WHERE session_id = in_session_id;
  37. ELSE
  38. DELETE FROM SESSION
  39. WHERE users_id IN (select id from users
  40. where username = SESSION_USER);
  41. -- the above query also releases all discretionary locks by the
  42. -- session
  43. IF NOT FOUND THEN
  44. PERFORM id FROM users WHERE username = SESSION_USER;
  45. IF NOT FOUND THEN
  46. RAISE EXCEPTION 'User Not Known';
  47. END IF;
  48. END IF;
  49. INSERT INTO session(users_id, token, last_used, transaction_id)
  50. SELECT id, md5(random()::text), now(), 0
  51. FROM users WHERE username = SESSION_USER;
  52. -- TODO-- remove transaction_id field from session table
  53. SELECT * INTO out_row FROM session
  54. WHERE session_id = currval('session_session_id_seq');
  55. END IF;
  56. RETURN out_row;
  57. END;
  58. $$ LANGUAGE PLPGSQL;
  59. COMMENT ON FUNCTION session_check(int, text) IS
  60. $$ Return code is 0 for failure, 1 for success. $$;