Request to register new user fullname: Riccardo Marini userid: SIRPSYCHO mail: CENSORED homepage: why:
I would like to publish my own TSM module. I was not satisfied with DBD::TSM or TSM:: because of lack of performance in many situations since doing a new session for each statement. I wrote my own that is able to pack statements in a single session to boost performance in case of complex reports/activities. It is the most complete perl wrapper for dsmadmc. Note that even DBD implementation is not using C API for TSM but still acting as a wrapper around dsmadmc. Doing reports with this one is simple and fun, and fast. Does not pretend to be an extension of DBD, so I would publish as "Dsmadmc" package since TSM is already taken by a 2001 module. Here below a quick demo client program using Dsmadmc: -----CODE BEGIN HERE #!/usr/bin/perl use Dsmadmc; use strict; use warnings; my $stanza=shift; die unless ($stanza); my $obj = Dsmadmc->new(stanza => $stanza, sep => '%', validate => 0, macro => "/var/tmp/$$.$$.$$") #This will allow multiple statement in one connection or die $!; $obj->add_statement('SELECT NODE_NAME,DOMAIN_NAME FROM NODES'); $obj->add_statement('SELECT NODE_NAME,DOMAIN_NAME FRM NODES'); $obj->do_query; #will silently chosse between single/macro conn. #will flush statement buffer, perform queries, charge data into answers print "Usage Example one...\n"; while(my $a=$obj->get_next_answer){ my $tsm_rc=$obj->get_tsm_rc($a); if($tsm_rc==0){ while(my ($node,$dom)=$obj->get_next_row($a)){ print "node: $node\n"; print "domain: $dom\n"; } }else{ print STDERR "\n******************************\n"; print STDERR $obj->get_error_string($a); print STDERR "\n******************************\n"; } } print "Usage Example two(inconsistent number of field within queries)...\n"; $obj->add_statement('SELECT NODE_NAME,DOMAIN_NAME FROM NODES'); #---> will be statement 0 $obj->add_statement('SELECT VOLUME_NAME,STGPOOL_NAME,PCT_RECLAIM FROM VOLUMES'); #--> will be statement 1 and so on.. $obj->do_query; #see above. my $ans=$obj->get_next_answer; #get answer to statement 0 while(my ($node,$dom)=$obj->get_next_row($a)){ print "node: $node\n"; print "domain: $dom\n"; } $ans=$obj->get_next_answer; #get ans. to statement 1.. while(my ($node,$stg,$pct)=$obj->get_next_row($a)){ print "volume: $node\n"; print "stgpool: $stg\n"; print "pctrec: $pct\n"; } print "Usage Example threee(Answers format)\n"; $obj->add_statement('SELECT count(*) FROM NODES'); $obj->add_statement('SELECT count(*) FROM VOLHISTORY'); $obj->add_statement('TCELES count(*) FROM VOLHISTORY'); #-->ERROR $obj->do_query; use Data::Dumper; print Dumper \$obj->{answers}; #Will produce #$VAR1 = \[ # { # 'rc' => 0, # 'statement' => 'SELECT count(*) FROM NODES', # 'rows' => [ # '145' # ] # }, # { # 'rc' => 0, # 'statement' => 'SELECT count(*) FROM VOLHISTORY', # 'rows' => [ # '44' # ] # }, # { # 'rc' => '2', # 'statement' => 'TCELES count(*) FROM VOLHISTORY', # 'error' => [ # 'ANR2000E Unknown command - TCELES.' # ], # 'rows' => [] # } # ]; print "Version was: ". $obj->get_tsm_version."\n"; -----CODE ENDS HERE Another demo showing performance 10x gain using Dsmadmc over any other implementation using single statement per session (DBD::TSM, TSM) ------CODE STARTS HERE #!/usr/bin/perl use Data::Dumper; use Dsmadmc; use strict; use warnings; my $stanza=shift; my $macro=shift; die unless ($stanza); my $obj; if($macro){ $obj = Dsmadmc->new(stanza => $stanza, sep => '%',validate => 0 , macro => '/var//tmp/test' ) or die $!; }else{ $obj = Dsmadmc->new(stanza => $stanza, sep => '%',validate => 0 ) or die $!; } $obj->add_statement('SELECT NODE_NAME,DOMAIN_NAME FROM NODES'); $obj->add_statement('SELECT NODE_NAME,DOMAIN_NAME FROM NODES'); $obj->add_statement('SELECT NODE_NAME,DOMAIN_NAME FROM NODES'); $obj->add_statement('SELECT NODE_NAME,DOMAIN_NAME FROM NODES'); $obj->add_statement('SELECT NODE_NAME,DOMAIN_NAME FROM NODES'); $obj->add_statement('SELECT NODE_NAME,DOMAIN_NAME FROM NODES'); $obj->add_statement('SELECT NODE_NAME,DOMAIN_NAME FROM NODES'); $obj->add_statement('SELECT NODE_NAME,DOMAIN_NAME FROM NODES'); $obj->add_statement('SELECT NODE_NAME,DOMAIN_NAME FROM NODES'); $obj->add_statement('SELECT NODE_NAME,DOMAIN_NAME FROM NODES'); $obj->add_statement('SELECT NODE_NAME,DOMAIN_NAME FROM NODES'); $obj->add_statement('SELECT NODE_NAME,DOMAIN_NAME FROM NODES'); $obj->add_statement(q~SELECT * FROM NODES WHERE NODE_NAME = 'CICCIO'~); $obj->add_statement('SELECT * FRM NODES'); $obj->do_query; while(my $a=$obj->get_next_answer){ my $tsm_rc=$obj->get_tsm_rc($a); if($tsm_rc==0){ while(my ($node,$stg)=$obj->get_next_row($a)){ print "node: $node\n"; print "Stg: $stg\n"; } }else{ print STDERR $obj->get_error_string($a); } } ------CODE ENDS HERE Execution times for both single and macro mode, showing no differences in reported output: [root@tsmmon tsm]# time ./client_M.pl AGRTSMNAS > a 2>/dev/null real 0m5.161s user 0m3.742s sys 0m0.218s [root@tsmmon tsm]# time ./client_M.pl AGRTSMNAS macro_mode > b 2>/dev/null real 0m0.534s user 0m0.298s sys 0m0.025s [root@tsmmon tsm]# diff a b [root@tsmmon tsm]# The following links are only valid for PAUSE maintainers: Registration form with editing capabilities: https://pause.perl.org/pause/authenquery?ACTION=add_user&USERID=96310000_a31e4a5f56c6beb5&SUBMIT_pause99_add_user_sub=1 Immediate (one click) registration: https://pause.perl.org/pause/authenquery?ACTION=add_user&USERID=96310000_a31e4a5f56c6beb5&SUBMIT_pause99_add_user_Definitely=1