Skip to content

Commit c075f7c

Browse files
committed
Fixes #427 by checking column size for field
1 parent 430532b commit c075f7c

File tree

1 file changed

+50
-0
lines changed

1 file changed

+50
-0
lines changed

perl_lib/EPrints/MetaField.pm

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1169,6 +1169,17 @@ sub sql_row_from_value
11691169
{
11701170
my( $self, $session, $value ) = @_;
11711171

1172+
# Truncate value if it is longer than what the database column permits.
1173+
{
1174+
use bytes;
1175+
my $maxlength = $self->get_sql_column_size( $session );
1176+
if ( $maxlength && length( $value ) > $maxlength )
1177+
{
1178+
$value = substr( $value, 0, $maxlength );
1179+
$session->log( "WARNING: Value for field '".$self->name."' was truncated, as it was longer than $maxlength characters." );
1180+
}
1181+
}
1182+
11721183
return( $value );
11731184
}
11741185

@@ -1278,6 +1289,45 @@ sub get_sql_index
12781289
}
12791290

12801291

1292+
######################################################################
1293+
=pod
1294+
1295+
=begin InternalDoc
1296+
1297+
=item $sql = $field->get_sql_column_size
1298+
1299+
Return the column size of the field in the database if that is
1300+
applicable
1301+
1302+
=end InternalDoc
1303+
1304+
=cut
1305+
######################################################################
1306+
1307+
sub get_sql_column_size
1308+
{
1309+
my( $self, $session ) = @_;
1310+
1311+
my $db = $session->get_db;
1312+
my $ds = $self->dataset;
1313+
1314+
if ( defined $session->{database}->{$ds->get_sql_table_name}->{$self->get_name}->{column_size} )
1315+
{
1316+
return $session->{database}->{$ds->get_sql_table_name}->{$self->get_name}->{column_size};
1317+
}
1318+
1319+
my $sth = $db->{dbh}->column_info(
1320+
undef, #catalogue
1321+
undef, #schema
1322+
$ds->get_sql_table_name,
1323+
$self->get_name,
1324+
);
1325+
my $res = $sth->fetchall_arrayref( { COLUMN_SIZE => 1 } );
1326+
1327+
$session->{database}->{$ds->get_sql_table_name}->{$self->get_name}->{column_size} = $res->[0] && $res->[0]->{COLUMN_SIZE} ? $res->[0]->{COLUMN_SIZE} : 0;
1328+
1329+
return $session->{database}->{$ds->get_sql_table_name}->{$self->get_name}->{column_size};
1330+
}
12811331

12821332

12831333
######################################################################

0 commit comments

Comments
 (0)