-
-
Notifications
You must be signed in to change notification settings - Fork 1.8k
/
duplicate.go
114 lines (95 loc) Β· 3.25 KB
/
duplicate.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
package entity
import (
"fmt"
"github.com/photoprism/photoprism/pkg/clean"
)
type Duplicates []Duplicate
type DuplicatesMap map[string]Duplicate
// Duplicate represents an exact file duplicate.
type Duplicate struct {
FileName string `gorm:"type:VARBINARY(755);primary_key;" json:"Name" yaml:"Name"`
FileRoot string `gorm:"type:VARBINARY(16);primary_key;default:'/';" json:"Root" yaml:"Root,omitempty"`
FileHash string `gorm:"type:VARBINARY(128);default:'';index" json:"Hash" yaml:"Hash,omitempty"`
FileSize int64 `json:"Size" yaml:"Size,omitempty"`
ModTime int64 `json:"ModTime" yaml:"-"`
}
// TableName returns the entity table name.
func (Duplicate) TableName() string {
return "duplicates"
}
// AddDuplicate adds a duplicate.
func AddDuplicate(fileName, fileRoot, fileHash string, fileSize, modTime int64) error {
if fileName == "" {
return fmt.Errorf("duplicate name must not be empty")
} else if fileHash == "" {
return fmt.Errorf("duplicate hash must not be empty")
} else if modTime == 0 {
return fmt.Errorf("duplicate mod time must not be empty")
} else if fileRoot == "" {
return fmt.Errorf("duplicate root must not be empty")
}
duplicate := &Duplicate{
FileName: fileName,
FileRoot: fileRoot,
FileHash: fileHash,
FileSize: fileSize,
ModTime: modTime,
}
if err := duplicate.Create(); err == nil {
return nil
} else if err := duplicate.Save(); err != nil {
return err
}
return nil
}
// PurgeDuplicate deletes a duplicate.
func PurgeDuplicate(fileName, fileRoot string) error {
if fileName == "" {
return fmt.Errorf("duplicate name must not be empty")
} else if fileRoot == "" {
return fmt.Errorf("duplicate root must not be empty")
}
if err := UnscopedDb().Delete(Duplicate{}, "file_name = ? AND file_root = ?", fileName, fileRoot).Error; err != nil {
log.Errorf("duplicate: %s in %s (purge)", err, clean.Log(fileName))
return err
}
return nil
}
// Purge deletes a duplicate.
func (m *Duplicate) Purge() error {
return PurgeDuplicate(m.FileName, m.FileRoot)
}
// Find returns a duplicate from the database.
func (m *Duplicate) Find() error {
return UnscopedDb().First(m, "file_name = ? AND file_root = ?", m.FileName, m.FileRoot).Error
}
// Create inserts a new row to the database.
func (m *Duplicate) Create() error {
if m.FileName == "" {
return fmt.Errorf("duplicate name must not be empty (create)")
} else if m.FileHash == "" {
return fmt.Errorf("duplicate hash must not be empty (create)")
} else if m.ModTime == 0 {
return fmt.Errorf("duplicate mod time must not be empty (create)")
} else if m.FileRoot == "" {
return fmt.Errorf("duplicate root must not be empty (create)")
}
return UnscopedDb().Create(m).Error
}
// Saves the duplicates in the database.
func (m *Duplicate) Save() error {
if m.FileName == "" {
return fmt.Errorf("duplicate name must not be empty (save)")
} else if m.FileHash == "" {
return fmt.Errorf("duplicate hash must not be empty (save)")
} else if m.ModTime == 0 {
return fmt.Errorf("duplicate mod time must not be empty (save)")
} else if m.FileRoot == "" {
return fmt.Errorf("duplicate root must not be empty (save)")
}
if err := UnscopedDb().Save(m).Error; err != nil {
log.Errorf("duplicate: %s in %s (save)", err, clean.Log(m.FileName))
return err
}
return nil
}