alecpl
2010-07-26 3a4c9f424bff7fc937334ac230217ffe5b2e246c
commit | author | age
a35062 1 #!/usr/bin/env php
T 2 <?php
3 /*
4
5  +-----------------------------------------------------------------------+
30aa4c 6  | bin/cleandb.sh                                                        |
a35062 7  |                                                                       |
T 8  | This file is part of the RoundCube Webmail client                     |
9  | Copyright (C) 2010, RoundCube Dev. - Switzerland                      |
10  | Licensed under the GNU GPL                                            |
11  |                                                                       |
12  | PURPOSE:                                                              |
13  |   Finally remove all db records marked as deleted some time ago       |
14  |                                                                       |
15  +-----------------------------------------------------------------------+
16  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
17  +-----------------------------------------------------------------------+
18
19  $Id$
20
21 */
22
23 if (php_sapi_name() != 'cli') {
24     die('Not on the "shell" (php-cli).');
25 }
26
27 define('INSTALL_PATH', realpath(dirname(__FILE__) . '/..') . '/' );
28 require INSTALL_PATH.'program/include/iniset.php';
29
30 // mapping for table name => primary key
31 $primary_keys = array(
60ff01 32     'contacts' => "contact_id",
A 33     'contactgroups' => "contactgroup_id",
a35062 34 );
T 35
36 // connect to DB
37 $RCMAIL = rcmail::get_instance();
38 $db = $RCMAIL->get_dbh();
39
40 if (!$db->is_connected() || $db->is_error)
60ff01 41     die("No DB connection");
a35062 42
5ba5fd 43 if (!empty($_SERVER['argv'][1]))
60ff01 44     $days = intval($_SERVER['argv'][1]);
5ba5fd 45 else
60ff01 46     $days = 7;
5ba5fd 47
a35062 48 // remove all deleted records older than two days
5ba5fd 49 $threshold = date('Y-m-d 00:00:00', time() - $days * 86400);
a35062 50
T 51 foreach (array('contacts','contactgroups','identities') as $table) {
52
60ff01 53     $sqltable = get_table_name($table);
a35062 54
60ff01 55     // also delete linked records
A 56     // could be skipped for databases which respect foreign key constraints
57     if ($db->db_provider == 'sqlite'
58         && ($table == 'contacts' || $table == 'contactgroups')
59     ) {
60         $pk = $primary_keys[$table];
61         $memberstable = get_table_name('contactgroupmembers');
a35062 62
60ff01 63         $db->query(
A 64             "DELETE FROM $memberstable".
65             " WHERE $pk IN (".
66                 "SELECT $pk FROM $sqltable".
67                 " WHERE del=1 AND changed < ?".
68             ")",
69             $threshold);
a35062 70
60ff01 71         echo $db->affected_rows() . " records deleted from '$memberstable'\n";
a35062 72     }
T 73
60ff01 74     // delete outdated records
A 75     $db->query("DELETE FROM $sqltable WHERE del=1 AND changed < ?", $threshold);
76
77     echo $db->affected_rows() . " records deleted from '$table'\n";
a35062 78 }
T 79
80 ?>