| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166 | /* * EliasDB * * Copyright 2016 Matthias Ladkau. All rights reserved. * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */package rumbleimport (	"fmt"	"strconv"	"devt.de/krotik/common/defs/rumble"	"devt.de/krotik/eliasdb/api"	"devt.de/krotik/eliasdb/graph")// Function: newTrans// ==================/*NewTransFunc creates a new transaction for EliasDB.*/type NewTransFunc struct {}/*Name returns the name of the function.*/func (f *NewTransFunc) Name() string {	return "db.newTrans"}/*Validate is called for parameter validation and to reset the function state.*/func (f *NewTransFunc) Validate(argsNum int, rt rumble.Runtime) rumble.RuntimeError {	var err rumble.RuntimeError	if argsNum != 0 {		err = rt.NewRuntimeError(rumble.ErrInvalidConstruct,			"Function newTrans does not require any parameters")	}	return err}/*Execute executes the rumble function.*/func (f *NewTransFunc) Execute(argsVal []interface{}, vars rumble.Variables,	rt rumble.Runtime) (interface{}, rumble.RuntimeError) {	return graph.NewConcurrentGraphTrans(api.GM), nil}// Function: newRollingTrans// =========================/*NewRollingTransFunc creates a new rolling transaction for EliasDB.A rolling transaction commits after n entries.*/type NewRollingTransFunc struct {}/*Name returns the name of the function.*/func (f *NewRollingTransFunc) Name() string {	return "db.newRollingTrans"}/*Validate is called for parameter validation and to reset the function state.*/func (f *NewRollingTransFunc) Validate(argsNum int, rt rumble.Runtime) rumble.RuntimeError {	var err rumble.RuntimeError	if argsNum != 1 {		err = rt.NewRuntimeError(rumble.ErrInvalidConstruct,			"Function newRollingTrans requires the rolling threshold (number of operations before rolling)")	}	return err}/*Execute executes the rumble function.*/func (f *NewRollingTransFunc) Execute(argsVal []interface{}, vars rumble.Variables,	rt rumble.Runtime) (interface{}, rumble.RuntimeError) {	i, err := strconv.Atoi(fmt.Sprint(argsVal[0]))	if err != nil {		return nil, rt.NewRuntimeError(rumble.ErrNotANumber,			fmt.Sprintf("Rolling threshold must be a number not: %v", argsVal[0]))	}	trans := graph.NewRollingTrans(graph.NewConcurrentGraphTrans(api.GM),		i, api.GM, graph.NewConcurrentGraphTrans)	return trans, nil}// Function: commitTrans// =====================/*CommitTransFunc commits an existing transaction for EliasDB.*/type CommitTransFunc struct {}/*Name returns the name of the function.*/func (f *CommitTransFunc) Name() string {	return "db.commitTrans"}/*Validate is called for parameter validation and to reset the function state.*/func (f *CommitTransFunc) Validate(argsNum int, rt rumble.Runtime) rumble.RuntimeError {	var err rumble.RuntimeError	if argsNum != 1 {		err = rt.NewRuntimeError(rumble.ErrInvalidConstruct,			"Function commitTrans	 requires the transaction to commit as parameter")	}	return err}/*Execute executes the rumble function.*/func (f *CommitTransFunc) Execute(argsVal []interface{}, vars rumble.Variables,	rt rumble.Runtime) (interface{}, rumble.RuntimeError) {	var err rumble.RuntimeError	trans, ok := argsVal[0].(graph.Trans)	// Check parameters	if !ok {		err = rt.NewRuntimeError(rumble.ErrInvalidConstruct,			"Parameter must be a transaction")	}	if err == nil {		if err = trans.Commit(); err != nil {			err = rt.NewRuntimeError(rumble.ErrInvalidConstruct,				fmt.Sprintf("Cannot store node: %v", err.Error()))		}	}	return nil, err}
 |