Merge pull request #2754 from solgenomics/topic/fix_homepage_add_accessions_dialog
[sgn.git] / bin / merge_stocks.pl
blob6bf5ae8ab18b84446c5896d0673f9a9e6d59a8b9
2 =head1 NAME
4 merge_stocks.pl - merge stocks using a file with stocks to merge
6 =head1 DESCRIPTION
8 merge_stocks.pl -H [database host] -D [database name] [ -x ] mergefile.txt
10 Options:
12 -H the database host
13 -D the database name
14 -x flag; if present, delete the empty remaining accession
16 mergefile.txt: A tab-separated file with two columns. Include the following header as the first line: bad name good name
18 All the metadata of bad name will be transferred to good name.
19 If -x is used, stock with name bad name will be deleted.
21 =head1 AUTHOR
23 Lukas Mueller <lam87@cornell.edu>
25 =cut
27 use strict;
29 use Getopt::Std;
30 use CXGN::DB::InsertDBH;
31 use CXGN::DB::Schemas;
32 use CXGN::Stock;
35 our($opt_H, $opt_D, $opt_x);
36 getopts('H:D:x');
39 print "Password for $opt_H / $opt_D: \n";
40 my $pw = (<STDIN>);
41 chomp($pw);
43 my $delete_merged_stock = $opt_x;
45 print STDERR "Note: -x: Deleting stocks that have been merged into other stocks.\n";
47 print STDERR "Connecting to database...\n";
48 my $dsn = 'dbi:Pg:database='.$opt_D.";host=".$opt_H.";port=5432";
50 my $dbh = DBI->connect($dsn, "postgres", $pw, { AutoCommit => 0, RaiseError=>1 });
52 print STDERR "Connecting to DBI schema...\n";
53 my $bcs_schema = Bio::Chado::Schema->connect($dsn, "postgres", $pw);
55 my $s = CXGN::DB::Schemas->new({ dbh => $dbh });
56 my $schema = $s->bcs_schema();
57 my $file = shift;
59 open(my $F, "<", $file) || die "Can't open file $file.\n";
61 my $header = <$F>;
62 print STDERR "Skipping header line $header\n";
63 eval {
64 while (<$F>) {
65 print STDERR "Read line: $_\n";
66 chomp;
67 my ($merge_stock_name, $good_stock_name) = split /\t/;
68 print STDERR "bad name: $merge_stock_name, good name: $good_stock_name\n";
69 my $stock_row = $schema->resultset("Stock::Stock")->find( { uniquename => $good_stock_name } );
70 if (!$stock_row) {
71 print STDERR "Stock $good_stock_name not found. Skipping...\n";
73 next();
76 my $merge_row = $schema->resultset("Stock::Stock")->find( { uniquename => $merge_stock_name } );
77 if (!$merge_row) {
78 print STDERR "Stock $merge_stock_name not available for merging. Skipping\n";
79 next();
82 my $good_stock = CXGN::Stock->new( { schema => $schema, stock_id => $stock_row->stock_id });
83 my $merge_stock = CXGN::Stock->new( { schema => $schema, stock_id => $merge_row->stock_id });
85 print STDERR "Merging stock $merge_stock_name into $good_stock_name... ";
86 $good_stock->merge($merge_stock->stock_id(), $delete_merged_stock);
87 print STDERR "Done.\n";
91 if ($@) {
92 print STDERR "An ERROR occurred ($@). Rolling back changes...\n";
93 $dbh->rollback();
95 else {
96 print STDERR "Script is done. Committing... ";
97 $dbh->commit();
98 print STDERR "Done.\n";