bytea сохранить на диск. возможно ли из ХП?

gebermes
Дата: 02.06.2015 12:57:09
есть ХП, которая принимает массив байт.
этот массив байт необходимо сохранить на локальный диск, каким образом это можно реализовать?

plpgsql такое позволяет делать? если нет, то необходимо использовать "с"?
vyegorov
Дата: 02.06.2015 13:16:20
gebermes,

Нужно клиентское приложение или un-trusted процедурный язык (С подойдет).
gebermes
Дата: 02.06.2015 13:25:07
vyegorov, покапавшись в справке и на форуме нашел
COPY () TO 'файл';

результат запросов сохраняет, сейчас с приложения передаю массив байт, буду пробовать.

а без си никак? может вам поподались примеры реализации?
qwwq
Дата: 02.06.2015 13:40:11
gebermes,

COPY вставляет шапку.

я пользуюсь для разовых выгрузок adminpack.pg_file_write
и его производными
http://www.sql.ru/forum/actualsearch.aspx?search=adminpack pg_file_write&sin=0&bid=7&a=&ma=0&dt=-1&s=1&so=1
vyegorov
Дата: 02.06.2015 16:52:43
gebermes,

Допустим, что PostgreSQL вертится на линуксе и в хранимке вы используете COPY для записи в файл '/home/user/out/file.name'.
Хранимка сама не запускается, нужно клиентское соединение которое запустит хранимку, но COPY сделает сервер. Пока база и клиент сидят на одной машине все выглядит хорошо. Как только клиент становится удаленным, нужно иметь в виду, что путь для COPY должен быть серверный.

Пробуйте скриптовать, ничего тут сложного нет.
p2.
Дата: 02.06.2015 18:03:30
gebermes
есть ХП, которая принимает массив байт.
этот массив байт необходимо сохранить на локальный диск
не понял, кто кому локальный и, если ХП уже есть, то кому нужно сохранить принимаемый ею массив.
Из plpgsql можно записать файл на сервере через лобы, copy, а можно и utl_file прикрутить - не уверен, что последние два корректно отработают с бинарными данными.

vyegorov
путь для COPY должен быть серверный
беспутный copy можно направить в клиента
gebermes
Дата: 02.06.2015 22:35:27
p2.
gebermes
есть ХП, которая принимает массив байт.
этот массив байт необходимо сохранить на локальный диск
не понял, кто кому локальный и, если ХП уже есть, то кому нужно сохранить принимаемый ею массив.
Из plpgsql можно записать файл на сервере через лобы, copy, а можно и utl_file прикрутить - не уверен, что последние два корректно отработают с бинарными данными.

vyegorov
путь для COPY должен быть серверный
беспутный copy можно направить в клиента


есть ХП у которой входящий параметр JSONB, в этом параметре содержатся поля для вставки в бд и массив байт в base64, и этот массив необходимо перекодировать (с этим вроде бы все хорошо), и сохранить на серваке в файл на диске D:\папка
так наверное правильное будет описание ТЗ.

каким способом это лучше сделать, что бы нагрузка на сервер была минимальной.


тут звучала фраза "клиентское приложение", скорее всего не до конца уловил вашу мысль, могли чуть подробнее?
p2.
Дата: 03.06.2015 01:00:49
gebermes
не до конца уловил
чего уж тут ловить. Выполняю из базового каталога сервера:
postgres=# select lo_from_bytea(0, E'\\xaa5500ff') lobid
postgres-# \gset
postgres=# select lo_export(:lobid, 'tmp/test1.lob');
 lo_export 
-----------
         1
(1 row)

postgres=# select lo_unlink(:lobid);
 lo_unlink 
-----------
         1
(1 row)

postgres=# \! ls -l tmp/test1.lob
-rw-r--r--. 1 postgres postgres 4 Jun  3 00:54 tmp/test1.lob
postgres=# \! od -t x1 tmp/test1.lob
0000000 aa 55 00 ff
0000004
postgres=# 
gebermes
Дата: 03.06.2015 10:25:50
p2.
спасибо


немного уйду от темы. передаю JSON в ХП с массив байт,
массив байт кодирован base64 и добавлено экранирование служебных символов.
decode base64 не хочет глотать текст с экранироваными символами.

как убрать эти символы и привести текст к нормальному виду?