8460: Return recent events if last_log_id given.
[arvados.git] / services / ws / event.go
1 package main
2
3 import (
4         "database/sql"
5         "log"
6         "sync"
7         "time"
8
9         "git.curoverse.com/arvados.git/sdk/go/arvados"
10         "github.com/ghodss/yaml"
11 )
12
13 type eventSink interface {
14         Channel() <-chan *event
15         Stop()
16 }
17
18 type eventSource interface {
19         NewSink() eventSink
20         DB() *sql.DB
21 }
22
23 type event struct {
24         LogID    uint64
25         Received time.Time
26         Serial   uint64
27
28         db     *sql.DB
29         logRow *arvados.Log
30         err    error
31         mtx    sync.Mutex
32 }
33
34 // Detail returns the database row corresponding to the event. It can
35 // be called safely from multiple goroutines. Only one attempt will be
36 // made. If the database row cannot be retrieved, Detail returns nil.
37 func (e *event) Detail() *arvados.Log {
38         e.mtx.Lock()
39         defer e.mtx.Unlock()
40         if e.logRow != nil || e.err != nil {
41                 return e.logRow
42         }
43         var logRow arvados.Log
44         var propYAML []byte
45         e.err = e.db.QueryRow(`SELECT id, uuid, object_uuid, COALESCE(object_owner_uuid,''), COALESCE(event_type,''), created_at, properties FROM logs WHERE id = $1`, e.LogID).Scan(
46                 &logRow.ID,
47                 &logRow.UUID,
48                 &logRow.ObjectUUID,
49                 &logRow.ObjectOwnerUUID,
50                 &logRow.EventType,
51                 &logRow.CreatedAt,
52                 &propYAML)
53         if e.err != nil {
54                 log.Printf("retrieving log row %d: %s", e.LogID, e.err)
55                 return nil
56         }
57         e.err = yaml.Unmarshal(propYAML, &logRow.Properties)
58         if e.err != nil {
59                 log.Printf("decoding yaml for log row %d: %s", e.LogID, e.err)
60                 return nil
61         }
62         e.logRow = &logRow
63         return e.logRow
64 }