(If you don't use DBI, you can skip to download and install source code, p500502.savf)
> 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. |
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. |
> 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. |
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]