...
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
H**FREE CTL-OPT DFTACTGRP(*NO) ACTGRP(*CALLER) BNDDIR('QC2LE'); D InputData_t ds DCL-DS INPUTDATA_T QUALIFIED BASED(TEMPLATE); FILEID VARCHAR(640); USERID CHAR(10); IPADDR CHAR(15); INLINE IND; END-DS; DCL-PR TMPNAM POINTER EXTPROC('_C_IFS_tmpnam'); qualifiedSTRING D based(Template) D fileid 640a varying D userid 10a D ipAddr 15a D inline 1n D Main PR ExtPgmCHAR(39) OPTIONS(*OMIT); END-PR; DCL-PR MAIN EXTPGM('PUIDNLEXIT'); TIMINGFLAG INT(10) CONST; D timingFlag 10i 0 const D inputData likeds(InputData_t) const D stmfDir 640a varying D stmfName 256a varying D attName 256a varying D contentType 255a varying D allow 5i 0 dcl-pr unlink int(10) ExtProc INPUTDATA LIKEDS(INPUTDATA_T) CONST; STMFDIR VARCHAR(640); STMFNAME VARCHAR(256); ATTNAME VARCHAR(256); CONTENTTYPE VARCHAR(256); ALLOW INT(5); END-PR; DCL-PR UNLINK INT(10) EXTPROC('unlink'); PATH POINTER path pointer value options(*string); VALUE OPTIONS(*STRING); END-PR; DCL-PI MAIN; TIMINGFLAG INT(10) CONST; D Main PI D timingFlag 10i 0 const D inputData likeds(InputData_t) const INPUTDATA LIKEDS(INPUTDATA_T) CONST; STMFDIR VARCHAR(640); STMFNAME VARCHAR(256); ATTNAME VARCHAR(256); CONTENTTYPE VARCHAR(256); ALLOW INT(5); END-PI; DCL-S MYPIC SQLTYPE(BLOB_FILE); DCL-S FILENAME VARCHAR(50); DCL-S RECNUMPOS INT(5); // USED TO PARSE THE PARAM STRING DCL-S BLOBLOC VARCHAR(25); // STORES THE KEYWORD FOR THE LOCATION OF THE TABLE CONTAINING THE BLOB DCL-S RECID VARCHAR(25); // STORES THE RECORD KEY FOR THE BLOB IMAGE IF %SUBST(INPUTDATA.FILEID:1:5) = 'BLOB:'; // CHECKING PASSED PARAMETER FOR THE KEYWORD 'BLOB' IF TIMINGFLAG = 0; D FILENAME stmfDir = %STR(TMPNAM(*OMIT)) + '.jpg'; RECNUMPOS = %SCAN(':' : INPUTDATA.FILEID : 6); 640a varying BLOBLOC = D%SUBST(INPUTDATA.FILEID : 6 stmfName: RECNUMPOS - 6); RECID = %SUBST(INPUTDATA.FILEID : RECNUMPOS + 1 256a: varying D attName %LEN(%TRIM(INPUTDATA.FILEID)) - RECNUMPOS); IF BLOBLOC = 'ANIMALS'; 256a varying MYPIC_FO D= SQFCRT; contentType MYPIC_NAME = FILENAME; 255a varying D MYPIC_NL allow= %LEN(%TRIM(FILENAME)); EXEC SQL 5i 0 SELECT MYBLOB INTO :MYPIC FROM MYTABLE WHERE dcl-sFILEID myPic SQLTYPE(BLOB_FILE)= :RECID; dcl-s filename varchar(255) inz('/tmp/myTestImage.jpg'); IF SQLCODE = 0; // SQL dcl-sWAS myidSUCCESSFUL int(5); /free allowSTMFNAME = 1FILENAME; if timingFlag = 0; ATTNAME myid = %int(%trim(InputData.fileid))= 'elephant'; myPic_fo = SQFCRT; myPic_name ALLOW = filename1; myPic_nl = %Len(%trim(filename)) ELSE; Exec SQL ALLOW = 0; select myBlob into :myPic from myLibrary.myTable where fileid = :myidENDIF; ELSE; stmfDir = '/tmp/'; stmfNameALLOW = 'myTestImage.jpg'0; attName = 'elephant'ENDIF; ENDIF; IF TIMINGFLAG if timingFlag = 1; unlinkUNLINK(%trim%TRIM(filenameFILENAME)); ENDIF; ELSE; ALLOW = *inlr = *on; /end-free 1; //ADD NON BLOB DOWNLOAD CONDITIONS HERE ENDIF; *INLR = *ON; |
We won’t go into detail about the parameters set in this exit program. You can learn more about the different parameters for the PUIDNLEXIT program in the documentation. It’s also important to note that we did not change any of the parameters in the PUIDNLEXIT program we used for this, we kept them the same as they were in the sample PUIDNLEXIT program that is shipped with Profound UI. Note though, that we are using the id property to pass a "key" value instead of an IFS path. You can read more about that here.
This PUIDNLEXIT program is called twice. The first time it is called before the download, timingFlag = 0. This is where you will actually write the image to the IFS in the program. IBM has more detailed information about LOB files here on their website that will also help you with understanding parts of this program. A few important notes about this section of the program:
- Fileid RECID is the ID value supplied to the pui.downloadURL() API. This will be your file’s key value.
- myPicMYPIC_name NAME is used in order to tell the program where to put the file. Notice in our program this is equal to “filename”, which has a value of “/tmp/myTestImage.jpg”. So, it will create a file named “myTestImage.jpg” in the “/tmp” folder. Instead of hardcoding this in your program, you could add columns to your table, read the values from those fields, and create the file based on those valuesis a temporary name generated by the TMPNAM() API. You can find more information about the TMPNAM() API here.
The second time the PUIDNLEXIT program is called is after the download occurs, in which case timingFlag = 1. This is where you will want to delete the file from the IFS. To do this, we used the “unlink()” API. This API is simply used to delete a link. You can find more detailed information about this API here.
...
Code Block | ||||
---|---|---|---|---|
| ||||
var imageSrc = pui.downloadURL({ "id": "BLOB:ANIMALS:1", "contentType": "image/jpeg" });
applyProperty('Image1', 'image source', imageSrc);
applyProperty('Image1', 'visibility', 'visible'); |
Here, we download the image using pui.downloadURL() by setting the “id” to “1”. This comes from ‘fileid’ in your PUIDNLEXIT program, as mentioned earlierto “BLOB:ANIMALS:1”, which contains the keywords to tell our PUIDNLEXIT program that we are downloading a BLOB object and where to find it. Note that we need to include the logic to parse the keywords in "id" as it is not included in the default PUIDNLEXIT program.
After downloading the image and setting this to a variable, “imageSrc”, we then use the applyProperty() API to change the "image source" property of our image to our downloaded image and change the visibility to “visible”, so that we can see the downloaded image. Now, when we click the download button, the image will download and appear in place of the image widget.
...