| 1 | #! /usr/bin/env php |
|---|
| 2 | <?php |
|---|
| 3 | |
|---|
| 4 | require_once(dirname($argv[0]) . "/utilities.php"); |
|---|
| 5 | require_once(dirname($argv[0]) . "/../common/db/round_task.php"); |
|---|
| 6 | |
|---|
| 7 | db_connect(); |
|---|
| 8 | $smfprefix = IA_SMF_DB_PREFIX; |
|---|
| 9 | |
|---|
| 10 | // Set password=username for all users. |
|---|
| 11 | log_print("Clearing passwords for all users."); |
|---|
| 12 | db_query("UPDATE ia_user |
|---|
| 13 | SET `password` = SHA1(CONCAT(LCASE(username), LCASE(username)))"); |
|---|
| 14 | db_query("UPDATE {$smfprefix}members |
|---|
| 15 | SET `passwd` = SHA1(CONCAT(LCASE(memberName), LCASE(memberName)))"); |
|---|
| 16 | |
|---|
| 17 | // Delete emails. |
|---|
| 18 | log_print("Clearing emails for all users."); |
|---|
| 19 | db_query("UPDATE ia_user |
|---|
| 20 | SET email = CONCAT(username, '@example.com')"); |
|---|
| 21 | db_query("UPDATE {$smfprefix}members |
|---|
| 22 | SET emailAddress = CONCAT(memberName, '@example.com')"); |
|---|
| 23 | |
|---|
| 24 | // Delete smf private data. |
|---|
| 25 | log_print("Clearing private data and ip information."); |
|---|
| 26 | db_query("UPDATE {$smfprefix}members |
|---|
| 27 | SET secretQuestion = '', secretAnswer='', memberIP='', |
|---|
| 28 | memberIP2=''"); |
|---|
| 29 | // Delete ip information. |
|---|
| 30 | db_query("UPDATE ia_file SET remote_ip_info = NULL"); |
|---|
| 31 | db_query("UPDATE ia_job SET remote_ip_info = NULL"); |
|---|
| 32 | db_query("UPDATE ia_textblock SET remote_ip_info = NULL"); |
|---|
| 33 | db_query("UPDATE ia_textblock_revision SET remote_ip_info = NULL"); |
|---|
| 34 | |
|---|
| 35 | // Delete all attachments except noimage. |
|---|
| 36 | log_print("Deleting all attachments."); |
|---|
| 37 | db_query("DELETE FROM ia_file |
|---|
| 38 | WHERE name <> 'noimage'"); |
|---|
| 39 | |
|---|
| 40 | // Delete submissions. |
|---|
| 41 | log_print("Clearing all submissions."); |
|---|
| 42 | db_query("UPDATE ia_job SET file_contents='--gone--'"); |
|---|
| 43 | |
|---|
| 44 | // Delete private tasks. |
|---|
| 45 | log_print("Deleting private tasks."); |
|---|
| 46 | db_query("DELETE FROM ia_task WHERE security = 'private'"); |
|---|
| 47 | |
|---|
| 48 | // Only keep first 100 tasks to keep the dump small. |
|---|
| 49 | log_print("Deleting all tasks except for the first 100."); |
|---|
| 50 | $del_task_count = db_query_value("SELECT COUNT(0) FROM ia_task") - 100; |
|---|
| 51 | if ($del_task_count > 0) { |
|---|
| 52 | db_query("DELETE FROM ia_task ORDER BY `order` DESC LIMIT $del_task_count"); |
|---|
| 53 | } |
|---|
| 54 | |
|---|
| 55 | // Delete extra users. Only kill mortals. |
|---|
| 56 | log_print("Deleting all normal users except for 200."); |
|---|
| 57 | $del_user_count = db_query_value("SELECT COUNT(*) FROM ia_user") - 200; |
|---|
| 58 | if ($del_user_count > 0) { |
|---|
| 59 | db_query("DELETE FROM ia_user ". |
|---|
| 60 | "WHERE security_level = 'normal' ". |
|---|
| 61 | "ORDER BY RAND() LIMIT $del_user_count"); |
|---|
| 62 | } |
|---|
| 63 | |
|---|
| 64 | // Delete orphan smf members. |
|---|
| 65 | db_query("DELETE ia_smf_members FROM ia_smf_members ". |
|---|
| 66 | "LEFT JOIN ia_user on ia_user.username = ia_smf_members.memberName ". |
|---|
| 67 | "WHERE (ia_user.username IS NULL) "); |
|---|
| 68 | |
|---|
| 69 | // Delete orphan user-defined rounds. |
|---|
| 70 | log_print("Deleting orphan user defined rounds."); |
|---|
| 71 | db_query("DELETE ia_round FROM ia_round |
|---|
| 72 | LEFT JOIN ia_user ON ia_round.user_id = ia_user.id |
|---|
| 73 | WHERE (ia_user.id IS NULL)"); |
|---|
| 74 | |
|---|
| 75 | // Delete orphan users registered in rounds. |
|---|
| 76 | log_print("Deleting orphan users registered in rounds."); |
|---|
| 77 | db_query("DELETE ia_user_round FROM ia_user_round |
|---|
| 78 | LEFT JOIN ia_user ON ia_user_round.user_id = ia_user.id |
|---|
| 79 | LEFT JOIN ia_round ON ia_user_round.round_id = ia_round.id |
|---|
| 80 | WHERE (ia_user.id IS NULL) OR (ia_round.id IS NULL)"); |
|---|
| 81 | |
|---|
| 82 | // Delete orphan tasks in rounds. |
|---|
| 83 | log_print("Deleting orphan tasks in rounds."); |
|---|
| 84 | db_query("DELETE ia_round_task FROM ia_round_task |
|---|
| 85 | LEFT JOIN ia_task ON ia_round_task.task_id = ia_task.id |
|---|
| 86 | LEFT JOIN ia_round ON ia_round_task.round_id = ia_round.id |
|---|
| 87 | WHERE (ia_task.id IS NULL) OR (ia_round.id IS NULL)"); |
|---|
| 88 | |
|---|
| 89 | // Recompute round task order |
|---|
| 90 | $rounds = db_fetch_all("SELECT DISTINCT `round_id` AS `id` FROM ia_round_task"); |
|---|
| 91 | foreach ($rounds as $round) { |
|---|
| 92 | round_task_recompute_order($round['id']); |
|---|
| 93 | } |
|---|
| 94 | |
|---|
| 95 | // Delete orphan task ratings. |
|---|
| 96 | log_print("Deleting orphan task_ratings"); |
|---|
| 97 | db_query("DELETE ia_task_ratings FROM ia_task_ratings |
|---|
| 98 | LEFT JOIN ia_task ON ia_task_ratings.task_id = ia_task.id |
|---|
| 99 | LEFT JOIN ia_user on ia_task_ratings.user_id = ia_user.id |
|---|
| 100 | WHERE (ia_user.id IS NULL) OR (ia_task.id IS NULL)"); |
|---|
| 101 | |
|---|
| 102 | // Delete orphan scores. |
|---|
| 103 | log_print("Deleting orphan scores."); |
|---|
| 104 | db_query("DELETE ia_score_user_round_task FROM ia_score_user_round_task ". |
|---|
| 105 | "LEFT JOIN ia_user on ia_user.id = ia_score_user_round_task.user_id ". |
|---|
| 106 | "LEFT JOIN ia_task on ia_task.id = ia_score_user_round_task.task_id ". |
|---|
| 107 | "LEFT JOIN ia_round on ia_round.id = ia_score_user_round_task.round_id ". |
|---|
| 108 | "WHERE (ia_score_user_round_task.user_id IS NOT NULL AND ia_user.id IS NULL) ". |
|---|
| 109 | "OR (ia_score_user_round_task.task_id IS NOT NULL AND ia_task.id IS NULL) ". |
|---|
| 110 | "OR (ia_score_user_round_task.round_id IS NOT NULL AND ia_round.id IS NULL)"); |
|---|
| 111 | |
|---|
| 112 | // Recompute ia_score_user_round |
|---|
| 113 | db_query("DELETE FROM ia_score_user_round"); |
|---|
| 114 | $rounds = db_fetch_all("SELECT id FROM ia_round"); |
|---|
| 115 | |
|---|
| 116 | foreach ($rounds as $round) { |
|---|
| 117 | round_recompute_score($round['id']); |
|---|
| 118 | } |
|---|
| 119 | |
|---|
| 120 | // Delete orphan rating entries |
|---|
| 121 | db_query("DELETE ia_rating FROM ia_rating ". |
|---|
| 122 | "LEFT JOIN ia_user on ia_user.id = ia_rating.user_id ". |
|---|
| 123 | "LEFT JOIN ia_round on ia_round.id = ia_rating.round_id ". |
|---|
| 124 | "WHERE (ia_rating.user_id IS NOT NULL AND ia_user.id IS NULL) ". |
|---|
| 125 | "OR (ia_rating.round_id IS NOT NULL AND ia_round.id IS NULL)"); |
|---|
| 126 | |
|---|
| 127 | // Delete orphan jobs. |
|---|
| 128 | log_print("Deleting orphan jobs."); |
|---|
| 129 | db_query("DELETE ia_job FROM ia_job ". |
|---|
| 130 | "LEFT JOIN ia_user on ia_user.id = ia_job.user_id ". |
|---|
| 131 | "LEFT JOIN ia_task on ia_task.id = ia_job.task_id ". |
|---|
| 132 | "WHERE (ia_user.id IS NULL) OR (ia_task.id IS NULL)"); |
|---|
| 133 | |
|---|
| 134 | // Delete extra jobs. |
|---|
| 135 | log_print("Deleting all but last 1000 submissions."); |
|---|
| 136 | $del_job_count = db_query_value("SELECT COUNT(*) FROM ia_job") - 1000; |
|---|
| 137 | if ($del_job_count > 0) { |
|---|
| 138 | db_query("DELETE FROM ia_job ORDER BY id ASC LIMIT $del_job_count"); |
|---|
| 139 | } |
|---|
| 140 | |
|---|
| 141 | // Delete orphan job tests. |
|---|
| 142 | log_print("Deleting orphan job tests."); |
|---|
| 143 | db_query("DELETE ia_job_test FROM ia_job_test ". |
|---|
| 144 | "LEFT JOIN ia_job on ia_job_test.job_id = ia_job.id ". |
|---|
| 145 | "WHERE (ia_job.id IS NULL)"); |
|---|
| 146 | |
|---|
| 147 | // Delete private pages. |
|---|
| 148 | log_print("Deleting private pages."); |
|---|
| 149 | db_query("DELETE FROM `ia_textblock` WHERE security='private'"); |
|---|
| 150 | |
|---|
| 151 | // Delete task pages. |
|---|
| 152 | // This is needed to avoid leaking secret statements. |
|---|
| 153 | log_print("Deleting orphan task pages."); |
|---|
| 154 | db_query("DELETE FROM `ia_textblock` ". |
|---|
| 155 | "WHERE name LIKE 'problema/%' AND name NOT IN ". |
|---|
| 156 | "(SELECT page_name FROM ia_task)"); |
|---|
| 157 | |
|---|
| 158 | // Delete orphan user pages. |
|---|
| 159 | // They take a huge amount of space. |
|---|
| 160 | log_print("Deleting orphan user pages."); |
|---|
| 161 | db_query("DELETE FROM `ia_textblock` ". |
|---|
| 162 | "WHERE name LIKE 'utilizator/%' AND name NOT IN ". |
|---|
| 163 | "(SELECT CONCAT('utilizator/', username) FROM ia_user)"); |
|---|
| 164 | |
|---|
| 165 | // Delete orphan revisions. |
|---|
| 166 | log_print("Deleting orphan revisions."); |
|---|
| 167 | db_query("DELETE `ia_textblock_revision` FROM ia_textblock_revision ". |
|---|
| 168 | "LEFT JOIN ia_textblock ON ia_textblock_revision.name = ia_textblock.name ". |
|---|
| 169 | "WHERE ia_textblock.name IS NULL"); |
|---|
| 170 | |
|---|
| 171 | // Erase worthless history. |
|---|
| 172 | log_print("Erasing much of textblock history."); |
|---|
| 173 | $del_revision_count = db_query_value("SELECT COUNT(*) FROM ia_textblock_revision") - 2000; |
|---|
| 174 | if ($del_revision_count > 0) { |
|---|
| 175 | db_query("DELETE FROM ia_textblock_revision ". |
|---|
| 176 | "ORDER BY RAND() LIMIT $del_revision_count"); |
|---|
| 177 | } |
|---|
| 178 | |
|---|
| 179 | // Delete orphan task tags. |
|---|
| 180 | log_print("Deleting orphan task tags."); |
|---|
| 181 | db_query("DELETE ia_task_tags FROM ia_task_tags |
|---|
| 182 | LEFT JOIN ia_task ON ia_task_tags.task_id = ia_task.id |
|---|
| 183 | WHERE (ia_task.id IS NULL)"); |
|---|
| 184 | |
|---|
| 185 | // Delete orphan round tags. |
|---|
| 186 | log_print("Deleting orphan round tags."); |
|---|
| 187 | db_query("DELETE ia_round_tags FROM ia_round_tags |
|---|
| 188 | LEFT JOIN ia_round ON ia_round_tags.round_id = ia_round.id |
|---|
| 189 | WHERE (ia_round.id IS NULL)"); |
|---|
| 190 | |
|---|
| 191 | // Delete orphan textblock tags. |
|---|
| 192 | log_print("Deleting orphan textblock tags."); |
|---|
| 193 | db_query("DELETE ia_textblock_tags FROM ia_textblock_tags |
|---|
| 194 | LEFT JOIN ia_textblock ON ia_textblock_tags.textblock_id = ia_textblock.name |
|---|
| 195 | WHERE (ia_textblock.name IS NULL)"); |
|---|
| 196 | |
|---|
| 197 | // Censor forum. FIXME: only censor private stuff. |
|---|
| 198 | // We could look inside smf and only delete some things, but it's hard. |
|---|
| 199 | // - personal and public SMF messages (we have some private threads) |
|---|
| 200 | log_print("Deleting everything from forum."); |
|---|
| 201 | db_query("DELETE FROM `{$smfprefix}messages`"); |
|---|
| 202 | db_query("DELETE FROM `{$smfprefix}personal_messages`"); |
|---|
| 203 | db_query("DELETE FROM `{$smfprefix}pm_recipients`"); |
|---|
| 204 | db_query("DELETE FROM `{$smfprefix}polls`"); |
|---|
| 205 | db_query("DELETE FROM `{$smfprefix}poll_choices`"); |
|---|
| 206 | db_query("DELETE FROM `{$smfprefix}sessions`"); |
|---|
| 207 | db_query("DELETE FROM `{$smfprefix}topics`"); |
|---|
| 208 | db_query("DELETE FROM `{$smfprefix}collapsed_categories`"); |
|---|
| 209 | // - SMF logs |
|---|
| 210 | db_query("DELETE FROM `{$smfprefix}log_actions`"); |
|---|
| 211 | db_query("DELETE FROM `{$smfprefix}log_activity`"); |
|---|
| 212 | db_query("DELETE FROM `{$smfprefix}log_banned`"); |
|---|
| 213 | db_query("DELETE FROM `{$smfprefix}log_boards`"); |
|---|
| 214 | db_query("DELETE FROM `{$smfprefix}log_errors`"); |
|---|
| 215 | db_query("DELETE FROM `{$smfprefix}log_floodcontrol`"); |
|---|
| 216 | db_query("DELETE FROM `{$smfprefix}log_karma`"); |
|---|
| 217 | db_query("DELETE FROM `{$smfprefix}log_mark_read`"); |
|---|
| 218 | db_query("DELETE FROM `{$smfprefix}log_notify`"); |
|---|
| 219 | db_query("DELETE FROM `{$smfprefix}log_online`"); |
|---|
| 220 | db_query("DELETE FROM `{$smfprefix}log_polls`"); |
|---|
| 221 | db_query("DELETE FROM `{$smfprefix}log_search_messages`"); |
|---|
| 222 | db_query("DELETE FROM `{$smfprefix}log_search_results`"); |
|---|
| 223 | db_query("DELETE FROM `{$smfprefix}log_search_subjects`"); |
|---|
| 224 | db_query("DELETE FROM `{$smfprefix}log_search_topics`"); |
|---|
| 225 | db_query("DELETE FROM `{$smfprefix}log_search_words`"); |
|---|
| 226 | db_query("DELETE FROM `{$smfprefix}log_topics`"); |
|---|
| 227 | |
|---|
| 228 | foreach (db_fetch_all("SHOW TABLES") as $row) { |
|---|
| 229 | $row = array_values($row); |
|---|
| 230 | $table = $row[0]; |
|---|
| 231 | db_query("OPTIMIZE TABLE $table"); |
|---|
| 232 | db_query("ANALYZE TABLE $table"); |
|---|
| 233 | } |
|---|
| 234 | |
|---|
| 235 | ?> |
|---|