@@ -3,11 +3,7 @@ package flowstate
33import (
44 "encoding/base64"
55 "fmt"
6- "strconv"
7- "strings"
86 "time"
9-
10- "github.com/oklog/ulid/v2"
117)
128
139var _ Command = & TransitCommand {}
@@ -30,10 +26,6 @@ var _ Command = &GetStatesCommand{}
3026
3127var _ Command = & GetDelayedStatesCommand {}
3228
33- var _ Command = & AttachDataCommand {}
34-
35- var _ Command = & GetDataCommand {}
36-
3729var _ Command = & CommitCommand {}
3830
3931var _ Command = & ExecuteCommand {}
@@ -394,60 +386,47 @@ func (cmd *UnstackCommand) Do() error {
394386 return nil
395387}
396388
397- func AttachData (stateCtx * StateCtx , data * Data , alias string ) * AttachDataCommand {
398- return & AttachDataCommand {
389+ func StoreData (stateCtx * StateCtx , alias string ) * StoreDataCommand {
390+ return & StoreDataCommand {
399391 StateCtx : stateCtx ,
400- Data : data ,
401392 Alias : alias ,
402-
403- Store : true ,
404393 }
405394}
406395
407- type AttachDataCommand struct {
396+ type StoreDataCommand struct {
408397 command
409398 StateCtx * StateCtx
410- Data * Data
411399 Alias string
412- Store bool
413- }
414-
415- func (cmd * AttachDataCommand ) WithoutStore () * AttachDataCommand {
416- cmd .Store = false
417- return cmd
418400}
419401
420- func (cmd * AttachDataCommand ) Prepare () error {
421- if cmd .Alias == "" {
422- return fmt .Errorf ("alias is empty" )
423- }
424- if cmd .Data .ID == "" {
425- cmd .Data .ID = DataID (ulid .Make ().String ())
426- }
427- if cmd .Data .Rev < 0 {
428- return fmt .Errorf ("Data.Rev is negative" )
402+ func (cmd * StoreDataCommand ) Prepare () (bool , error ) {
403+ d , err := cmd .StateCtx .Data (cmd .Alias )
404+ if err != nil {
405+ return false , err
429406 }
430- if cmd .Data .B == nil || len (cmd .Data .B ) == 0 {
431- return fmt .Errorf ("Data.B is empty" )
407+
408+ if d .Rev < 0 {
409+ return false , fmt .Errorf ("data rev is negative" )
432410 }
433- if cmd .Data .Rev == 0 && ! cmd .Store {
434- return fmt .Errorf ("Data.Rev is zero, but Store is false; this would lead to data loss" )
411+
412+ if ! d .isDirty () {
413+ referenceData (cmd .StateCtx , cmd .Alias , d .Rev )
414+ return false , nil
435415 }
436416
437- return nil
417+ d .checksum ()
418+
419+ return true , nil
438420}
439421
440- func (cmd * AttachDataCommand ) Do () {
441- cmd .StateCtx .Current .SetAnnotation (
442- dataAnnotation (cmd .Alias ),
443- string (cmd .Data .ID )+ ":" + strconv .FormatInt (cmd .Data .Rev , 10 ),
444- )
422+ func (cmd * StoreDataCommand ) post () {
423+ d := cmd .StateCtx .MustData (cmd .Alias )
424+ referenceData (cmd .StateCtx , cmd .Alias , d .Rev )
445425}
446426
447- func GetData (stateCtx * StateCtx , data * Data , alias string ) * GetDataCommand {
427+ func GetData (stateCtx * StateCtx , alias string ) * GetDataCommand {
448428 return & GetDataCommand {
449429 StateCtx : stateCtx ,
450- Data : data ,
451430 Alias : alias ,
452431 }
453432
@@ -456,43 +435,32 @@ func GetData(stateCtx *StateCtx, data *Data, alias string) *GetDataCommand {
456435type GetDataCommand struct {
457436 command
458437 StateCtx * StateCtx
459- Data * Data
460438 Alias string
461439}
462440
463- func (cmd * GetDataCommand ) Prepare () error {
464- if cmd .Data == nil {
465- return fmt .Errorf ("data is nil" )
466- }
467- if cmd .Alias == "" {
468- return fmt .Errorf ("alias is empty" )
469- }
470-
471- annotKey := dataAnnotation (cmd .Alias )
472- idRevStr := cmd .StateCtx .Current .Annotations [annotKey ]
473- if idRevStr == "" {
474- return fmt .Errorf ("annotation %q is not set" , annotKey )
475- }
476-
477- sepIdx := strings .LastIndexAny (idRevStr , ":" )
478- if sepIdx < 1 || sepIdx + 1 == len (idRevStr ) {
479- return fmt .Errorf ("annotation %q contains invalid data reference; got %q" , annotKey , idRevStr )
441+ func (cmd * GetDataCommand ) Prepare () (bool , error ) {
442+ rev , err := dereferenceData (cmd .StateCtx , cmd .Alias )
443+ if err != nil {
444+ return false , err
480445 }
481446
482- id := DataID (idRevStr [:sepIdx ])
483- rev , err := strconv .ParseInt (idRevStr [sepIdx + 1 :], 10 , 64 )
447+ d , err := cmd .StateCtx .Data (cmd .Alias )
484448 if err != nil {
485- return fmt .Errorf ("annotation %q contains invalid data revision; got %q: %w" , annotKey , idRevStr [sepIdx + 1 :], err )
449+ cmd .StateCtx .SetData (cmd .Alias , & Data {
450+ Rev : rev ,
451+ })
452+ return true , nil
453+ } else if d .Rev == rev {
454+ return false , nil
486455 }
487456
488- cmd . Data . ID = id
489- cmd . Data . Rev = rev
490-
491- return nil
492- }
457+ d . Rev = rev
458+ d . Blob = d . Blob [: 0 ]
459+ for k := range d . Annotations {
460+ delete ( d . Annotations , k )
461+ }
493462
494- func dataAnnotation (alias string ) string {
495- return "flowstate.data." + string (alias )
463+ return true , nil
496464}
497465
498466func nextTransitionOrCurrent (stateCtx * StateCtx , to FlowID ) Transition {
0 commit comments