22
Sun, Dec
3 New Articles

TechTip: Use RPG and QShell for Zipping and Tarring Files

General
Typography
  • Smaller Small Medium Big Bigger
  • Default Helvetica Segoe Georgia Times

If you're putting data on the Web, you likely need to compress it first.

 

As businesses provide more data to the Internet, one common administrative task required for preparing the data is to compress the data into either a zip or a tar file.

 

The IBM i UNIX environment called QShell provides many capabilities, including the jar and tar commands used to compress data. To enter QShell, go to the command line and type STRQSH to bring up a command line in the UNIX environment. Here, you can try out your commands interactively to check the syntax and behavior of the commands that you are executing. I primarily use QShell for operations that I want to perform in the IFS.

 

In this TechTip, I will compress a text file named test.xml that I have stored in a public folder off of the root directory of the IFS.

Creating the TAR File                                                                                              

To compress the test.xml file into test_xml.tar, I have chosen to use the standard UNIX archiving command TAR:

 

tar cf /Public/test_xml.tar /Public/test.xml

 

•·                tar is the UNIX command.

•·                c indicates to create a new file.

•·                f indicates that the archive will be a file.

•·                /Public/test_xml.tar is the destination file name of the archive output (TOFILE in IBM lingo).

•·                /Public/test.xml is the source file name of the input file (FROMFILE in IBM lingo).

 

Creating the ZIP File                                                                                      

To compress the test.xml file into test_xml.zip, I have chosen to use the Java Archiving command JAR:

 

jar cfM /Public/test_xml.zip /Public/test.xml

 

•·                jar is the UNIX command.

•·                c indicates to create a new file.

•·                f indicates that the archive will be a file.

•·                M indicates that the manifest file should not be created. The JAR command's default behavior will accommodate the jar archive format that would create a manifest file to determine the main class of the Java archive. For the purpose of creating a pure zip archive, you would not want a manifest to be created in the resulting archive file.

•·                /Public/test_xml.zip is the destination file name of the archive output (TOFILE in IBM lingo).

•·                /Public/test.xml is the source file name of the input file (FROMFILE in IBM lingo).

 

I strongly recommend that you test your intended archiving commands interactively in QShell before you attempt to code it into your RPG program. This way, if you encounter any problems when running the RPG application, you will know that the problem is in the RPG code, so you're not troubleshooting both the QShell command and the RPG program at the same time.

Coding the QShell commands into RPG                                                            

Now that you have the syntax down and you've executed it interactively to make sure that it behaves the way that you expect it to, you can code it into your RPG program to be executed. You do this by using the QCMDEXC command to call the STRQSH command with the QShell command as the parameter.

 

 

D STRING                   S           1000A                                   

D INFILENAME         S           1000A                                         

D OUTFILENAME     S           1000A                                            

D*                                                                             

C                   EXSR      ZIP_IT                                           

C*                                                                             

C                   EXSR      TAR_IT                                           

C*                                                                             

C                   EVAL      *INLR = *ON                                      

C/EJECT                                                                        

C**********************************************************************        

C* SUBROUTINE: ZIP_IT                                                          

C* FUNCTION:   EXECUTES HARD-CODED JAR COMMAND IN QSHELL.                      

C**********************************************************************        

C     ZIP_IT        BEGSR                                                     

C                         EVAL      INFILENAME  = '/Public/test.xml'          

C                         EVAL      OUTFILENAME = '/Public/test_xml.zip'      

C* ZIP THE XML FILE                                                            

C                         EVAL      STRING = 'STRQSH CMD('                    

C                                                         + '''jar cfM '      

C                                                         + %TRIM(OUTFILENAME) + ' '

C                                                         + %TRIM(INFILENAME) 

C                                                         + ''')'             

C                         Z-ADD     1000          STRLEN                       

C                         CALL      'QCMDEXC'                                  

C                         PARM                    STRING                      

C                         PARM                    STRLEN           15 5       

C                         ENDSR                                               

C/EJECT                                                                        

C**********************************************************************       

C* SUBROUTINE: TAR_IT                                                          

C* FUNCTION:   EXECUTES HARD-CODED TAR COMMAND IN QSHELL.                       

C**********************************************************************       

C     TAR_IT        BEGSR                                                     

C                          EVAL      INFILENAME  = '/Public/test.xml'         

C                          EVAL      OUTFILENAME = '/Public/test_xml.tar'     

C* TAR THE XML FILE                                                           

C                          EVAL      STRING = 'STRQSH CMD('                   

C                                                          + '''tar cf '      

C                                                          + %TRIM(OUTFILENAME) + ' '

C                                                          + %TRIM(INFILENAME)

C                                                          + ''')'            

C                          Z-ADD     1000          STRLEN                     

C                          CALL      'QCMDEXC'                                 

C                          PARM                    STRING                      

C                          PARM                    STRLEN           15 5      

C                          ENDSR                                               

Error When Submitting to Batch                                                                          

OK, everything worked fine when I ran it interactively. So why does it crash when I submit it to batch? When you submit the job to batch, you may get Message ID: RNQ0202, indicating that the call to QCMDEXC ended in error.

 

In our shop, we typically set up our job queues to run one job at a time to allow multiple jobs to be queued up and run in sequential order. This common batch behavior can be a problem for applications that use QShell from RPG because the job will spawn another job to do the QShell operations. Interactively, this isn't a problem because your interactive subsystem allows multiple jobs to run concurrently. Otherwise, you would be the only one allowed on the system with only one session allowed, and that can't work because you have to let the users on too. So more than one job can run concurrently in the interactive subsystem.

 

To resolve this problem, I created a new subsystem for running these types of jobs in batch. When I used the Create Subsystem Description (CRTSBSD) command, I set the MAXJOBS field to *NOMAX instead of the typical value of 1. When I created the subsystem, I reused the original batch subsystem name of QBATCH and appended MAX to the end of the new subsystem to become QBATCHMAX so that I remembered its behavior. I wouldn't want the system operator to push a bunch of queued batch jobs over to this new subsystem that were depending on the previous job completing before the next one started. You could end up with all of the jobs running concurrently and your bills being printed before your account balances are updated!

Compressing Multiple Files into One Archive File                                         

So far, we have compressed one file into an archive file to reduce the size of the original file, which reduces the time that it takes to transfer the file across the network. You can also combine multiple files into one destination archive file, which reduces the size and also organizes all of the files together. To do this, you simply keep adding the file names to the end of the command.

Compressing an Entire Directory of Files into One Archive File                          

You can selectively add individual files to an archive by specifying each file that you wish to add, or you can use wild cards to add all of the files within the specified directory that match the wild card criteria. If you wish to add every file in the directory, you just specify the directory name as the source file. If you wish to only include the XML files, you specify the directory with the *.xml wild card value.

 

Tar Examples:

 

Archiving files /Public/test1.xml, /Public/test2.xml, and /Public/test3.xml into /Public/test_xml.tar:

 

tar cf /Public/test_xml.tar /Public/test1.xml /Public/test2.xml /Public/test3.xml

 

Archiving the XML files into /Public/test_xml.tar:

 

tar cf /Public/test_xml.tar /Public/*.xml

Archiving all of the files from the /Public folder into /Public/test_xml.tar:

 

tar cf /Public/test_xml.tar /Public/

 

Zip Examples:

 

Archiving files /Public/test1.xml, /Public/test2.xml, and /Public/test3.xml into /Public/test_xml.zip:

 

jar cfM /Public/test_xml.zip /Public/test1.xml /Public/test2.xml /Public/test3.xml

 

Archiving the XML files in the /Public folder into /Public/test_xml.zip:

 

jar cfM /Public/test_xml.zip /Public/*.xml

 

Archiving all of the files from the /Public folder into /Public/test_xml.zip:

 

jar cfM /Public/test_xml.zip /Public/

BLOG COMMENTS POWERED BY DISQUS

LATEST COMMENTS

Support MC Press Online

$

Book Reviews

Resource Center

  • SB Profound WC 5536 Have you been wondering about Node.js? Our free Node.js Webinar Series takes you from total beginner to creating a fully-functional IBM i Node.js business application. You can find Part 1 here. In Part 2 of our free Node.js Webinar Series, Brian May teaches you the different tooling options available for writing code, debugging, and using Git for version control. Brian will briefly discuss the different tools available, and demonstrate his preferred setup for Node development on IBM i or any platform. Attend this webinar to learn:

  • SB Profound WP 5539More than ever, there is a demand for IT to deliver innovation. Your IBM i has been an essential part of your business operations for years. However, your organization may struggle to maintain the current system and implement new projects. The thousands of customers we've worked with and surveyed state that expectations regarding the digital footprint and vision of the company are not aligned with the current IT environment.

  • SB HelpSystems ROBOT Generic IBM announced the E1080 servers using the latest Power10 processor in September 2021. The most powerful processor from IBM to date, Power10 is designed to handle the demands of doing business in today’s high-tech atmosphere, including running cloud applications, supporting big data, and managing AI workloads. But what does Power10 mean for your data center? In this recorded webinar, IBMers Dan Sundt and Dylan Boday join IBM Power Champion Tom Huntington for a discussion on why Power10 technology is the right strategic investment if you run IBM i, AIX, or Linux. In this action-packed hour, Tom will share trends from the IBM i and AIX user communities while Dan and Dylan dive into the tech specs for key hardware, including:

  • Magic MarkTRY the one package that solves all your document design and printing challenges on all your platforms. Produce bar code labels, electronic forms, ad hoc reports, and RFID tags – without programming! MarkMagic is the only document design and print solution that combines report writing, WYSIWYG label and forms design, and conditional printing in one integrated product. Make sure your data survives when catastrophe hits. Request your trial now!  Request Now.

  • SB HelpSystems ROBOT GenericForms of ransomware has been around for over 30 years, and with more and more organizations suffering attacks each year, it continues to endure. What has made ransomware such a durable threat and what is the best way to combat it? In order to prevent ransomware, organizations must first understand how it works.

  • SB HelpSystems ROBOT GenericIT security is a top priority for businesses around the world, but most IBM i pros don’t know where to begin—and most cybersecurity experts don’t know IBM i. In this session, Robin Tatam explores the business impact of lax IBM i security, the top vulnerabilities putting IBM i at risk, and the steps you can take to protect your organization. If you’re looking to avoid unexpected downtime or corrupted data, you don’t want to miss this session.

  • SB HelpSystems ROBOT GenericCan you trust all of your users all of the time? A typical end user receives 16 malicious emails each month, but only 17 percent of these phishing campaigns are reported to IT. Once an attack is underway, most organizations won’t discover the breach until six months later. A staggering amount of damage can occur in that time. Despite these risks, 93 percent of organizations are leaving their IBM i systems vulnerable to cybercrime. In this on-demand webinar, IBM i security experts Robin Tatam and Sandi Moore will reveal:

  • FORTRA Disaster protection is vital to every business. Yet, it often consists of patched together procedures that are prone to error. From automatic backups to data encryption to media management, Robot automates the routine (yet often complex) tasks of iSeries backup and recovery, saving you time and money and making the process safer and more reliable. Automate your backups with the Robot Backup and Recovery Solution. Key features include:

  • FORTRAManaging messages on your IBM i can be more than a full-time job if you have to do it manually. Messages need a response and resources must be monitored—often over multiple systems and across platforms. How can you be sure you won’t miss important system events? Automate your message center with the Robot Message Management Solution. Key features include:

  • FORTRAThe thought of printing, distributing, and storing iSeries reports manually may reduce you to tears. Paper and labor costs associated with report generation can spiral out of control. Mountains of paper threaten to swamp your files. Robot automates report bursting, distribution, bundling, and archiving, and offers secure, selective online report viewing. Manage your reports with the Robot Report Management Solution. Key features include:

  • FORTRAFor over 30 years, Robot has been a leader in systems management for IBM i. With batch job creation and scheduling at its core, the Robot Job Scheduling Solution reduces the opportunity for human error and helps you maintain service levels, automating even the biggest, most complex runbooks. Manage your job schedule with the Robot Job Scheduling Solution. Key features include:

  • LANSA Business users want new applications now. Market and regulatory pressures require faster application updates and delivery into production. Your IBM i developers may be approaching retirement, and you see no sure way to fill their positions with experienced developers. In addition, you may be caught between maintaining your existing applications and the uncertainty of moving to something new.

  • LANSAWhen it comes to creating your business applications, there are hundreds of coding platforms and programming languages to choose from. These options range from very complex traditional programming languages to Low-Code platforms where sometimes no traditional coding experience is needed. Download our whitepaper, The Power of Writing Code in a Low-Code Solution, and:

  • LANSASupply Chain is becoming increasingly complex and unpredictable. From raw materials for manufacturing to food supply chains, the journey from source to production to delivery to consumers is marred with inefficiencies, manual processes, shortages, recalls, counterfeits, and scandals. In this webinar, we discuss how:

  • The MC Resource Centers bring you the widest selection of white papers, trial software, and on-demand webcasts for you to choose from. >> Review the list of White Papers, Trial Software or On-Demand Webcast at the MC Press Resource Center. >> Add the items to yru Cart and complet he checkout process and submit

  • Profound Logic Have you been wondering about Node.js? Our free Node.js Webinar Series takes you from total beginner to creating a fully-functional IBM i Node.js business application.

  • SB Profound WC 5536Join us for this hour-long webcast that will explore:

  • Fortra IT managers hoping to find new IBM i talent are discovering that the pool of experienced RPG programmers and operators or administrators with intimate knowledge of the operating system and the applications that run on it is small. This begs the question: How will you manage the platform that supports such a big part of your business? This guide offers strategies and software suggestions to help you plan IT staffing and resources and smooth the transition after your AS/400 talent retires. Read on to learn: