#!/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 " -c => check catalog and report number of entries \n"; print " -l lfn => return id\n"; print " -i id => return logical filename\n"; print " -w id => insert into catalog\n"; print " -h => this page\n"; exit 0; } my $table = "dfc"; my $condition = ""; &dlConnect(); if( $opt eq "-c" ) { my $nrows = &countRows($table, $condition); print "$nrows\n"; $return = 0; } elsif( $opt eq "-l" ) { my $lfn = shift; $condition = "where lfn='$lfn'"; my $columns = "uid"; my %resultset; &fetchTableColumns(\%resultset,$table,$columns,$condition); my $uid; foreach my $id ( keys %resultset ) { $uid = $resultset{$id}->{uid}; print "$uid\n"; } if( $uid eq "" ) { print STDERR "$lfn not found in catalog\n"; } } elsif( $opt eq "-i" ) { my $id = shift; if( $id eq "" ) { print STDERR "Please provide an id\n"; &dlDisconnect(); exit $return; } if( ! ($id =~ /-/) ) { print STDERR "Invalid id format\n"; &dlDisconnect(); exit $return; } $condition = "where uid='$id'"; my $columns = "lfn"; my %resultset; &fetchTableColumns(\%resultset,$table,$columns,$condition); my $lfn; foreach my $id ( keys %resultset ) { $lfn = $resultset{$id}->{lfn}; } if( $lfn ne "" ) { print "$lfn\n"; $return = 0; } else { print STDERR "$id not found in catalog\n"; } } elsif( $opt eq "-w" ) { my $id = shift; if( $id eq "" ) { print STDERR "Please provide an id\n"; &dlDisconnect(); exit $return; } if( ! ($id =~ /-/) ) { print STDERR "Invalid id format\n"; &dlDisconnect(); exit $return; } my $cmd = "dataset_property -i $id logical_file_names 2>&1"; my @lfns = `$cmd`; my $cmd2 = "dataset_property -i $id logical_file_names 2>&1"; my @content = `$cmd2`; if( ($lfns[0] =~ /is not in DDB/) || ($lfns[0] =~ /Unable to parse id/) ) { print STDERR "Invalid id\n"; &dlDisconnect(); exit $return; } if( scalar(@lfns) > 1 ) { print STDERR "Can't run $exename to this id. Maybe it's a composite dataset\n"; &dlDisconnect(); exit $return; } chomp $lfns[0]; my $lfn = $lfns[0]; $condition = "where lfn='$lfn' && uid='$id'"; my $nrows = &countRows($table, $condition); if( $nrows > 0 ) { print STDERR "$id and/or logical file '$lfn' already in catalog\n"; &dlDisconnect(); exit $return; } my $set = "lfn='$lfn', uid='$id', name='lfn://atlas/$lfn'"; &insertTable($table, $set); $nrows = 0; $nrows = &countRows($table, $condition); if( $nrows == 1 ) { print "id $id inserted.\n"; $return = 0; } } &dlDisconnect(); exit $return; sub dlConnect { my $home = $ENV{"HOME"}; open (HANDLE, "$home/.dial/pwada"); my @all = ; my $first = $all[0]; chop $first; if( $first eq "" ) { $DBI::dbh = DBI->connect("dbi:mysql:ada:db1.usatlas.bnl.gov","", "") || die "Cannot connect to db server $DBI::errstr\n"; } else { $DBI::dbh = DBI->connect("dbi:mysql:ada:db1.usatlas.bnl.gov","ada", "$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 uid 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 uid,$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 'uid' ) {$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; }