+function set_profile_display(&$display_names, Profile $profile)
+{
+ XDB::execute("UPDATE profile_display
+ SET public_name = {?}, private_name = {?},
+ directory_name = {?}, short_name = {?}, sort_name = {?}
+ WHERE pid = {?}",
+ $display_names['public_name'], $display_names['private_name'],
+ $display_names['directory_name'], $display_names['short_name'],
+ $display_names['sort_name'], $profile->id());
+
+ $owner = $profile->owner();
+ if ($owner) {
+ XDB::execute('UPDATE accounts
+ SET full_name = {?}, directory_name = {?}
+ WHERE uid = {?}',
+ $display_names['public_name'], $display_names['directory_name'], $owner->id());
+ }
+}
+
+function build_sn_pub($pid)
+{
+ $res = XDB::iterator("SELECT CONCAT(sn.particle, sn.name) AS fullname, sn.typeid,
+ sn.particle, sn.name, sn.id
+ FROM profile_name AS sn
+ INNER JOIN profile_name_enum AS e ON (e.id = sn.typeid)
+ WHERE sn.pid = {?} AND NOT FIND_IN_SET('not_displayed', e.flags)
+ AND FIND_IN_SET('public', e.flags)
+ ORDER BY NOT FIND_IN_SET('always_displayed', e.flags), e.id, sn.name",
+ $pid);
+ $sn_old = array();
+ while ($old = $res->next()) {
+ $sn_old[$old['typeid']] = array('fullname' => $old['fullname'],
+ 'name' => $old['name'],
+ 'particle' => $old['particle'],
+ 'id' => $old['id']);
+ }
+ return $sn_old;
+}
+
+/** Transform a name to its canonical value so it can be compared
+ * to another form (different case, with accents or with - instead
+ * of blanks).
+ * @see compare_basename to compare
+ */
+function name_to_basename($value) {
+ $value = mb_strtoupper(replace_accent($value));
+ return preg_replace('/[^A-Z]/', ' ', $value);
+}
+
+/** Compares two strings and check if they are two forms of the
+ * same name (different case, with accents or with - instead of
+ * blanks).
+ * @see name_to_basename to retreive the compared string
+ */
+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)
+{
+ $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)) {
+ 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);
+ unset($sn_old[$typeid]);
+ } else {
+ $has_new = true;
+ }
+ } else {
+ if ($sn['fullname'] != '') {
+ XDB::execute("INSERT INTO profile_name (particle, name, typeid, pid)
+ VALUES ('', {?}, {?}, {?})",
+ $sn['fullname'], $typeid, $pid);
+ }
+ $i = 0;
+ while (isset($sn[$i])) {
+ XDB::execute("INSERT INTO profile_name (particle, name, typeid, pid)
+ VALUES ('', {?}, {?}, {?})",
+ $sn[$i], $typeid, $pid);
+ $i++;
+ }
+ }
+ }
+ if (count($sn_old) > 0) {
+ if (!$update_new) {
+ $has_new = true;
+ foreach ($sn_old as $typeid => $sn) {
+ XDB::execute("INSERT INTO profile_name (particle, name, typeid, pid)
+ VALUES ({?}, {?}, {?}, {?})",
+ $sn['particle'], $sn['name'], $typeid, $pid);
+ }
+ } else {
+ foreach ($sn_old as $typeid => $sn) {
+ XDB::execute("DELETE FROM profile_name
+ WHERE pid = {?} AND id = {?}",
+ $pid, $sn['id']);
+ }
+ }
+ }
+ if ($update_new) {
+ XDB::execute("DELETE FROM aliases
+ WHERE FIND_IN_SET('usage', flags) AND uid = {?}",
+ $uid);
+ }
+ if ($new_alias) {
+ XDB::execute("INSERT INTO aliases (alias, type, flags, uid)
+ VALUES ({?}, 'alias', 'usage', {?})",
+ $new_alias, $uid);
+ }
+ Profile::rebuildSearchTokens($pid);
+ return $has_new;
+}
+