/** * 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; }