/** * List the current set of contact records * * @param array List of cols to show, Null means all * @param int Only return this number of records, use negative values for tail * @param boolean True to skip the count query (select only) * @return array Indexed list of contact records, each a hash array */ function list_records($cols = null, $subset = 0, $nocount = false) { if ($nocount || $this->list_page <= 1) { // create dummy result, we don't need a count now $this->result = new rcube_result_set(); } else { // count all records $this->result = $this->count(); } $start_row = $subset < 0 ? $this->result->first + $this->page_size + $subset : $this->result->first; $length = $subset != 0 ? abs($subset) : $this->page_size; if ($this->group_id) { $join = " LEFT JOIN " . $this->db->table_name($this->db_groupmembers) . " AS m" . " ON (m.contact_id = c." . $this->primary_key . ")"; } $order_col = in_array($this->sort_col, $this->table_cols) ? $this->sort_col : 'name'; $order_cols = array('c.' . $order_col); if ($order_col == 'firstname') { $order_cols[] = 'c.surname'; } else { if ($order_col == 'surname') { $order_cols[] = 'c.firstname'; } } if ($order_col != 'name') { $order_cols[] = 'c.name'; } $order_cols[] = 'c.email'; $sql_result = $this->db->limitquery("SELECT * FROM " . $this->db->table_name($this->db_name) . " AS c" . $join . " WHERE c.del<>1" . " AND c.user_id=?" . ($this->group_id ? " AND m.contactgroup_id=?" : "") . ($this->filter ? " AND (" . $this->filter . ")" : "") . " ORDER BY " . $this->db->concat($order_cols) . " " . $this->sort_order, $start_row, $length, $this->user_id, $this->group_id); // determine whether we have to parse the vcard or if only db cols are requested $read_vcard = !$cols || count(array_intersect($cols, $this->table_cols)) < count($cols); while ($sql_result && ($sql_arr = $this->db->fetch_assoc($sql_result))) { $sql_arr['ID'] = $sql_arr[$this->primary_key]; if ($read_vcard) { $sql_arr = $this->convert_db_data($sql_arr); } else { $sql_arr['email'] = explode(self::SEPARATOR, $sql_arr['email']); $sql_arr['email'] = array_map('trim', $sql_arr['email']); } $this->result->add($sql_arr); } $cnt = count($this->result->records); // update counter if ($nocount) { $this->result->count = $cnt; } else { if ($this->list_page <= 1) { if ($cnt < $this->page_size && $subset == 0) { $this->result->count = $cnt; } else { if (isset($this->cache['count'])) { $this->result->count = $this->cache['count']; } else { $this->result->count = $this->_count(); } } } } return $this->result; }
/** * List the current set of contact records * * @param array List of cols to show * @param int Only return this number of records, use negative values for tail * @param boolean True to skip the count query (select only) * @return array Indexed list of contact records, each a hash array */ function list_records($cols = null, $subset = 0, $nocount = false) { if ($nocount || $this->list_page <= 1) { // create dummy result, we don't need a count now $this->result = new rcube_result_set(); } else { // count all records $this->result = $this->count(); } $start_row = $subset < 0 ? $this->result->first + $this->page_size + $subset : $this->result->first; $length = $subset != 0 ? abs($subset) : $this->page_size; if ($this->group_id) { $join = " LEFT JOIN " . get_table_name($this->db_groupmembers) . " AS m" . " ON (m.contact_id = c." . $this->primary_key . ")"; } $sql_result = $this->db->limitquery("SELECT * FROM " . get_table_name($this->db_name) . " AS c" . $join . " WHERE c.del<>1" . " AND c.user_id=?" . ($this->group_id ? " AND m.contactgroup_id=?" : "") . ($this->filter ? " AND (" . $this->filter . ")" : "") . " ORDER BY c.name", $start_row, $length, $this->user_id, $this->group_id); while ($sql_result && ($sql_arr = $this->db->fetch_assoc($sql_result))) { $sql_arr['ID'] = $sql_arr[$this->primary_key]; // make sure we have a name to display if (empty($sql_arr['name'])) { $sql_arr['name'] = $sql_arr['email']; } $this->result->add($sql_arr); } $cnt = count($this->result->records); // update counter if ($nocount) { $this->result->count = $cnt; } else { if ($this->list_page <= 1) { if ($cnt < $this->page_size && $subset == 0) { $this->result->count = $cnt; } else { if (isset($this->cache['count'])) { $this->result->count = $this->cache['count']; } else { $this->result->count = $this->_count(); } } } } return $this->result; }
/** * @param string $key Cache key * @param string $from * @param string $to * @param string $sort_field * @param string $sort_order * @access private */ private function get_message_cache($key, $from, $to, $sort_field, $sort_order) { if (!$this->caching_enabled) { return NULL; } // use idx sort as default sorting if (!$sort_field || !in_array($sort_field, $this->db_header_fields)) { $sort_field = 'idx'; } $result = array(); $sql_result = $this->db->limitquery("SELECT idx, uid, headers" . " FROM " . get_table_name('messages') . " WHERE user_id=?" . " AND cache_key=?" . " ORDER BY " . $this->db->quoteIdentifier($sort_field) . " " . strtoupper($sort_order), $from, $to - $from, $_SESSION['user_id'], $key); while ($sql_arr = $this->db->fetch_assoc($sql_result)) { $uid = intval($sql_arr['uid']); $result[$uid] = $this->db->decode(unserialize($sql_arr['headers'])); // featch headers if unserialize failed if (empty($result[$uid])) { $result[$uid] = $this->conn->fetchHeader(preg_replace('/.msg$/', '', $key), $uid, true, false, $this->get_fetch_headers()); } } return $result; }