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 }