Example #1
0
 /**
  * 画像を削除
  */
 public static function remove($target, $to_blacklist = false)
 {
     $ini = ic2_loadconfig();
     $removed_files = array();
     if (empty($target)) {
         return $removed_files;
     }
     if (!is_array($target)) {
         if (is_integer($target) || ctype_digit($target)) {
             $id = (int) $target;
             if ($id > 0) {
                 $target = array($id);
             } else {
                 return $removed_files;
             }
         } else {
             P2Util::pushInfoHtml('<p>WARNING! ImageCache2_DatabaseManager::remove(): 不正な引数</p>');
             return $removed_files;
         }
     }
     // トランザクションの開始
     $ta = new ImageCache2_DataObject_Images();
     $db = $ta->getDatabaseConnection();
     if ($db->phptype == 'pgsql') {
         $ta->query('BEGIN');
     } elseif ($db->phptype == 'sqlite') {
         $db->query('BEGIN;');
     }
     // 画像を削除
     $parent_dir = dirname($ini['General']['cachedir']) . DIRECTORY_SEPARATOR;
     $pattern = '/^' . preg_quote($parent_dir, '/') . '/';
     foreach ($target as $id) {
         $icdb = new ImageCache2_DataObject_Images();
         $icdb->whereAdd("id = {$id}");
         if ($icdb->find(true)) {
             // キャッシュしているファイルを削除
             $sizes = array(ImageCache2_Thumbnailer::SIZE_PC, ImageCache2_Thumbnailer::SIZE_MOBILE, ImageCache2_Thumbnailer::SIZE_INTERMD);
             $dprs = array(ImageCache2_Thumbnailer::DPR_DEFAULT, ImageCache2_Thumbnailer::DPR_1_5, ImageCache2_Thumbnailer::DPR_2_0);
             foreach ($sizes as $size) {
                 foreach ($dprs as $dpr) {
                     $t = new ImageCache2_Thumbnailer($size | $dpr);
                     $path = $t->thumbPath($icdb->size, $icdb->md5, $icdb->mime);
                     if (file_exists($path)) {
                         unlink($path);
                         $removed_files[] = preg_replace($pattern, '', $path);
                     }
                 }
             }
             $t = new ImageCache2_Thumbnailer();
             $path = $t->srcPath($icdb->size, $icdb->md5, $icdb->mime);
             if (file_exists($path)) {
                 unlink($path);
                 $removed_files[] = preg_replace($pattern, '', $path);
             }
             // ブラックリスト送りの準備
             if ($to_blacklist) {
                 $_blacklist = new ImageCache2_DataObject_BlackList();
                 $_blacklist->size = $icdb->size;
                 $_blacklist->md5 = $icdb->md5;
                 if ($icdb->mime === 'clamscan/infected' || $icdb->rank == -4) {
                     $_blacklist->type = 2;
                 } elseif ($icdb->rank < 0) {
                     $_blacklist->type = 1;
                 } else {
                     $_blacklist->type = 0;
                 }
             }
             // 同一画像を検索
             $remover = new ImageCache2_DataObject_Images();
             $remover->whereAddQuoted('size', '=', $icdb->size);
             $remover->whereAddQuoted('md5', '=', $icdb->md5);
             //$remover->whereAddQuoted('mime', '=', $icdb->mime); // SizeとMD5で十分
             $remover->find();
             while ($remover->fetch()) {
                 // ブラックリスト送りにする
                 if ($to_blacklist) {
                     $blacklist = clone $_blacklist;
                     $blacklist->uri = $remover->uri;
                     $blacklist->insert();
                 }
                 // テーブルから抹消
                 $remover->delete();
             }
         }
     }
     // トランザクションのコミット
     if ($db->phptype == 'pgsql') {
         $ta->query('COMMIT');
     } elseif ($db->phptype == 'sqlite') {
         $db->query('COMMIT;');
     }
     return $removed_files;
 }