Completed
Pull Request — stable8.2 (#135)
by Victor
02:48
created

BackgroundScanner::run()   B

Complexity

Conditions 6
Paths 16

Size

Total Lines 63
Code Lines 45

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 50
CRAP Score 6.0146

Importance

Changes 3
Bugs 1 Features 0
Metric Value
c 3
b 1
f 0
dl 0
loc 63
ccs 50
cts 54
cp 0.9259
rs 8.6498
cc 6
eloc 45
nc 16
nop 0
crap 6.0146

How to fix   Long Method   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
/**
3
 * Copyright (c) 2012 Bart Visscher <[email protected]>
4
 * This file is licensed under the Affero General Public License version 3 or
5
 * later.
6
 * See the COPYING-README file.
7
 */
8
9
namespace OCA\Files_Antivirus;
10
11
use OCP\IUserManager;
12
use OCP\IL10N;
13
14
use OCA\Files_Antivirus\Item;
15
16
class BackgroundScanner {
17
18
	/**
19
	 * @var ScannerFactory
20
	 */
21
	private $scannerFactory;
22
	
23
	/**
24
	 * @var IUserManager 
25
	 */
26
	private $userManager;
27
	
28
	/**
29
	 * @var IL10N
30
	 */
31
	private $l10n;
32
	
33
	/**
34
	 * A constructor
35
	 * @param \OCA\Files_Antivirus\ScannerFactory $scannerFactory
36
	 * @param IUserManager $userManager
37
	 * @param IL10N $l10n
38
	 */
39 1
	public function __construct(ScannerFactory $scannerFactory, IUserManager $userManager, IL10N $l10n){
40 1
		$this->scannerFactory = $scannerFactory;
41 1
		$this->userManager = $userManager;
42 1
		$this->l10n = $l10n;
43 1
	}
44
	
45
	/**
46
	 * Background scanner main job
47
	 * @return null
48
	 */
49 1
	public function run(){
50 1
		if (!$this->initFS()) {
51
			return;
52
		}
53
		// locate files that are not checked yet
54 1
		$dirMimeTypeId = \OC::$server->getMimeTypeLoader()->getId('httpd/unix-directory');
55
		try {
56 1
			$qb = \OC::$server->getDatabaseConnection()->getQueryBuilder();
57 1
			$qb->select(['fc.fileid'])
58 1
				->from('filecache', 'fc')
59 1
				->leftJoin('fc', 'files_antivirus', 'fa', $qb->expr()->eq('fa.fileid', 'fc.fileid'))
60 1
				->innerJoin(
61 1
					'fc',
62 1
					'storages',
63 1
					'ss',
64 1
					$qb->expr()->andX(
65 1
						$qb->expr()->eq('fc.storage', 'ss.numeric_id'),
66 1
						$qb->expr()->orX(
67 1
							$qb->expr()->like('ss.id', $qb->expr()->literal('local::%')),
68 1
							$qb->expr()->like('ss.id', $qb->expr()->literal('home::%'))
69 1
						)
70 1
					)
71 1
				)
72 1
				->where(
73 1
					$qb->expr()->neq('fc.mimetype', $qb->expr()->literal($dirMimeTypeId))
74 1
				)
75 1
				->andWhere(
76 1
					$qb->expr()->orX(
77 1
						$qb->expr()->isNull('fa.fileid'),
78 1
						$qb->expr()->gt('fc.mtime', 'fa.check_time')
79 1
					)
80 1
				)
81 1
				->andWhere(
82 1
					$qb->expr()->like('fc.path', $qb->expr()->literal('files/%'))
83 1
				)
84 1
				->andWhere(
85 1
					$qb->expr()->neq('fc.size', $qb->expr()->literal('0'))
86 1
				)
87 1
				->setMaxResults(5)
88
			;
89 1
			$result = $qb->execute();
90 1
		} catch(\Exception $e) {
91
			\OC::$server->getLogger()->error( __METHOD__ . ', exception: ' . $e->getMessage(), ['app' => 'files_antivirus']);
92
			return;
93
		}
94
95
96 1
		$view = new \OC\Files\View('');
97
		try {
98 1
			while ($row = $result->fetch()) {
99 1
				$path = $view->getPath($row['fileid']);
100 1
				if (!is_null($path)) {
101 1
					$item = new Item($this->l10n, $view, $path, $row['fileid']);
102 1
					$scanner = $this->scannerFactory->getScanner();
103 1
					$status = $scanner->scan($item);
104 1
					$status->dispatch($item, true);
105 1
				}
106 1
			}
107 1
		} catch (\Exception $e){
108
			\OC::$server->getLogger()->error( __METHOD__ . ', exception: ' . $e->getMessage(), ['app' => 'files_antivirus']);
109
		}
110 1
		\OC_Util::tearDownFS();
111 1
	}
112
113
	/**
114
	 * A hack to access files and views. Better than before.
115
	 *
116
	 * @return bool
117
	 */
118 1
	protected function initFS(){
119
		//Need any valid user to mount FS
120 1
		$results = $this->userManager->search('', 2, 0);
121 1
		$anyUser = array_pop($results);
122 1
		if (is_null($anyUser)) {
123
			\OC::$server->getLogger()->error("Failed to setup file system", ['app' => 'files_antivirus']);
124
			return false;
125
		}
126 1
		\OC_Util::tearDownFS();
127 1
		\OC_Util::setupFS($anyUser->getUID());
128 1
		return true;
129
	}
130
131
	/**
132
	 * @deprecated 
133
	 */
134
	public static function check(){
135
		return \OCA\Files_Antivirus\Cron\Task::run();
136
	}
137
}
138