Open Journal Systems  3.3.0
SubmissionFileDAODelegate.inc.php
1 <?php
2 
18 import('lib.pkp.classes.db.DAO');
19 import('lib.pkp.classes.submission.SubmissionFile');
20 
22 
23  //
24  // Abstract public methods to be implemented by subclasses.
25  //
36  function insertObject($submissionFile, $sourceFile, $isUpload = false) {
37  $fileId = $submissionFile->getFileId();
38 
39  if (!is_numeric($submissionFile->getRevision())) {
40  // Set the initial revision.
41  $submissionFile->setRevision(1);
42  }
43 
44  if (!is_bool($submissionFile->getViewable())) {
45  // Set the viewable default.
46  $submissionFile->setViewable(false);
47  }
48 
49  $params = array(
50  (int)$submissionFile->getRevision(),
51  (int)$submissionFile->getSubmissionId(),
52  is_null($submissionFile->getSourceFileId()) ? null : (int)$submissionFile->getSourceFileId(),
53  is_null($submissionFile->getSourceRevision()) ? null : (int)$submissionFile->getSourceRevision(),
54  $submissionFile->getFileType(),
55  (int)$submissionFile->getFileSize(),
56  $submissionFile->getOriginalFileName(),
57  (int)$submissionFile->getFileStage(),
58  (boolean)$submissionFile->getViewable() ? 1 : 0,
59  is_null($submissionFile->getUploaderUserId()) ? null : (int)$submissionFile->getUploaderUserId(),
60  is_null($submissionFile->getAssocType()) ? null : (int)$submissionFile->getAssocType(),
61  is_null($submissionFile->getAssocId()) ? null : (int)$submissionFile->getAssocId(),
62  is_null($submissionFile->getGenreId()) ? null : (int)$submissionFile->getGenreId(),
63  $submissionFile->getDirectSalesPrice(),
64  $submissionFile->getSalesType(),
65  );
66 
67  if ($fileId) {
68  array_unshift($params, (int) $fileId);
69  }
70 
71  $this->update(
72  sprintf('INSERT INTO submission_files
73  (' . ($fileId ? 'file_id, ' : '') . 'revision, submission_id, source_file_id, source_revision, file_type, file_size, original_file_name, file_stage, date_uploaded, date_modified, viewable, uploader_user_id, assoc_type, assoc_id, genre_id, direct_sales_price, sales_type)
74  VALUES
75  (' . ($fileId ? '?, ' : '') . '?, ?, ?, ?, ?, ?, ?, ?, %s, %s, ?, ?, ?, ?, ?, ?, ?)',
76  $this->datetimeToDB($submissionFile->getDateUploaded()), $this->datetimeToDB($submissionFile->getDateModified())),
77  $params
78  );
79 
80  if (!$fileId) {
81  $submissionFile->setFileId($this->_getInsertId('submission_files', 'file_id'));
82  }
83 
84  $submissionLocale = $submissionFile->getSubmissionLocale();
85 
86  $reviewStage = in_array($submissionFile->getFileStage(), array(
87  SUBMISSION_FILE_REVIEW_FILE, SUBMISSION_FILE_REVIEW_ATTACHMENT, SUBMISSION_FILE_REVIEW_REVISION
88  ));
89 
90  if ($reviewStage) {
91  $submissionFile->setName($submissionFile->_generateName(true), $submissionLocale);
92  } else {
93  if ($isUpload || !$submissionFile->getName($submissionLocale)) {
94  $submissionFile->setName($submissionFile->_generateName(), $submissionLocale);
95  }
96  }
97 
98  $this->updateLocaleFields($submissionFile);
99 
100  // Determine the final destination of the file (requires
101  // the file id we just generated).
102  $targetFilePath = $submissionFile->getFilePath();
103 
104  // Only copy the file if it is not yet in the target position.
105  if ($isUpload || $sourceFile != $targetFilePath) {
106  // Copy the file from its current location to the target destination.
107  import('lib.pkp.classes.file.FileManager');
108  $fileManager = new FileManager();
109  if ($isUpload) {
110  $success = $fileManager->uploadFile($sourceFile, $targetFilePath);
111  } else {
112  assert(is_readable($sourceFile));
113  $success = $fileManager->copyFile($sourceFile, $targetFilePath);
114  }
115  if (!$success) {
116  // If the copy/upload operation fails then remove
117  // the already inserted meta-data.
118  $this->deleteObject($submissionFile);
119  $nullVar = null;
120  return $nullVar;
121  }
122  }
123  assert(is_readable($targetFilePath));
124 
125  return $submissionFile;
126  }
127 
136  function updateObject($submissionFile, $previousFile) {
137  // Update the file in the database.
138  $this->update(
139  sprintf('UPDATE submission_files
140  SET
141  file_id = ?,
142  revision = ?,
143  submission_id = ?,
144  source_file_id = ?,
145  source_revision = ?,
146  file_type = ?,
147  file_size = ?,
148  original_file_name = ?,
149  file_stage = ?,
150  date_uploaded = %s,
151  date_modified = %s,
152  viewable = ?,
153  uploader_user_id = ?,
154  assoc_type = ?,
155  assoc_id = ?,
156  genre_id = ?,
157  direct_sales_price = ?,
158  sales_type = ?
159  WHERE file_id = ? AND revision = ?',
160  $this->datetimeToDB($submissionFile->getDateUploaded()), $this->datetimeToDB($submissionFile->getDateModified())),
161  array(
162  (int)$submissionFile->getFileId(),
163  (int)$submissionFile->getRevision(),
164  (int)$submissionFile->getSubmissionId(),
165  is_null($submissionFile->getSourceFileId()) ? null : (int)$submissionFile->getSourceFileId(),
166  is_null($submissionFile->getSourceRevision()) ? null : (int)$submissionFile->getSourceRevision(),
167  $submissionFile->getFileType(),
168  $submissionFile->getFileSize(),
169  $submissionFile->getOriginalFileName(),
170  $submissionFile->getFileStage(),
171  (boolean)$submissionFile->getViewable() ? 1 : 0,
172  is_null($submissionFile->getUploaderUserId()) ? null : (int)$submissionFile->getUploaderUserId(),
173  is_null($submissionFile->getAssocType()) ? null : (int)$submissionFile->getAssocType(),
174  is_null($submissionFile->getAssocId()) ? null : (int)$submissionFile->getAssocId(),
175  is_null($submissionFile->getGenreId()) ? null : (int)$submissionFile->getGenreId(),
176  $submissionFile->getDirectSalesPrice(),
177  $submissionFile->getSalesType(),
178  (int)$previousFile->getFileId(),
179  (int)$previousFile->getRevision(),
180  )
181  );
182 
183  $this->updateLocaleFields($submissionFile);
184 
185  // Update all dependent objects.
186  $this->_updateDependentObjects($submissionFile, $previousFile);
187 
188  // Copy the file from its current location to the target destination
189  // if necessary.
190  $previousFilePath = $previousFile->getFilePath();
191  $targetFilePath = $submissionFile->getFilePath();
192  if ($previousFilePath != $targetFilePath && is_file($previousFilePath)) {
193  // The file location changed so let's move the file on
194  // the file system, too.
195  assert(is_readable($previousFilePath));
196  import('lib.pkp.classes.file.FileManager');
197  $fileManager = new FileManager();
198  if (!$fileManager->copyFile($previousFilePath, $targetFilePath)) return false;
199  if (!$fileManager->deleteByPath($previousFilePath)) return false;
200  }
201 
202  return file_exists($targetFilePath);
203  }
204 
210  function deleteObject($submissionFile) {
211  if (!$this->update(
212  'DELETE FROM submission_files
213  WHERE file_id = ? AND revision = ?',
214  array(
215  (int)$submissionFile->getFileId(),
216  (int)$submissionFile->getRevision()
217  ))) return false;
218 
219  // if we've removed the last revision of this file, clean up
220  // the settings for this file as well.
221  $result = $this->retrieve(
222  'SELECT * FROM submission_files WHERE file_id = ?',
223  array((int)$submissionFile->getFileId())
224  );
225 
226  if ($result->RecordCount() == 0) {
227  $this->update('DELETE FROM submission_file_settings WHERE file_id = ?',
228  array((int) $submissionFile->getFileId()));
229  }
230 
231  // Delete all dependent objects.
232  $this->_deleteDependentObjects($submissionFile);
233 
234  // Delete the file on the file system, too.
235  $filePath = $submissionFile->getFilePath();
236  if(!(is_file($filePath) && is_readable($filePath))) return false;
237  assert(is_writable(dirname($filePath)));
238 
239  import('lib.pkp.classes.file.FileManager');
240  $fileManager = new FileManager();
241  $fileManager->deleteByPath($filePath);
242 
243  return !file_exists($filePath);
244  }
245 
251  function fromRow($row) {
252  $submissionFile = $this->newDataObject();
253  $submissionFile->setFileId((int)$row['submission_file_id']);
254  $submissionFile->setSubmissionLocale($row['submission_locale']);
255  $submissionFile->setRevision((int)$row['submission_revision']);
256  $submissionFile->setAssocType(is_null($row['assoc_type']) ? null : (int)$row['assoc_type']);
257  $submissionFile->setAssocId(is_null($row['assoc_id']) ? null : (int)$row['assoc_id']);
258  $submissionFile->setSourceFileId(is_null($row['source_file_id']) ? null : (int)$row['source_file_id']);
259  $submissionFile->setSourceRevision(is_null($row['source_revision']) ? null : (int)$row['source_revision']);
260  $submissionFile->setSubmissionId((int)$row['submission_id']);
261  $submissionFile->setFileStage((int)$row['file_stage']);
262  $submissionFile->setOriginalFileName($row['original_file_name']);
263  $submissionFile->setFileType($row['file_type']);
264  $submissionFile->setGenreId(is_null($row['genre_id']) ? null : (int)$row['genre_id']);
265  $submissionFile->setFileSize((int)$row['file_size']);
266  $submissionFile->setUploaderUserId(is_null($row['uploader_user_id']) ? null : (int)$row['uploader_user_id']);
267  $submissionFile->setViewable((boolean)$row['viewable']);
268  $submissionFile->setDateUploaded($this->datetimeFromDB($row['date_uploaded']));
269  $submissionFile->setDateModified($this->datetimeFromDB($row['date_modified']));
270  $submissionFile->setDirectSalesPrice($row['direct_sales_price']);
271  $submissionFile->setSalesType($row['sales_type']);
272 
273  $this->getDataObjectSettings('submission_file_settings', 'file_id', $row['submission_file_id'], $submissionFile);
274 
275  return $submissionFile;
276  }
277 
282  function newDataObject() {
283  return new SubmissionFile();
284  }
285 
286 
287  //
288  // Protected helper methods
289  //
294  function getLocaleFieldNames() {
295  $localeFieldNames = parent::getLocaleFieldNames();
296  $localeFieldNames[] = 'name';
297  return $localeFieldNames;
298  }
299 
306  $additionalFields = parent::getAdditionalFieldNames();
307  $additionalFields[] = 'pub-id::publisher-id';
308  $additionalFields[] = 'chapterId';
309  return $additionalFields;
310  }
311 
316  function updateLocaleFields($submissionFile) {
317  // Update the locale fields.
318  $this->updateDataObjectSettings('submission_file_settings', $submissionFile, array(
319  'file_id' => $submissionFile->getFileId()
320  ));
321  }
322 
334  function pubIdExists($pubIdType, $pubId, $excludePubObjectId, $contextId) {
335  $result = $this->retrieve(
336  'SELECT COUNT(*)
337  FROM submission_file_settings sfs
338  INNER JOIN submission_files sf ON sfs.file_id = sf.file_id
339  INNER JOIN submissions s ON sf.submission_id = s.submission_id
340  WHERE sfs.setting_name = ? AND sfs.setting_value = ? AND sfs.file_id <> ? AND s.context_id = ?',
341  array(
342  'pub-id::'.$pubIdType,
343  $pubId,
344  (int) $excludePubObjectId,
345  (int) $contextId
346  )
347  );
348  $returner = $result->fields[0] ? true : false;
349  $result->Close();
350  return $returner;
351  }
352 
356  function changePubId($pubObjectId, $pubIdType, $pubId) {
357  $idFields = array(
358  'file_id', 'locale', 'setting_name'
359  );
360  $updateArray = array(
361  'file_id' => (int) $pubObjectId,
362  'locale' => '',
363  'setting_name' => 'pub-id::'.$pubIdType,
364  'setting_type' => 'string',
365  'setting_value' => (string)$pubId
366  );
367  $this->replace('submission_file_settings', $updateArray, $idFields);
368  $this->flushCache();
369  }
370 
374  function deletePubId($pubObjectId, $pubIdType) {
375  $settingName = 'pub-id::'.$pubIdType;
376  $this->update(
377  'DELETE FROM submission_file_settings WHERE setting_name = ? AND file_id = ?',
378  array(
379  $settingName,
380  (int)$pubObjectId
381  )
382  );
383  $this->flushCache();
384  }
385 
389  function deleteAllPubIds($contextId, $pubIdType) {
390  $settingName = 'pub-id::'.$pubIdType;
391 
392  $submissionDao = DAORegistry::getDAO('SubmissionDAO'); /* @var $submissionDao SubmissionDAO */
393  $submissions = $submissionDao->getByContextId($contextId);
394  $submissionFileDao = DAORegistry::getDAO('SubmissionFileDAO'); /* @var $submissionFileDao SubmissionFileDAO */
395  while ($submission = $submissions->next()) {
396  $submissionFiles = $submissionFileDao->getBySubmissionId($submission->getId());
397  foreach ($submissionFiles as $submissionFile) {
398  $this->update(
399  'DELETE FROM submission_file_settings WHERE setting_name = ? AND file_id = ?',
400  array(
401  $settingName,
402  (int)$submissionFile->getFileId()
403  )
404  );
405  }
406  }
407  $this->flushCache();
408  }
409 
410  //
411  // Private helper methods
412  //
418  function _updateDependentObjects($submissionFile, $previousFile) {
419  // If the file ids didn't change then we do not have to
420  // do anything.
421  if (
422  $previousFile->getFileId() == $submissionFile->getFileId() ||
423  $previousFile->getRevision() == $submissionFile->getRevision()
424  ) return;
425 
426  // Update file views that refer to this file.
427  $viewsDao = DAORegistry::getDAO('ViewsDAO'); /* @var $viewsDao ViewsDAO */
428  $viewsDao->moveViews(
429  ASSOC_TYPE_SUBMISSION_FILE,
430  $previousFile->getFileIdAndRevision(), $submissionFile->getFileIdAndRevision()
431  );
432  }
433 
438  function _deleteDependentObjects($submissionFile) {
439  // Delete file views that refer to this file.
440  $viewsDao = DAORegistry::getDAO('ViewsDAO'); /* @var $viewsDao ViewsDAO */
441  $viewsDao->deleteViews(
442  ASSOC_TYPE_SUBMISSION_FILE, $submissionFile->getFileIdAndRevision()
443  );
444  }
445 }
446 
447 
SubmissionFileDAODelegate\deleteAllPubIds
deleteAllPubIds($contextId, $pubIdType)
Definition: SubmissionFileDAODelegate.inc.php:389
DAORegistry\getDAO
static & getDAO($name, $dbconn=null)
Definition: DAORegistry.inc.php:57
SubmissionFileDAODelegate\pubIdExists
pubIdExists($pubIdType, $pubId, $excludePubObjectId, $contextId)
Definition: SubmissionFileDAODelegate.inc.php:334
SubmissionFileDAODelegate\insertObject
insertObject($submissionFile, $sourceFile, $isUpload=false)
Definition: SubmissionFileDAODelegate.inc.php:36
SubmissionFileDAODelegate\updateObject
updateObject($submissionFile, $previousFile)
Definition: SubmissionFileDAODelegate.inc.php:136
SubmissionFile
Submission file class.
Definition: SubmissionFile.inc.php:35
SubmissionFileDAODelegate\getLocaleFieldNames
getLocaleFieldNames()
Definition: SubmissionFileDAODelegate.inc.php:294
DAO\retrieve
& retrieve($sql, $params=false, $callHooks=true)
Definition: DAO.inc.php:85
SubmissionFileDAODelegate\changePubId
changePubId($pubObjectId, $pubIdType, $pubId)
Definition: SubmissionFileDAODelegate.inc.php:356
SubmissionFileDAODelegate\newDataObject
newDataObject()
Definition: SubmissionFileDAODelegate.inc.php:282
SubmissionFileDAODelegate\deletePubId
deletePubId($pubObjectId, $pubIdType)
Definition: SubmissionFileDAODelegate.inc.php:374
DAO\datetimeFromDB
datetimeFromDB($dt)
Definition: DAO.inc.php:319
DAO\update
update($sql, $params=false, $callHooks=true, $dieOnError=true)
Definition: DAO.inc.php:214
SubmissionFileDAODelegate
Abstract class to support DAO delegates that provide operations to retrieve and modify SubmissionFile...
Definition: SubmissionFileDAODelegate.inc.php:21
DAO\datetimeToDB
datetimeToDB($dt)
Definition: DAO.inc.php:299
DAO\_getInsertId
_getInsertId($table='', $id='')
Definition: DAO.inc.php:255
SubmissionFileDAODelegate\fromRow
fromRow($row)
Definition: SubmissionFileDAODelegate.inc.php:251
DAO\getDataObjectSettings
getDataObjectSettings($tableName, $idFieldName, $idFieldValue, $dataObject)
Definition: DAO.inc.php:582
DAO\replace
replace($table, $arrFields, $keyCols)
Definition: DAO.inc.php:243
SubmissionFileDAODelegate\_deleteDependentObjects
_deleteDependentObjects($submissionFile)
Definition: SubmissionFileDAODelegate.inc.php:438
SubmissionFileDAODelegate\deleteObject
deleteObject($submissionFile)
Definition: SubmissionFileDAODelegate.inc.php:210
DAO\flushCache
flushCache()
Definition: DAO.inc.php:288
FileManager
Class defining basic operations for file management.
Definition: FileManager.inc.php:35
DAO\updateDataObjectSettings
updateDataObjectSettings($tableName, $dataObject, $idArray)
Definition: DAO.inc.php:488
SubmissionFileDAODelegate\getAdditionalFieldNames
getAdditionalFieldNames()
Definition: SubmissionFileDAODelegate.inc.php:305
SubmissionFileDAODelegate\updateLocaleFields
updateLocaleFields($submissionFile)
Definition: SubmissionFileDAODelegate.inc.php:316
DAO
Operations for retrieving and modifying objects from a database.
Definition: DAO.inc.php:31
SubmissionFileDAODelegate\_updateDependentObjects
_updateDependentObjects($submissionFile, $previousFile)
Definition: SubmissionFileDAODelegate.inc.php:418