This is a pre-unofficial release, It just allows to open PowerBuilder project up to 12.0, but a lot of new APIs are not mapped yet. Here is was we could do with it.
First of all, install Powerbuilder::ORCA (see annexes for all mentioned files)
Method 1: From sources.
Download and unpack the file PowerBuilder-ORCA-0.06.tar.gz file in your working directory, then
perl Makefile.pl & nmake & nmake install
Method 2: From binaries (active Perl 5.8.8).
Download the files PowerBuilder-ORCA-0.06-PPM.tar.gz and PowerBuilder-ORCA-0.06.ppd, then
ppm install PowerBuilder-ORCA-0.06.ppd
At first, I have backported the SeKi’s Pbniregex project to pb10.5.
Here is a script which will output objects references in a graphviz format:
#!/usr/perl
#usage: references-dep.pl pborcaXXX.dll full-project-path project-file-name.pbt
use PowerBuilder::ORCA qw/:const/;
my ($dll, $cwd, $pbt) = @ARGV;
PowerBuilder::ORCA::LoadDll($dll);
print STDERR "Using ORCA DLL: $PowerBuilder::ORCA::ORCA_Dll \n";
my ($appName, $appLib);
my @libList;
open( PROJECT, $cwd.$pbt ) or die("Couldn't open PROJECT (${cwd}${pbt}) for reading.\n\n");
while(<PROJECT>){
if($_=~/^appname "([^"]+)";$/gi){ $appName = $1; }
if($_=~/applib "([^"]+)";$/gi){ $appLib = $1; }
if($_=~/LibList "([^"]+)";$/gi){ @libList = split(/;/,$1); }
}
close PROJECT;
# concat to each lib the PATH $cwd !!!
for my $lib ( @libList ){ $lib = $cwd.$lib; }
my $ses=new PowerBuilder::ORCA(\@libList , $cwd.$appLib, $appName);
my %refMap;
$|++; #Autoflush output
for $lib ( @libList ){
my @objects;
$ses->LibDir( $lib, \@objects);
{ $| = 1, print STDERR $lib . "\n"; }
for $obj (@objects ){
#~ print "\t$obj->{Type} : '$obj->{Name}'\n";
my @references;
$rc = $ses->ObjectQueryReference($lib,$obj->{Name},$obj->{Type},\@references);
push( @{$refMap{$obj->{Name}}}, @references ) unless $rc;
}
}
my $reflinks = "";
my $edgeop = "--";
print "\n";
for $key ( keys %refMap ){
$reflinks .= "\t\"$key\" \n";
for $ref (@{$refMap{$key}}){
$reflinks .= "\t\t\"$key\"$edgeop \"$ref->{Name}\";\n";
}
}
print <<"HEADER" ;
/* (c) GeNi Powerbuilder Project analyser */
graph unix {
$reflinks
}
HEADER
$ses->Close();
Run this script with something like : perl references-dep.pl pborc105.dll "c:\developpement\perl\PowerBuilder-ORCA-0.05\samples\orca\PbniRegex105\\" regexdemo105.pbt > pbniregex_references.txt
And it should produce a file pbniregex_references.txt containing:
/* (c) GeNi Powerbuilder Project analyser */
graph unix {
“nv_auto_resizer”
“nv_auto_resizer” — “debug_message”;
“nv_auto_resizer” — “hasmethod”;
“w_test”
“w_test” — “w_anc_response”;
“w_test” — “nv_auto_resizer”;
“w_test” — “u_splitbar_vertical”;
“w_test” — “u_splitbar_horizontal”;
“w_test” — “uo_regex”;
“w_test” — “hasmethod”;
“w_test” — “fastreplaceall”;
“w_test” — “m_main”;
“w_test” — “w_unit_tests”;
“w_test” — “fastreplaceall2”;
“w_test” — “unvo_regexp”;
“w_test” — “replaceall”;
“fastreplaceall”
“fastreplaceall” — “syncparm”;
“u_splitbar_vertical”
“u_splitbar_vertical” — “nv_auto_resizer”;
“replaceall”
“w_minihelp”
“hasmethod”
“w_unit_tests”
“w_unit_tests” — “w_anc_response”;
“w_unit_tests” — “nv_auto_resizer”;
“w_unit_tests” — “uo_regex”;
“w_unit_tests” — “iif”;
“w_unit_tests” — “dw_unittests”;
“regexdemo105”
“regexdemo105” — “w_test”;
“unvo_regexp”
“debug_message”
“w_anc_response”
“w_anc_response” — “nv_auto_resizer”;
“m_main”
“m_main” — “w_test”;
“m_main” — “w_minihelp”;
“u_splitbar_horizontal”
“u_splitbar_horizontal” — “nv_auto_resizer”;
“fastreplaceall2”
“fastreplaceall2” — “syncparm”;
“uo_regex”
“uo_regex” — “syncparm”;
“iif”
}
We could transform this into a graph (require graphviz) dot -Tpng -orxrefsdot.png pbniregex_references.txt
Another script for retrieving objects hierarchy.
#!/usr/perl
#usage: ancestors-dep.pl pborcaXXX.dll full-project-path project-file-name.pbt
use PowerBuilder::ORCA qw/:const/;
my ($dll, $cwd, $pbt) = @ARGV;
PowerBuilder::ORCA::LoadDll($dll);
print STDERR "Using ORCA DLL: $PowerBuilder::ORCA::ORCA_Dll \n";
my ($appName, $appLib);
my @libList;
open( PROJECT, $cwd.$pbt ) or die("Couldn't open PROJECT(${cwd}${pbt}) for reading.\n\n");
while(<PROJECT>){
if($_=~/^appname "([^"]+)";$/gi){ $appName = $1; }
if($_=~/applib "([^"]+)";$/gi){ $appLib = $1; }
if($_=~/LibList "([^"]+)";$/gi){ @libList = split(/;/,$1); }
}
close PROJECT;
# concat to each lib the PATH $cwd !!!
for my $lib ( @libList ){ $lib = $cwd.$lib; }
my $ses=new PowerBuilder::ORCA(\@libList , $cwd.$appLib, $appName);
my %refMap;
for $lib ( @libList ){
my @objects;
$ses->LibDir( $lib, \@objects);
{ $| = 1, print STDERR $lib . "\n"; }
for $obj (@objects ){
my @references;
$rc = $ses->ObjectQueryHierarchy($lib,$obj->{Name},$obj->{Type},\@references);
push( @{$refMap{$obj->{Name}}}, @references ) unless $rc;
}
}
my $reflinks = "";
my $edgeop = "--";
print "\n";
for $key ( keys %refMap ){
$reflinks .= "\t\"$key\"";
for $ref (@{$refMap{$key}}){
$reflinks.=" $edgeop \"$ref\"";
}
$reflinks .= ";\n";
}
print <<"HEADER" ;
/* (c) GeNi Powerbuilder Project analyser */
graph unix {
$reflinks
}
HEADER
$ses->Close();
print STDERR "\nend of scan...\n";
So, test with something like perl ancestors-dep.pl pborc105.dll "c:\developpement\perl\PowerBuilder-ORCA-0.05\samples\orca\PbniRegex105\\" regexdemo105.pbt > rxanc.txt
And it may produce this file:
/* (c) GeNi Powerbuilder Project analyser */ graph unix { "w_test" -- "w_anc_response"; "w_unit_tests" -- "w_anc_response"; }
We could transform it too into a graph dot -Tpng -orxrefsanc.png rxanc.txt
That’s all for tonight