/** * provide numRows */ public function numRows() { $type = OC_Config::getValue("dbtype", "sqlite"); if ($type == 'oci') { // OCI doesn't have a queryString, just do a rowCount for now return $this->statement->rowCount(); } $regex = '/^SELECT\\s+(?:ALL\\s+|DISTINCT\\s+)?(?:.*?)\\s+FROM\\s+(.*)$/i'; $queryString = $this->statement->getWrappedStatement()->queryString; if (preg_match($regex, $queryString, $output) > 0) { $query = OC_DB::prepare("SELECT COUNT(*) FROM {$output[1]}"); return $query->execute($this->lastArguments)->fetchColumn(); } else { return $this->statement->rowCount(); } }
private function tryFixSubstringLastArgumentDataForMSSQL($input) { $query = $this->statement->getWrappedStatement()->queryString; $pos = stripos($query, 'SUBSTRING'); if ($pos === false) { return $input; } try { $newQuery = ''; $cArg = 0; $inSubstring = false; $queryLength = strlen($query); // Create new query for ($i = 0; $i < $queryLength; $i++) { if ($inSubstring == false) { // Defines when we should start inserting values if (substr($query, $i, 9) == 'SUBSTRING') { $inSubstring = true; } } else { // Defines when we should stop inserting values if (substr($query, $i, 1) == ')') { $inSubstring = false; } } if (substr($query, $i, 1) == '?') { // We found a question mark if ($inSubstring) { $newQuery .= $input[$cArg]; // // Remove from input array // array_splice($input, $cArg, 1); } else { $newQuery .= substr($query, $i, 1); $cArg++; } } else { $newQuery .= substr($query, $i, 1); } } // The global data we need $name = OC_Config::getValue("dbname", "owncloud"); $host = OC_Config::getValue("dbhost", ""); $user = OC_Config::getValue("dbuser", ""); $pass = OC_Config::getValue("dbpassword", ""); if (strpos($host, ':')) { list($host, $port) = explode(':', $host, 2); } else { $port = false; } $opts = array(); if ($port) { $dsn = 'sqlsrv:Server=' . $host . ',' . $port . ';Database=' . $name; } else { $dsn = 'sqlsrv:Server=' . $host . ';Database=' . $name; } $PDO = new PDO($dsn, $user, $pass, $opts); $PDO->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); $PDO->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $this->statement = $PDO->prepare($newQuery); $this->lastArguments = $input; return $input; } catch (PDOException $e) { $entry = 'PDO DB Error: "' . $e->getMessage() . '"<br />'; $entry .= 'Offending command was: ' . $this->statement->queryString . '<br />'; $entry .= 'Input parameters: ' . print_r($input, true) . '<br />'; $entry .= 'Stack trace: ' . $e->getTraceAsString() . '<br />'; OC_Log::write('core', $entry, OC_Log::FATAL); OC_User::setUserId(null); // send http status 503 header('HTTP/1.1 503 Service Temporarily Unavailable'); header('Status: 503 Service Temporarily Unavailable'); OC_Template::printErrorPage('Failed to connect to database'); die($entry); } }