roundcubemail/program/lib/Roundcube/rcube_db.php
protected function dsn_select($query)
    {
        // no replication
        if ($this->db_dsnw == $this->db_dsnr) {
            return 'w';
        }

        // Read or write ?
        $mode = preg_match('/^(select|show|set)/i', $query) ? 'r' : 'w';

        $start = '[' . $this->options['identifier_start'] . self::DEFAULT_QUOTE . ']';
        $end   = '[' . $this->options['identifier_end']   . self::DEFAULT_QUOTE . ']';
        $regex = '/(?:^|\s)(from|update|into|join)\s+'.$start.'?([a-z0-9._]+)'.$end.'?\s+/i';

        // find tables involved in this query
        if (preg_match_all($regex, $query, $matches, PREG_SET_ORDER)) {
            foreach ($matches as $m) {
                $table = $m[2];

                // always use direct mapping
                if ($this->options['table_dsn_map'][$table]) {
                    $mode = $this->options['table_dsn_map'][$table];
                    break;  // primary table rules
                }
                else if ($mode == 'r') {
                    // connected to db with the same or "higher" mode for this table
                    $db_mode = $this->table_connections[$table];
                    if ($db_mode == 'w' && !$this->options['dsnw_noread']) {
                        $mode = $db_mode;
                    }
                }
            }

            // remember mode chosen (for primary table)
            $table = $matches[0][2];
            $this->table_connections[$table] = $mode;
        }

        return $mode;
    }
protected function dsn_select($query)
    {
        // no replication
        if ($this->db_dsnw == $this->db_dsnr) {
            return 'w';
        }

        // Read or write ?
        $mode = preg_match('/^(select|show|set)/i', $query) ? 'r' : 'w';

        $start = '[' . $this->options['identifier_start'] . self::DEFAULT_QUOTE . ']';
        $end   = '[' . $this->options['identifier_end']   . self::DEFAULT_QUOTE . ']';
        $regex = '/(?:^|\s)(from|update|into|join)\s+'.$start.'?([a-z0-9._]+)'.$end.'?\s+/i';

        // find tables involved in this query
        if (preg_match_all($regex, $query, $matches, PREG_SET_ORDER)) {
            foreach ($matches as $m) {
                $table = $m[2];

                // always use direct mapping
                if ($this->options['table_dsn_map'][$table]) {
                    $mode = $this->options['table_dsn_map'][$table];
                    break;  // primary table rules
                }
                else if ($mode == 'r') {
                    // connected to db with the same or "higher" mode for this table
                    $db_mode = $this->table_connections[$table];
                    if ($db_mode == 'w' && !$this->options['dsnw_noread']) {
                        $mode = $db_mode;
                    }
                }
            }

            // remember mode chosen (for primary table)
            $table = $matches[0][2];
            $this->table_connections[$table] = $mode;
        }

        return $mode;
    }
protected function dsn_select ( $ query ) { // no replication if ( $ this -> db_dsnw == $ this -> db_dsnr ) { return 'w' ; } // Read or write ? $ mode = preg_match ( '/^(select|show|set)/i' , $ query ) ? 'r' : 'w' ; $ start = '[' . $ this -> options [ 'identifier_start' ] . self :: DEFAULT_QUOTE . ']' ; $ end = '[' . $ this -> options [ 'identifier_end' ] . self :: DEFAULT_QUOTE . ']' ; $ regex = '/(?:^|\s)(from|update|into|join)\s+' . $ start . '?([a-z0-9._]+)' . $ end . '?\s+/i' ; // find tables involved in this query if ( preg_match_all ( $ regex , $ query , $ matches , PREG_SET_ORDER ) ) { foreach ( $ matches as $ m ) { $ table = $ m [ 2 ] ; // always use direct mapping if ( $ this -> options [ 'table_dsn_map' ] [ $ table ] ) { $ mode = $ this -> options [ 'table_dsn_map' ] [ $ table ] ; break ; // primary table rules } else if ( $ mode == 'r' ) { // connected to db with the same or "higher" mode for this table $ db_mode = $ this -> table_connections [ $ table ] ; if ( $ db_mode == 'w' && ! $ this -> options [ 'dsnw_noread' ] ) { $ mode = $ db_mode ; } } } // remember mode chosen (for primary table) $ table = $ matches [ 0 ] [ 2 ] ; $ this -> table_connections [ $ table ] = $ mode ; } return $ mode ; }
Analyze the given SQL statement and select the appropriate connection to use
Analyze the given SQL statement and select the appropriate connection to use