diff --git a/docs/changelog/7.x.x.txt b/docs/changelog/7.x.x.txt index 5dc61eb04..898b24b54 100644 --- a/docs/changelog/7.x.x.txt +++ b/docs/changelog/7.x.x.txt @@ -1,6 +1,8 @@ 7.0.7 - fix: sqlform trunctate search results doesn't work (Martin Kamerbeek / Procolix) + - fixed some of bugs in the sqlform concerning file uploads and cross table + constraints (Martin Kamerbeek / Procolix) 7.0.6 diff --git a/lib/WebGUI/Asset/Wobject/SQLForm.pm b/lib/WebGUI/Asset/Wobject/SQLForm.pm index 2e0140694..812a87896 100644 --- a/lib/WebGUI/Asset/Wobject/SQLForm.pm +++ b/lib/WebGUI/Asset/Wobject/SQLForm.pm @@ -2048,12 +2048,18 @@ my $regexName = $self->session->form->process("regex_name") || 'untitled'; # If id = new create column in table if ($self->session->form->process("fid") eq 'new') { $dbLink->db->write('alter table '.$self->get('tableName').' add column '.$processed->{fieldName}.' '.$type); - $dbLink->db->write('alter table '.$self->get('tableName'). - ' add column '.'__'.$processed->{fieldName}.'_mimeType'.' varchar(64)') if ($self->session->form->process("formFieldType") eq 'file'); } else { $dbLink->db->write('alter table '.$self->get('tableName').' change column '.$properties->{fieldName}.' '.$processed->{fieldName}.' '.$type); } + # Add mimetype column for file fields. + if ($processed->{formFieldType} eq 'file') { + unless (isIn('__'.$processed->{fieldName}.'_mimeType' , keys(%{$databaseDef->{$self->get('tableName')}}))) { + $dbLink->db->write('alter table '.$self->get('tableName'). + ' add column '.'__'.$processed->{fieldName}.'_mimeType'.' varchar(64)'); + } + } + # Process fulltext columns if ($processed->{useFulltext} && !$properties->{useFulltext}) { $dbLink->db->write('alter table '.$self->get('tableName').' add fulltext ('.$processed->{fieldName}.')'); @@ -2506,7 +2512,7 @@ my ($creationDate, $creator); # Get field constraint my $fieldConstraint = undef; - if ($field->{fieldConstraintType} && $field->{fieldConstraintTarget} =~ /joinColumn[12]/) { + if ($field->{fieldConstraintType} && $field->{fieldConstraintTarget} ne 'value') { my $sql = $field->{sqlQuery}; if ($field->{joinConstraintColumn}) { $sql =~ s/^select/select $field->{fieldConstraintTarget},/; @@ -2542,17 +2548,29 @@ my @results = $self->session->db->quickArray($sql); push(@update, "$fieldName = ".$self->session->db->quote($previousRecord->{$fieldName})); push(@update, "__".$fieldName."_mimeType=".$self->session->db->quote($previousRecord->{"__".$fieldName."_mimeType"})); } elsif ($self->session->form->process('_'.$fieldName.'_action') eq 'overwrite' && $self->session->form->process($fieldName)) { - my $fileHandle = $self->session->request->upload($fieldName); + require Apache2::Request; + require Apache2::Upload; + + # Get Apache2::Upload object + my $upload = $self->session->request->upload($fieldName); + + # Check file size my $maxFileSize = ($self->get('maxFileSize') > $self->session->setting->get("maxAttachmentSize")) ? $self->session->setting->get("maxAttachmentSize") : $self->get('maxFileSize'); - push(@error, $i18n->get('ers file too large')) if (-s $fileHandle > $maxFileSize); - my $fileType = $self->session->request->uploadInfo($self->session->form->process($fieldName))->{'Content-Type'}; - my $fileContents; - while (<$fileHandle>) { - $fileContents .= $_; + if ($upload->size > $maxFileSize * 1024) { + push(@error, $i18n->get('ers file too large')); + } else { + my $fileType = $upload->type; + my $fileContents = ''; + + # Slurp file into scalar for use in query. Blocked reads will save memory, but then you + # have to stream the data, which is not possible in mysql queries as far as I know. + $upload->slurp($fileContents); + + # Include file content and mime type in query. + push(@update, "$fieldName = ".$self->session->db->quote($fileContents)); + push(@update, "__".$fieldName."_mimeType=".$self->session->db->quote($fileType)); } - push(@update, "$fieldName = ".$self->session->db->quote($fileContents)); - push(@update, "__".$fieldName."_mimeType=".$self->session->db->quote($fileType)); } else { } # Throw error if field is required and empty.