From: | Jov <amutu(at)amutu(dot)com> |
---|---|
To: | Pavel Stehule <pavel(dot)stehule(at)gmail(dot)com> |
Cc: | PostgreSQL Hackers <pgsql-hackers(at)postgresql(dot)org> |
Subject: | Re: proposal: lob conversion functionality |
Date: | 2013-08-22 13:23:36 |
Message-ID: | CADyrUxMAzVQrghR4C3eK-bd_hG2V0VgbQt5iqocfw1-oRvTrWQ@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-hackers |
+1
badly need the large object and bytea convert function.
Once I have to use the ugly pg_read_file() to put some text to pg,I tried
to use large object but find it is useless without function to convert
large object to bytea.
Jov
blog: http:amutu.com/blog <http://amutu.com/blog>
2013/8/10 Pavel Stehule <pavel(dot)stehule(at)gmail(dot)com>
> Hello
>
> I had to enhance my older project, where XML documents are parsed and
> created on server side - in PLpgSQL and PLPerl procedures. We would to
> use a LO API for client server communication, but we have to
> parse/serialize LO on server side.
>
> I found so there are no simple API for working with LO from PL without
> access to file system. I had to use a ugly hacks:
>
> CREATE OR REPLACE FUNCTION parser.save_as_lob(bytea)
> RETURNS oid AS $$
> DECLARE
> _loid oid;
> _substr bytea;
> BEGIN
> _loid := lo_creat(-1);
> FOR i IN 0..length($1)/2048
> LOOP
> _substr := substring($1 FROM i * 2048 + 1 FOR 2048);
> IF _substr <> '' THEN
> INSERT INTO pg_largeobject(loid, pageno, data)
> VALUES(_loid, i, _substr);
> END IF;
> END LOOP;
>
> EXECUTE format('GRANT SELECT ON LARGE OBJECT %s TO ohs', _loid);
> RETURN _loid;
> END;
> $$ LANGUAGE plpgsql SECURITY DEFINER STRICT SET search_path = 'pg_catalog';
>
> and
>
> CREATE OR REPLACE FUNCTION fbuilder.attachment_to_xml(attachment oid)
> RETURNS xml AS $$
> DECLARE
> b_cum bytea = '';
> b bytea;
> BEGIN
> FOR b IN SELECT l.data
> FROM pg_largeobject l
> WHERE l.loid = attachment_to_xml.attachment
> ORDER BY l.pageno
> LOOP
> b_cum := b_cum || b;
> END LOOP;
> IF NOT FOUND THEN
> RETURN NULL;
> ELSE
> RETURN xmlelement(NAME "attachment",
> encode(b_cum, 'base64'));
> END IF;
> END;
> $$ LANGUAGE plpgsql STRICT SECURITY DEFINER SET search_path = 'pg_catalog';
>
> These functions can be simplified if we supports some functions like
> encode, decode for LO
>
> So my proposal is creating functions:
>
> * lo_encode(loid oid) .. returns bytea
> * lo_encode(loid oid, encoding text) .. returns text
> * lo_make(loid oid, data bytea)
> * lo_make(loid oid, data text, encoding text)
>
> This can simplify all transformation between LO and VARLENA. Known
> limit is 1G for varlena, but it is still relative enough high.
>
> Notes. comments?
>
> Regards
>
> Pavel
>
>
> --
> Sent via pgsql-hackers mailing list (pgsql-hackers(at)postgresql(dot)org)
> To make changes to your subscription:
> http://www.postgresql.org/mailpref/pgsql-hackers
>
>
From | Date | Subject | |
---|---|---|---|
Next Message | Craig Ringer | 2013-08-22 13:33:15 | Re: Backup throttling |
Previous Message | Fujii Masao | 2013-08-22 13:21:28 | Re: pg_system_identifier() |