/** * Remove media present in media directories but not referenced in database (aka. orphan media) */ public static function remove_deleted_representations($po_opts = null) { require_once __CA_LIB_DIR__ . "/core/Db.php"; require_once __CA_MODELS_DIR__ . "/ca_object_representations.php"; $vb_delete_opt = (bool) $po_opts->getOption('delete'); $o_db = new Db(); $t_rep = new ca_object_representations(); $t_rep->setMode(ACCESS_WRITE); $va_paths = array(); $qr_reps = $o_db->query("SELECT * FROM ca_object_representations WHERE deleted=1"); if ($vb_delete_opt) { print CLIProgressBar::start($qr_reps->numRows(), _t('Removing deleted representations from database')); } else { print CLIProgressBar::start($qr_reps->numRows(), _t('Loading deleted representations from database')); } while ($qr_reps->nextRow()) { print CLIProgressBar::next(); $va_versions = $qr_reps->getMediaVersions('media'); if (!is_array($va_versions)) { continue; } foreach ($va_versions as $vs_version) { $va_paths[$qr_reps->getMediaPath('media', $vs_version)] = true; } if ($vb_delete_opt) { $t_rep->load($qr_reps->get('representation_id')); $t_rep->setMode(ACCESS_WRITE); $t_rep->removeAllLabels(); $t_rep->delete(true, array('hard' => true)); } } print CLIProgressBar::finish() . PHP_EOL; if ($vb_delete_opt && $qr_reps->numRows() > 0) { CLIUtils::addMessage(_t('Done!'), array('color' => 'green')); } elseif ($qr_reps->numRows() == 0) { CLIUtils::addMessage(_t('There are no deleted representations to process!'), array('color' => 'green')); } else { CLIUtils::addMessage(_t("%1 files are referenced by %2 deleted records. Both the records and the files will be deleted if you re-run the script with the -d (--delete) option and the correct permissions.", sizeof($va_paths), $qr_reps->numRows())); CLIUtils::addMessage(_t("It is highly recommended to create a full backup before you do this!"), array('color' => 'bold_red')); } }