#!/usr/bin/env perl # use DBI; use strict; my $debugOn = 0; my $return = 1; my $exename = $0; my $opt = shift; if( $opt eq '' ) { print STDERR "Run \"$exename -h\" for help message\n"; exit 1; } if( $opt eq '-h' ) { print "Usage: $exename\n"; print " -v vid => return lid\n"; print " -i lid => return vid\n"; print " -w vid lid => insert into replica catalog\n"; print " -h => this page\n"; exit 0; } &dlConnect(); my $table = "replica"; my $set = ""; my $condition = ""; my $columns = ""; if( $opt eq "-v" ) { my $vid = shift; my $cmd1 = "dataset_property -i $vid is_virtual 2>&1"; my $result1 = `$cmd1`; chop $result1; if( $result1 ne "1" ) { print STDERR "$vid invalid virtual id\n"; &dlDisconnect(); exit $return; } my ($vidh, $vidl) = split("-", $vid); $columns = "lidh,lidl"; $condition = "where vidh='$vidh' && vidl='$vidl'"; my %resultset; my $lid = ""; my $lidh; my $lidl; &fetchTableColumns(\%resultset,$table,$columns,$condition); foreach my $id ( keys %resultset ) { $lidh = $resultset{$id}->{lidh}; $lidl = $resultset{$id}->{lidl}; } if( $lidh ne "" ) { $lid = $lidh."-".$lidl; print $lid."\n"; $return = 0; } } elsif( $opt eq "-i" ) { my $lid = shift; my $cmd1 = "dataset_property -i $lid is_valid 2>&1"; my $result1 = `$cmd1`; chop $result1; if( $result1 ne "1" ) { print STDERR "$lid invalid id\n"; &dlDisconnect(); exit $return; } my ($lidh, $lidl) = split("-", $lid); $columns = "vidh,vidl"; $condition = "where lidh='$lidh' && lidl='$lidl'"; my %resultset; my $vid = ""; my $vidh; my $vidl; &fetchTableColumns(\%resultset,$table,$columns,$condition); foreach my $id ( keys %resultset ) { $vidh = $resultset{$id}->{vidh}; $vidl = $resultset{$id}->{vidl}; } if( $vidh ne "" ) { $vid = $vidh."-".$vidl; print $vid."\n"; $return = 0; } } elsif( $opt eq "-w" ) { my $vid = shift; my $lid = shift; my $cmd = "dataset_property -i $vid is_valid 2>&1"; my $result = `$cmd`; chop $result; if( $result ne "1" ) { print STDERR "$vid invalid\n"; &dlDisconnect(); exit $return; } my $cmd1 = "dataset_property -i $vid is_virtual 2>&1"; my $result1 = `$cmd1`; chop $result1; if( $result1 ne "1" ) { print STDERR "$vid invalid virtual id\n"; &dlDisconnect(); exit $return; } my $cmd2 = "dataset_property -i $lid is_valid 2>&1"; my $result2 = `$cmd2`; chop $result2; if( $result2 ne "1" ) { print STDERR "$lid invalid\n"; &dlDisconnect(); exit $return; } my $cmd3 = "dataset_property -i $lid sub_dataset_count 2>&1"; my $result3 = `$cmd3`; chop $result3; if( $result3 < 0 ) { print STDERR "$lid: less than zero sub-datasets\n"; &dlDisconnect(); exit $return; } my $nsubdataset = $result3; my ($vidh, $vidl) = split("-", $vid); my ($lidh, $lidl) = split("-", $lid); $condition = "where vidh='$vidh' && vidl='$vidl' && lidh='$lidh' && lidl='$lidl'"; my $nrows = &countRows($table, $condition); if( $nrows > 0 ) { print STDERR "The entry already exists in replica catalog\n"; &dlDisconnect(); exit $return; } $set = "vidh='$vidh',vidl='$vidl',lidh='$lidh', lidl='$lidl',numsubdatasets='$nsubdataset'"; &insertTable( $table, $set ); $nrows = &countRows($table, $condition); if( $nrows == 1 ) { print "The entry is inserted into replica catalog\n"; $return = 0; } } &dlDisconnect(); exit $return; sub dlConnect { my $home = $ENV{"HOME"}; open (HANDLE, "$home/.dial/pwdbds"); my @all = ; my $first = $all[0]; chop $first; if( $first eq "" ) { $DBI::dbh = DBI->connect("dbi:mysql:dbds:db1.usatlas.bnl.gov","", "") || die "Cannot connect to db server $DBI::errstr\n"; } else { $DBI::dbh = DBI->connect("dbi:mysql:dbds:db1.usatlas.bnl.gov","dbds", "$first") || die "Cannot connect to db server $DBI::errstr\n"; } } sub dlDisconnect { if ( $DBDS::writeCursor ) {$DBDS::writeCursor->finish} if ( $DBDS::currentCursor ) {$DBDS::currentCursor->finish} if ( $DBDS::secondCursor ) {$DBDS::secondCursor->finish} if ( $DBDS::thirdCursor ) {$DBDS::thirdCursor->finish} $DBI::dbh = $DBI::dbh->disconnect() || die "Disconnect failure $DBI::errstr\n"; } sub saveToDb { my ( $table, %vals ) = @_; my $sql = "replace into $table set "; my $nv = 0; foreach my $val ( keys %vals ) { if ( $nv > 0 ) { $sql .= ',' } $sql .= "$val='$vals{$val}'"; $nv++; } $sql =~ s/\'NOW\(\)\'/NOW\(\)/g; print "$sql\n" if $debugOn; $DBDS::writeCursor =$DBI::dbh->prepare($sql) || die "Cannot prepare statement: $DBI::errstr\n"; my $res = $DBDS::writeCursor->execute; print "Result $res\n" if $debugOn; } sub updateDb { my ( $table, $condition, %vals ) = @_; my $sql = "update $table set "; my $nv = 0; foreach my $val ( keys %vals ) { if ( $nv > 0 ) { $sql .= ',' } $sql .= "$val='$vals{$val}'"; $nv++; } $sql =~ s/\'NOW\(\)\'/NOW\(\)/g; $sql =~ s/,$//; $sql .= " "; $sql .= $condition; print "$sql\n" if $debugOn; $DBDS::writeCursor =$DBI::dbh->prepare($sql) || die "Cannot prepare statement: $DBI::errstr\n"; $DBDS::writeCursor->execute; } sub updateTable { my ($table, $set, $condition) = @_; my $sql="update $table set $set $condition"; print "sql: $sql\n" if $debugOn; $DBDS::writeCursor =$DBI::dbh->prepare($sql) || die "Cannot prepare statement: $DBI::errstr\n"; $DBDS::writeCursor->execute || die "Cannot execute: $DBI::errstr\nSQL: $sql\n"; } sub insertTable { my ($table, $set) = @_; my $sql="insert into $table set $set"; print "sql: $sql\n" if $debugOn; $DBDS::writeCursor =$DBI::dbh->prepare($sql) || die "Cannot prepare statement: $DBI::errstr\n"; $DBDS::writeCursor->execute || die "Cannot execute: $DBI::errstr\nSQL: $sql\n"; } sub replaceTable { my ($table, $set) = @_; my $sql="replace into $table set $set"; print "sql: $sql\n" if $debugOn; $DBDS::writeCursor =$DBI::dbh->prepare($sql) || die "Cannot prepare statement: $DBI::errstr\n"; $DBDS::writeCursor->execute || die "Cannot execute: $DBI::errstr\nSQL: $sql\n"; } sub countRows { my ( $table, $condition ) = @_; print "$condition\n" if $debugOn; my $sql="select id from $table $condition"; $DBDS::currentCursor =$DBI::dbh->prepare($sql) || die "Cannot prepare statement: $DBI::errstr\n"; $DBDS::currentCursor->execute || die "Cannot execute: $DBI::errstr\nSQL: $sql"; return $DBDS::currentCursor->rows; } sub fetchTableColumns { my ($tableP, $table, $columns, $condition) = @_; my $sql="select id,$columns from $table $condition"; print "fetchTableColumns $sql\n" if $debugOn; $DBDS::secondCursor =$DBI::dbh->prepare($sql) || die "Cannot prepare statement: $DBI::errstr\n"; $DBDS::secondCursor->execute || die "Cannot execute: $DBI::errstr\nSQL: $sql\n"; my $id = ''; my $list = ''; my $index = ''; my $fname = ''; my $fvalue = ''; my $nrow = 0; while(my @fields = $DBDS::secondCursor->fetchrow) { my $id = ''; my $cols=$DBDS::secondCursor->{NUM_OF_FIELDS}; for(my $i=0;$i<$cols;$i++) { $fvalue=$fields[$i]; $fname=$DBDS::secondCursor->{NAME}->[$i]; if ( $fname eq 'id' ) {$id = $fvalue} } if ( $id ne '' ) { for(my $i=0;$i<$cols;$i++) { my $fvalue=$fields[$i]; my $fname=$DBDS::secondCursor->{NAME}->[$i]; $$tableP{$id}->{$fname} = $fvalue; } } $nrow++; } print "fetchTableColumns nrows=$nrow\n" if $debugOn; }