All pastes #278944 Raw Edit

jsmith

public text v1 · immutable
·published 2006-12-14 15:36 UTC
rendered paste body
CREATE FUNCTION loin (cstring) RETURNS lo AS 'oidin' LANGUAGE internal IMMUTABLE STRICT;
CREATE FUNCTION loout (lo) RETURNS cstring AS 'oidout' LANGUAGE internal IMMUTABLE STRICT;
CREATE FUNCTION lorecv (internal) RETURNS lo AS 'oidrecv' LANGUAGE internal IMMUTABLE STRICT;
CREATE FUNCTION losend (lo) RETURNS bytea AS 'oidrecv' LANGUAGE internal IMMUTABLE STRICT;

CREATE TYPE lo ( INPUT = loin, OUTPUT = loout, RECEIVE = lorecv, SEND = losend, INTERNALLENGTH = 4, PASSEDBYVALUE );
CREATE CAST (lo AS oid) WITHOUT FUNCTION AS IMPLICIT;
CREATE CAST (oid AS lo) WITHOUT FUNCTION AS IMPLICIT;

CREATE TABLE lo_test(
 id serial,
 data lo);

create or replace function lo_cleanup() returns trigger as '
    declare
      lo_oid oid;
    begin
      raise notice ''Starting lo_cleanup function for large object with oid %'',old.data;
      -- If it is an update action but the BLOB (lo) field was not changed, dont do anything
      if (TG_OP = ''UPDATE'') then
        if (old.data = new.data) or (old.data is null) then
          raise notice ''Not cleaning up the large object table'';
          return new;
        end if;
      end if;
      select into lo_oid loid from pg_largeobject where lo_oid = old.data;
      if found then
        raise notice ''Cleaning up the large object table'';
        perform lo_unlink(lo_oid);
        return new;
      else
        raise notice ''Did not find the right oid'';
      end if;
    end'
  language 'plpgsql';


create trigger lo_test_cleanup
after delete or update on lo_test
for each row execute procedure lo_cleanup();