[ic] indirect login with unique column

Bill Carr bill at worldwideimpact.com
Tue Dec 2 21:09:28 EST 2003


----- Original Message ----- 
From: "Mike Heins" <mike at perusion.com>
To: <interchange-users at icdevgroup.org>
Sent: Tuesday, December 02, 2003 7:20 PM
Subject: Re: [ic] indirect login with unique column


> Quoting Bill Carr (bill at worldwideimpact.com):
> > IC 4.9.9, MySQL 4.0.16
> >
> > I have indirect_login set to email in my UserDB config. I also have a
> > UNIQUE INDEX on my email column in the userdb table. This seems like a
> > reasonable thing to do.
> >
> > Creating a new account was not working because of the UNIQUE INDEX. It
> > worked once but would not work after that because the insert statement
> > was failing with out including the 'email' value.
> >
> > I have made some hacks to UserDB.pm to fix this for myself. I will post
> > the changes if anyone thinks they would be of value. Someone please tell
> > me if I am just missing something here.
>
> I don't understand why you think there are two INSERT operations.
>
> If you are telling me that a subsequent UPDATE fails because the email
> column is not included in the list of fields updated, I would say that
> is a problem in MySQL. I see no reason that you have to include a field
> on every update.
In Vend::UserDB::new_account there is this:

  my $pass = $udb->set_field(
      $self->{USERNAME},
      $self->{LOCATION}{PASSWORD},
      $pw,
      );
  die ::errmsg("Database access error.") . "\n" unless defined $pass;

  if($foreign) { ...

If you somehow have row with a value of '' in the email column the above
dies. MySQL complains with error 1062 duplicate key '' for key 2. Now I
realize that there should not be a value of '' in the email column but some
how it happened. When it did no one else could create an account and
therefore no new customers could buy anything a this particular store.

I rewrote the above as follows and it solved my problem.
  my $fary;
  my $vary;
  push @$fary, $self->{LOCATION}{PASSWORD};
  push @$vary, $pw;
  if($foreign) {
    push @$fary,$foreign;
    push @$vary,$self->{PASSED_USERNAME};
  }

  my $pass = $udb->set_slice(
      $self->{USERNAME},
      $fary,
      $vary,
      );


Please tell me what you think. I can take it like a man!

Bill Carr



More information about the interchange-users mailing list