Completed
Pull Request — master (#111)
by Victor
03:03
created

BackgroundScanner::run()   B

Complexity

Conditions 5
Paths 7

Size

Total Lines 58
Code Lines 42

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 36
CRAP Score 5.7283

Importance

Changes 9
Bugs 3 Features 0
Metric Value
c 9
b 3
f 0
dl 0
loc 58
ccs 36
cts 52
cp 0.6923
rs 8.7274
cc 5
eloc 42
nc 7
nop 0
crap 5.7283

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', 0)
86
				)
87
				->setMaxResults(5)
88
			;
89
			$result = $qb->execute();
90 1
		} catch(\Exception $e) {
91 1
			\OC::$server->getLogger()->error( __METHOD__ . ', exception: ' . $e->getMessage(), ['app' => 'files_antivirus']);
92 1
			return;
93
		}
94
	
95
		$view = new \OC\Files\View('/');
96
		while ($row = $result->fetchRow()) {
97
			$path = $view->getPath($row['fileid']);
98
			if (!is_null($path)) {
99
				$item = new Item($this->l10n, $view, $path, $row['fileid']);
100
				$scanner = $this->scannerFactory->getScanner();
101
				$status = $scanner->scan($item);					
102
				$status->dispatch($item, true);
103
			}
104
		}
105
		\OC_Util::tearDownFS();
106
	}
107
108
	/**
109
	 * A hack to access files and views. Better than before.
110
	 *
111
	 * @return bool
112
	 */
113 1
	protected function initFS(){
114
		//Need any valid user to mount FS
115 1
		$results = $this->userManager->search('', 2, 0);
116 1
		$anyUser = array_pop($results);
117 1
		if (is_null($anyUser)) {
118
			\OC::$server->getLogger()->error("Failed to setup file system", ['app' => 'files_antivirus']);
119
			return false;
120
		}
121 1
		\OC_Util::tearDownFS();
122 1
		\OC_Util::setupFS($anyUser->getUID());
123 1
		return true;
124
	}
125
126
	/**
127
	 * @deprecated since  v8.0.0
128
	 */
129
	public static function check(){
130
	}
131
}
132