Show
Ignore:
Timestamp:
07/23/09 12:56:40 (11 years ago)
Author:
kovell
Message:

Fixes: file query cache correctly updates, feed admin panel more usable.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • dev/common/includes/class.db.mysqli.php

    r425 r436  
    242242 
    243243    //! The resulting list is set internally to this object. 
    244     function parseSQL() 
     244    function parseSQL($sql) 
    245245    { 
    246246        // gets all involved tables for a select statement 
    247         $text = strtolower($this->_sql).' '; 
     247        $sql = strtolower($sql).' '; 
    248248 
    249249        // we try to get the text from 'from' to 'where' because all involved 
    250250        // tables are declared in that part 
    251         $from = strpos($text, 'from')+5; 
    252         if (!$to = strpos($text, 'where')) 
    253         { 
    254             $to = strlen($text); 
    255         } 
    256         $parse = trim(substr($text, $from, $to-$from)); 
     251        $from = strpos($sql, 'from')+5; 
     252                if($from > strlen($sql)) return ''; 
     253                // if there is a subquery then recurse into the string between the next 
     254                // from and first unclosed ) or where 
     255                $from2 = strpos($sql, 'from', $from); 
     256                if($from2) $sql = substr_replace($sql, $this->parseSQL(substr($sql,$from2 - 1)), $from2); 
     257 
     258        if (!$to = strpos($sql, 'where')) 
     259        { 
     260            $to = strlen($sql); 
     261        } 
     262                // Find an unmatched ')'. 
     263                $bracketpos = $from; 
     264                $countbr = 0; 
     265                while($bracketpos < $to && $countbr >=0) 
     266                { 
     267                        $bracketpos++; 
     268                        if($sql[$bracketpos] == '(') $countbr++; 
     269                        elseif($sql[$bracketpos] == ')') $countbr++; 
     270                } 
     271                $to = $bracketpos; 
     272 
     273        $parse = trim(substr($sql, $from, $to-$from)); 
     274                $parse = str_replace('`', ' ', $parse); 
    257275 
    258276        $tables = array(); 
     
    263281        } 
    264282 
    265         $parse = 'join '.$parse; 
    266283        if (strpos($parse, 'join')) 
    267284        { 
    268285            // if this query is a join we parse it with regexp to get all tables 
    269             preg_match_all('/join (.*?) /', $parse, $match); 
    270             $tables = $match[1]; 
     286                        $parse = 'join '.$parse; 
     287            preg_match_all('/join\s+([^ ]+)\s/', $parse, $match); 
     288            $this->_usedtables = $this->_usedtables + $match[1]; 
    271289        } 
    272290        else 
    273291        { 
    274292            // no join so it is hopefully a simple table select 
    275             $tables[] = $parse; 
    276         } 
    277  
    278         $this->_usedtables = $tables; 
     293            $this->_usedtables[] = preg_replace('/\s.*/', '', $parse); 
     294        } 
     295                return substr_replace($sql, '', $from, $to-$from); 
    279296    } 
    280297    //! Check if the cached query is valid. 
     
    286303    { 
    287304        // check if cachefiles are still valid 
    288  
     305                $this->_usedtables = array(); 
    289306        // first, we need to get all involved tables 
    290         $this->parseSQL(); 
    291  
    292         foreach ($this->_usedtables as $table) 
     307        $this->parseSQL($this->_sql); 
     308 
     309                foreach ($this->_usedtables as $table) 
    293310        { 
    294311            $file = KB_CACHEDIR.'/qcache_tbl_'.trim($table); 
     
    296313            { 
    297314                // if one of the tables is outdated, the query is outdated 
    298                 if ($this->_mtime < filemtime($file)) 
     315                if ($this->_mtime <= filemtime($file)) 
    299316                { 
    300317                    return false; 
     
    644661        return false; 
    645662    } 
    646     //! Extract all tables affected by a database modification. 
    647  
    648     //! The resulting list is set internally to this object. 
    649     function parseSQL() 
    650     { 
    651         // gets all involved tables for a select statement 
    652         $text = strtolower($this->_sql).' '; 
    653  
    654         // we try to get the text from 'from' to 'where' because all involved 
    655         // tables are declared in that part 
    656         $from = strpos($text, 'from')+5; 
    657         if (!$to = strpos($text, 'where')) 
    658         { 
    659             $to = strlen($text); 
    660         } 
    661         $parse = trim(substr($text, $from, $to-$from)); 
    662  
    663         $tables = array(); 
    664         if (strpos($parse, ',') !== false) 
    665         { 
    666             // , is a synonym for join so we'll replace them 
    667             $parse = str_replace(',', ' join ', $parse); 
    668         } 
    669  
    670         $parse = 'join '.$parse; 
    671         if (strpos($parse, 'join')) 
    672         { 
    673             // if this query is a join we parse it with regexp to get all tables 
    674             preg_match_all('/join (.*?) /', $parse, $match); 
    675             $tables = $match[1]; 
    676         } 
    677         else 
    678         { 
    679             // no join so it is hopefully a simple table select 
    680             $tables[] = $parse; 
    681         } 
    682  
    683         $this->_usedtables = $tables; 
    684     } 
    685  
    686663    function genCache() 
    687664    {