Re: [postgrsql bytea ]extraction bytea

From: Cédric Villemain <cedric(at)2ndquadrant(dot)com>
To: pgsql-fr-generale(at)postgresql(dot)org
Cc: pierre crumeyrolle <pierre(dot)crumeyrolle(at)c-s(dot)fr>, Guillaume Lelarge <guillaume(at)lelarge(dot)info>
Subject: Re: [postgrsql bytea ]extraction bytea
Date: 2014-04-10 17:22:06
Message-ID: 2034334.5PtSL8SEF2@obelix
Views: Whole Thread | Raw Message | Download mbox | Resend email
Thread:
Lists: pgsql-fr-generale

Le jeudi 10 avril 2014 16:59:47 pierre crumeyrolle a écrit :
> j'extrait mon binaire via ECPG => select binaire from ma table
> il va dans un buffer déclaré char * buffer
> je fwrite mon buffer
> je me retrouve avec un fichier ascii
> le select sous pg_admin me donne \037\235\220C\324\200 etc ...
> je m'attendais à voir du binaire

non, postgresql fait une sortie texte en hexa ou en escape pour le
bytea. Il faut a ce moment là retraiter cette entrée pour l'écrire dans
le format binaire souhaité.

Sinon vous devez ajouter une fonction pour renvoyer directement au
format binaire à la place de byteasend(bytea), je suggère de regarder
"src/backend/utils/adt/varlena.c" et "src/include/utils/bytea.h"

>
> Le 10/04/2014 16:31, Guillaume Lelarge a écrit :
> > On Thu, 2014-04-10 at 16:15 +0200, pierre crumeyrolle wrote:
> >> OK mais ma data c'est pas de l'ascii mais du binaire, c'est du tar
> >> compressé stocké en base (initialement dans des CLOB oracle migré
> >> via
> >> ora2pg)
> >
> > Je ne comprends pas. L'exemple de Dimitri traite bien d'un objet
> > binaire (très précisément une donnée dans une colonne bytea). Le
> > fait qu'il est mis un texte dans cette colonne ne change pas que la
> > colonne est du binaire.
> >
> >> Le 10/04/2014 15:44, Dimitri Fontaine a écrit :
> >>> pierre crumeyrolle <pierre(dot)crumeyrolle(at)c-s(dot)fr> writes:
> >>>> comment puis je extraire le contenu de la colonne bindata de type
> >>>> bytea directement dans un fichier binaire sans passer par un
> >>>> copy qui rajoute une entête ?
> >>>
> >>> Il me semble qu'il faut écrire une application cliente pour cela.
> >>>
> >>> Voilà comment reproduire le problème :
> >>> ~# create table t(id integer, bindata bytea);
> >>> CREATE TABLE
> >>> ~# insert into t values(1, 'deadbeef');
> >>> INSERT 0 1
> >>> ~# table t;
> >>>
> >>> id | bindata
> >>>
> >>> ----+--------------------
> >>>
> >>> 1 | \x6465616462656566
> >>>
> >>> (1 row)
> >>>
> >>> ~# \copy (select bindata from t where id = 1) to '/tmp/bin'
> >>> binary
> >>> COPY 1
> >>>
> >>> ~# \! hexdump -C /tmp/bin
> >>> 00000000 50 47 43 4f 50 59 0a ff 0d 0a 00 00 00 00 00 00
> >>> |PGCOPY..........| 00000010 00 00 00 00 01 00 00 00 08 64
> >>> 65 61 64 62 65 65 |.........deadbee| 00000020 66 ff ff
> >>> |f..| 00000023
> >>>
> >>> Écris une application dans ton language de programmation préféré
> >>> afin de pouvoir écrire chaque valeur binaire dans un fichier
> >>> séparé.>>>
> >>> Par exemple, avec mes outils préférés du moment :
> >>> CL-USER> (with-open-file (s "/tmp/bin"
> >>>
> >>> :direction :output
> >>> :element-type '(unsigned-byte 8)
> >>> :if-exists :supersede)
> >>>
> >>> (pomo:with-connection '("dim" "dim" "dim" :unix
> >>> :port 54393)
> >>>
> >>> (write-sequence
> >>>
> >>> (pomo:query "select bindata from t where id = 1"
> >>> :single) s)))
> >>>
> >>> #(100 101 97 100 98 101 101 102)
> >>>
> >>> $ hexdump -C /tmp/bin
> >>> 00000000 64 65 61 64 62 65 65 66
> >>> |deadbeef| 00000008
> >>>
> >>> Et voilà,
> >>
> >> --
> >> Envoi via la liste pgsql-fr-generale
> >> (pgsql-fr-generale(at)postgresql(dot)org)
> --
> Envoi via la liste pgsql-fr-generale
> (pgsql-fr-generale(at)postgresql(dot)org)

--
Cédric Villemain +33 (0)6 20 30 22 52
http://2ndQuadrant.fr/
PostgreSQL: Support 24x7 - Développement, Expertise et Formation

In response to

Responses

Browse pgsql-fr-generale by date

  From Date Subject
Next Message CRUMEYROLLE Pierre 2014-04-10 18:10:09 Re: [postgrsql bytea ]extraction bytea
Previous Message pierre crumeyrolle 2014-04-10 14:59:47 Re: [postgrsql bytea ]extraction bytea