From 40e9e103a57df863153abcf393b0eea3a912dd6e Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Wed, 4 Sep 2013 21:50:32 +0100 Subject: [PATCH] break out generate_local_part and prepare_create --- service | 36 ++++++++++++++++++++++-------------- 1 file changed, 22 insertions(+), 14 deletions(-) diff --git a/service b/service index f160aac..d9ca7e3 100755 --- a/service +++ b/service @@ -141,16 +141,9 @@ sub rhsargs ($) { return $row; } -sub action_create { - my $newrow = rhsargs({'redirect'=>$user, 'comment'=>''}); - open R, "/dev/urandom" or die $!; - binmode R; - my $countq = $dbh->prepare("SELECT count(*) FROM addrs WHERE user=?"); - $countq->execute($user); - my ($count) = $countq->fetchrow_array(); - die unless defined $count; - die "too many aliases for this user\n" if $count >= $maxperuser; - my $q = $dbh->prepare("SELECT localpart FROM addrs WHERE localpart=?"); +sub generate_local_part () { + our $checkexist_q ||= + $dbh->prepare("SELECT localpart FROM addrs WHERE localpart=?"); my $s; for (;;) { $s = chr(ord('a')+goodrand(26)); @@ -161,13 +154,28 @@ sub action_create { : ord('0')+($v-26)); } # print STDERR "$s\n"; - $q->execute($s); - my $row = $q->fetchrow_arrayref(); + $checkexist_q->execute($s); + my $row = $checkexist_q->fetchrow_arrayref(); last if !$row; - $dbh->abort(); } + return $s; +} + +sub prepare_create () { + my $countq = $dbh->prepare("SELECT count(*) FROM addrs WHERE user=?"); + $countq->execute($user); + my ($count) = $countq->fetchrow_array(); + die unless defined $count; + die "too many aliases for this user\n" if $count >= $maxperuser; + open R, "/dev/urandom" or die $!; + binmode R; +} + +sub action_create { + my $newrow = rhsargs({'redirect'=>$user, 'comment'=>''}); + prepare_create(); $newrow->{'user'} = $user; - $newrow->{'localpart'} = $s; + $newrow->{'localpart'} = generate_local_part(); insertrow($newrow); $dbh->commit(); prow($newrow); -- 2.30.2