go.mondoo.com/cnquery@v0.0.0-20231005093811-59568235f6ea/internal/datalakes/inmemory/inmemory.go (about)

     1  // Copyright (c) Mondoo, Inc.
     2  // SPDX-License-Identifier: BUSL-1.1
     3  
     4  package inmemory
     5  
     6  import (
     7  	"time"
     8  
     9  	"github.com/google/uuid"
    10  	"go.mondoo.com/cnquery/explorer"
    11  	"go.mondoo.com/cnquery/llx"
    12  )
    13  
    14  // Db is the database backend, it allows the interaction with the underlying data.
    15  type Db struct {
    16  	cache       kvStore
    17  	services    *explorer.LocalServices // bidirectional connection between db + services
    18  	uuid        string                  // used for all object identifiers to prevent clashes (eg in-memory pubsub)
    19  	nowProvider func() time.Time
    20  }
    21  
    22  // NewServices creates a new set of backend services
    23  func NewServices(runtime llx.Runtime) (*Db, *explorer.LocalServices, error) {
    24  	var cache kvStore = newKissDb()
    25  
    26  	db := &Db{
    27  		cache:       cache,
    28  		uuid:        uuid.New().String(),
    29  		nowProvider: time.Now,
    30  	}
    31  
    32  	services := explorer.NewLocalServices(db, db.uuid, runtime)
    33  	db.services = services // close the connection between db and services
    34  
    35  	return db, services, nil
    36  }
    37  
    38  // WithDb creates a new set of backend services and closes everything out once the function is done
    39  func WithDb(runtime llx.Runtime, f func(*Db, *explorer.LocalServices) error) error {
    40  	db, ls, err := NewServices(runtime)
    41  	if err != nil {
    42  		return err
    43  	}
    44  
    45  	return f(db, ls)
    46  }
    47  
    48  // Prefixes for all keys that are stored in the cache.
    49  // Prevent collisions by creating namespaces for different types of data.
    50  const (
    51  	dbIDQuery          = "q\x00"
    52  	dbIDQueryPack      = "qp\x00"
    53  	dbIDBundle         = "qb\x00"
    54  	dbIDListQueryPacks = "qpl\x00"
    55  	dbIDData           = "d\x00"
    56  	dbIDAsset          = "a\x00"
    57  	dbIDExecutionJob   = "ej\x00"
    58  	dbIDresolvedPack   = "rpa\x00"
    59  )
    60  
    61  func (db *Db) SetNowProvider(f func() time.Time) {
    62  	db.nowProvider = f
    63  }