package Database import ( "database/sql" "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.Unix()) } 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) (map[int]string, error) { var ( stmtString string stmt *sql.Stmt values []interface{} = []interface{}{} result *sql.Rows dirtyFiles map[int]string = make(map[int]string) counter int = 0 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 path string e = result.Scan(&id, &path) if e != nil { return dirtyFiles, e } dirtyFiles[counter] = path counter++ } e = result.Err() return dirtyFiles, e } func GetMostRecentTimestamp() (time.Time, error) { var ( stmt *sql.Stmt result *sql.Row lastUpdatedAt int64 e error ) stmt, e = DB.Prepare(` SELECT updated_at FROM filesystem_hash ORDER BY updated_at DESC LIMIT 1; `) if e != nil { return time.Now(), e } result = stmt.QueryRow() result.Scan(&lastUpdatedAt) return time.Unix(lastUpdatedAt, 0), nil }