bytea -> Bitmap

hi,

vorweg : ich habe das Beispiel lo_import / lo_export ausprobiert und es funktioniert bei mir :wink:

“das” wäre wohl der “richtige” Weg um ein Bitmap zu speichern …
nun habe ich eine “vorgegebene” v8.3 PostgreSQL Table wo bytea dafür verwendet wird !

wenn ich nun mit meinem “native” Control via libpq.dll auf das Field zugreife bekomme ich so was

\x28000000fa000000c80000000100080000000000e0c40000842500008425000000000000000000
00ffffff00ccffff0099ffff0066ffff0033ffff0000ffff00ffccff00ccccff0099ccff0066ccff ...

das sieht mit nun gar nicht nach einem Bitmap Header aus … kein “BM6” …

wie schon gesagt ein “large Object” wäre wohl der “richtige” Weg aber ich muss nun mit “der” Konstruktion leben …

was “könnte” sich der Erfinder von einer solchen bytea <-> Bitmap Kontrucktion “gedacht” haben ?

-- Table: parts

-- DROP TABLE parts;

CREATE TABLE parts
(
  partno character(8),
  partname character(20),
  parttype character(20),
  purchase numeric(7,2),
  sellprice numeric(7,2),
  margin numeric(3,1),
  bmpimage bytea,
  __deleted boolean NOT NULL DEFAULT false,
  __record serial NOT NULL,
  __rowversion integer NOT NULL DEFAULT 0,
  __keyversion integer NOT NULL DEFAULT 0,
  __lock_owner integer NOT NULL DEFAULT 0,
  __order_parts_partno character(19),
  __order_parts_partname character(31),
  CONSTRAINT parts_pkey PRIMARY KEY (__record )
)
WITH (
  OIDS=FALSE
);
ALTER TABLE parts
  OWNER TO postgres;

-- Trigger: parts_isam_rowversion on parts
-- DROP TRIGGER parts_isam_rowversion ON parts;

*** abgeschnitten ***

ich habe es mit Encode / Decode versucht …
oder muss ich mit dem “String” evtl eine Bitmap API Structure “füllen” ?

hat jemand irgendeine weitere Idee ?

hi,

habe es raus gefunden :wink:

ich handelt sich um einen HEX String wobei die ersten 14 Byte des Bitmap Header fehlen !!!
es handelt sich hierbei um eine Xbase++ spezifische Art des Herstellers welche als PDR 6009 dokumentiert wurde.
Alaska Software - Knowledgebase

Frage : ich habe am Anfang des HEX String “\x” … hat das was mit PostgreSQL zu tun ?

\x28000000fa000000c8 ...

Ja, es gibt 2 Arten der Ausgabe: escape und hex. Hex ist Default, seit 9.0. Wer z.B. DRUPAL nutzt, sollte das umstellen (eigene Erfahrung einer PG-Umstellung 8.4 → 9.0 @work …)

test=# create table foo(t bytea);
CREATE TABLE
Time: 3,363 ms
test=*# insert into foo values ('test');
INSERT 0 1
Time: 0,353 ms
test=*# select * from foo;
     t
------------
 \x74657374
(1 row)

Time: 0,279 ms
test=*# set bytea_output = 'escape';
SET
Time: 0,126 ms
test=*# select * from foo;
  t
------
 test
(1 row)

Time: 0,234 ms

Andreas

aha … verstehe … dann ist “\e” wohl für escape gedacht. Danke

hi,

nachdem ich den HEX String “bearbeitet” habe kann ich ein Bitmap erzeugen und anzeigen.

nun möchte ich es “andersherum” versuchen also den HEX String in PostgreSQL Field Type bytea “abspeichern”.

// Xbase++ Syntax
//
// SQL String für Query zusammenstellen
//
METHOD JimBrowse:LoadBitmap( nRow, nCol ,nRecord)
LOCAL  cSql     := "UPDATE " + ::_cTable + " SET "

   cFile    :=  GetBitmapFile()
   IF FILE(cFile)
      oBMP := XBPBITMAP() :new()  :create()
      oBMP:loadFile( cFile )
      cBuffer :=  oBMP:setbuffer()

      cSql     += ::_aBroFields[ nCol ] [ DBS_NAME ] +  "= '"    // inside " ' "
      cSql     += cBin2Hex(cBuffer) + "'  "                      // inside " ' "
  
      cAlias   := ::_aBroFields[ nCol ] [ DBS_ALIAS ] + "."
      cWhere   := cAlias + "__record" + "=" + STR(nRecord)
      cSql     += "  WHERE " + cWhere

      : :o utMsg( cSql )
      : :o PG:Exec( cSql  )
      xt := : :o PG:result:ResultStatus()

ich habe den HEX String in " ’ " (ohne Leerzeichen) gepackt und er sieht im Debugger “gut” aus (“28000000…”) …
die Query wird auch angenommen und ich “sehe” in meiner Appication die Änderung

leider steht da nun nicht HEX “\x28000000…” sondern “\x323830303030303…” und das stimmt einfach nicht :frowning:

wie schon gesagt die Function cBin2Hex(cBuffer) liefert mir im Debugger noch den “richtigen” String aber nach dem

UPDATE parts AS a SET bmpimage= '280000...' WHERE a.__record=1

bekomme ich den “\x323830303030303…” angezeigt …

was mache ich Newbie falsch ?
PostgreSQL 9.1.4


Nachtrag : vergesst es … ich muss “\x” vor dem HEX String einfügen … dann klappt es auch mit bytea