Replaced `FromInt64` with `FromInt` to simplify timestamp operations. Updated related methods, tests, and logic to consistently handle timestamps as integers, improving code clarity and reducing unnecessary conversions.
86 lines
1.8 KiB
Go
86 lines
1.8 KiB
Go
package database
|
|
|
|
import (
|
|
"bytes"
|
|
"time"
|
|
|
|
"x.realy.lol/chk"
|
|
"x.realy.lol/database/indexes"
|
|
"x.realy.lol/database/indexes/types/timestamp"
|
|
"x.realy.lol/database/indexes/types/varint"
|
|
"x.realy.lol/errorf"
|
|
"x.realy.lol/event"
|
|
)
|
|
|
|
func (d *D) StoreEvent(ev *event.E) (err error) {
|
|
var ev2 *event.E
|
|
if ev2, err = d.GetEventById(ev.GetIdBytes()); err != nil {
|
|
// so we didn't find it?
|
|
}
|
|
if ev2 != nil {
|
|
// we did found it
|
|
if ev.Id == ev2.Id {
|
|
err = errorf.E("duplicate event")
|
|
return
|
|
}
|
|
}
|
|
var ser *varint.V
|
|
var idxs [][]byte
|
|
if idxs, ser, err = d.GetEventIndexes(ev); chk.E(err) {
|
|
return
|
|
}
|
|
_ = idxs
|
|
evK := new(bytes.Buffer)
|
|
if err = indexes.EventEnc(ser).MarshalWrite(evK); chk.E(err) {
|
|
return
|
|
}
|
|
ts := ×tamp.T{}
|
|
ts.FromInt64(time.Now().Unix())
|
|
// FirstSeen
|
|
fsI := new(bytes.Buffer)
|
|
if err = indexes.FirstSeenEnc(ser, ts).MarshalWrite(fsI); chk.E(err) {
|
|
return
|
|
}
|
|
idxs = append(idxs, fsI.Bytes())
|
|
// write indexes; none of the above have values.
|
|
for _, v := range idxs {
|
|
if err = d.Set(v, nil); chk.E(err) {
|
|
return
|
|
}
|
|
}
|
|
// LastAccessed
|
|
laI := new(bytes.Buffer)
|
|
if err = indexes.LastAccessedEnc(ser).MarshalWrite(laI); chk.E(err) {
|
|
return
|
|
}
|
|
var tsb []byte
|
|
if tsb, err = ts.Bytes(); chk.E(err) {
|
|
return
|
|
}
|
|
if err = d.Set(laI.Bytes(), tsb); chk.E(err) {
|
|
return
|
|
}
|
|
// AccessCounter
|
|
acI := new(bytes.Buffer)
|
|
if err = indexes.AccessCounterEnc(ser).MarshalWrite(acI); chk.E(err) {
|
|
return
|
|
}
|
|
ac := varint.New()
|
|
if err = d.Set(acI.Bytes(), ac.Bytes()); chk.E(err) {
|
|
return
|
|
}
|
|
// lastly, the event
|
|
evk := new(bytes.Buffer)
|
|
if err = indexes.EventEnc(ser).MarshalWrite(evk); chk.E(err) {
|
|
return
|
|
}
|
|
evV := new(bytes.Buffer)
|
|
if err = ev.MarshalWrite(evV); chk.E(err) {
|
|
return
|
|
}
|
|
if err = d.Set(evk.Bytes(), evV.Bytes()); chk.E(err) {
|
|
return
|
|
}
|
|
return
|
|
}
|