Thomas Bruederli
2014-06-04 3412e50b54e3daac8745234e21ab6e72be0ed165
program/lib/Roundcube/rcube_contacts.php
@@ -45,7 +45,6 @@
    private $fulltext_cols = array('name', 'firstname', 'surname', 'middlename', 'nickname',
      'jobtitle', 'organization', 'department', 'maidenname', 'email', 'phone',
      'address', 'street', 'locality', 'zipcode', 'region', 'country', 'website', 'im', 'notes');
    protected $date_types = array('birthday', 'anniversary');
    // public properties
    public $primary_key = 'contact_id';
@@ -61,6 +60,7 @@
      'jobtitle', 'organization', 'department', 'assistant', 'manager',
      'gender', 'maidenname', 'spouse', 'email', 'phone', 'address',
      'birthday', 'anniversary', 'website', 'im', 'notes', 'photo');
    public $date_cols = array('birthday', 'anniversary');
    const SEPARATOR = ',';
@@ -137,16 +137,34 @@
     * List all active contact groups of this source
     *
     * @param string  Search string to match group name
     * @param int     Matching mode:
     *                0 - partial (*abc*),
     *                1 - strict (=),
     *                2 - prefix (abc*)
     *
     * @return array  Indexed list of contact groups, each a hash array
     */
    function list_groups($search = null)
    function list_groups($search = null, $mode = 0)
    {
        $results = array();
        if (!$this->groups)
            return $results;
        $sql_filter = $search ? " AND " . $this->db->ilike('name', '%'.$search.'%') : '';
        if ($search) {
            switch (intval($mode)) {
            case 1:
                $sql_filter = $this->db->ilike('name', $search);
                break;
            case 2:
                $sql_filter = $this->db->ilike('name', $search . '%');
                break;
            default:
                $sql_filter = $this->db->ilike('name', '%' . $search . '%');
            }
            $sql_filter = " AND $sql_filter";
        }
        $sql_result = $this->db->query(
            "SELECT * FROM ".$this->db->table_name($this->db_groups).
@@ -332,7 +350,7 @@
                if (in_array($col, $this->table_cols)) {
                    switch ($mode) {
                    case 1: // strict
                        $where[] = '(' . $this->db->quoteIdentifier($col) . ' = ' . $this->db->quote($val)
                        $where[] = '(' . $this->db->quote_identifier($col) . ' = ' . $this->db->quote($val)
                            . ' OR ' . $this->db->ilike($col, $val . $AS . '%')
                            . ' OR ' . $this->db->ilike($col, '%' . $AS . $val . $AS . '%')
                            . ' OR ' . $this->db->ilike($col, '%' . $AS . $val) . ')';
@@ -372,7 +390,7 @@
        }
        foreach (array_intersect($required, $this->table_cols) as $col) {
            $and_where[] = $this->db->quoteIdentifier($col).' <> '.$this->db->quote('');
            $and_where[] = $this->db->quote_identifier($col).' <> '.$this->db->quote('');
        }
        if (!empty($where)) {
@@ -574,8 +592,8 @@
        // validate e-mail addresses
        $valid = parent::validate($save_data, $autofix);
        // require at least one e-mail address (syntax check is already done)
        if ($valid && !array_filter($this->get_col_values('email', $save_data, true))) {
        // require at least one email address or a name
        if ($valid && !strlen($save_data['firstname'].$save_data['surname'].$save_data['name']) && !array_filter($this->get_col_values('email', $save_data, true))) {
            $this->set_error(self::ERROR_VALIDATE, 'noemailwarning');
            $valid = false;
        }
@@ -608,11 +626,11 @@
            }
        }
        $save_data = $this->convert_save_data($save_data);
        $save_data     = $this->convert_save_data($save_data);
        $a_insert_cols = $a_insert_values = array();
        foreach ($save_data as $col => $value) {
            $a_insert_cols[]   = $this->db->quoteIdentifier($col);
            $a_insert_cols[]   = $this->db->quote_identifier($col);
            $a_insert_values[] = $this->db->quote($value);
        }
@@ -626,10 +644,6 @@
            $insert_id = $this->db->insert_id($this->db_name);
        }
        // also add the newly created contact to the active group
        if ($insert_id && $this->group_id)
            $this->add_to_group($this->group_id, $insert_id);
        $this->cache = null;
        return $insert_id;
@@ -641,17 +655,18 @@
     *
     * @param mixed Record identifier
     * @param array Assoziative array with save data
     *
     * @return boolean True on success, False on error
     */
    function update($id, $save_cols)
    {
        $updated = false;
        $updated   = false;
        $write_sql = array();
        $record = $this->get_record($id, true);
        $record    = $this->get_record($id, true);
        $save_cols = $this->convert_save_data($save_cols, $record);
        foreach ($save_cols as $col => $value) {
            $write_sql[] = sprintf("%s=%s", $this->db->quoteIdentifier($col), $this->db->quote($value));
            $write_sql[] = sprintf("%s=%s", $this->db->quote_identifier($col), $this->db->quote($value));
        }
        if (!empty($write_sql)) {
@@ -669,7 +684,7 @@
            $this->result = null;  // clear current result (from get_record())
        }
        return $updated;
        return $updated ? true : false;
    }
@@ -704,6 +719,10 @@
        foreach ($save_data as $key => $values) {
            list($field, $section) = explode(':', $key);
            $fulltext = in_array($field, $this->fulltext_cols);
            // avoid casting DateTime objects to array
            if (is_object($values) && is_a($values, 'DateTime')) {
                $values = array(0 => $values);
            }
            foreach ((array)$values as $value) {
                if (isset($value))
                    $vcard->set($field, $value, $section);
@@ -794,16 +813,30 @@
    /**
     * Remove all records from the database
     *
     * @param bool $with_groups Remove also groups
     *
     * @return int Number of removed records
     */
    function delete_all()
    function delete_all($with_groups = false)
    {
        $this->cache = null;
        $this->db->query("UPDATE ".$this->db->table_name($this->db_name).
            " SET del=1, changed=".$this->db->now().
            " WHERE user_id = ?", $this->user_id);
        $this->db->query("UPDATE " . $this->db->table_name($this->db_name)
            . " SET del = 1, changed = " . $this->db->now()
            . " WHERE user_id = ?", $this->user_id);
        return $this->db->affected_rows();
        $count = $this->db->affected_rows();
        if ($with_groups) {
            $this->db->query("UPDATE " . $this->db->table_name($this->db_groups)
                . " SET del = 1, changed = " . $this->db->now()
                . " WHERE user_id = ?", $this->user_id);
            $count += $this->db->affected_rows();
        }
        return $count;
    }
@@ -842,11 +875,11 @@
    function delete_group($gid)
    {
        // flag group record as deleted
        $sql_result = $this->db->query(
            "UPDATE ".$this->db->table_name($this->db_groups).
            " SET del=1, changed=".$this->db->now().
            " WHERE contactgroup_id=?".
            " AND user_id=?",
        $this->db->query(
            "UPDATE " . $this->db->table_name($this->db_groups)
            . " SET del = 1, changed = " . $this->db->now()
            . " WHERE contactgroup_id = ?"
            . " AND user_id = ?",
            $gid, $this->user_id
        );
@@ -854,7 +887,6 @@
        return $this->db->affected_rows();
    }
    /**
     * Rename a specific contact group
@@ -883,9 +915,10 @@
    /**
     * Add the given contact records the a certain group
     *
     * @param string  Group identifier
     * @param array   List of contact identifiers to be added
     * @return int    Number of contacts added
     * @param string       Group identifier
     * @param array|string List of contact identifiers to be added
     *
     * @return int Number of contacts added
     */
    function add_to_group($group_id, $ids)
    {
@@ -930,9 +963,10 @@
    /**
     * Remove the given contact records from a certain group
     *
     * @param string  Group identifier
     * @param array   List of contact identifiers to be removed
     * @return int    Number of deleted group members
     * @param string       Group identifier
     * @param array|string List of contact identifiers to be removed
     *
     * @return int Number of deleted group members
     */
    function remove_from_group($group_id, $ids)
    {