github.com/voedger/voedger@v0.0.0-20240520144910-273e84102129/pkg/sys/workspace/utils.go (about) 1 /* 2 * Copyright (c) 2022-present unTill Pro, Ltd. 3 */ 4 5 package workspace 6 7 import ( 8 "context" 9 10 "github.com/voedger/voedger/pkg/appdef" 11 "github.com/voedger/voedger/pkg/istructs" 12 "github.com/voedger/voedger/pkg/projectors" 13 14 coreutils "github.com/voedger/voedger/pkg/utils" 15 ) 16 17 func validateWSKindInitializationData(as istructs.IAppStructs, data map[string]interface{}, t appdef.IType) (err error) { 18 reb := as.Events().GetNewRawEventBuilder( 19 istructs.NewRawEventBuilderParams{ 20 GenericRawEventBuilderParams: istructs.GenericRawEventBuilderParams{ 21 QName: t.QName(), 22 }, 23 }, 24 ) 25 aob := reb.ArgumentObjectBuilder() 26 aob.PutQName(appdef.SystemField_QName, t.QName()) 27 aob.PutRecordID(appdef.SystemField_ID, 1) 28 if err = coreutils.MapToObject(data, aob); err != nil { 29 return err 30 } 31 _, err = aob.Build() 32 return 33 } 34 35 // kept here because impossible to define in sql 36 func provideViewNextWSID(appDefBuilder appdef.IAppDefBuilder) { 37 projectors.ProvideViewDef(appDefBuilder, QNameViewNextBaseWSID, func(b appdef.IViewBuilder) { 38 b.Key().PartKey().AddField(fldDummy1, appdef.DataKind_int32) 39 b.Key().ClustCols().AddField(fldDummy2, appdef.DataKind_int32) 40 b.Value().AddField(fldNextBaseWSID, appdef.DataKind_int64, true) 41 }) 42 } 43 44 // TODO: works correct in Community Edition only. Have >1 VVM -> need to lock in a different way 45 func GetNextWSID(ctx context.Context, appStructs istructs.IAppStructs, clusterID istructs.ClusterID) (istructs.WSID, error) { 46 vr := appStructs.ViewRecords() 47 kb := vr.KeyBuilder(QNameViewNextBaseWSID) 48 kb.PartitionKey().PutInt32(fldDummy1, 1) 49 kb.ClusteringColumns().PutInt32(fldDummy2, 1) // no clustering columns -> storage driver behaviour is unknown 50 nextBaseWSID := istructs.FirstBaseUserWSID 51 nextWSIDGlobalLock.Lock() 52 defer nextWSIDGlobalLock.Unlock() 53 err := vr.Read(ctx, istructs.NullWSID, kb, func(key istructs.IKey, value istructs.IValue) (err error) { 54 if nextBaseWSID != istructs.FirstBaseUserWSID { 55 panic(">1 records in view NextBaseWSID") 56 } 57 nextBaseWSID = istructs.WSID(value.AsInt64(fldNextBaseWSID)) 58 return nil 59 }) 60 if err != nil { 61 return 0, err 62 } 63 vb := vr.NewValueBuilder(QNameViewNextBaseWSID) 64 vb.PutInt64(fldNextBaseWSID, int64(nextBaseWSID+1)) 65 if err := vr.Put(istructs.NullWSID, kb, vb); err != nil { 66 return 0, err 67 } 68 return istructs.NewWSID(clusterID, nextBaseWSID), nil 69 }