[Bio] / Sprout / ERDBLoad.pm Repository:
ViewVC logotype

Diff of /Sprout/ERDBLoad.pm

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

revision 1.23, Wed Sep 3 20:56:20 2008 UTC revision 1.24, Sat Sep 20 14:30:21 2008 UTC
# Line 72  Line 72 
72      my $fileName = "$directory/$relationName.dtx";      my $fileName = "$directory/$relationName.dtx";
73      # Declare the file handle variable.      # Declare the file handle variable.
74      my $fileHandle;      my $fileHandle;
75      # Determine whether or not this is a primary relation.      # Determine whether or not this is a simply keyed relation. For a simply keyed
76      my $primary = ($erdb->_IsPrimary($relationName) ? 1 : 0);      # relation, we can determine at run time if it is pre-sorted, and if so, skip
77        # the sort step.
78        my $sortString = $erdb->SortNeeded($relationName);
79        # Get all of the key specifiers in the sort string.
80        my @specs = grep { $_ =~ /-k\S+/ } split /\s+/, $sortString;
81        # We are pre-sortable if the key is a single, non-numeric field at the beginning. If
82        # we are pre-sortable, we'll check each incoming key and skip the sort step if the
83        # keys are already in the correct order.
84        my $preSortable = (scalar(@specs) == 1 && $specs[0] eq "-k1,1");
85      # Check to see if this is a load-only, ignore, or a generate-and-load.      # Check to see if this is a load-only, ignore, or a generate-and-load.
86      if ($ignore) {      if ($ignore) {
87          Trace("Relation $relationName will be ignored.") if T(2);          Trace("Relation $relationName will be ignored.") if T(2);
# Line 87  Line 95 
95          my $fileString = ">$fileName.tmp";          my $fileString = ">$fileName.tmp";
96          # Open the output file and remember its handle.          # Open the output file and remember its handle.
97          $fileHandle = Open(undef, $fileString);          $fileHandle = Open(undef, $fileString);
98          Trace("Relation $relationName load file created with primary flag $primary.") if T(2);          Trace("Relation $relationName load file created.") if T(2);
99      }      }
100      # Create the $erload object.      # Create the $erload object.
101      my $retVal = {      my $retVal = {
# Line 98  Line 106 
106                    fileSize => 0,                    fileSize => 0,
107                    lineCount => 0,                    lineCount => 0,
108                    stats => Stats->new(),                    stats => Stats->new(),
109                    primary => $primary,                    presorted => $preSortable,
110                    ignore => ($ignore ? 1 : 0)                    ignore => ($ignore ? 1 : 0),
111                      sortString => $sortString,
112                      presorted => $preSortable,
113                      lastKey => ""
114                   };                   };
115      # Bless and return it.      # Bless and return it.
116      bless $retVal, $class;      bless $retVal, $class;
# Line 158  Line 169 
169          print $fh $line;          print $fh $line;
170          # Determine how long this will make the load file.          # Determine how long this will make the load file.
171          my $lineLength = length $line;          my $lineLength = length $line;
172            # Check to see if we're still pre-sorted.
173            if ($self->{presorted}) {
174                if ($fields[0] lt $self->{lastKey}) {
175                    # This key is out of order, so we're not pre-sorded any more.
176                    $self->{presorted} = 0;
177                } else {
178                    # We're still pre-sorted, so save this key.
179                    $self->{lastKey} = $fields[0];
180                }
181            }
182          # Update the statistics.          # Update the statistics.
183          $self->{fileSize} += $lineLength;          $self->{fileSize} += $lineLength;
184          $self->{lineCount} ++;          $self->{lineCount} ++;
# Line 226  Line 247 
247          my $erdb = $self->{dbh};          my $erdb = $self->{dbh};
248          # Get the output file name.          # Get the output file name.
249          my $fileName = $self->{fileName};          my $fileName = $self->{fileName};
250            # Do we need a sort?
251            if ($self->{presorted}) {
252                # No, so just rename the file.
253                Trace("$fileName is pre-sorted.") if T(3);
254                unlink $fileName;
255                rename "$fileName.tmp", $fileName;
256            } else {
257          # Get the sort command for this relation.          # Get the sort command for this relation.
258          my $sortCommand = $erdb->SortNeeded($self->{relName});          my $sortCommand = $erdb->SortNeeded($self->{relName});
         # Open the temp file for input via sort.  
         my $ih = Open(undef, "$sortCommand <$fileName.tmp |");  
         # Open the real file for output.  
         my $oh = Open(undef, ">$fileName");  
259          Trace("Sorting into $fileName with command: $sortCommand") if T(3);          Trace("Sorting into $fileName with command: $sortCommand") if T(3);
260          # Set up a timer.          # Set up a timer.
261          my $start = time();          my $start = time();
262          # Sort from the temp file into the output file.              # Execute the sort command and save the error output.
263          while (! eof $ih) {              my @messages = `$sortCommand 2>&1 1>$fileName <$fileName.tmp`;
             print $oh (<$ih>);  
         }  
264          # Record the time spent          # Record the time spent
265          $self->{stats}->Add(sortTime => (time() - $start));          $self->{stats}->Add(sortTime => (time() - $start));
266          # Delete the temp file.              # If there was no error, delete the temp file.
267                if (! scalar(@messages)) {
268          unlink "$fileName.tmp";          unlink "$fileName.tmp";
269                } else {
270                    # Here there was an error.
271                    Confess("Error messages from $sortCommand:\n" . join("\n", @messages));
272                }
273            }
274          # Tell the user we're done.          # Tell the user we're done.
275          Trace("Load file $fileName created.") if T(3);          Trace("Load file $fileName created.") if T(3);
   
276      }      }
277      # Return the statistics object.      # Return the statistics object.
278      return $self->{stats};      return $self->{stats};

Legend:
Removed from v.1.23  
changed lines
  Added in v.1.24

MCS Webmaster
ViewVC Help
Powered by ViewVC 1.0.3