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