3
* $Id: purge.php,v 1.31 2005/02/22 01:29:58 cknudsen Exp $
2
/* $Id: purge.php,v 1.65.2.5 2008/04/04 19:57:15 umcesrjones Exp $
6
* Purge events page and handler.
7
* When an event is deleted from a user's calendar, it is marked
8
* as deleted (webcal_entry_user.cal_status = 'D'). This page
9
* will actually clean out the database rather than just mark an
5
* Purge events page and handler.
6
* When an event is deleted from a user's calendar, it is marked
7
* as deleted (webcal_entry_user.cal_status = 'D'). This page
8
* will actually clean out the database rather than just mark an
13
* Events will only be deleted if they were created by the selected
14
* user. Events where the user was a participant (but not did not
15
* create) will remain unchanged.
12
* Events will only be deleted if they were created by the selected
13
* user. Events where the user was a participant (but not did not
14
* create) will remain unchanged.
18
17
include_once 'includes/init.php';
20
19
// Set this to true do show the SQL at the bottom of the page
24
24
if ( ! $is_admin ) {
25
25
// must be admin...
26
do_redirect ( "index.php" );
26
do_redirect ( 'index.php' );
32
$purge_all = getPostValue ( "purge_all" );
33
$end_year = getPostValue ( "end_year" );
34
$end_month = getPostValue ( "end_month" );
35
$end_day = getPostValue ( "end_day" );
36
$user = getPostValue ( "user" );
37
$preview = getPostValue ( "preview" );
32
$previewStr = translate ( 'Preview' );
33
$allStr = translate ( 'All' );
34
$purgingStr = translate ( 'Purging events for' );
35
$deleteStr = translate ( 'Delete' );
37
$delete = getPostValue ( 'delete' );
39
if ( ! empty ( $delete ) ) {
43
$purge_all = getPostValue ( 'purge_all' );
44
$purge_deleted = getPostValue ( 'purge_deleted' );
45
$end_year = getPostValue ( 'end_year' );
46
$end_month = getPostValue ( 'end_month' );
47
$end_day = getPostValue ( 'end_day' );
48
$username = getPostValue ( 'username' );
49
$preview = getPostValue ( 'preview' );
38
50
$preview = ( empty ( $preview ) ? false : true );
40
$INC = array('js/purge.php','js/visible.php');
41
if ( ! empty ( $user ) ) {
44
$BodyX = 'onload="all_handler();"';
52
$INC = array ( 'js/visible.php' );
47
print_header ( $INC, '', $BodyX );
54
print_header ( $INC );
50
<table style="border-width:0px;">
51
58
<tr><td style="vertical-align:top; width:50%;">
53
echo "<h2>" . translate("Delete Events" );
60
echo '<h2>' . translate ( 'Delete Events' );
55
echo "[ " . translate("Preview" ) . "]";
62
echo '[ ' . $previewStr . ']';
59
<a title="<?php etranslate("Admin") ?>" class="nav" href="adminhome.php">« <?php etranslate("Admin") ?></a><br /><br />
62
if ( ! empty ( $user ) ) {
64
echo "<h2> [" . translate("Preview") . "] " .
65
translate("Purging events for") . " $user...</h2>\n";
67
echo "<h2>" . translate("Purging events for") . ": $user</h2>\n";
64
echo display_admin_link ();
68
echo '<h2> [' . $previewStr . '] ' . $purgingStr . " $username...</h2>\n";
70
echo '<h2>' . $purgingStr . ": $username</h2>\n";
70
72
$end_date = sprintf ( "%04d%02d%02d", $end_year, $end_month, $end_day );
71
if ( $purge_all == "Y" ) {
72
if ( $user == 'ALL' ) {
74
if ( $purge_deleted == 'Y' )
75
$tail = " AND weu.cal_status = 'D' ";
77
if ( $purge_all == 'Y' ) {
78
if ( $username == 'ALL' ) {
73
79
$ids = array ( 'ALL' );
76
"SELECT cal_id FROM webcal_entry WHERE cal_create_by = '$user'" );
81
$ids = get_ids ( 'SELECT cal_id FROM webcal_entry '
82
. " WHERE cal_create_by = '$username' $tail" );
78
84
} elseif ( $end_date ) {
79
if ( $user != 'ALL' ) {
80
$tail = " AND webcal_entry.cal_create_by = '$user'";
85
if ( $username != 'ALL' ) {
86
$tail = " AND we.cal_create_by = '$username' $tail";
83
89
$ALL = 1; // Need this to tell get_ids to ignore participant check
85
$E_ids = get_ids ( "SELECT cal_id FROM webcal_entry " .
91
$E_ids = get_ids ( 'SELECT we.cal_id FROM webcal_entry we, webcal_entry_user weu ' .
86
92
"WHERE cal_type = 'E' AND cal_date < '$end_date' $tail",
88
$M_ids = get_ids ( "SELECT webcal_entry.cal_id FROM webcal_entry " .
89
"INNER JOIN webcal_entry_repeats ON " .
90
"webcal_entry.cal_id = webcal_entry_repeats.cal_id " .
91
"WHERE webcal_entry.cal_type = 'M' AND " .
92
"cal_end IS NOT NULL AND cal_end < '$end_date' $tail",
94
$M_ids = get_ids ( 'SELECT DISTINCT(we.cal_id) FROM webcal_entry we,
95
webcal_entry_user weu, webcal_entry_repeats wer
96
WHERE we.cal_type = \'M\'
97
AND we.cal_id = wer.cal_id AND we.cal_id = wer.cal_id '
98
. "AND cal_end IS NOT NULL AND cal_end < '$end_date' $tail",
94
100
$ids = array_merge ( $E_ids, $M_ids );
97
103
if ( count ( $ids ) > 0 ) {
98
104
purge_events ( $ids );
100
echo translate("None");
106
echo translate ( 'None' );
102
echo "<h2>..." . translate("Finished") . ".</h2>\n";
108
echo '<h2>...' . translate ( 'Finished' ) . ".</h2>\n";
110
<form><input type="button" value="<?php etranslate ( 'Back' )?>"
111
onclick="history.back()" /></form
103
113
if ( $purgeDebug ) {
104
echo "<div style=\"border: 1px solid #000;background-color: #fff;\"><tt>$sqlLog</tt></div>\n";
114
echo '<div style="border: 1px solid #000;background-color: #ffffff;"><tt>' .
115
$sqlLog . '</tt></div>' ."\n";
109
<form action="purge.php" method="post" name="purgeform">
120
<form action="purge.php" method="post" name="purgeform" id="purgeform">
111
<tr><td><label for="user">
112
<?php etranslate("User");?>:</label></td>
113
<td><select name="user">
122
<tr><td><label for="user">
123
<?php echo translate ( 'User' );?>:</label></td>
124
<td><select name="username">
115
126
$userlist = get_my_users ();
116
if ($nonuser_enabled == "Y" ) {
127
if ($NONUSER_ENABLED == 'Y' ) {
117
128
$nonusers = get_nonuser_cals ();
118
$userlist = ($nonuser_at_top == "Y") ? array_merge($nonusers, $userlist) : array_merge($userlist, $nonusers);
129
$userlist = ($NONUSER_AT_TOP == 'Y' ? array_merge ($nonusers, $userlist) : array_merge ($userlist, $nonusers));
120
for ( $i = 0; $i < count ( $userlist ); $i++ ) {
121
echo "<option value=\"".$userlist[$i]['cal_login']."\">".$userlist[$i]['cal_fullname']."</option>\n";
131
for ( $i = 0, $cnt = count ( $userlist ); $i < $cnt; $i++ ) {
132
echo '<option value="' . $userlist[$i]['cal_login'] . '"';
133
if ( $login == $userlist[$i]['cal_login'] )
134
echo ' selected="selected"';
135
echo '>' . $userlist[$i]['cal_fullname'] . "</option>\n";
124
<option value="ALL" selected="selected"><?php etranslate("All")?></option>
127
<tr><td><label for="purge_all">
128
<?php etranslate("Check box to delete <b>ALL</b> events for a user")?>:</label></td>
130
<input type="checkbox" name="purge_all" value="Y"
131
onclick="all_handler()" />
133
<tr id="dateArea"><td><label>
134
<?php etranslate("Delete all events before");?>:</label></td><td>
135
<?php print_date_selection ( "end_", date ( "Ymd" ) ) ?>
137
<tr><td><label for="preview">
138
<?php etranslate("Preview delete")?>:</label></td>
140
<input type="checkbox" name="preview" value="Y" checked="checked" />
143
<input type="submit" name="action" value="<?php etranslate("Delete")?>" onclick="return confirm('<?php etranslate("Are you sure you want to delete events for");?> ' + document.forms[0].user.value + '?')" />
138
<option value="ALL"><?php echo $allStr ?></option>
141
<tr><td><label for="purge_all">
142
<?php etranslate ( 'Check box to delete ALL events for a user' )?>:</label></td>
144
<input type="checkbox" name="purge_all" value="Y" id="purge_all" onclick="toggle_datefields( 'dateArea', this );" />
146
<tr id="dateArea"><td><label>
147
<?php etranslate ( 'Delete all events before' );?>:</label></td><td>
148
<?php echo date_selection ( 'end_', date ( 'Ymd' ) ) ?>
150
<tr><td><label for="purge_deleted">
151
<?php etranslate ( 'Purge deleted only' )?>:</label></td>
153
<input type="checkbox" name="purge_deleted" value="Y" />
155
<tr><td><label for="preview">
156
<?php etranslate ( 'Preview delete' )?>:</label></td>
158
<input type="checkbox" name="preview" value="Y" checked="checked" />
161
<input type="submit" name="delete" value="<?php
162
echo $deleteStr?>" onclick="return confirm( '<?php
163
etranslate ( 'Are you sure you want to delete events for', true);
164
?> ' + document.forms[0].username.value + '?' )" />
149
170
</td></tr></table>
151
<?php print_trailer(); ?>
172
<?php echo print_trailer ();
155
174
function purge_events ( $ids ) {
156
global $preview, $c; // db connection
175
global $preview, $previewStr, $c; // db connection
176
global $sqlLog, $allStr;
159
178
$tables = array (
160
179
array ( 'webcal_entry_user', 'cal_id' ),
161
180
array ( 'webcal_entry_repeats', 'cal_id' ),
162
181
array ( 'webcal_entry_repeats_not', 'cal_id' ),
163
182
array ( 'webcal_entry_log', 'cal_entry_id' ),
183
array ( 'webcal_entry_categories', 'cal_id' ),
164
184
array ( 'webcal_import_data', 'cal_id' ),
165
185
array ( 'webcal_site_extras', 'cal_id' ),
166
array ( 'webcal_reminder_log', 'cal_id' ),
186
array ( 'webcal_reminders', 'cal_id' ),
167
187
array ( 'webcal_entry_ext_user', 'cal_id' ),
188
array ( 'webcal_blob', 'cal_id' ),
168
189
array ( 'webcal_entry', 'cal_id' )
171
192
//var_dump($tables);exit;
173
for ( $i = 0; $i < count ( $tables ); $i++ ) {
194
$cnt = count ( $tables );
195
for ( $i = 0; $i < $cnt; $i++ ) {
176
198
foreach ( $ids as $cal_id ) {
177
for ( $i = 0; $i < count ( $tables ); $i++ ) {
199
for ( $i = 0; $i < $cnt; $i++ ) {
178
200
$clause = ( $cal_id == 'ALL' ? '' :
179
201
" WHERE {$tables[$i][1]} = $cal_id" );
180
202
if ( $preview ) {
181
$sql = "SELECT COUNT(" . $tables[$i][1] .
203
$sql = 'SELECT COUNT(' . $tables[$i][1] .
182
204
") FROM {$tables[$i][0]}" . $clause;
183
//echo "cal_id = '$cal_id'<br>clause = '$clause'<br>";
184
//echo "$sql <br/>\n";
185
$res = dbi_query ( $sql );
186
$sqlLog .= $sql . "<br/>\n";
206
$res = dbi_execute ( $sql );
207
$sqlLog .= $sql . "<br />\n";
188
209
if ( $row = dbi_fetch_row ( $res ) )
189
210
$num[$i] += $row[0];
193
214
$sql = "DELETE FROM {$tables[$i][0]}" . $clause;
194
$sqlLog .= $sql . "<br/>\n";
195
$res = dbi_query ( $sql );
196
if ( $cal_id == 'ALL' ) {
197
$num[$i] = translate ( "All" );
215
$sqlLog .= $sql . "<br />\n";
216
$res = dbi_execute ( $sql );
217
if ( $cal_id == 'ALL' )
199
220
$num[$i] += dbi_affected_rows ( $c, $res );
204
for ( $i = 0; $i < count ( $tables ); $i++ ) {
224
for ( $i = 0; $i < $cnt; $i++ ) {
205
225
$table = $tables[$i][0];
206
echo "[" . translate ( "Preview" ) . "] " .
207
translate("Records deleted from") .
226
echo '[' . $previewStr . '] ' .
227
translate ( 'Records deleted from' ) .
208
228
" $table: $num[$i]<br />\n";
212
232
function get_ids ( $sql, $ALL = '' ) {
215
//echo "SQL: $sql <br/>\n";
216
$sqlLog .= $sql . "<br/>\n";
217
$res = dbi_query ( $sql );
236
$sqlLog .= $sql . "<br />\n";
237
$res = dbi_execute ( $sql );
219
239
while ( $row = dbi_fetch_row ( $res ) ) {
221
241
$ids[] = $row[0];
223
243
//ONLY Delete event if no other participants.
225
$res2 = dbi_query ( "SELECT COUNT(*) FROM webcal_entry_user " .
226
"WHERE cal_id = $ID" );
245
$res2 = dbi_execute ( 'SELECT COUNT( * ) FROM webcal_entry_user
246
WHERE cal_id = ?', array ( $ID ) );
228
248
if ( $row2 = dbi_fetch_row ( $res2 ) ) {
229
if ( $row2[0] == 1 ) $ids[] = $ID;
231
252
dbi_free_result ( $res2 );