From 46990042df471ed188c89cbb20f966b74e29602d Mon Sep 17 00:00:00 2001 From: Moritz Bunkus Date: Wed, 3 Jun 2015 14:35:23 +0200 Subject: [PATCH] SL::DB::Helper::TransNumberGenerator: Belegnummern einmal direkt auslesen MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit 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. --- SL/DB/Helper/TransNumberGenerator.pm | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) 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) ; } -- 2.20.1