On Fri, Jun 02, 2000 at 09:26:45AM +1000, Adam Cassar wrote:
> I was wondering how people are clearing out old Apache::Session's
> 
> No timestamp is used on the fields used by Apache::Session, so how do
> we clear the old sessions? 
> 
> I am not talking about the delete() method to remove a session, as that
> presumes that a user will always leave your site via pre-defined access
> points.

As was mentiuoned, TMTOWTDI, but for postgresql, you can just do:

CREATE TABLE sessions (
  id VARCHAR(32) NOT NULL,
  ts TIMESTAMP NOT NULL DEFAULT NOW(),
  a_session TEXT,
  PRIMARY KEY (id)
);

Which works.

Another equivalent solution would involve setting up a "view" on a different
table abd setting up RULES that update the timestamp.  E.g.:

CREATE TABLE session_data (
    id CHAR(32) NOT NULL,
    ts TIMESTAMP NOT NULL,
    a_session TEXT,
    PRIMARY KEY (id)
);

CREATE VIEW sessions AS SELECT id,a_session FROM session_data;

CREATE RULE sessions_update AS ON UPDATE TO sessions
    DO INSTEAD
    UPDATE session_data SET
           id = NEW.id,
           a_session = NEW.a_session,
           ts = CURRENT_TIMESTAMP
     WHERE id = OLD.id;

CREATE RULE sessions_delete AS ON DELETE TO sessions
    DO INSTEAD
    DELETE FROM session_data
          WHERE id = OLD.id;

CREATE RULE sessions_insert AS ON INSERT TO sessions
    DO INSTEAD
    INSERT INTO session_data
                (id, a_session, ts)
         VALUES (NEW.id, NEW.a_session, CURRENT_TIMESTAMP);

This works too.  And has the added nifty feature that "sessions" looks exactly
like what Apache::Session expects to find.  

I'm sure there are other ways to do it (plpgsql, triggers come to mind) for
postgresql.  As I said, TMTOWTDI.

I'm sure nearly every dbms out there can use some variant of one of the above
two methods...  You'll just have to adapt it for your particular DBMS.

Mike

Reply via email to