Month: December 2014

New PeopleCode Dump Method

One of my old tricks was to create a PeopleCode dump from the system.  Then I could use a text editor tool such as gVim or Ultraedit to search through the code to find examples or certain uses of definitions.

Basically, a PeopleCode dump is easily created by searching for (Edit > Find In) a semicolon.  Because every statement must have a semicolon, it matches every statement of code in the system.  On the Find In dialog, checking the Save to File option will write out each line to a text file.

The problem is that Application Designer seems to load every line into memory.  If you don’t have a client machine with a ton of memory, you end up looking like this:

App Designer Out of Memory Error

 

Instead, I found this new tool called Decode PeopleCode.  You can download the latest zipped version of the program from here.

Once extracted, I had to configured the URL property in the DecodePC.properties file.  I set it to something like this:

url=jdbc:oracle:thin:@<server name>:1521/<db name>

I also had a problem with the JDBC driver for some reason.  It didn’t find the odbc5.jar file that was delivered.  I already had a copy of the odbc6.jar, so I just adjusted the classpath to include that.  If you run into the same problem, adjust the DecodePCODE.sh or DecodePCODE.bat file to contain the full path to the jar file.

Also, adjust the “outdir” property in the DecodePC.properties file to point to the directory where you want the output dumped.  Note that it will create a bunch of folders and files in that directory, so you may want to point it to an empty directory.

Then, I ran the program with this command to capture everything:

sh DecodePCODE.sh since 1901/01/01

Now, that creates each PeopleCode program in its own file.  The problem is that I want it all in a single file that I can run regular expressions against.  I could use grep, but I am used to a single file.  I cobbled this script together to build that single file:

#!/bin/bash


processFile() {
   outdirlen=$((${#OUTDIR} + 1))
   filename=$1
   lastUpdateFile=$( echo "$filename" | sed 's/\.pcode$/.last_update/' )
   peoplecodePath=${filename:$outdirlen}
   peoplecodePath=$( echo "$peoplecodePath" | sed 's/\//: /' | sed 's/\.pcode$//' | sed 's/\//./g')
   echo -e "\e[0K\r Writing: $peoplecodePath"
   echo "[$peoplecodePath]" >> "$OUTFILE"
   echo '/*   Details:' >> "$OUTFILE"
   echo '   Last Update User: ' $(head -n 1 "$lastUpdateFile") >> "$OUTFILE"
   echo '   Last Update Date/Time: ' $(tail -n 1 "$lastUpdateFile") >> "$OUTFILE"
   echo '*/' >> "$OUTFILE"
   cat "$filename" >> "$OUTFILE"
}


#  ------------------------------
#    Main
#  ------------------------------

OUTDIR=$( grep "outdir=" DecodePC.properties | sed 's/^outdir=//' | sed 's/\r//')
DUMPDATE=$(stat -c %y $(ls -rt | tail -n 1) | cut -d ' ' -f1 )
DATABASE=$( grep "^url=" DecodePC.properties | sed 's/^url=.*\///' | sed 's/\r//')
OUTFILE="$OUTDIR/all.pcode"
echo "outdir -- $OUTDIR  dump date -- $DUMPDATE  database -- $DATABASE"

echo "PeopleCode Dump $DATABASE   $DUMPDATE" > "$OUTFILE"
find "$OUTDIR" -type f -name \*.pcode | while read file; do processFile "$file"; done

That seemed to get the trick done for me nicely.

This program has more features than just this. You should explore it. It can check the code into a sourcecode repository to track changes. Kudos to whoever wrote it!

Resources