forked from SCUTMSC/SCUTMSC-DFS
/
file.go
213 lines (192 loc) · 7.36 KB
/
file.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
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
package model
import (
"database/sql"
"fmt"
"../model/mysql"
)
// FileRecord is a database record of a file
type FileRecord struct {
FileSha1 string
FileName sql.NullString
FileSize sql.NullInt64
FilePath sql.NullString
EnableTimes sql.NullInt64
EnableDays sql.NullInt64
CreateAt sql.NullString
UpdateAt sql.NullString
}
// InsertFileRecord is to insert a database record of a file
func InsertFileRecord(fileSha1 string, fileName string, fileSize int64, filePath string,
enableTimes int64, enableDays int64, createAt string, updateAt string) bool {
// Prepare SQL statement
stmt, err := mysql.DBConn().Prepare(
"INSERT ignore INTO tbl_file (`file_sha1`, `file_name`, `file_size`, `file_path`, " +
"`enable_times`, `enable_days`, `create_at`, `update_at`, `status`) values (?, ?, ?, ?, ?, ?, ?, ?, 1)")
if err != nil {
// log.Fatal("Failed to prepare SQL statement when inserting, err: \n" + err.Error())
fmt.Printf("Failed to prepare SQL statement when inserting, err: \n" + err.Error())
return false
}
defer stmt.Close()
// Execute SQL statement
res, err := stmt.Exec(fileSha1, fileName, fileSize, filePath, enableTimes, enableDays, createAt, updateAt)
if err != nil {
// log.Fatal("Failed to execute SQL statement when inserting, err: \n" + err.Error())
fmt.Printf("Failed to execute SQL statement when inserting, err: \n" + err.Error())
return false
}
// Inform duplicate insert
if rows, err := res.RowsAffected(); err == nil {
// If rows == 0, duplicate insert occurs
if rows == 0 {
// log.Fatal("Duplicate insert occurs, file hash: \n" + fileSha1)
fmt.Printf("Duplicate insert occurs, file hash: \n" + fileSha1)
}
// If rows == 1, duplicate insert didn't occur
return true
}
return false
}
// UpdateFileRecord is to update a database record of a file
func UpdateFileRecord(fileSha1 string, fileName string, filePath string) bool {
// Prepare SQL statement
stmt, err := mysql.DBConn().Prepare(
"Update tbl_file SET file_name=?, file_path=? WHERE file_sha1=? AND status=1 LIMIT 1")
if err != nil {
// log.Fatal("Failed to execute SQL statement when updating, err: \n" + err.Error())
fmt.Printf("Failed to execute SQL statement when updating, err: \n" + err.Error())
return false
}
defer stmt.Close()
// Execute SQL statement
res, err := stmt.Exec(fileName, filePath, fileSha1)
if err != nil {
// log.Fatal("Failed to execute SQL statement when updating, err: \n" + err.Error())
fmt.Printf("Failed to execute SQL statement when updating, err: \n" + err.Error())
return false
}
// Inform record not found
if rows, err := res.RowsAffected(); err == nil {
// If rows == 0, record not found
if rows == 0 {
// log.Fatal("Record not found, file hash: \n" + fileSha1)
fmt.Printf("Record not found, file hash: \n" + fileSha1)
}
// If rows == 1, record found
return true
}
return false
}
// CheckFileRecord is to check whether a database record of file exists
func CheckFileRecord(fileSha1 string) bool {
// Prepare SQL statement
stmt, err := mysql.DBConn().Prepare("SELECT 1 FROM tbl_file where file_sha1=? AND status=1 LIMIT 1")
if err != nil {
// log.Fatal("Failed to execute SQL statement when checking, err: \n" + err.Error())
fmt.Printf("Failed to execute SQL statement when checking, err: \n" + err.Error())
return false
}
defer stmt.Close()
// Execute SQL statement
rows, err := stmt.Query(fileSha1)
if err != nil {
// log.Fatal("Failed to execute SQL statement when checking, err: \n" + err.Error())
fmt.Printf("Failed to execute SQL statement when checking, err: \n" + err.Error())
return false
}
// Inform record not found
if rows == nil || !rows.Next() {
// log.Fatal("Record not found, file hash: \n" + fileSha1)
fmt.Printf("Record not found, file hash: \n" + fileSha1)
return false
}
return true
}
// SelectFileRecord is to select a database record of a file by fileSha1
func SelectFileRecord(fileSha1 string) (*FileRecord, bool) {
// Prepare SQL statement
stmt, err := mysql.DBConn().Prepare(
"SELECT file_sha1, file_name, file_size, file_path, enable_times, enable_days, create_at, update_at " +
"FROM tbl_file WHERE file_sha1=? AND status=1 LIMIT 1")
if err != nil {
// log.Fatal("Failed to prepare SQL statement when selecting, err: \n" + err.Error())
fmt.Printf("Failed to prepare SQL statement when selecting, err: \n" + err.Error())
return nil, false
}
defer stmt.Close()
// Execute SQL statement
fileRecord := FileRecord{}
err = stmt.QueryRow(fileSha1).Scan(&fileRecord.FileSha1, &fileRecord.FileName, &fileRecord.FileSize, &fileRecord.FilePath,
&fileRecord.EnableTimes, &fileRecord.EnableDays, &fileRecord.CreateAt, &fileRecord.UpdateAt)
if err != nil {
// log.Fatal("Failed to execute SQL statement when selecting, err: \n" + err.Error())
fmt.Printf("Failed to execute SQL statement when selecting, err: \n" + err.Error())
return nil, false
}
// Return query result
return &fileRecord, true
}
// SelectFileRecords is to select database records of files by limitCount
func SelectFileRecords(limitCount int) ([]FileRecord, bool) {
// Prepare SQL statement
stmt, err := mysql.DBConn().Prepare(
"SELECT file_sha1, file_name, file_size, file_path, enable_times, enable_days, create_at, update_at " +
"FROM tbl_file WHERE status=1 LIMIT ?")
if err != nil {
// log.Fatal("Failed to prepare SQL statement when selecting, err: \n" + err.Error())
fmt.Printf("Failed to prepare SQL statement when selecting, err: \n" + err.Error())
return nil, false
}
defer stmt.Close()
// Execute SQL statement
rows, err := stmt.Query(limitCount)
if err != nil {
// log.Fatal("Failed to execute SQL statement when selecting, err: \n" + err.Error())
fmt.Printf("Failed to execute SQL statement when selecting, err: \n" + err.Error())
return nil, false
}
var fileRecords []FileRecord
for rows.Next() {
fileRecord := FileRecord{}
err = rows.Scan(&fileRecord.FileSha1, &fileRecord.FileName, &fileRecord.FileSize, &fileRecord.FilePath,
&fileRecord.EnableTimes, &fileRecord.EnableDays, &fileRecord.CreateAt, &fileRecord.UpdateAt)
if err != nil {
// log.Fatal("Failed to execute SQL statement when selecting, err: \n" + err.Error())
fmt.Printf("Failed to execute SQL statement when selecting, err: \n" + err.Error())
return nil, false
}
fileRecords = append(fileRecords, fileRecord)
}
// Return query results
return fileRecords, true
}
// DeleteFileRecord is to delete a database record of a file
func DeleteFileRecord(fileSha1 string) bool {
// Prepare SQL statement
stmt, err := mysql.DBConn().Prepare(
"UPDATE tbl_file SET status=2 WHERE file_sha1=? AND status=1 LIMIT 1")
if err != nil {
// log.Fatal("Failed to execute SQL statement when deleting, err: \n" + err.Error())
fmt.Printf("Failed to execute SQL statement when deleting, err: \n" + err.Error())
return false
}
defer stmt.Close()
// Execute SQL statement
res, err := stmt.Exec(fileSha1)
if err != nil {
// log.Fatal("Failed to execute SQL statement when deleting, err: \n" + err.Error())
fmt.Printf("Failed to execute SQL statement when deleting, err: \n" + err.Error())
return false
}
// Inform record not found
if rows, err := res.RowsAffected(); err == nil {
// If rows == 0, record not found
if rows == 0 {
// log.Fatal("Record not found, file hash: \n" + fileSha1)
fmt.Printf("Record not found, file hash: \n" + fileSha1)
}
// If rows == 1, record found
return true
}
return false
}