2424 */
2525namespace OCA \Files \Command ;
2626
27+ use OCP \DB \QueryBuilder \IQueryBuilder ;
2728use OCP \IDBConnection ;
2829use Symfony \Component \Console \Command \Command ;
2930use Symfony \Component \Console \Input \InputInterface ;
31+ use Symfony \Component \Console \Input \InputOption ;
3032use Symfony \Component \Console \Output \OutputInterface ;
3133
3234/**
@@ -44,7 +46,8 @@ public function __construct(
4446 protected function configure (): void {
4547 $ this
4648 ->setName ('files:cleanup ' )
47- ->setDescription ('cleanup filecache ' );
49+ ->setDescription ('cleanup filecache ' )
50+ ->addOption ('skip-filecache-extended ' , null , InputOption::VALUE_NONE , 'don \'t remove orphaned entries from filecache_extended ' );
4851 }
4952
5053 public function execute (InputInterface $ input , OutputInterface $ output ): int {
@@ -75,11 +78,44 @@ public function execute(InputInterface $input, OutputInterface $output): int {
7578
7679 $ output ->writeln ("$ deletedEntries orphaned file cache entries deleted " );
7780
81+ if (!$ input ->getOption ('skip-filecache-extended ' )) {
82+ $ deletedFileCacheExtended = $ this ->cleanupOrphanedFileCacheExtended ();
83+ $ output ->writeln ("$ deletedFileCacheExtended orphaned file cache extended entries deleted " );
84+ }
85+
86+
7887 $ deletedMounts = $ this ->cleanupOrphanedMounts ();
7988 $ output ->writeln ("$ deletedMounts orphaned mount entries deleted " );
8089 return self ::SUCCESS ;
8190 }
8291
92+ private function cleanupOrphanedFileCacheExtended (): int {
93+ $ deletedEntries = 0 ;
94+
95+ $ query = $ this ->connection ->getQueryBuilder ();
96+ $ query ->select ('fce.fileid ' )
97+ ->from ('filecache_extended ' , 'fce ' )
98+ ->leftJoin ('fce ' , 'filecache ' , 'fc ' , $ query ->expr ()->eq ('fce.fileid ' , 'fc.fileid ' ))
99+ ->where ($ query ->expr ()->isNull ('fc.fileid ' ))
100+ ->setMaxResults (self ::CHUNK_SIZE );
101+
102+ $ deleteQuery = $ this ->connection ->getQueryBuilder ();
103+ $ deleteQuery ->delete ('filecache_extended ' )
104+ ->where ($ deleteQuery ->expr ()->in ('fileid ' , $ deleteQuery ->createParameter ('idsToDelete ' )));
105+
106+ $ result = $ query ->executeQuery ();
107+ while ($ result ->rowCount () > 0 ) {
108+ $ idsToDelete = $ result ->fetchAll (\PDO ::FETCH_COLUMN );
109+
110+ $ deleteQuery ->setParameter ('idsToDelete ' , $ idsToDelete , IQueryBuilder::PARAM_INT_ARRAY );
111+ $ deletedEntries += $ deleteQuery ->executeStatement ();
112+
113+ $ result = $ query ->executeQuery ();
114+ }
115+
116+ return $ deletedEntries ;
117+ }
118+
83119 private function cleanupOrphanedMounts (): int {
84120 $ deletedEntries = 0 ;
85121
0 commit comments