2021-02-06 16:30:30 +01:00
package query
2021-09-30 16:11:45 +02:00
import (
"time"
"github.com/photoprism/photoprism/internal/entity"
2021-10-06 11:50:48 +02:00
"github.com/photoprism/photoprism/internal/mutex"
2021-09-30 16:11:45 +02:00
)
2021-02-06 16:30:30 +01:00
// PurgeOrphans removes orphan database entries.
func PurgeOrphans ( ) error {
2021-09-30 16:11:45 +02:00
// Remove files without a photo.
start := time . Now ( )
2021-09-30 15:50:10 +02:00
if count , err := PurgeOrphanFiles ( ) ; err != nil {
return err
} else if count > 0 {
2022-07-22 19:18:42 +02:00
log . Infof ( "index: removed %d orphan files [%s]" , count , time . Since ( start ) )
2021-09-30 15:50:10 +02:00
} else {
2022-07-22 19:18:42 +02:00
log . Debugf ( "index: found no orphan files [%s]" , time . Since ( start ) )
2021-09-30 15:50:10 +02:00
}
2021-09-30 16:11:45 +02:00
// Remove duplicates without an original file.
2021-02-06 16:30:30 +01:00
if err := PurgeOrphanDuplicates ( ) ; err != nil {
return err
}
2021-09-30 16:11:45 +02:00
// Remove unused countries.
2021-02-06 16:30:30 +01:00
if err := PurgeOrphanCountries ( ) ; err != nil {
return err
}
2021-09-30 16:11:45 +02:00
// Remove unused cameras.
2021-02-06 16:30:30 +01:00
if err := PurgeOrphanCameras ( ) ; err != nil {
return err
}
2021-09-30 16:11:45 +02:00
// Remove unused camera lenses.
2021-02-06 16:30:30 +01:00
if err := PurgeOrphanLenses ( ) ; err != nil {
return err
}
return nil
}
2021-09-30 16:11:45 +02:00
// PurgeOrphanFiles removes files without a photo from the index.
2021-09-30 15:50:10 +02:00
func PurgeOrphanFiles ( ) ( count int , err error ) {
2021-12-09 02:33:41 +01:00
mutex . Index . Lock ( )
defer mutex . Index . Unlock ( )
2021-10-06 11:50:48 +02:00
2021-09-30 15:50:10 +02:00
files , err := OrphanFiles ( )
if err != nil {
return count , err
}
for i := range files {
if err = files [ i ] . DeletePermanently ( ) ; err != nil {
return count , err
}
count ++
}
return count , err
}
2021-02-06 16:30:30 +01:00
// PurgeOrphanDuplicates deletes all files from the duplicates table that don't exist in the files table.
func PurgeOrphanDuplicates ( ) error {
2021-12-09 02:33:41 +01:00
mutex . Index . Lock ( )
defer mutex . Index . Unlock ( )
2021-10-06 11:50:48 +02:00
2021-02-08 14:09:58 +01:00
return UnscopedDb ( ) . Delete (
entity . Duplicate { } ,
"file_hash NOT IN (SELECT file_hash FROM files WHERE file_missing = 0 AND deleted_at IS NULL)" ) . Error
2021-02-06 16:30:30 +01:00
}
// PurgeOrphanCountries removes countries without any photos.
func PurgeOrphanCountries ( ) error {
2021-12-09 02:33:41 +01:00
mutex . Index . Lock ( )
defer mutex . Index . Unlock ( )
2021-10-06 11:50:48 +02:00
2021-02-06 16:30:30 +01:00
entity . FlushCountryCache ( )
switch DbDialect ( ) {
default :
return UnscopedDb ( ) . Exec ( ` DELETE FROM countries WHERE country_slug <> ? AND id NOT IN (SELECT photo_country FROM photos) ` , entity . UnknownCountry . CountrySlug ) . Error
}
}
// PurgeOrphanCameras removes cameras without any photos.
func PurgeOrphanCameras ( ) error {
2021-12-09 02:33:41 +01:00
mutex . Index . Lock ( )
defer mutex . Index . Unlock ( )
2021-10-06 11:50:48 +02:00
2021-02-06 16:30:30 +01:00
entity . FlushCameraCache ( )
switch DbDialect ( ) {
default :
return UnscopedDb ( ) . Exec ( ` DELETE FROM cameras WHERE camera_slug <> ? AND id NOT IN (SELECT camera_id FROM photos) ` , entity . UnknownCamera . CameraSlug ) . Error
}
}
// PurgeOrphanLenses removes cameras without any photos.
func PurgeOrphanLenses ( ) error {
2021-12-09 02:33:41 +01:00
mutex . Index . Lock ( )
defer mutex . Index . Unlock ( )
2021-10-06 11:50:48 +02:00
2021-02-06 16:30:30 +01:00
entity . FlushLensCache ( )
switch DbDialect ( ) {
default :
return UnscopedDb ( ) . Exec ( ` DELETE FROM lenses WHERE lens_slug <> ? AND id NOT IN (SELECT lens_id FROM photos) ` , entity . UnknownLens . LensSlug ) . Error
}
}