chiark / gitweb /
break out generate_local_part and prepare_create
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Wed, 4 Sep 2013 20:50:32 +0000 (21:50 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Wed, 4 Sep 2013 20:50:32 +0000 (21:50 +0100)
service

diff --git a/service b/service
index f160aaca213322281950353128a1e54613f9728e..d9ca7e3bf5ae26867088d42b9dab1cf35c7283ba 100755 (executable)
--- 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);