Hallo zusammen



Ich habe die Anforderung aus einem BLOB Feld einer AS400 Tabelle, welches ein Programmobjekt für eine Android App beinhält (ca. 5 MB), mittels REST Service über den IBM i integrated web services server, dieses als BASE64 String zur Verfügung zu stellen.



Grundsätzlich dachte ich, das mit folgendem SQL zu machen, aber das funktioniert leider nicht, da der BLOB Inhalt zu groß ist. SYSTOOLS.BASE64ENCODE ist auf 2732 Zeichen beschränkt.



Code:
Select cast(systools.base64encode(Datei) AS clob ccsid 1208) as Datei from Versionsverwaltung

where programm = 'StaplerTerminal.apk' and versionsnr = '1.0.5';


Daher war dann mein Ansatz, das BLOB Feld in einem CLOB (CCSID 1208) als BASE64 zu speichern. Dies wollte ich mittels apr_base64_encode_binary bewerkstelligen. Die Funktion habe ich aus einem Foreneintrag übernommen. Nur komme ich auf keinen grünen Zweig, da ich, egal was ich anstelle, immer falsche BASE64 Daten erzeuge.



Code:
dcl-s Blob sqltype(BLOB:16773100);                 

dcl-s Clob sqltype(CLOB:16773100) CCSID(1208);     

dcl-s DateiClob sqltype(CLOB:16773100) CCSID(1208);

dcl-s ClobOut sqltype(CLOB:16773100) CCSID(1208);  

dcl-s   LocString   like(Clob);      

dcl-s   LocBase64   like(Clob);      



exec sql                                                           

   select datei into :Blob,  

   from Versionsverwaltung                                          

   where  programm = trim(:Programm) and versionsnr = trim(:Version)

   limit 1;                                                         



if sqlcode = 0;

  ClobOut = getBase64(Blob);                                          

  ClobOut_Len = %len(%trimr(ClobOut));                                

  exec sql                                                             

    update Versionsverwaltung set DateiClob = :ClobOut                

    where aktuell='1' and                                             

   where  programm = trim(:Programm) and versionsnr = trim(:Version);

endif;



*inlr = *on;   

return;        

 

//  _______________________________________________________________

//  getBASE64 Encoded String   ____________________________________

                                                                  

 dcl-proc getBase64;                                              

   dcl-pi *n     like(Clob) rtnparm; // Encoded String            

     PiString    like(Blob);                                      

   end-pi;                                                        

                                                                  

   dcl-s   LocString   like(Blob) inz;     // Source String       

   dcl-s   LocBase64   like(Clob) inz;     // Encoded String      

   dcl-s   Loclength   int(10);            // StringLength        

   dcl-s   LocEnclen   int(10);            // EncodedLength       

                                                                  

   LocString = %trimr(PiString);                                  

   LocLength = %len(%trimr(LocString));       // String-Length    

                                                                  

   LocEnclen = encbase64bin(%addr(LocBase64): // Encode Base64    

                            %addr(LocString):LocLength);          

                                                                  

   if LocEnclen > *zero;                      // Encoded Length   

     return %subst(LocBase64:1:LocEnclen - 1);// without last null

   else;                                                          

     return *blanks;             

   endif;                        

                                 

 end-proc;


Hat jemand eine Idee, was ich hier falsch mache oder ist meine Herangehensweise falsch? Bin für jeden Tipp dankbar.



Grüße, Ingo