From: Moritz Bunkus Date: Wed, 3 Jun 2015 12:35:23 +0000 (+0200) Subject: SL::DB::Helper::TransNumberGenerator: Belegnummern einmal direkt auslesen X-Git-Tag: release-3.3.0beta~53 X-Git-Url: http://wagnertech.de/git?a=commitdiff_plain;h=46990042df471ed188c89cbb20f966b74e29602d;p=kivitendo-erp.git SL::DB::Helper::TransNumberGenerator: Belegnummern einmal direkt auslesen Es werden alle vorhandenen Belegnummern benötigt. Diese wurden bisher so ausgelesen, dass die Belege vom Rose-Manager via ->get_all komplett geladen wurden und dann jeweils die Belegnummernspalte davon genommen wurde. Das ist sehr langsam, vor allem da es potenziell sogar gleich ein zweites Mal gemacht wurde. Die Umstellung hier nutzt dafür ein direktes SQL-Query und umgeht Rose dafür. Außerdem werden die nur einmal ausgelesen. --- diff --git a/SL/DB/Helper/TransNumberGenerator.pm b/SL/DB/Helper/TransNumberGenerator.pm index e42c41597..c9ed09fc0 100644 --- a/SL/DB/Helper/TransNumberGenerator.pm +++ b/SL/DB/Helper/TransNumberGenerator.pm @@ -8,6 +8,7 @@ our @EXPORT = qw(get_next_trans_number create_trans_number); use Carp; use List::Util qw(max); +use SL::DBUtils (); use SL::PrefixedNumber; sub oe_scoping { @@ -81,7 +82,17 @@ sub get_next_trans_number { # therefore we're re-loading the row. $self->db->dbh->do("LOCK " . $self->meta->table) || die $self->db->dbh->errstr; - my %numbers_in_use = map { ( $_->$number_column => 1 ) } @{ $self->_get_manager_class->get_all(%conditions_for_in_use) }; + my ($query_in_use, $bind_vals_in_use) = Rose::DB::Object::QueryBuilder::build_select( + dbh => $self->db->dbh, + select => $number_column, + tables => [ $self->meta->table ], + columns => { $self->meta->table => [ $number_column ] }, + query_is_sql => 1, + %conditions_for_in_use, + ); + + my @numbers = do { no warnings 'once'; SL::DBUtils::selectall_array_query($::form, $self->db->dbh, $query_in_use, @{ $bind_vals_in_use || [] }) }; + my %numbers_in_use = map { ( $_ => 1 ) } @numbers; my $range_table = ($business ? $business : SL::DB::Default->get)->load(for_update => 1); @@ -90,7 +101,6 @@ sub get_next_trans_number { my $sequence = SL::PrefixedNumber->new(number => $start_number // 0); if (!$fill_holes_in_range) { - my @numbers = map { $_->$number_column } @{ $self->_get_manager_class->get_all(%conditions) }; $sequence->set_to_max(@numbers) ; }