Class it_dbi:

/**
 * Semi-internal: send a raw SQL query and return mysql result value
 * @param $query complete SQL query string
 * @return MySQL result which is false for errors. May die on error if safety is big enough
 */
function query($query$p = array())
{
    
$p += $this->_p;
    
$start gettimeofday(true);

    if ((
$writing = !it::match('^(EXPLAIN|SELECT|SHOW)'$query, array('utf8' => false))))
    {
        if (
$p['server_update'])
        {
            
debug("switching to update server \"{$p['server_update']}\""5);
            
$this->_p['server'] = $p['server'] = $p['server_update'];
            unset(
$this->_p['server_update'], $p['server_update'], $this->_link);
        }
        else if (
$p['server'] == "localhost" && $p['db'] == $GLOBALS['ULTRADB'] && preg_grep('/replicate-do/', (array)@it::file($GLOBALS['ULTRAHOME'] . "/etc/my.cnf")))
            if ((
$t = @it::file($GLOBALS['ULTRAHOME'] . "/doc/machines.txt")) && preg_grep("/^" gethostname() . "/"array_slice($t2)))
                
it::error("local mysql write on a replication slave machine?");
    }

    
$this->_connect($p);    # must be called after update server switching code

    
debug("{$p['user']}@{$p['server']}:{$p['db']}'.' get_class($this) . "::query(\"$query\")"4);

    if (!(
$result $this->_query($query$p)))
    {
        if (
$result === null || !$p['safety'])
            return 
false;
        
$this->_fatal("query() failed"$query);
    }
    else if (
it::match('^(CREATE|ALTER|DROP) '$query, array('utf8' => false)))
    {
        
# Purge cache for schema changes (after modifying table)
        
$dbid "{$p['user']}@{$p['server']}:{$p['db']}";
        static::
_state_purgeshared($dbid);
    }

    if (
$writing && $this->_p['throttle_writes'])
    {
        
it::log('debug''dbi-throttle'round(1000000 * (gettimeofday(true) - $start) * $this->_p['throttle_writes']));
        
usleep(round(1000000 * (gettimeofday(true) - $start) * $this->_p['throttle_writes']));
    }

    
$msec round(1000 * (gettimeofday(true) - $start));
    
$slow $msec >= 2000;
    if (
$GLOBALS['debug_sqllog'] || $GLOBALS['debug_sqltrace'] || $slow)
    {
        
$backtrace = (EDC('sqltrace') || $slow) ? it_debug::backtrace(1) : null;
        
$truncquery strlen($query) > 1000 mb_substr($query01000) . '...' $query;
        
it::log('sqllog'"$msec\t$truncquery\t$backtrace\t" $this->_p['server'] . ($slow "\tSLOW" ""));

        
$this->_sqllog[] = array(
            
'time' => $msec,
            
'query' => $query,
        ) + (
$backtrace ? array('backtrace' => $backtrace) : array());
    }

    return 
$result;
}