mirror of
https://github.com/Icinga/icingadb.git
synced 2026-02-03 20:40:34 -05:00
72 lines
2 KiB
Go
72 lines
2 KiB
Go
package common
|
|
|
|
import (
|
|
"github.com/icinga/icinga-go-library/database"
|
|
"github.com/icinga/icinga-go-library/types"
|
|
"github.com/icinga/icingadb/pkg/contracts"
|
|
v1 "github.com/icinga/icingadb/pkg/icingadb/v1"
|
|
)
|
|
|
|
// SyncSubject defines information about entities to be synchronized.
|
|
type SyncSubject struct {
|
|
entity database.Entity
|
|
factory database.EntityFactoryFunc
|
|
withChecksum bool
|
|
}
|
|
|
|
// NewSyncSubject returns a new SyncSubject.
|
|
func NewSyncSubject(factoryFunc database.EntityFactoryFunc) *SyncSubject {
|
|
e := factoryFunc()
|
|
|
|
var factory database.EntityFactoryFunc
|
|
if _, ok := e.(contracts.Initer); ok {
|
|
factory = func() database.Entity {
|
|
e := factoryFunc()
|
|
e.(contracts.Initer).Init()
|
|
|
|
return e
|
|
}
|
|
} else {
|
|
factory = factoryFunc
|
|
}
|
|
|
|
_, withChecksum := e.(contracts.Checksumer)
|
|
|
|
return &SyncSubject{
|
|
entity: e,
|
|
factory: factory,
|
|
withChecksum: withChecksum,
|
|
}
|
|
}
|
|
|
|
// Entity returns one value from the factory. Always returns the same entity.
|
|
func (s SyncSubject) Entity() database.Entity {
|
|
return s.entity
|
|
}
|
|
|
|
// Factory returns the entity factory function that calls Init() on the created contracts.Entity if applicable.
|
|
func (s SyncSubject) Factory() database.EntityFactoryFunc {
|
|
return s.factory
|
|
}
|
|
|
|
// FactoryForDelta behaves like Factory() unless s is WithChecksum().
|
|
// In the latter case it returns a factory for EntityWithChecksum instead.
|
|
// Rationale: Sync#ApplyDelta() uses its input entities which are WithChecksum() only for the delta itself
|
|
// and not for insertion into the database, so EntityWithChecksum is enough. And it consumes less memory.
|
|
func (s SyncSubject) FactoryForDelta() database.EntityFactoryFunc {
|
|
if s.withChecksum {
|
|
return v1.NewEntityWithChecksum
|
|
}
|
|
|
|
return s.factory
|
|
}
|
|
|
|
// Name returns the declared name of the entity.
|
|
func (s SyncSubject) Name() string {
|
|
return types.Name(s.entity)
|
|
}
|
|
|
|
// WithChecksum returns whether entities from the factory implement contracts.Checksumer.
|
|
func (s SyncSubject) WithChecksum() bool {
|
|
return s.withChecksum
|
|
}
|