+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.steh...@gmail.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@postgresql.org)
> To make changes to your subscription:
> http://www.postgresql.org/mailpref/pgsql-hackers
>
>

Reply via email to