diff --git a/pkg/database/method.go b/pkg/database/method.go index 208fc1c..fc0294e 100644 --- a/pkg/database/method.go +++ b/pkg/database/method.go @@ -188,6 +188,15 @@ func (database *Database) FindFolder(folder string) (int64, error) { return id, nil } +func (database *Database) FindFile(folderId int64, filename string) (int64, error) { + var id int64 + err := database.stmt.findFile.QueryRow(folderId, filename).Scan(&id) + if err != nil { + return 0, err + } + return id, nil +} + func (database *Database) InsertFolder(folder string) (int64, error) { result, err := database.stmt.insertFolder.Exec(folder, filepath.Base(folder)) if err != nil { @@ -217,6 +226,13 @@ func (database *Database) Insert(path string, filesize int64) error { return err } } + + // if file exists, skip it + _, err = database.FindFile(folderId, filename) + if err == nil { + return nil + } + err = database.InsertFile(folderId, filename, filesize) if err != nil { return err diff --git a/pkg/database/sql_stmt.go b/pkg/database/sql_stmt.go index 449dd52..52976c7 100644 --- a/pkg/database/sql_stmt.go +++ b/pkg/database/sql_stmt.go @@ -29,6 +29,8 @@ VALUES (?, ?);` var findFolderQuery = `SELECT id FROM folders WHERE folder = ? LIMIT 1;` +var findFileQuery = `SELECT id FROM files WHERE folder_id = ? AND filename = ? LIMIT 1;` + var insertFileQuery = `INSERT INTO files (folder_id, filename, filesize) VALUES (?, ?, ?);` @@ -82,6 +84,7 @@ type Stmt struct { insertFolder *sql.Stmt insertFile *sql.Stmt findFolder *sql.Stmt + findFile *sql.Stmt searchFiles *sql.Stmt getFolder *sql.Stmt dropFiles *sql.Stmt @@ -142,6 +145,12 @@ func NewPreparedStatement(sqlConn *sql.DB) (*Stmt, error) { return nil, err } + // init findFile statement + stmt.findFile, err = sqlConn.Prepare(findFileQuery) + if err != nil { + return nil, err + } + // init insertFile stmt stmt.insertFile, err = sqlConn.Prepare(insertFileQuery) if err != nil {