| 1 | #!/usr/bin/php5 |
| 2 | <?php |
| 3 | // WARNING: this script takes a few minutes to be executed completly, thus run it into a screen. |
| 4 | |
| 5 | require_once 'connect.db.inc.php'; |
| 6 | require_once '../../classes/phone.php'; |
| 7 | require_once '../../classes/address.php'; |
| 8 | |
| 9 | $globals->debug = 0; // Do not store backtraces. |
| 10 | |
| 11 | print "Deletes duplicated addresses. (1/3)\n"; |
| 12 | $pids = XDB::rawFetchColumn("SELECT DISTINCT(pid) |
| 13 | FROM profile_addresses AS a1 |
| 14 | WHERE type = 'home' AND EXISTS (SELECT * |
| 15 | FROM profile_addresses AS a2 |
| 16 | WHERE a2.type = 'home' AND a2.pid = a1.pid AND a2.id != a1.id) |
| 17 | ORDER BY pid"); |
| 18 | $total = count($pids); |
| 19 | $done = 0; |
| 20 | $aux = 0; |
| 21 | $deleted = 0; |
| 22 | $addresses = array(); |
| 23 | $rawAddresses = array(); |
| 24 | $duplicates = array(); |
| 25 | foreach ($pids as $pid) { |
| 26 | $count = 0; |
| 27 | $it = Address::iterate(array($pid), array(Address::LINK_PROFILE), array(0)); |
| 28 | while ($item = $it->next()) { |
| 29 | $addresses[] = $item; |
| 30 | $rawAddresses[] = preg_replace('/[^a-zA-Z0-9]/', '', replace_accent($item->text)); |
| 31 | ++$count; |
| 32 | } |
| 33 | for ($i = 0; $i < $count; ++$i) { |
| 34 | for ($j = $i + 1; $j < $count; ++$j) { |
| 35 | if ($rawAddresses[$i] == $rawAddresses[$j]) { |
| 36 | $duplicates[$i] = true; |
| 37 | } |
| 38 | } |
| 39 | } |
| 40 | foreach ($duplicates as $key => $bool) { |
| 41 | unset($addresses[$key]); |
| 42 | } |
| 43 | if (count($addresses) != $count) { |
| 44 | $deleted += ($count - count($addresses)); |
| 45 | Address::deleteAddresses($pid, 'home'); |
| 46 | $id = 0; |
| 47 | foreach ($addresses as $address) { |
| 48 | $address->setId($id); |
| 49 | $address->save(); |
| 50 | ++$id; |
| 51 | } |
| 52 | XDB::execute('UPDATE IGNORE profile_merge_issues |
| 53 | SET issues = REPLACE(issues, \'address\', \'\') |
| 54 | WHERE pid = {?}', $pid); |
| 55 | } |
| 56 | unset($rawAddresses); |
| 57 | unset($addresses); |
| 58 | unset($duplicates); |
| 59 | |
| 60 | ++$done; |
| 61 | ++$aux; |
| 62 | if ($aux == 100) { |
| 63 | $aux = 0; |
| 64 | printf("\r%u / %u", $done, $total); |
| 65 | } |
| 66 | } |
| 67 | printf("\r%u / %u", $done, $total); |
| 68 | print "\n$deleted addresses deleted.\n\n"; |
| 69 | |
| 70 | print "Formats non formated phones. (2/3)\n"; |
| 71 | $it = XDB::rawIterator("SELECT search_tel AS search, display_tel AS display, comment, link_id, |
| 72 | tel_type AS type, link_type, tel_id AS id, pid, pub |
| 73 | FROM profile_phones |
| 74 | WHERE search_tel = '' OR search_tel IS NULL |
| 75 | ORDER BY pid, link_id, tel_id"); |
| 76 | $total = $it->total(); |
| 77 | $i = 0; |
| 78 | $j = 0; |
| 79 | while ($item = $it->next()) { |
| 80 | $phone = new Phone($item); |
| 81 | $phone->delete(); |
| 82 | $phone->save(); |
| 83 | |
| 84 | ++$i; |
| 85 | ++$j; |
| 86 | if ($j == 100) { |
| 87 | $j = 0; |
| 88 | printf("\r%u / %u", $i, $total); |
| 89 | } |
| 90 | } |
| 91 | printf("\r%u / %u", $i, $total); |
| 92 | print "\nFormating done.\n\n"; |
| 93 | |
| 94 | print "Deletes duplicated phones. (3/3)\n"; |
| 95 | $pids = XDB::rawFetchColumn("SELECT DISTINCT(pid) |
| 96 | FROM profile_phones AS p1 |
| 97 | WHERE link_type = 'user' AND EXISTS (SELECT * |
| 98 | FROM profile_phones AS p2 |
| 99 | WHERE p2.link_type = 'user' AND p2.pid = p1.pid AND p2.tel_id != p1.tel_id) |
| 100 | ORDER BY pid"); |
| 101 | $total = count($pids); |
| 102 | $done = 0; |
| 103 | $aux = 0; |
| 104 | $deleted = 0; |
| 105 | $phones = array(); |
| 106 | $duplicates = array(); |
| 107 | foreach ($pids as $pid) { |
| 108 | $count = 0; |
| 109 | Phone::iterate(array($pid), array(Phone::LINK_PROFILE), array(0)); |
| 110 | while ($item = $it->next()) { |
| 111 | $phones[] = $item; |
| 112 | ++$count; |
| 113 | } |
| 114 | for ($i = 0; $i < $count; ++$i) { |
| 115 | for ($j = $i + 1; $j < $count; ++$j) { |
| 116 | if ($phones[$i]->search() == $phones[$j]->search()) { |
| 117 | $duplicates[$i] = true; |
| 118 | } |
| 119 | } |
| 120 | } |
| 121 | foreach ($duplicates as $key => $bool) { |
| 122 | unset($phones[$key]); |
| 123 | } |
| 124 | if (count($phones) != $count) { |
| 125 | $deleted += ($count - count($phones)); |
| 126 | Phone::deletePhones($pid, 'user'); |
| 127 | $id = 0; |
| 128 | foreach ($phones as $phone) { |
| 129 | $phone->setId($id); |
| 130 | $phone->save(); |
| 131 | ++$id; |
| 132 | } |
| 133 | XDB::execute('UPDATE IGNORE profile_merge_issues |
| 134 | SET issues = REPLACE(issues, \'phone\', \'\') |
| 135 | WHERE pid = {?}', $pid); |
| 136 | } |
| 137 | unset($duplicates); |
| 138 | unset($phones); |
| 139 | |
| 140 | ++$done; |
| 141 | ++$aux; |
| 142 | if ($aux == 10) { |
| 143 | $aux = 0; |
| 144 | printf("\r%u / %u", $done, $total); |
| 145 | } |
| 146 | } |
| 147 | printf("\r%u / %u", $done, $total); |
| 148 | print "\n$deleted phones deleted.\n\n"; |
| 149 | |
| 150 | print "That's all folks!\n"; |
| 151 | |
| 152 | /* vim:set et sw=4 sts=4 ts=4: */ |
| 153 | ?> |