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  }