[Bio] / IGSBPortal / IGSBDB.pm Repository:
ViewVC logotype

Annotation of /IGSBPortal/IGSBDB.pm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.1 - (view) (download) (as text)

1 : wilke 1.1 package IGSBportal::IGSBDB;
2 :    
3 :     use strict;
4 :     use warnings;
5 :    
6 :     use DBMaster;
7 :     use FIG_Config;
8 :    
9 :     #
10 :     # Add following lines to FIGConfig.pm
11 :     # $mgrast_metadata_db = "MGRASTMetadata";
12 :     # $mgrast_metadata_host = "mg-rast.mcs.anl.gov";
13 :     # $mgrast_metadata_user = "mgrast";
14 :     #
15 :    
16 :    
17 :     sub new {
18 :     my ($class) = @_;
19 :     my $self = {};
20 :    
21 :     eval {
22 :     $self->{_handle} = DBMaster->new( -database => $FIG_Config::IGSB_db || 'IGSB',
23 :     -host => $FIG_Config::IGSB_dbhost,
24 :     -user => $FIG_Config::IGSB_dbuser,
25 :     -password => $FIG_Config::IGSB_password || "");
26 :     };
27 :     if ($@) {
28 :     warn "Unable to connect to IGSB db: $@\n";
29 :     $self->{_handle} = undef;
30 :     }
31 :    
32 :     bless ($self, $class);
33 :     return $self;
34 :    
35 :     }
36 :    
37 :    
38 :     sub handle {
39 :     my ($self) = @_;
40 :     return $self->{_handle};
41 :     }
42 :    
43 :     sub get_request {
44 :     my ($self , $id ) = @_ ;
45 :    
46 :     my $request = '';
47 :    
48 :     ($id) = $id =~/R?(\d+-\d+)/ ;
49 :     my $tmp = $self->handle->Request->get_objects( { ID => $id } );
50 :    
51 :     unless (@$tmp) {
52 :     return ( -1 , "No request for ID $id") ;
53 :     }
54 :     elsif (scalar @$tmp == 1){
55 :     $request = $tmp->[0];
56 :     }
57 :     else{
58 :     return ( -2 , "Multiple requests for ID $id") ;
59 :     }
60 :    
61 :     my $rows = $self->handle->RequestData->get_objects( { request => $request });
62 :    
63 :     my $data = {} ;
64 :     foreach my $entry (@$rows){
65 :     $data->{ $entry->tag } = $entry->value ;
66 :     }
67 :    
68 :     return ( 1 , "Retrieved data for request ID $id " , $data , $request , $rows ) ;
69 :     }
70 :    
71 :     sub update_status{
72 :     my ($self , $id , $status ) = @_;
73 :    
74 :     my ($success , $msg , $data , $request , $rows ) = $self->get_request($id) ;
75 :     # push @{$request->status_history} , $status->current_status ;
76 :    
77 :     $request->current_status($status);
78 :     return ( 1 , "Status updated for $id to ". $request->current_status , $request ) ;
79 :     }
80 :    
81 :     sub get_requests_by_status{
82 :     my ($self , $status) = @_;
83 :     my $list = $self->handle->Request->get_objects( { current_status => $status } );
84 :     return $list;
85 :     }
86 :    
87 :    
88 :     sub create_request_id {
89 :     my ($self) = @_;
90 :     my $dbh = $self->handle->db_handle ;
91 :    
92 :     my $time = $self->get_time;
93 :     print STDERR $time , "\n";
94 :     # my $sth = $dbh->prepare( "select ID from Request where ID regex $time order by ID desc" );
95 :     # $sth->execute();
96 :    
97 :     my $statement = "select ID from Request where ID regexp '$time' order by ID desc" ;
98 :    
99 :     print STDERR $statement , "\n";
100 :     my $last_ids = $dbh->selectcol_arrayref($statement);
101 :    
102 :     print STDERR $last_ids , "\n";
103 :    
104 :     # sort IDs
105 :     if (ref $last_ids and scalar @$last_ids){
106 :     print STDERR "Returning " , join " " , @$last_ids , "\n";
107 :     my ($date , $counter) = $last_ids->[0] =~ /(\d+)-(\d+)/ ;
108 :     $counter++;
109 :     print STDERR "Incrementing Counter: $date-$counter\n";
110 :     return "$date-$counter";
111 :     }
112 :     else{
113 :     return "$time-1" ;
114 :     }
115 :     }
116 :    
117 :     sub get_time{
118 :     my ( $self , $format ) = @_;
119 :    
120 :     my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime();
121 :     my $version = 0;
122 :    
123 :     $mon++;
124 :     $year += 1900;
125 :    
126 :     $mday = "0".$mday if ( $mday < 10 );
127 :     $min = "0".$min if ($min < 10);
128 :     $sec = "0".$sec if ($sec < 10);
129 :     $mon = "0".$mon if ($mon < 10);
130 :    
131 :     my ($year_short) = $year =~ /(\d\d)$/;
132 :    
133 :     my $time = $year_short.$mon.$mday;
134 :    
135 :     return $time
136 :     }
137 :    
138 :     sub create_request {
139 :     my ($self, $id , $data) = @_;
140 :    
141 :     #print STDERR "1\n";
142 :     my $request = '';
143 :     # print STDERR $self->handle , "\n";
144 :    
145 :     $id = $self->create_request_id unless ($id) ;
146 :     print STDERR "Request ID = $id\n";
147 :    
148 :     eval{
149 :     $self->handle->Request->get_objects( { ID => $id } );
150 :     };
151 :    
152 :     print STDERR $@ , "\n" if ($@);
153 :    
154 :     my $tmp = $self->handle->Request->get_objects( { ID => $id } );
155 :    
156 :     unless( scalar @$tmp ){
157 :     print STDERR "Creating new request\n";
158 :     eval{ $request = $self->handle->Request->create( { ID => $id ,
159 :     current_status => 'new' ,
160 :     } ); } ;
161 :     print STDERR $@ if $@ ;
162 :     } elsif ( scalar @$tmp == 1) {
163 :     $request = $tmp->[0];
164 :     } else {
165 :     print STDERR "Multiple request with ID $id exists , aborting\n" ;
166 :     return (-1 , "Multiple request with ID $id exists") ;
167 :     }
168 :    
169 :     print STDERR "Adding to DB\n";
170 :     my ($error , $msg) = $self->add2request( $request , $data) ;
171 :     #print STDERR "4\n";
172 :     return ($error , $msg , $id);
173 :     }
174 :    
175 :     sub add2request{
176 :     my ($self, $request , $data) = @_ ;
177 :    
178 :     print STDERR "Adding " . scalar (keys %$data) . " fields to DB\n";
179 :    
180 :     foreach my $tag (keys %$data){
181 :     my $obj = $self->handle->RequestData->get_objects( { request => $request ,
182 :     tag =>$tag,
183 :     });
184 :    
185 :     if (scalar @$obj){
186 :     print STDERR "Existing entry , need to update\n";
187 :     $obj->[0]->value( $data->{ $tag } );
188 :     }
189 :     else{
190 :     print STDERR "Create new entry\n";
191 :     eval{
192 :     my $row = $self->handle->RequestData->create(
193 :     {
194 :     request => $request ,
195 :     tag => $tag ,
196 :     value => ( $data->{$tag} || '') ,
197 :     }
198 :     );
199 :     };
200 :     print STDERR $@ if $@ ;
201 :     }
202 :     }
203 :     return ( 1 , '');
204 :     }
205 :    
206 :     sub search {
207 :     my ($self, $values, $where) = @_;
208 :    
209 :     my $mddb = $self->{_handle};
210 :     my $search_attributes = $mddb->RequestData->attributes();
211 :    
212 :     my ($search_tmp, $all_tmp, $metadata_objects);
213 :     foreach(keys %$where){
214 :     if(defined $search_attributes->{$_}){
215 :     $search_tmp->{$_} = $where->{$_};
216 :     } else {
217 :     $all_tmp->{$_} = $where->{$_};
218 :     }
219 :     }
220 :    
221 :     if(scalar keys %$search_tmp){
222 :     $metadata_objects = $mddb->RequestData->get_objects($search_tmp);
223 :     unless (scalar @$metadata_objects){
224 :     return undef;
225 :     }
226 :     } else {
227 :     return undef;
228 :     }
229 :     }
230 :    
231 :    
232 :    
233 :     sub get_all {
234 :     my ($self, $job) = @_;
235 :    
236 :     my $mddb = $self->{_handle};
237 :    
238 :     my $attributes = $mddb->JobMD->get_objects({job => $job});
239 :    
240 :     return $attributes;
241 :     }
242 :    
243 :    
244 :    
245 :     sub get_samples_cistrack{
246 :     my ($self , $request_id) = @_ ;
247 :    
248 :     my $msg = '' ;
249 :     my $status = 1 ;
250 :    
251 :     my @samples ;
252 :    
253 :     # get request object
254 :     my $request = $self->handle->Request->init( { ID => $request_id } );
255 :     unless ($request and ref $request){
256 :     return [] , "no request for $request_id" , -1 ;
257 :     }
258 :    
259 :     # get samples from cistrack
260 :    
261 :     my $response =`curl https://www.cistrack.org/browsedb2/meta-move/get_samples.html?id=R$request_id` ;
262 :    
263 :     return ([] , "no response $response for request $request_id" , -1) unless ($response);
264 :    
265 :     print STDERR "Response $response\n";
266 :    
267 :    
268 :     my $cistrack = {} ;
269 :     foreach my $line ( split ";" , $response ){
270 :     my ($id , $name) = split "," , $line ;
271 :     $cistrack->{$id} = $name if ($id and $id =~/[\w+]/);
272 :     }
273 :    
274 :     # check samples in local db
275 :     for my $id (keys %$cistrack){
276 :     my $sample = $self->handle->Sample->init( { ID => $id } );
277 :    
278 :     unless ($sample and ref $sample) {
279 :    
280 :     # not in local DB , create entry
281 :     $sample = $self->handle->Sample->create( { ID => $id ,
282 :     name => $cistrack->{$id} ,
283 :     request => $request ,
284 :     } );
285 :     }
286 :    
287 :     push @samples , $sample
288 :    
289 :     }
290 :    
291 :     return (\@samples , $msg , $status ) ;
292 :     }
293 :    
294 :     sub get_samples{
295 :     my ($self , $hash) = @_;
296 :     return $self->handle->Sample->get_objects( $hash ) , '' , 1 ;
297 :     }
298 :    
299 :     sub sample{
300 :     my ($self , $id) = @_;
301 :     return $self->handle->Sample->init( { ID => $id } );
302 :     }
303 :    
304 :    
305 :     1;

MCS Webmaster
ViewVC Help
Powered by ViewVC 1.0.3