Bug 8435: (follow-up) use a transaction for unit tests
[koha.git] / C4 / UploadedFile.pm
index 6b72991..b7bcd37 100644 (file)
@@ -14,19 +14,22 @@ package C4::UploadedFile;
 # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
 # A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
 #
-# You should have received a copy of the GNU General Public License along with
-# Koha; if not, write to the Free Software Foundation, Inc., 59 Temple Place,
-# Suite 330, Boston, MA  02111-1307 USA
+# You should have received a copy of the GNU General Public License along
+# with Koha; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 
 use strict;
+#use warnings; FIXME - Bug 2505
 use C4::Context;
 use C4::Auth qw/get_session/;
 use IO::File;
 
 use vars qw($VERSION);
 
-# set the version for version checking
-$VERSION = 3.00;
+BEGIN {
+       # set the version for version checking
+    $VERSION = 3.07.00.049;
+}
 
 =head1 NAME
 
@@ -35,26 +38,23 @@ for later processing.
 
 =head1 SYNOPSIS
 
-=over 4
-
-# create and store data
-my $uploaded_file = C4::UploadedFile->new($sessionID);
-my $fileID = $uploaded_file->id();
-$uploaded_file->name('c:\temp\file.mrc');
-$uploaded_file->max_size(1024);
-while ($have_more_data) {
+ # create and store data
+ my $uploaded_file = C4::UploadedFile->new($sessionID);
+ my $fileID = $uploaded_file->id();
+ $uploaded_file->name('c:\temp\file.mrc');
+ $uploaded_file->max_size(1024);
+ while ($have_more_data) {
     $uploaded_file->stash($data, $bytes_read);
-}
-$uploaded_file->done();
+ }
+ $uploaded_file->done();
 
-# check status of current file upload
-my $progress = C4::UploadedFile->upload_progress($sessionID);
+ # check status of current file upload
+ my $progress = C4::UploadedFile->upload_progress($sessionID);
 
-# get file handle for reading uploaded file
-my $uploaded_file = C4::UploadedFile->fetch($fileID);
-my $fh = $uploaded_file->fh();
+ # get file handle for reading uploaded file
+ my $uploaded_file = C4::UploadedFile->fetch($fileID);
+ my $fh = $uploaded_file->fh();
 
-=back
 
 Stores files uploaded by the user from their web browser.  The
 uploaded files are temporary and at present are not guaranteed
@@ -73,11 +73,7 @@ TODO: implement secure persistant storage of uploaded files.
 
 =head2 new
 
-=over 4
-
-my $uploaded_file = C4::UploadedFile->new($sessionID);
-
-=back
+  my $uploaded_file = C4::UploadedFile->new($sessionID);
 
 Creates a new object to represent the uploaded file.  Requires
 the current session ID.
@@ -104,28 +100,38 @@ sub new {
     $fh->binmode(); # Windows compatibility
     $self->{'fh'} = $fh;
     $self->{'tmp_file_name'} = $tmp_file_name;
-    my $session = get_session($sessionID);
-    $session->param("$self->{'fileID'}.uploaded_tmpfile", $tmp_file_name);
-    $session->param('current_upload', $self->{'fileID'});
-    $session->flush();
-    $self->{'session'} = $session;
-    $self->{'name'} = '';
     $self->{'max_size'} = 0;
     $self->{'progress'} = 0;
+    $self->{'name'} = '';
 
     bless $self, $class;
+    $self->_serialize();
+
+    my $session = get_session($sessionID);
+    $session->param('current_upload', $self->{'fileID'});
+    $session->flush();
 
     return $self;
 
 }
 
-=head2 id
+sub _serialize {
+    my $self = shift;
 
-=over 4
+    my $prefix = "upload_" . $self->{'fileID'};
+    my $session = get_session($self->{'sessionID'});
+
+    # temporarily take file handle out of structure
+    my $fh = $self->{'fh'};
+    delete $self->{'fh'};
+    $session->param($prefix, $self);
+    $session->flush();
+    $self->{'fh'} =$fh;
+}
 
-my $fileID = $uploaded_file->id();
+=head2 id
 
-=back
+  my $fileID = $uploaded_file->id();
 
 =cut
 
@@ -136,12 +142,8 @@ sub id {
 
 =head2 name
 
-=over 4
-
-my $name = $uploaded_file->name();
-$uploaded_file->name($name);
-
-=back
+  my $name = $uploaded_file->name();
+  $uploaded_file->name($name);
 
 Accessor method for the name by which the file is to be known.
 
@@ -151,21 +153,34 @@ sub name {
     my $self = shift;
     if (@_) {
         $self->{'name'} = shift;
-        $self->{'session'}->param("$self->{'fileID'}.uploaded_filename", $self->{'name'});
-        $self->{'session'}->flush();
+        $self->_serialize();
     } else {
         return $self->{'name'};
     }
 }
 
-=head2 max_size
+=head2 filename
+
+  my $filename = $uploaded_file->filename();
 
-=over 4
+Accessor method for the name by which the file is to be known.
 
-my $max_size = $uploaded_file->max_size();
-$uploaded_file->max_size($max_size);
+=cut
 
-=back
+sub filename {
+    my $self = shift;
+    if (@_) {
+        $self->{'tmp_file_name'} = shift;
+        $self->_serialize();
+    } else {
+        return $self->{'tmp_file_name'};
+    }
+}
+
+=head2 max_size
+
+  my $max_size = $uploaded_file->max_size();
+  $uploaded_file->max_size($max_size);
 
 Accessor method for the maximum size of the uploaded file.
 
@@ -178,11 +193,7 @@ sub max_size {
 
 =head2 stash
 
-=over 4
-
-$uploaded_file->stash($dataref, $bytes_read);
-
-=back
+  $uploaded_file->stash($dataref, $bytes_read);
 
 Write C<$dataref> to the temporary file.  C<$bytes_read> represents
 the number of bytes (out of C<$max_size>) transmitted so far.
@@ -200,18 +211,13 @@ sub stash {
     my $percentage = int(($bytes_read / $self->{'max_size'}) * 100);
     if ($percentage > $self->{'progress'}) {
         $self->{'progress'} = $percentage;
-        $self->{'session'}->param("$self->{'fileID'}.uploadprogress", $self->{'progress'});
-        $self->{'session'}->flush();
+        $self->_serialize();
     }
 }
 
 =head2 done
 
-=over 4
-
-$uploaded_file->done();
-
-=back
+  $uploaded_file->done();
 
 Indicates that all of the bytes have been uploaded.
 
@@ -219,18 +225,14 @@ Indicates that all of the bytes have been uploaded.
 
 sub done {
     my $self = shift;
-    $self->{'session'}->param("$self->{'fileID'}.uploadprogress", 'done');
-    $self->{'session'}->flush();
+    $self->{'progress'} = 'done';
     $self->{'fh'}->close();
+    $self->_serialize();
 }
 
 =head2 upload_progress
 
-=over 4
-
-my $upload_progress = C4::UploadFile->upload_progress($sessionID);
-
-=back
+  my $upload_progress = C4::UploadFile->upload_progress($sessionID);
 
 Returns (as an integer from 0 to 100) the percentage
 progress of the current file upload.
@@ -246,7 +248,8 @@ sub upload_progress {
 
     my $reported_progress = 0;
     if (defined $fileID and $fileID ne "") {
-        my $progress = $session->param("$fileID.uploadprogress");
+        my $file = C4::UploadedFile->fetch($sessionID, $fileID);
+        my $progress = $file->{'progress'};
         if (defined $progress) {
             if ($progress eq "done") {
                 $reported_progress = 100;
@@ -260,11 +263,7 @@ sub upload_progress {
 
 =head2 fetch
 
-=over 4
-
-    my $uploaded_file = C4::UploadedFile->fetch($sessionID, $fileID);
-
-=back
+  my $uploaded_file = C4::UploadedFile->fetch($sessionID, $fileID);
 
 Retrieves an uploaded file object from the current session.
 
@@ -275,29 +274,19 @@ sub fetch {
     my $sessionID = shift;
     my $fileID = shift;
 
-    my $self = {};
-
-    $self->{'sessionID'} = $sessionID;
-    $self->{'fileID'} = $fileID;
     my $session = get_session($sessionID);
-    $self->{'session'} = $session;
-    $self->{'tmp_file_name'} = $session->param("$self->{'fileID'}.uploaded_tmpfile");
-    $self->{'name'} = $session->param("$self->{'fileID'}.uploaded_filename");
+    my $prefix = "upload_$fileID";
+    my $self = $session->param($prefix);
     my $fh = new IO::File $self->{'tmp_file_name'}, "r";
     $self->{'fh'} = $fh;
 
     bless $self, $class;
-
     return $self;
 }
 
 =head2 fh
 
-=over
-
-my $fh = $uploaded_file->fh();
-
-=back
+  my $fh = $uploaded_file->fh();
 
 Returns an IO::File handle to read the uploaded file.
 
@@ -308,9 +297,12 @@ sub fh {
     return $self->{'fh'};
 }
 
+1;
+__END__
+
 =head1 AUTHOR
 
-Koha Development Team <info@koha.org>
+Koha Development Team <http://koha-community.org/>
 
 Galen Charlton <galen.charlton@liblime.com>