package Database import ( "database/sql" "fmt" "time" ) type FilesystemHashRow struct { Path string Hash string UpdatedAt time.Time } func FindOrCreateFileHash(rows []FilesystemHashRow) error { var ( stmtString string stmt *sql.Stmt values []interface{} = []interface{}{} e error ) stmtString = "INSERT OR REPLACE INTO filesystem_hash (id, path, hash, updated_at) VALUES " for _, row := range rows { stmtString += `( (SELECT id FROM filesystem_hash WHERE path = ?), ?, ?, ? ),` values = append(values, row.Path, row.Path, row.Hash, row.UpdatedAt.String()) } stmtString = stmtString[0 : len(stmtString)-1] stmt, e = DB.Prepare(stmtString) if e != nil { return e } _, e = stmt.Exec(values...) return e } func FindModifiedFiles(hashes []string) ([]string, error) { var ( stmtString string stmt *sql.Stmt values []interface{} = []interface{}{} result *sql.Rows dirtyFiles []string = []string{} e error ) stmtString = "SELECT id, path FROM filesystem_hash WHERE hash NOT IN (" for _, row := range hashes { stmtString += "?," values = append(values, row) } stmtString = stmtString[0:len(stmtString)-1] + ")" stmt, e = DB.Prepare(stmtString) if e != nil { return dirtyFiles, e } result, e = stmt.Query(values...) if e != nil { return dirtyFiles, e } defer result.Close() for result.Next() { var id string var hash string e = result.Scan(&id, &hash) if e != nil { return dirtyFiles, e } fmt.Println(id, hash) dirtyFiles = append(dirtyFiles, hash) } e = result.Err() return dirtyFiles, e } /* func FindNewFiles(files []string) ([]string, error) { var ( stmtString string stmt *sql.Stmt values []interface{} = []interface{}{} result *sql.Rows dirtyFiles []string = []string{} e error ) stmtString = `select * from ( values (4),(5),(6) ) as v(id) where not exists (select * from images i where i.id = v.id);` for _, row := range hashes { stmtString += "?," values = append(values, row) } stmtString = stmtString[0:len(stmtString)-1] + ")" stmt, e = DB.Prepare(stmtString) if e != nil { return dirtyFiles, e } result, e = stmt.Query(values...) if e != nil { return dirtyFiles, e } defer result.Close() for result.Next() { var id string var hash string e = result.Scan(&id, &hash) if e != nil { return dirtyFiles, e } fmt.Println(id, hash) dirtyFiles = append(dirtyFiles, hash) } e = result.Err() return dirtyFiles, e } */