[kronolith] DB conversion woes on creating 'rampage_users' (webmail 1.2.8 to HordeGW 5.0.2)

Herbert Pophal pophal at tubit.tu-berlin.de
Wed Jan 23 15:23:05 UTC 2013


Dear Horde folks,

Probably this is not just a kronolith related issue, but I wasn't quite
sure which mailing list to choose instead. Please let me know.

I'm trying to upgrade our one year old webmail edition (1.2.8, i.e. H3)
to Horde Groupware 5. I experience problems in converting the database,
more specifically, creating the rampage_users table derived from
kronolith_events.


Environment: RHEL 6.3 (last year Solaris 10)
             PHP 5.3.3 (RedHat Packages) driven by mod_fcgid
             Separate PEAR Installation of Horde Groupware 5.0.2

webmail-install failed with the error:

$ PHP_PEAR_SYSCONF_DIR=$HORDE5 php  -d include_path=$HORDE5/pear/php
$HORDE5/pear/webmail-install
....
====================

Fatal Error:
QUERY FAILED: Duplicate entry 'j.doe' for key 'rampage_users_user_name'

INSERT INTO `rampage_users` (user_name) VALUES ('j.doe')

[Name changed]


In order to trace what's going on I inserted some print()s in the code
(see below), guided by the traceback (as well, below). The result is:

up J.doe [20081023221501.383724nxck41bakg at webmail.tu-berlin.de, 2] 0
ensureUsers:: INSERT INTO `rampage_users` (user_name) VALUES ('J.doe')
ensureUsers: ---
up SHARE: j.doe [20081023221501.383724nxck41bakg at webmail.tu-berlin.de, 2] 0
ensureUsers:: INSERT INTO `rampage_users` (user_name) VALUES ('j.doe')
[other updates]
up J.doe [20081023222256.26315wukf75ifu8s at webmail.tu-berlin.de, 2] 0
ensureUsers: ---
up SHARE: j.doe [20081023222256.26315wukf75ifu8s at webmail.tu-berlin.de, 2] 0
ensureUsers:: INSERT INTO `rampage_users` (user_name) VALUES ('j.doe')

...

up jane.tarzan [20081024122118.19381e67ceecfm4k at webmail.tu-berlin.de, 2] 0
ensureUsers:: INSERT INTO `rampage_users` (user_name) VALUES ('jane.tarzan')
ensureUsers: ---
up SHARE: Jane.Tarzan
[20081024122118.19381e67ceecfm4k at webmail.tu-berlin.de, 2] 0
ensureUsers:: INSERT INTO `rampage_users` (user_name) VALUES ('Jane.Tarzan')
up jane.tarzan [20081024122359.10563syxgtkzpd8g at webmail.tu-berlin.de, 2] 0
ensureUsers: ---
up SHARE: Jane.Tarzan
[20081024122359.10563syxgtkzpd8g at webmail.tu-berlin.de, 2] 0
ensureUsers:: INSERT INTO `rampage_users` (user_name) VALUES ('Jane.Tarzan')
up jane.tarzan [20081024122535.70608bjh8fcst09s at webmail.tu-berlin.de, 2] 0
ensureUsers: ---
[ a dozen times or so ]
...

up Ascii-Unicode [20081026151751.17426vo1khzwivk8 at webmail.tu-berlin.de,
2] Uni-Veranstaltung
ensureUsers:: INSERT INTO `rampage_users` (user_name) VALUES
('Ascii-Unicode')
ensureUsers: ---
up SHARE: ascii-unicode
[20081026151751.17426vo1khzwivk8 at webmail.tu-berlin.de, 2] Uni-Veranstaltung
ensureUsers:: INSERT INTO `rampage_users` (user_name) VALUES
('ascii-unicode')

[Again, names are changed, but with observation of character case]

up j.doe [20081028165942.59321yryb5fy1szo at webmail.tu-berlin.de, 2] 0
ensureUsers:: INSERT INTO `rampage_users` (user_name) VALUES ('j.doe')

Fatal Error:
QUERY FAILED: Duplicate entry 'j.doe' for key 'rampage_users_user_name'

INSERT INTO `rampage_users` (user_name) VALUES ('j.doe')


HINT: When inspecting e.g. kronolith_events, there are records belonging
to j.doe and J.doe, resp., though this is the same person. When logging
in into the current (H3) installation as SomeBody, the portal calls me
somebody, but a newly created calendar is owned by SomeBody.
The 'other case' entries in rampage_users marked 'SHARE' above do not
show up in the resulting table.


Traceback:
In
/afs/tu-berlin.de/units/tubit/www/horde-test.tubit/htdocs/horde-5/pear/php/Horde/Db/Adapter/Mysql.php
on line 258

 1. Horde_Core_Bundle->migrateDb()
/afs/tu-berlin.de/units/tubit/www/horde-test.tubit/htdocs/horde-5/pear/webmail-install:32
 2. Horde_Db_Migration_Migrator->up()
/afs/tu-berlin.de/units/tubit/www/horde-test.tubit/htdocs/horde-5/pear/php/Horde/Core/Bundle.php:107
 3. Horde_Db_Migration_Migrator->_doMigrate()
/afs/tu-berlin.de/units/tubit/www/horde-test.tubit/htdocs/horde-5/pear/php/Horde/Db/Migration/Migrator.php:102
 4. Horde_Db_Migration_Base->migrate()
/afs/tu-berlin.de/units/tubit/www/horde-test.tubit/htdocs/horde-5/pear/php/Horde/Db/Migration/Migrator.php:182
 5. KronolithUpgradeCategoriesToTags->up()
/afs/tu-berlin.de/units/tubit/www/horde-test.tubit/htdocs/horde-5/pear/php/Horde/Db/Migration/Base.php:121
 6. Content_Tagger->tag()
/afs/tu-berlin.de/units/tubit/www/horde-test.tubit/htdocs/horde-5/kronolith/migration/18_kronolith_upgrade_categoriestotags.php:44
 7. Content_Users_Manager->ensureUsers()
/afs/tu-berlin.de/units/tubit/www/horde-test.tubit/htdocs/horde-5/content/lib/Tagger.php:109
 8. Horde_Core_Bundle->migrateDb()
/afs/tu-berlin.de/units/tubit/www/horde-test.tubit/htdocs/horde-5/pear/webmail-install:32
 9. Horde_Db_Migration_Migrator->up()
/afs/tu-berlin.de/units/tubit/www/horde-test.tubit/htdocs/horde-5/pear/php/Horde/Core/Bundle.php:107
10. Horde_Db_Migration_Migrator->_doMigrate()
/afs/tu-berlin.de/units/tubit/www/horde-test.tubit/htdocs/horde-5/pear/php/Horde/Db/Migration/Migrator.php:102
11. Horde_Db_Migration_Base->migrate()
/afs/tu-berlin.de/units/tubit/www/horde-test.tubit/htdocs/horde-5/pear/php/Horde/Db/Migration/Migrator.php:182
12. KronolithUpgradeCategoriesToTags->up()
/afs/tu-berlin.de/units/tubit/www/horde-test.tubit/htdocs/horde-5/pear/php/Horde/Db/Migration/Base.php:121
13. Content_Tagger->tag()
/afs/tu-berlin.de/units/tubit/www/horde-test.tubit/htdocs/horde-5/kronolith/migration/18_kronolith_upgrade_categoriestotags.php:44
14. Content_Users_Manager->ensureUsers()
/afs/tu-berlin.de/units/tubit/www/horde-test.tubit/htdocs/horde-5/content/lib/Tagger.php:109
15. Horde_Db_Adapter_Mysql->insert()
/afs/tu-berlin.de/units/tubit/www/horde-test.tubit/htdocs/horde-5/content/lib/Users/Manager.php:75
16. Horde_Db_Adapter_Mysql->execute()
/afs/tu-berlin.de/units/tubit/www/horde-test.tubit/htdocs/horde-5/pear/php/Horde/Db/Adapter/Mysql.php:281


Code changes:
18_kronolith_upgrade_categoriestotags.php
class KronolithUpgradeCategoriesToTags extends Horde_Db_Migration_Base

    public function up()
    {
        $sql = 'SELECT event_uid, event_category, event_creator_id,
calendar_id FROM kronolith_events';
        $this->announce('Migrating event categories to tags.');
        $rows = $this->select($sql);
        foreach ($rows as $row) {
            print __FUNCTION__.' '.$row['event_creator_id'].'
['.(string)$row['event_uid'].', '.$this->_type_ids['event'].']
'.$row['event_category'].PHP_EOL; //DBG
            $this->_tagger->tag(
                $row['event_creator_id'],
                array('object' => (string)$row['event_uid'], 'type' =>
$this->_type_ids['event']),
                $row['event_category']
            );

            // Do we need to tag the event again, but as the share owner?
            try {
                $cal = $this->_shares->getShare($row['calendar_id']);
                if ($cal->get('owner') != $row['event_creator_id']) {
 //////// case sensitive, but same user!
                    print __FUNCTION__.' SHARE: '.$cal->get('owner').'
['.(string)$row['event_uid'].', '.$this->_type_ids['event'].']
'.$row['event_category'].PHP_EOL; //DBG
                    $this->_tagger->tag(
                        $cal->get('owner'),
                        array('object' => (string)$row['event_uid'],
'type' => $this->_type_ids['event']),
                        $row['event_category']
                    );
                }
            } catch (Exception $e) {
                $this->announce('Unable to find Share: ' .
$row['calendar_id'] . ' Skipping.');
            }
        }
        print __FUNCTION__.' ------'.PHP_EOL; //DBG, NOT reached due to
abort
        $this->announce('Event categories successfully migrated.');
        $this->removeColumn('kronolith_events', 'event_category');
    }

-------------------------

Manager.php
class Content_Users_Manager
public function ensureUsers()

            // Create any users that didn't already exist
            foreach ($userName as $user => $userIndex) {
                $query = 'INSERT INTO ' . $this->_t('users') . '
(user_name) VALUES (' . $this->toDriver($user) . ')';
                print __FUNCTION__.':: '.$query.PHP_EOL;
                // $userIds[$userIndex] = $this->_db->insert('INSERT
INTO ' . $this->_t('users') . ' (user_name) VALUES (' .
$this->toDriver($user) . ')');
                $userIds[$userIndex] = $this->_db->insert( $query );
            }
            print __FUNCTION__.': ---'.PHP_EOL;


What can I do to overcome the problem?

Thanks in advance.

Herbert


More information about the kronolith mailing list