/** * Processes file. * * @param string $file File. * * @return integer */ protected function processFile($file) { $size = filesize($file); $relative_file = $this->removeProjectPath($file); $sql = 'SELECT Id, Size FROM Files WHERE Name = :name'; $file_data = $this->db->fetchOne($sql, array('name' => $relative_file)); $this->db->beginTransaction(); if ($file_data === false) { $sql = 'INSERT INTO Files (Name, Size) VALUES (:name, :size)'; $this->db->perform($sql, array('name' => $relative_file, 'size' => $size)); $file_id = $this->db->lastInsertId(); } else { $file_id = $file_data['Id']; } // File is not changed since last time it was indexed. if ($file_data !== false && (int) $file_data['Size'] === $size) { $sql = 'UPDATE Files SET Found = 1 WHERE Id = :file_id'; $this->db->perform($sql, array('file_id' => $file_data['Id'])); $this->db->commit(); return $file_data['Id']; } $sql = 'UPDATE Files SET Found = 1 WHERE Id = :file_id'; $this->db->perform($sql, array('file_id' => $file_data['Id'])); $new_classes = array(); $parsed_file = new ReflectionFile($file); foreach ($parsed_file->getFileNamespaces() as $namespace) { foreach ($namespace->getClasses() as $class) { $new_classes[] = $class->getName(); $this->processClass($file_id, $class); } } if ($new_classes) { $sql = 'SELECT Id FROM Classes WHERE FileId = :file_id AND Name NOT IN (:classes)'; $deleted_classes = $this->db->fetchCol($sql, array('file_id' => $file_id, 'classes' => $new_classes)); } else { $sql = 'SELECT Id FROM Classes WHERE FileId = :file_id'; $deleted_classes = $this->db->fetchCol($sql, array('file_id' => $file_id)); } foreach ($deleted_classes as $deleted_class_id) { $this->deleteClass($deleted_class_id); } $this->db->commit(); ReflectionEngine::unsetFile($file); return $file_id; }
/** * * Begins a transaction and turns off autocommit mode. * * @return bool True on success, false on failure. * * @see http://php.net/manual/en/pdo.begintransaction.php * */ public function beginTransaction() { $result = $this->pdo->beginTransaction(); $this->logProfiles(__FUNCTION__); return $result; }