1
|
|
|
<?php |
2
|
|
|
|
3
|
|
|
/** |
4
|
|
|
* This file is part of the PHPMongo package. |
5
|
|
|
* |
6
|
|
|
* (c) Dmytro Sokil <[email protected]> |
7
|
|
|
* |
8
|
|
|
* For the full copyright and license information, please view the LICENSE |
9
|
|
|
* file that was distributed with this source code. |
10
|
|
|
*/ |
11
|
|
|
|
12
|
|
|
namespace Sokil\Mongo; |
13
|
|
|
|
14
|
|
|
/** |
15
|
|
|
* Representation of GridFS as collection of files |
16
|
|
|
* |
17
|
|
|
* @property \MongoGridFS $collection MongoGridFS Instance |
18
|
|
|
*/ |
19
|
|
|
class GridFS extends Collection |
20
|
|
|
{ |
21
|
|
|
protected $mongoCollectionClassName = '\MongoGridFS'; |
22
|
|
|
|
23
|
|
|
/** |
24
|
|
|
* Factory method to get document object from array of stored document |
25
|
|
|
* @param \MongoGridFSFile $data |
26
|
|
|
* @return \Sokil\Mongo\GridFsFile |
27
|
|
|
*/ |
28
|
|
|
public function hydrate($data, $useDocumentPool = true) |
29
|
|
|
{ |
30
|
|
|
if (($data instanceof \MongoGridFSFile) === false) { |
31
|
|
|
throw new Exception('Must be \MongoGridFSFile'); |
32
|
|
|
} |
33
|
|
|
|
34
|
|
|
$className = $this->getFileClassName($data); |
35
|
|
|
|
36
|
|
|
return new $className($this, $data); |
37
|
|
|
} |
38
|
|
|
|
39
|
|
|
/** |
40
|
|
|
* Override to define class name of file by file data |
41
|
|
|
* |
42
|
|
|
* @param \MongoGridFSFile $fileData |
43
|
|
|
* @return string Document class data |
44
|
|
|
*/ |
45
|
|
|
public function getFileClassName(\MongoGridFSFile $fileData = null) |
46
|
|
|
{ |
47
|
|
|
return '\Sokil\Mongo\GridFSFile'; |
48
|
|
|
} |
49
|
|
|
|
50
|
|
|
/** |
51
|
|
|
* Create file in GridFS from file in filesystem |
52
|
|
|
* |
53
|
|
|
* @param string $filename name of source file |
54
|
|
|
* @param array $metadata metadata stored with file |
55
|
|
|
* @return \MongoId Id of stored file |
56
|
|
|
*/ |
57
|
|
|
public function storeFile($filename, $metadata = array()) |
58
|
|
|
{ |
59
|
|
|
return $this->getMongoCollection()->storeFile($filename, $metadata); |
60
|
|
|
} |
61
|
|
|
|
62
|
|
|
/** |
63
|
|
|
* Create file in GridFS from binary data |
64
|
|
|
* |
65
|
|
|
* @param string $bytes binary data to store in GridFS |
66
|
|
|
* @param array $metadata metadata stored with file |
67
|
|
|
* @return \MongoId Id of stored file |
68
|
|
|
*/ |
69
|
|
|
public function storeBytes($bytes, $metadata = array()) |
70
|
|
|
{ |
71
|
|
|
return $this->getMongoCollection()->storeBytes($bytes, $metadata); |
72
|
|
|
} |
73
|
|
|
|
74
|
|
|
/** |
75
|
|
|
* Get file instance by id of document |
76
|
|
|
* Used \MongoGridFS::findOne() instead of \MongoGridFS::get() due |
77
|
|
|
* to backward compatibility with old mongo extensions |
78
|
|
|
* |
79
|
|
|
* @param \MongoId|string|int $id |
80
|
|
|
* @return \Sokil\Mongo\GridFSFile|null |
81
|
|
|
*/ |
82
|
|
|
public function getFileById($id) |
83
|
|
|
{ |
84
|
|
|
if ($id instanceof \MongoId) { |
85
|
|
|
$file = $this->getMongoCollection()->findOne(array('_id' => $id)); |
86
|
|
|
} else { |
87
|
|
|
try { |
88
|
|
|
$file = $this->getMongoCollection()->findOne(array('_id' => new \MongoId($id))); |
89
|
|
|
} catch (\MongoException $e) { |
90
|
|
|
$file = $this->getMongoCollection()->findOne(array('_id' => $id)); |
91
|
|
|
} |
92
|
|
|
} |
93
|
|
|
|
94
|
|
|
if (!$file) { |
95
|
|
|
return null; |
96
|
|
|
} |
97
|
|
|
|
98
|
|
|
$fileClassName = $this->getFileClassName($file); |
99
|
|
|
return new $fileClassName($this, $file); |
100
|
|
|
} |
101
|
|
|
|
102
|
|
|
/** |
103
|
|
|
* Delete file by id |
104
|
|
|
* |
105
|
|
|
* @param string|\MongoId $id id of file's document |
106
|
|
|
* @return \Sokil\Mongo\GridFS |
107
|
|
|
* @throws Exception |
108
|
|
|
*/ |
109
|
|
|
public function deleteFileById($id) |
110
|
|
|
{ |
111
|
|
|
if ($id instanceof \MongoId) { |
112
|
|
|
$result = $this->getMongoCollection()->delete($id); |
113
|
|
|
} else { |
114
|
|
|
try { |
115
|
|
|
$result = $this->getMongoCollection()->delete(new \MongoId($id)); |
116
|
|
|
} catch (\MongoException $e) { |
117
|
|
|
$result = $this->getMongoCollection()->delete($id); |
118
|
|
|
} |
119
|
|
|
} |
120
|
|
View Code Duplication |
if ($result['ok'] !== (double) 1) { |
|
|
|
|
121
|
|
|
throw new Exception('Error deleting file: ' . $result['err'] . ': ' . $result['errmsg']); |
122
|
|
|
} |
123
|
|
|
|
124
|
|
|
return $this; |
125
|
|
|
} |
126
|
|
|
} |
127
|
|
|
|
Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.
You can also find more detailed suggestions in the “Code” section of your repository.