From: Meik S. <acy...@ph...> - 2009-09-21 18:03:21
|
Author: acydburn Date: Mon Sep 21 19:02:33 2009 New Revision: 10175 Log: And now i feel even more dirty because i had to adjust the oracle hack to allow for queries > 4k to let it recognise concatenated strings and strings having the character ")" in it. I also added fallback code in case our regex splits too much. :/ Modified: branches/phpBB-3_0_0/phpBB/includes/db/oracle.php Modified: branches/phpBB-3_0_0/phpBB/includes/db/oracle.php ============================================================================== *** branches/phpBB-3_0_0/phpBB/includes/db/oracle.php (original) --- branches/phpBB-3_0_0/phpBB/includes/db/oracle.php Mon Sep 21 19:02:33 2009 *************** *** 255,267 **** // We overcome Oracle's 4000 char limit by binding vars if (strlen($query) > 4000) { ! if (preg_match('/^(INSERT INTO[^(]++)\\(([^()]+)\\) VALUES[^(]++\\((.*?)\\)$/s', $query, $regs)) { if (strlen($regs[3]) > 4000) { $cols = explode(', ', $regs[2]); preg_match_all('/\'(?:[^\']++|\'\')*+\'|[\d-.]+/', $regs[3], $vals, PREG_PATTERN_ORDER); $inserts = $vals[0]; unset($vals); --- 255,316 ---- // We overcome Oracle's 4000 char limit by binding vars if (strlen($query) > 4000) { ! if (preg_match('/^(INSERT INTO[^(]++)\\(([^()]+)\\) VALUES[^(]++\\((.*?)\\)$/sU', $query, $regs)) { if (strlen($regs[3]) > 4000) { $cols = explode(', ', $regs[2]); + preg_match_all('/\'(?:[^\']++|\'\')*+\'|[\d-.]+/', $regs[3], $vals, PREG_PATTERN_ORDER); + if (sizeof($cols) !== sizeof($vals)) + { + // Try to replace some common data we know is from our restore script or from other sources + $regs[3] = str_replace("'||chr(47)||'", '/', $regs[3]); + $_vals = explode(', ', $regs[3]); + + $vals = array(); + $is_in_val = false; + $i = 0; + $string = ''; + + foreach ($_vals as $value) + { + if (strpos($value, "'") === false && !$is_in_val) + { + $vals[$i++] = $value; + continue; + } + + if (substr($value, -1) === "'") + { + $vals[$i] = $string . (($is_in_val) ? ', ' : '') . $value; + $string = ''; + $is_in_val = false; + + if ($vals[$i][0] !== "'") + { + $vals[$i] = "''" . $vals[$i]; + } + $i++; + continue; + } + else + { + $string .= (($is_in_val) ? ', ' : '') . $value; + $is_in_val = true; + } + } + + if ($string) + { + // New value if cols != value + $vals[(sizeof($cols) !== sizeof($vals)) ? $i : $i - 1] .= $string; + } + + $vals = array(0 => $vals); + } + $inserts = $vals[0]; unset($vals); |