[ic] indirect_login with AUTO_INCREMENT field

Bill Carr bill at worldwideimpact.com
Wed Oct 4 11:09:14 EDT 2006


On Sep 28, 2006, at 10:51 AM, Stefan Hornburg wrote:

> Bill Carr wrote:
>> I can not figure out how to use indirect_login and an  
>> AUTO_INCREMENT  username column with my UserDB to create a new  
>> account.
>> mysql> SHOW CREATE TABLE userdb;
>> CREATE TABLE `userdb` (
>>   `username` int(11) NOT NULL auto_increment,
>>   `email` varchar(128) NOT NULL default '',
>>   `password` varchar(20) NOT NULL default '',
>>   `acl` text,
>> ...
>> I've tried all kinds of combinations like below.
>> UserDB    default    <<EOD
>> {
>>     userminlen        => 1,
>>     passminlen        => 1,
>>     crypt        => 0,
>>     time_field        => 'mod_time',
>>     database        => 'userdb',
>>     indirect_login  => 'email',
>>     logfile        => 'userdb.log',
>>     sql_counter        => 'userdb:username',
>>     assign_username => 1
>> }
>> I always end up with two records in my UserDB like so:
>> mysql> SELECT username,email,password FROM userdb ORDER BY  
>> username  DESC LIMIT 2;
>> +----------+--------------------------+----------+
>> | username | email                    | password |
>> +----------+--------------------------+----------+
>> |     1724 |                          | password |
>> |     1723 | bill at bottlenose-wine.com |          |
>> +----------+--------------------------+----------+
>> It seems like I could make sure I have a numeric counter file with  
>> a  value at least as high as MAX(username) but that seems like  
>> something  that should be able to be avoided. Is there a way to  
>> use an  AUTO_INCREMENT username column with indirect_login in  
>> Interchange?
>
> The problem is that IC creates first a record with just username/ 
> password and fills in the details later. Personally, I think
> accounts should created in an atomic operation.
I have taken another look at this it it just seems impossible to use  
an AUTO_INCREMENT field in the userdb for the username and a foreign  
email field. Maybe I just do things weird but to me this seems like a  
common setup we should support. Now I'm a MySQL guy so I don't know  
how this stuff goes down using other DBs.

First patch Interpolate.pm to make tag_counter work with UserDB  
sql_counter userdb:username for MySQL:

--- /root/interchange-5.4.1/lib/Vend/Interpolate.pm     2005-12-23  
09:59:44.000000000 -0500
+++ Vend/Interpolate.pm 2006-09-28 13:41:54.000000000 -0400
@@ -2139,9 +2139,9 @@
                                         );
                         }
                         elsif($dsn =~ /^dbi:mysql:/i) {
-                               $seq ||= $tab;
-                               $dbh->do("INSERT INTO $seq VALUES  
(0)")         or die $diemsg;
-                               my $sth = $dbh->prepare("select  
LAST_INSERT_ID()")
+                         $seq = qq{($seq)} if $seq;
+                         $dbh->do("INSERT INTO $tab $seq VALUES  
(0)")          or die $diemsg;
+                         my $sth = $dbh->prepare("select  
LAST_INSERT_ID()")
                                         or die $diemsg;
                                 $sth->execute 
()                                                         or die  
$diemsg;
                                 ($val) = $sth->fetchrow_array;


Now after we get this going we are able to get a username using  
sql_counter. However, because we now have a new record in the userdb  
it breaks the existing account check in UserDB::new_account. The  
following modification gets us by that.

--- /root/interchange-5.4.1/lib/Vend/UserDB.pm  2005-11-09  
04:04:18.000000000 -0500
+++ /usr/lib/interchange/Vend/UserDB.pm 2006-10-04 11:00:26.000000000  
-0400
@@ -1556,8 +1556,11 @@
                                 };
                 }
-               if ($udb->record_exists($self->{USERNAME})) {
-                       die errmsg("Username already exists.") . "\n";
+               my $record_exists = $udb->record_exists($self-> 
{USERNAME});
+               if ($self->{OPTIONS}{sql_counter}) {
+                 die errmsg("Could not create Username.") . "\n"  
unless $record_exists;
+               } else {
+                 die errmsg("Username already exists.") . "\n" if  
$record_exists;
                 }
                 if($foreign) {

Bill Carr
Bottlenose - Wine & Spirits eBusiness Specialists
(877) 857-6700



More information about the interchange-users mailing list