root .'lib/db_implementation.php'; class DBMysqli extends DBImpl { private static $_instance = null; private $con = null; private $charset = 'utf8'; private $numRows = -1; private function __construct() { $this->connect(); } function __destruct() { if ($this->con) { $this->con->close(); $this->con = null; } } private function __clone() {} public static function getInstance() { if (!is_object(self::$_instance)) { self::$_instance = new DBMysqli(); } return self::$_instance; } private function connect() { global $CFG; if (!$this->con) { $this->con = new mysqli($CFG->amavisd_db_host, $CFG->amavisd_db_user, $CFG->amavisd_db_password, $CFG->amavisd_db_name, $CFG->amavisd_db_port); if ($this->con->connect_error) { die ('Connect error ('.$this->con->connect_errno.') '. $this->con->connect_error); } } } public function setCharset($charset = 'utf8') { $this->charset = $charset; } private function changeCharset() { if (!$this->con->set_charset($this->charset)) { printf("Error loading character set %s: %s\n", $this->charset, $this->con->error); } } public function update($sql) { $success = true; if (! is_array($sql)) { $sql = array($sql); } $this->con->autocommit(false); foreach ($sql as $query) { $this->con->query($query) ? null : $success = false; } $success ? $this->con->commit() : $this->con->rollback(); $this->con->autocommit(true); return $success; } function getMarked($recipient = 'all') { $all = array(); $query = "select distinct m.mail_id as id from quarantine q, msgrcpt m, msgs s, maddr r "; $query .= "where m.mail_id = q.mail_id and q.mail_id = s.mail_id and m.rid = r.id "; $query .= "and (m.rs = 'R' or m.rs = 'D')"; if ($recipient != 'all') { $query .= " and email = '$recipient'"; } if ($result = $this->con->query($query)) { while ($row = $result->fetch_object()) { $all[] = $row->id; } } return $all; } public function getQMails($offset = -1, $rowsPerPage = -1, $recipient = 'all') { $row = array(); $this->changeCharset(); $query = "SELECT DISTINCT quarantine.mail_id, secret_id, rs, bspam_level, "; $query .= "(UNIX_TIMESTAMP(time_iso) + (3600 * 2)) AS time_iso, "; $query .= "SUBSTRING(sender.email,1,35) AS sender, "; $query .= "SUBSTRING(recipient.email,1,28) AS recipient, size, msgrcpt.content "; $query .= "AS quaratinefor, SUBSTRING( subject, 1, 25) AS subject FROM "; $query .= "`quarantine` LEFT JOIN msgrcpt ON msgrcpt.mail_id = quarantine.mail_id "; $query .= "LEFT JOIN msgs ON msgs.mail_id = quarantine.mail_id LEFT JOIN maddr AS "; $query .= "recipient ON msgrcpt.rid = recipient.id LEFT JOIN maddr AS sender ON "; $query .= "msgs.sid = sender.id WHERE msgrcpt.rs != 'R' AND msgrcpt.rs != 'D'"; if ($recipient != 'all') { $query .= " and recipient.email = '$recipient'"; } if ($offset >= 0 && $rowsPerPage >= 0) { $result = $this->con->query($query, MYSQLI_STORE_RESULT); if ($result) { $this->numRows = $result->num_rows; $result->free(); } else { $this->numRows = 0; } $query .= " ORDER BY time_iso DESC LIMIT $offset, $rowsPerPage"; } if ($result = $this->con->query($query, MYSQLI_USE_RESULT)) { if ($this->numRows < 0) $this->numRows = $result->num_rows; while ($obj = $result->fetch_object()) { $row[] = $obj; } $result->free(); } return $row; } public function numRows() { return $this->numRows; } public function getMail($id) { $row = null; $this->changeCharset(); $query = "SELECT * FROM quarantine WHERE mail_id = '$id'"; if ($result = $this->con->query($query, MYSQLI_USE_RESULT)) { $row = $result->fetch_object(); } return $row; } public function getRecipient($id) { $recipient = false; $query = "SELECT recipient.email as recipient FROM quarantine q LEFT JOIN msgrcpt "; $query .= "ON msgrcpt.mail_id = q.mail_id LEFT JOIN msgs ON "; $query .= "msgs.mail_id = q.mail_id LEFT JOIN maddr AS recipient "; $query .= "ON msgrcpt.rid = recipient.id LEFT JOIN maddr AS sender ON "; $query .= "msgs.sid = sender.id WHERE q.mail_id = '$id'"; if ($result = $this->con->query($query, MYSQLI_USE_RESULT)) { $obj = $result->fetch_object(); if ($obj) { $recipient = $obj->recipient; } $result->free(); } return $recipient; } } ?>