[Bio] / FigKernelPackages / FIGMODELTable.pm Repository:
ViewVC logotype

Diff of /FigKernelPackages/FIGMODELTable.pm

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.10, Tue Sep 8 21:04:08 2009 UTC revision 1.11, Fri Oct 9 21:54:20 2009 UTC
# Line 9  Line 9 
9  ########################################################################  ########################################################################
10    
11  use strict;  use strict;
 use FIGMODEL;  
12    
13  package FIGMODELTable;  package FIGMODELTable;
14    
# Line 594  Line 593 
593          }          }
594  }  }
595    
596    =head3 add_hashheadings
597    Definition:
598            $TableObj->add_hashheadings(@Headings);
599    Description:
600            Adds new hash headings to the table. This is needed to get the table to print the data under the new heading.
601    Example:
602            $TableObj->add_hashheadings("Notes");
603    =cut
604    
605    sub add_hashheadings {
606            my ($self,@HashHeadings) = @_;
607    
608            foreach my $HashHeading (@HashHeadings) {
609                    if (!defined($self->{"hash columns"}->{$HashHeading})) {
610                            $self->{"hash columns"}->{$HashHeading} = {};
611                            for (my $i=0; $i < $self->size(); $i++) {
612                                    my $Row = $self->get_row($i);
613                                    if (defined($Row->{$HashHeading})) {
614                                            for (my $j=0; $j < @{$Row->{$HashHeading}}; $j++) {
615                                                    push(@{$self->{"hash columns"}->{$HashHeading}->{$Row->{$HashHeading}->[$j]}},$Row);
616                                            }
617                                    }
618                            }
619                    }
620            }
621    }
622    
623  =head3 save  =head3 save
624  Definition:  Definition:
625          $TableObj->save($filename,$delimiter,$itemdelimiter,$prefix);          $TableObj->save($filename,$delimiter,$itemdelimiter,$prefix);
# Line 618  Line 644 
644          if (defined($prefix)) {          if (defined($prefix)) {
645                  $self->{"file IO settings"}->{"file prefix"}->[0] = $prefix;                  $self->{"file IO settings"}->{"file prefix"}->[0] = $prefix;
646          }          }
647          FIGMODEL::SaveTable($self);          $self->print_table_to_file();
648    }
649    
650    sub print_table_to_file {
651            my ($self) = @_;
652    
653            #Checking that a filename exists
654            if (!defined($self->{"array"}) || !defined($self->{"file IO settings"}->{"filename"}) || !defined($self->{"file IO settings"}->{"orderedkeys"})) {
655                    return -1;
656            }
657    
658            my $Filename = $self->{"file IO settings"}->{"filename"}->[0];
659            my $Delimiter = ";";
660            my $ItemDelimiter = "|";
661            my $Prefix = "";
662            if (defined($self->{"file IO settings"}->{"delimiter"})) {
663                    $Delimiter = $self->{"file IO settings"}->{"delimiter"}->[0];
664                    if ($Delimiter eq "\\|" || $Delimiter eq "\|") {
665                            $Delimiter = "|";
666                    } elsif ($Delimiter eq "\\t") {
667                            $Delimiter = "\t";
668                    }
669            }
670            if (defined($self->{"file IO settings"}->{"item delimiter"})) {
671                    $ItemDelimiter = $self->{"file IO settings"}->{"item delimiter"}->[0];
672                    if ($ItemDelimiter eq "\\|" || $ItemDelimiter eq "\|") {
673                            $ItemDelimiter = "|";
674                    } elsif ($ItemDelimiter eq "\\t") {
675                            $ItemDelimiter = "\t";
676                    }
677            }
678            if (defined($self->{"file IO settings"}->{"file prefix"})) {
679                    $Prefix = $self->{"file IO settings"}->{"file prefix"}->[0];
680            }
681    
682            #Opening the file
683            if (defined($self->{"file IO settings"}->{"append"})) {
684                    if (!open (SAVINGTABLE, ">>$Filename")) {
685                            return -1;
686                    }
687            } else {
688                    if (!open (SAVINGTABLE, ">$Filename")) {
689                            return -1;
690                    }
691            }
692    
693            if (defined($Prefix)) {
694                    print SAVINGTABLE $Prefix;
695            }
696            print SAVINGTABLE join($Delimiter,@{$self->{"file IO settings"}->{"orderedkeys"}})."\n";
697            for (my $i=0; $i < @{$self->{"array"}}; $i++) {
698                    for (my $j=0; $j < @{$self->{"file IO settings"}->{"orderedkeys"}}; $j++) {
699                            if ($j > 0) {
700                                    print SAVINGTABLE $Delimiter;
701                            }
702                            if (defined($self->{"array"}->[$i]->{$self->{"file IO settings"}->{"orderedkeys"}->[$j]})) {
703                                    if(ref($self->{"array"}->[$i]->{$self->{"file IO settings"}->{"orderedkeys"}->[$j]}) eq 'ARRAY') {
704                                            print SAVINGTABLE join($ItemDelimiter,@{$self->{"array"}->[$i]->{$self->{"file IO settings"}->{"orderedkeys"}->[$j]}});
705                                    } else {
706                                            print SAVINGTABLE $self->{"array"}->[$i]->{$self->{"file IO settings"}->{"orderedkeys"}->[$j]};
707                                    }
708                            }
709                    }
710                    print SAVINGTABLE "\n";
711            }
712            close (SAVINGTABLE);
713  }  }
714    
715  =head3 html_print  =head3 html_print
# Line 731  Line 822 
822          return $Table;          return $Table;
823  }  }
824    
825    =head3 connect_to_db
826    Definition:
827            integer::status = FIGMODELTable->connect_to_db(string::table name,string::database,string::user,host::host)
828    Description:
829            Connects to the database for input and output for the table to and from the database
830    =cut
831    
832    sub connect_to_db {
833            my ($self,$Table,$Database,$Username,$Host,$SubTableHeadings,$TableKey) = @_;
834    
835            #Getting DB data from arguments
836            my $Changed = 0;
837            if (!defined($Host)) {
838                    $Host = $self->{_host};
839            } elsif (!defined($self->{_host}) || $Host ne $self->{_host}) {
840                    $Changed = 1;
841            }
842            if (!defined($Table)) {
843                    $Table = $self->{_table};
844            } elsif (!defined($self->{_table}) || $Table ne $self->{_table}) {
845                    $Changed = 1;
846            }
847            if (!defined($Database)) {
848                    $Database = $self->{_database};
849            } elsif (!defined($self->{_database}) || $Database ne $self->{_database}) {
850                    $Changed = 1;
851            }
852            if (!defined($Username)) {
853                    $Username = $self->{_user};
854            } elsif (!defined($self->{_user}) || $Username ne $self->{_user}) {
855                    $Changed = 1;
856            }
857            if (!defined($Username)) {
858                    $Username = $self->{_user};
859            } elsif (!defined($self->{_user}) || $Username ne $self->{_user}) {
860                    $Changed = 1;
861            }
862            if (defined($SubTableHeadings)) {
863                    for (my $i=0; $i < @{$SubTableHeadings}; $i++) {
864                            $self->{_subheadings}->{$SubTableHeadings->[$i]} = 1;
865                    }
866            }
867            if (defined($TableKey)) {
868                    $self->{_tablekey} = $TableKey;
869            }
870    
871            #If no change, then we leave
872            if ($Changed == 0) {
873                    return 1;
874            }
875    
876            #If the connection data was changed, we reconnect to the database
877            if (defined($self->{_dbhandle})) {
878                    #Closing any previous connection
879                    delete $self->{_dbhandle};
880            }
881    
882            #Checking if DBMaster is even available
883            eval {
884                    require "DBMaster.pm";
885            };
886            if ($@) {
887                    print STDERR "FIGMODELTable:connect_to_db:Cannot connect to database because DBMaster module is unavailable\n";
888                    return -1;
889            }
890    
891            $self->{_dbhandle} = DBMaster->new(-database => $Database, -user => $Username, -host => $Host);
892            $self->{_dbtable} = $self->{_dbhandle}->$Table;
893    
894            #Check that the connection was successful
895            if (!defined($self->{_dbhandle})) {
896                    print STDERR "FIGMODELTable:save_to_db: could not connect to database with ".$Database.";".$Table.";".$Username.";".$Host."\n";
897                    return -1;
898            }
899    
900            return 1;
901    }
902    
903    =head3 save_to_db
904    Definition:
905            integer::status = FIGMODELTable->save_to_db(string::table name,string::database,string::user,host::host)
906    Description:
907            Syncs the FIGMODELTable and the database
908    =cut
909    
910    sub save_to_db {
911            my ($self,$Table,$Database,$Username,$Host,$SubTableHeadings,$TableKey) = @_;
912    
913            #Connecting to database
914            if ($self->connect_to_db($Table,$Database,$Username,$Host,$SubTableHeadings,$TableKey) == -1) {
915                    return -1;
916            }
917    
918            #Saving the table
919            for (my $i=0; $i < $self->size(); $i++) {
920                    my $Row = $self->get_row($i);
921                    $self->update_db_row($Row);
922            }
923    
924            return 1;
925    }
926    
927    =head3 update_db_row
928    Definition:
929            integer::status = FIGMODELTable->update_db_row(FIGMODELTable::Row::row to be updated)
930    Description:
931            Updates the input row in the database. Returns -1 upon failure, 0 if there was no change, 1 if the row is new, 2 if the row was changed
932    =cut
933    
934    sub update_db_row {
935            my ($self,$row) = @_;
936    
937            #Checking that the database is connected
938            if (!defined($self->{_dbhandle})) {
939                    print STDERR "FIGMODELTable:update_db_row: need to be connected to database prior to update of row.\n";
940                    return -1;
941            }
942    
943            #Checking if a row with the same table key already exists in the table
944            if (!defined($row->{_dbhandle}) && defined($self->{_tablekey}) && defined($row->{$self->{_tablekey}}->[0])) {
945                    $row->{_dbhandle} = $self->{_dbtable}->init( { $self->{_tablekey} => $row->{$self->{_tablekey}}->[0] } );
946            }
947    
948            #Checking if the row has a dbhandle
949            if (defined($row->{_dbhandle})) {
950                    #This is not a new row-first we check if anything has changed
951            } else {
952                    #First we add the base object to the table on the server
953                    my $NewObject;
954                    my @Headings = $self->headings();
955                    for (my $i=0; $i < @Headings; $i++) {
956                            if (defined($row->{$Headings[$i]}->[0])) {
957                                    if (!defined($self->{_subheadings}->{$Headings[$i]})) {
958                                            $NewObject->{$Headings[$i]} = join($self->item_delimiter(),@{$row->{$Headings[$i]}});
959                                    }
960                            }
961                    }
962                    $row->{_dbhandle} = $self->{_dbtable}->create($NewObject);
963                    #Now we add all of the subtable objects
964                    for (my $i=0; $i < @Headings; $i++) {
965                            if (defined($row->{$Headings[$i]}->[0])) {
966                                    if (defined($self->{_subheadings}->{$Headings[$i]})) {
967                                            #Adding the subtable rows to the database
968                                            for (my $j=0; $j < @{$row->{$Headings[$i]}}; $j++) {
969                                                    #my $Object = $self->{_dbtable}->init( { $self->{_tablekey} => $row->{$self->{_tablekey}}->[0] } );
970                                            }
971                                    }
972                            }
973                    }
974            }
975    
976            return 1;
977    }
978    
979  1;  1;

Legend:
Removed from v.1.10  
changed lines
  Added in v.1.11

MCS Webmaster
ViewVC Help
Powered by ViewVC 1.0.3