Fixes names captitalization and sorting.
[platal.git] / upgrade / 1.1.5 / name.php
1 #!/usr/bin/php5
2 <?php
3 include 'connect.db.inc.php';
4 include '../../include/name.func.inc.php';
5
6 // Returns the lower-cased name; if proper capitalization rule was not known,
7 // warns the user, and returns the initial name.
8 function capitalize_name_checked($name)
9 {
10 $capitalized = capitalize_name($name);
11 if (!$capitalized) {
12 echo "WARNING: Unable to capitalize '$name'.\n";
13 return $name;
14 }
15 if (mb_strtolower($name, 'UTF-8') != mb_strtolower($capitalized, 'UTF-8')) {
16 echo "WARNING: Capitalization of '$name' is unexpected: '$capitalized'\n";
17 return $name;
18 }
19
20 return $capitalized;
21 }
22
23 // Returns true iff the @p name looks like it should be properly recapitalized.
24 function needs_conversion($name)
25 {
26 if (strlen($name) == 0) {
27 return false;
28 }
29 if ($name == mb_strtoupper($name, 'UTF-8')) {
30 return true;
31 }
32
33 $name_length = mb_strlen($name, 'UTF-8');
34 $name_capitals = preg_replace('/\P{Lu}/u', '', $name);
35 return (mb_strlen($name_capitals, 'UTF-8') > 0.4 * $name_length);
36 }
37
38 // Retrieves all the names to convert.
39 $conversions = 0;
40 $names = XDB::iterRow('SELECT pid, lastname_initial, lastname_main, lastname_marital, lastname_ordinary,
41 firstname_initial, firstname_main, firstname_ordinary, pseudonym
42 FROM profile_public_names');
43 $name_list = array('lastname_initial', 'lastname_main', 'lastname_marital', 'lastname_ordinary',
44 'firstname_initial', 'firstname_main', 'firstname_ordinary', 'pseudonym');
45 while ($item = $names->next()) {
46 foreach ($name_list as $type) {
47 if ($item[$type] != '') {
48 $item[$type] = capitalize_name_checked($item[$type]);
49 }
50 }
51
52 XDB::execute('UPDATE profile_public_names
53 SET lastname_initial = {?}, lastname_main = {?}, lastname_marital = {?}, lastname_ordinary = {?},
54 firstname_initial = {?}, firstname_main = {?}, firstname_ordinary = {?}, pseudonym = {?}
55 WHERE pid = {?}',
56 $item['lastname_initial'], $item['lastname_main'], $item['lastname_marital'], $item['lastname_ordinary'],
57 $item['firstname_initial'], $item['firstname_main'], $item['firstname_ordinary'], $item['pseudonym'],
58 $item['pid']);
59 $profile = Profile::get($pid);
60 update_display_names($profile, $item);
61
62 $conversions++;
63 unset($item, $profile);
64 }
65
66 echo "$conversions names from profiles properly recapitalized.\n";
67
68 $conversions = 0;
69 $names = XDB::iterRow('SELECT uid, firstname, lastname
70 FROM accounts
71 WHERE NOT EXISTS (SELECT 1
72 FROM account_profiles
73 WHERE account_profiles.uid = accounts.uid)');
74
75 while ($item = $names->next()) {
76 $lastname = capitalize_name_checked($item['lastname']);
77 $firstname = capitalize_name_checked($item['firstname']);
78
79 $full_name = build_full_name($firstname, $lastname);
80 $directory_name = build_directory_name($firstname, $lastname);
81 $sort_name = build_sort_name($firstname, $lastname);
82
83 XDB::execute('UPDATE accounts
84 SET firstname = {?}, lastname = {?}, full_name = {?}, directory_name = {?}, sort_name = {?}
85 WHERE uid = {?}',
86 $firstname, $lastname, $full_name, $directory_name, $sort_name);
87
88 $conversions++;
89 unset($item);
90 }
91
92 echo "$conversions names from accounts properly recapitalized.\n";
93
94 // vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8:
95 ?>