Changeset 436

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.

Location:
dev/common
Files:
5 modified

Legend:

Unmodified
Added
Removed
  • dev/common/admin/admin_feedsyndication.php

    r408 r436  
    6868            $ftmp = explode(':::', $fstr); 
    6969            // reset the feed lastkill details if the URL, friends or api status has changed 
    70             if($_POST[$url] != $ftmp[0] || $friends != $ftmp[2] || $apikills != $ftmp[3] || 
    71                                         ($_POST['newkills'] && !in_array ($i, $_POST['newkills'])) ) 
     70            if($_POST[$url] != $ftmp[0] || $friends != $ftmp[2] || $apikills != $ftmp[3] ) 
    7271                config::set($url, $_POST[$url] . ':::' . 0 . ':::' . $friends . ':::' . $apikills); 
    7372        } 
     
    110109        { 
    111110            $str = ''; 
     111/* Fetch all kills when using the admin panel. 
    112112             if ($feedlast[$i]) 
    113113             $str .= '&lastkllid='.$feedlast[$i]; 
     114 */ 
    114115            if ($friend[$i]) 
    115116                $str .= '&friend=1'; 
     
    165166        $html .= " checked=\"checked\""; 
    166167    $html .= "><b>Friend?</b></td>"; 
    167  
     168/* Make automatic for admin feeds 
    168169    $html .= "<td><input type=checkbox name=newkills[] id=newkills value=" . $i; 
    169170    if ($feed[$i]) 
    170171        $html .= " checked=\"checked\""; 
    171172    $html .= "><b>New kills only?</b><br>"; 
    172  
     173*/ 
    173174    $html .= "<td><input type=checkbox name=apikills[] id=apikills value=" . $i; 
    174175    if ($apikills[$i]) 
  • 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    { 
  • dev/common/includes/class.db_cache.php

    r404 r436  
    6060 
    6161    //! The resulting list is set internally to this object. 
    62     function parseSQL() 
     62    function parseSQL($sql) 
    6363    { 
    6464        // gets all involved tables for a select statement 
    65         $text = strtolower($this->_sql).' '; 
     65        $sql = strtolower($sql).' '; 
    6666 
    6767        // we try to get the text from 'from' to 'where' because all involved 
    6868        // tables are declared in that part 
    69         $from = strpos($text, 'from')+5; 
    70         if (!$to = strpos($text, 'where')) 
    71         { 
    72             $to = strlen($text); 
    73         } 
    74         $parse = trim(substr($text, $from, $to-$from)); 
     69        $from = strpos($sql, 'from')+5; 
     70                if($from > strlen($sql)) return ''; 
     71                // if there is a subquery then recurse into the string between the next 
     72                // from and first unclosed ) or where 
     73                $from2 = strpos($sql, 'from', $from); 
     74                if($from2) $sql = substr_replace($sql, $this->parseSQL(substr($sql,$from2 - 1)), $from2); 
     75 
     76        if (!$to = strpos($sql, 'where')) 
     77        { 
     78            $to = strlen($sql); 
     79        } 
     80                // Find an unmatched ')'. 
     81                $bracketpos = $from; 
     82                $countbr = 0; 
     83                while($bracketpos < $to && $countbr >=0) 
     84                { 
     85                        $bracketpos++; 
     86                        if($sql[$bracketpos] == '(') $countbr++; 
     87                        elseif($sql[$bracketpos] == ')') $countbr++; 
     88                } 
     89                $to = $bracketpos; 
     90 
     91        $parse = trim(substr($sql, $from, $to-$from)); 
     92                $parse = str_replace('`', ' ', $parse); 
    7593 
    7694        $tables = array(); 
     
    8199        } 
    82100 
    83         $parse = 'join '.$parse; 
    84101        if (strpos($parse, 'join')) 
    85102        { 
    86103            // if this query is a join we parse it with regexp to get all tables 
    87             preg_match_all('/join (.*?) /', $parse, $match); 
    88             $tables = $match[1]; 
     104                        $parse = 'join '.$parse; 
     105            preg_match_all('/join\s+([^ ]+)\s/', $parse, $match); 
     106            $this->_usedtables = $this->_usedtables + $match[1]; 
    89107        } 
    90108        else 
    91109        { 
    92110            // no join so it is hopefully a simple table select 
    93             $tables[] = $parse; 
    94         } 
    95  
    96         $this->_usedtables = $tables; 
     111            $this->_usedtables[] = preg_replace('/\s.*/', '', $parse); 
     112        } 
     113                return substr_replace($sql, '', $from, $to-$from); 
    97114    } 
    98115 
     
    104121    function isCacheValid() 
    105122    { 
    106         // check if cachefiles are stil valid 
    107  
     123        // check if cachefiles are still valid 
    108124        // first, we need to get all involved tables 
    109         $this->parseSQL(); 
    110  
    111         foreach ($this->_usedtables as $table) 
     125                $this->_usedtables = array(); 
     126        $this->parseSQL($this->_sql); 
     127 
     128                foreach ($this->_usedtables as $table) 
    112129        { 
    113130            $file = KB_CACHEDIR.'/qcache_tbl_'.trim($table); 
     
    115132            { 
    116133                // if one of the tables is outdated, the query is outdated 
    117                 if ($this->_mtime < filemtime($file)) 
     134                if ($this->_mtime <= filemtime($file)) 
    118135                { 
    119136                    return false; 
  • dev/common/includes/class.db_memcache.php

    r424 r436  
    3636 
    3737        return false; 
    38     } 
    39  
    40     function parseSQL() 
    41     { 
    42         // gets all involved tables for a select statement 
    43         $text = strtolower($this->_sql).' '; 
    44  
    45         // we try to get the text from 'from' to 'where' because all involved 
    46         // tables are declared in that part 
    47         $from = strpos($text, 'from')+5; 
    48         if (!$to = strpos($text, 'where')) 
    49         { 
    50             $to = strlen($text); 
    51         } 
    52         $parse = trim(substr($text, $from, $to-$from)); 
    53  
    54         $tables = array(); 
    55         if (strpos($parse, ',') !== false) 
    56         { 
    57             // , is a synonym for join so we'll replace them 
    58             $parse = str_replace(',', ' join ', $parse); 
    59         } 
    60  
    61         $parse = 'join '.$parse; 
    62         if (strpos($parse, 'join')) 
    63         { 
    64             // if this query is a join we parse it with regexp to get all tables 
    65             preg_match_all('/join (.*?) /', $parse, $match); 
    66             $tables = $match[1]; 
    67         } 
    68         else 
    69         { 
    70             // no join so it is hopefully a simple table select 
    71             $tables[] = $parse; 
    72         } 
    73  
    74         $this->_usedtables = $tables; 
    7538    } 
    7639 
  • dev/common/includes/globals.php

    r434 r436  
    77else 
    88{ 
    9         $svn_rev = '435'; 
     9        $svn_rev = '437'; 
    1010} 
    1111define('SVN_REV', $svn_rev);