I forgot to commit the sql script for last commits.
[platal.git] / include / name.func.inc.php
index d954263..1f78daf 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /***************************************************************************
- *  Copyright (C) 2003-2010 Polytechnique.org                              *
+ *  Copyright (C) 2003-2011 Polytechnique.org                              *
  *  http://opensource.polytechnique.org/                                   *
  *                                                                         *
  *  This program is free software; you can redistribute it and/or modify   *
@@ -228,6 +228,14 @@ function build_sn_pub($pid)
     return $sn_old;
 }
 
+/** Splits a name into tokens, as used in search_name.
+ * Used for search_name rebuilding and for queries.
+ */
+function split_name_for_search($name) {
+    return preg_split('/[[:space:]\'\-]+/', strtolower(replace_accent($name)),
+                      -1, PREG_SPLIT_NO_EMPTY);
+}
+
 /** Transform a name to its canonical value so it can be compared
  * to another form (different case, with accents or with - instead
  * of blanks).
@@ -247,22 +255,21 @@ function compare_basename($a, $b) {
     return name_to_basename($a) == name_to_basename($b);
 }
 
-function set_alias_names(&$sn_new, $sn_old, $pid, $uid, $update_new = false, $new_alias = null)
+function set_alias_names(&$sn_new, $sn_old, $pid, PlUser $user, $update_new = false, $new_alias = null)
 {
     $has_new = false;
     foreach ($sn_new as $typeid => $sn) {
-        if (isset($sn['pub'])) {
-            if (isset($sn_old[$typeid]) && ($sn_old[$typeid]['fullname'] == $sn['fullname'] && $update_new)) {
+        if (isset($sn['pub']) && !is_null($sn['fullname'])) {
+            if (isset($sn_old[$typeid]) && $update_new) {
                 XDB::execute("UPDATE  profile_name
                                  SET  particle = {?}, name = {?}, typeid = {?}
                                WHERE  id = {?} AND pid = {?}",
                              $sn['particle'], $sn['name'], $typeid, $sn_old[$typeid]['id'], $pid);
                 unset($sn_old[$typeid]);
-            } elseif ($update_new
-                      || (isset($sn_old[$typeid]) && compare_basename($sn_old[$typeid]['fullname'], $sn['fullname']))) {
-                XDB::execute("INSERT INTO  profile_name (particle, name, typeid, pid)
-                                   VALUES  ({?}, {?}, {?}, {?})",
-                             $sn['particle'], $sn['name'], $typeid, $pid);
+            } elseif ($sn['fullname'] == $sn_old[$typeid]['fullname'] && $sn['name'] == $sn_old[$typeid]['name']) {
+                XDB::execute('INSERT INTO  profile_name (particle, name, typeid, pid)
+                                   VALUES  ({?}, {?}, {?}, {?})',
+                             $sn_old[$typeid]['particle'], $sn_old[$typeid]['name'], $typeid, $pid);
                 unset($sn_old[$typeid]);
             } else {
                 $has_new = true;
@@ -299,16 +306,42 @@ function set_alias_names(&$sn_new, $sn_old, $pid, $uid, $update_new = false, $ne
         }
     }
     if ($update_new) {
-        XDB::execute("DELETE FROM  aliases
-                            WHERE  FIND_IN_SET('usage', flags) AND uid = {?}",
-                     $uid);
+        XDB::execute('DELETE FROM  email_source_account
+                            WHERE  FIND_IN_SET(\'usage\', flags) AND uid = {?} AND type = \'alias\'',
+                     $user->id());
     }
     if ($new_alias) {
-        XDB::execute("INSERT INTO  aliases (alias, type, flags, uid)
-                           VALUES  ({?}, 'alias', 'usage', {?})",
-                     $new_alias, $uid);
+        XDB::execute('INSERT INTO  email_source_account (email, uid, type, flags, domain)
+                           SELECT  {?}, {?}, \'alias\', \'usage\', id
+                             FROM  email_virtual_domains
+                            WHERE  name = {?}',
+                     $new_alias, $user->id(), $user->mainEmailDomain());
     }
-    Profile::rebuildSearchTokens($pid);
+
+    // XXX: Improve this when we optimize names handling.
+    // Updates accounts firt and last names.
+    XDB::execute('UPDATE  accounts          AS a
+              INNER JOIN  account_profiles  AS ap ON (ap.uid = a.uid AND FIND_IN_SET(\'owner\', ap.perms))
+              INNER JOIN  profile_name_enum AS le ON (le.type = \'lastname\')
+              INNER JOIN  profile_name_enum AS ce ON (ce.type = \'lastname_ordinary\')
+              INNER JOIN  profile_name      AS l  ON (ap.pid = l.pid AND le.id = l.typeid)
+               LEFT JOIN  profile_name      AS c  ON (ap.pid = c.pid AND ce.id = c.typeid)
+                     SET  a.lastname = IF(c.pid IS NULL, IF(l.particle != \'\', l.name, CONCAT(l.particle, \' \', l.name)),
+                                                         IF(c.particle != \'\', c.name, CONCAT(c.particle, \' \', c.name)))
+                   WHERE  a.uid = {?}',
+                 $user->id());
+
+    XDB::execute('UPDATE  accounts          AS a
+              INNER JOIN  account_profiles  AS ap ON (ap.uid = a.uid AND FIND_IN_SET(\'owner\', ap.perms))
+              INNER JOIN  profile_name_enum AS fe ON (fe.type = \'firstname\')
+              INNER JOIN  profile_name_enum AS ce ON (ce.type = \'firstname_ordinary\')
+              INNER JOIN  profile_name      AS f  ON (ap.pid = f.pid AND fe.id = f.typeid)
+               LEFT JOIN  profile_name      AS c  ON (ap.pid = c.pid AND ce.id = c.typeid)
+                     SET  a.firstname = IF(c.pid IS NULL, f.name, c.name)
+                   WHERE  a.uid = {?}',
+                 $user->id());
+
+    Profile::rebuildSearchTokens($pid, false);
     return $has_new;
 }