BuzzSaw

 view release on metacpan or  search on metacpan

buzzsaw.sql  view on Meta::CPAN

DROP TABLE log;
DROP TABLE event;
DROP TABLE tag;

CREATE DOMAIN BASE64 AS VARCHAR(200) CHECK( VALUE ~ '^[A-Za-z0-9+/:_.-]+$' );

CREATE DOMAIN HOSTNAME AS VARCHAR(100);

BEGIN;

CREATE TABLE log (
    id       SERIAL                        PRIMARY KEY,
    name     VARCHAR(200)                  NOT NULL,
    digest   BASE64                        NOT NULL,
    CONSTRAINT name_digest UNIQUE(name,digest)
);

CREATE INDEX log_name ON log (name);

CREATE TABLE current_processing (
    id        SERIAL                       PRIMARY KEY,
    name      VARCHAR(200)                 NOT NULL UNIQUE,
    starttime TIMESTAMP WITH TIME ZONE     NOT NULL DEFAULT current_timestamp
);

CREATE OR REPLACE FUNCTION register_current_processing(n current_processing.name%TYPE, d log.digest%TYPE, readall BOOLEAN) RETURNS void AS $$
DECLARE logcount INTEGER;
BEGIN

    LOCK TABLE current_processing IN ACCESS EXCLUSIVE MODE;

    -- If the mode is not set for reading all files then raise an
    -- error if we have already seen the file before.

    IF NOT readall THEN
      SELECT COUNT(*) INTO logcount
        FROM log
        WHERE digest = d;

      IF logcount > 0 THEN
        RAISE EXCEPTION 'Previously seen';
      END IF;
    END IF;

    -- Check if the file is currently being processed.

    -- Timeout any processing entries after 1 hour

    DELETE FROM current_processing
      WHERE starttime < current_timestamp - interval '1 hour';

    SELECT COUNT(*) INTO logcount
      FROM current_processing
      WHERE name = n;

    IF logcount > 0 THEN
      RAISE EXCEPTION 'Currently being processed';
    ELSE
      INSERT INTO current_processing (name) VALUES (n);
    END IF;

END;
$$  LANGUAGE plpgsql;

CREATE TABLE event (
    id       SERIAL                        PRIMARY KEY,
    raw      VARCHAR(1000)                 NOT NULL,
    digest   BASE64                        NOT NULL UNIQUE,
    logtime  TIMESTAMP WITH TIME ZONE      NOT NULL,
    logdate  DATE                          NOT NULL,
    hostname VARCHAR(100)                  NOT NULL,
    message  VARCHAR(1000)                 NOT NULL,
    program  VARCHAR(100),
    pid      INTEGER,
    userid   VARCHAR(20)
);

CREATE INDEX event_program_idx ON event(program);
CREATE INDEX event_userid_idx  ON event(userid);
CREATE INDEX event_logdate_idx ON event(logdate);
CREATE INDEX event_logtime_idx ON event(logtime);

CREATE FUNCTION set_event_date_func () RETURNS trigger AS '
 BEGIN
 	NEW.logdate = NEW.logtime::date;
 	RETURN NEW;
 END;
 ' LANGUAGE plpgsql;

CREATE TRIGGER set_event_date_trg BEFORE INSERT OR UPDATE
     ON event FOR EACH ROW
     EXECUTE PROCEDURE set_event_date_func ();

CREATE TABLE tag (
    id       SERIAL                        PRIMARY KEY,
    name     VARCHAR(20)                   NOT NULL,
    event    INTEGER                       NOT NULL REFERENCES event(id),
    CONSTRAINT name_event UNIQUE(name,event)
);

CREATE INDEX tag_name_idx ON tag(name);

CREATE TABLE extra_info (
    id       SERIAL                        PRIMARY KEY,
    name     VARCHAR(20)                   NOT NULL,
    val      VARCHAR(100)                  NOT NULL,
    event    INTEGER                       NOT NULL REFERENCES event(id),



( run in 1.332 second using v1.01-cache-2.11-cpan-39bf76dae61 )