Perl for AS/400 Installation

(If you don't use DBI, you can skip to download and install source code, p500502.savf)
  1. Access http://www.cpan.org/ports/as400/ or ftp://ftp.plig.org/pub/CPAN/ports/as400/ and download "perlpgm.savf.gz" (6.3M) and "p500502.savf.gz" (7.0M).
  2. Uncompress files using, for example, WinZip to obtain "perlpgm.savf" (17.7M) and "p500502.savf" (18.7M).


  3. Create save-file on your AS/400.
    > CRTLIB LIB(PERLDIST) TEXT('Perl 5 Distribution Library')
      Library PERLDIST created.
    > CRTSAVF FILE(PERLDIST/PERLPGM) TEXT('AS/400 Perl Binaries')
      File PERLPGM created in library PERLDIST.
    > CRTSAVF FILE(PERLDIST/P500502) TEXT('AS/400 Perl Sources')
      File P500502 created in library PERLDIST.                 

  4. Connect to the AS/400 using FTP client (i.e. from Windows command prompt). Put(send) the distribution (.savf) to the save-file by binary mode.
    C:\>ftp your_as400_hostname
    Connected to ????
    220-QTCP AT ????.
    220 CONNECTION WILL CLOSE IF IDLE MORE THAN 5 MINUTES.
    User (????:(none)): as400_user_id
    331 ENTER PASSWORD.
    Password:enter_password_for_the_user_id
    230 ???? LOGGED ON.
    ftp> bi
    200 REPRESENTATION TYPE IS BINARY IMAGE.
    ftp> put perlpgm.savf perldist/perlpgm
    200 PORT SUBCOMMAND REQUEST SUCCESSFUL.
    150 SENDING FILE TO MEMBER PERLPGM IN FILE PERLPGM IN LIBRARY PERLDIST.
    250 FILE TRANSFER COMPLETED SUCCESSFULLY.
    17750832 bytes sent in 50.34 seconds (352.60 Kbytes/sec)
    ftp> put p500502.savf perldist/p500502
    200 PORT SUBCOMMAND REQUEST SUCCESSFUL.
    150 SENDING FILE TO MEMBER P500502 IN FILE P500502 IN LIBRARY PERLDIST.
    250 FILE TRANSFER COMPLETED SUCCESSFULLY.
    ftp: 18777792 bytes sent in 16.10Seconds 1166.11Kbytes/sec.
    ftp> quit
    221 QUIT SUBCOMMAND RECEIVED.

  5. Restore objects to library 'PERLDIST' and directory '/usr/local' from the save-files using RSTLIB and RST commands.
    > RSTOBJ OBJ(*ALL) SAVLIB(PERLDIST) DEV(*SAVF) SAVF(PERLDIST/PERLPGM)
      3 objects restored from PERLDIST to PERLDIST.
    > QSH CMD('ln -s /qsys.lib/perldist.lib/perl.pgm /usr/bin/perl')
    > MD DIR('/usr/local')
      Directory created.
    > MD DIR('/usr/local/lib')
      Directory created.
    > RST DEV('/QSYS.LIB/PERLDIST.LIB/PERLLIB.FILE') OBJ(('/usr/local/lib/*'))
      Security changes occurred for 409 objects.
      409 objects restored. 0 objects not restored.
    > MD DIR('/usr/local/src')
      Directory created.
    > RSTOBJ OBJ(PERLSRC) SAVLIB(PERLDIST) DEV(*SAVF) SAVF(PERLDIST/P500502)  
      1 objects restored from PERLDIST to PERLDIST.                           
    > RST DEV('/QSYS.LIB/PERLDIST.LIB/PERLSRC.FILE') OBJ(('/usr/local/src/*'))
      Security changes occurred for 1280 objects.                             
      1280 objects restored. 0 objects not restored.                          

Apply (unauthorized, untested) patch to DBI

Unfortunately, DBI (standard database access scheme for Perl) returns blank value for character fields from OS/400 V4R5. It is required to modify a source file "/usr/local/src/perldist/DBD-DB2-0.71/dbdimp.c" to circumvent this problem.

Below is a quick-and-dirty patch I am using. This patch has not been tested thoroughly and nobody supports it.

(Before)

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ SNIP ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 995 if (fbh->rlen > -1) { /* normal case - column is not null */ 996 #ifdef AS400 997 if (fbh->ftype == SQL_C_CHAR && fbh->rlen == 0) 998 fbh->rlen = strlen(fbh->buf); 999 #endif /* AS400 */ 1000 if (fbh->ftype == SQL_C_CHAR) 1001 SvCUR(fbh->sv) = fbh->rlen; 1002 sv_setsv(sv,fbh->sv); 1003 } else { /* column contains a null value */ 1004 fbh->indp = fbh->rlen; 1005 fbh->rlen = 0; 1006 (void)SvOK_off(sv); 1007 } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ SNIP ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
(After)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ SNIP ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 995 #ifdef AS400
 996           /*  if (fbh->ftype == SQL_C_CHAR && fbh->rlen == 0)  */
 997             if (fbh->ftype == SQL_C_CHAR && fbh->rlen <= 0)
 998                  fbh->rlen = strlen(fbh->buf);
 999 #endif /* AS400 */
1000 /* H.Yahagi 2002-01-20 */
1001         if (fbh->rlen > -1) {    /* normal case - column is not null */
1002             if (fbh->ftype == SQL_C_CHAR)
1003                  SvCUR(fbh->sv) = fbh->rlen;
1004             sv_setsv(sv,fbh->sv);
1005         } else {                /*  column contains a null value */
1006                fbh->indp = fbh->rlen;
1007             fbh->rlen = 0;
1008             (void)SvOK_off(sv);
1009         }
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ SNIP ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Compile and update the module as follows.
> CHGJOB CCSID(37)
> CRTCMOD MODULE(QTEMP/DBDIMP) SRCSTMF('/usr/local/src/perldist/DBD-DB2-0.7
  1/dbdimp.c') OUTPUT(*print) OPTIMIZE(40) DBGVIEW(*ALL) DEFINE(HAVE_DBI HA
  VE_DB2 AS400 'STANDARD_C=1' DEBUGGING YYDYNAMIC 'YYDEBUG=1' STRANGE_MALLO
  C EBCDIC) INCDIR('/usr/local/src/perldist/perl5.005_02' '/usr/local/src/p
  erldist/DBI-1.06')                                                       
  Module DBDIMP was created in library QTEMP on 02/02/02 at 14:11:49.      
> UPDPGM PGM(PERLDIST/PERL) MODULE(QTEMP/DBDIMP)                           
  Program PERL in PERLDIST updated.                                        

[Home]