-- Database: session_db

-- DROP DATABASE session_db;

CREATE DATABASE session_db
  WITH OWNER = "session_user"
       ENCODING = 'UTF8'
       TABLESPACE = pg_default
       LC_COLLATE = 'en_US.UTF-8'
       LC_CTYPE = 'en_US.UTF-8'
       CONNECTION LIMIT = -1;



-- Table: sessions

-- DROP TABLE sessions;

CREATE TABLE sessions
(
  session_id character varying(200) NOT NULL,
  ts timestamp with time zone DEFAULT now(),
  session_data text,
  CONSTRAINT sessions_pkey PRIMARY KEY (session_id )
)
WITH (
  OIDS=FALSE
);
ALTER TABLE sessions
  OWNER TO "session_user";

-- Index: session_id_index

-- DROP INDEX session_id_index;

CREATE INDEX session_id_index
  ON sessions
  USING btree
  (session_id COLLATE pg_catalog."default" );


-- Function: upsert_session(character varying, text)

-- DROP FUNCTION upsert_session(character varying, text);

CREATE OR REPLACE FUNCTION upsert_session(id character varying, data text)
  RETURNS void AS
$BODY$
BEGIN
    LOOP
        -- first try to update the session
        UPDATE sessions SET session_data = data WHERE session_id = id;
        IF found THEN
            RETURN;
        END IF;
        -- not there, so try to insert the session
        -- if someone else inserts the same session concurrently,
        -- we could get a unique-key failure
        BEGIN
            INSERT INTO sessions(session_id,session_data) VALUES (id, data);
            RETURN;
        EXCEPTION WHEN unique_violation THEN
            -- do nothing, and loop to try the UPDATE again
        END;
    END LOOP;
END;

$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION upsert_session(character varying, text)
  OWNER TO "session_user";

