mirror of
https://github.com/aptly-dev/aptly.git
synced 2026-01-12 03:21:33 +00:00
For any action which is multi-step (requires updating more than 1 DB key), use transaction to make update atomic. Also pack big chunks of updates (importing packages for importing and mirror updates) into single transaction to improve aptly performance and get some isolation. Note that still layers up (Collections) provide some level of isolation, so this is going to shine with the future PRs to remove collection locks. Spin-off of #459
122 lines
3.1 KiB
Go
122 lines
3.1 KiB
Go
package deb
|
|
|
|
import (
|
|
"sync"
|
|
|
|
"github.com/aptly-dev/aptly/aptly"
|
|
"github.com/aptly-dev/aptly/database"
|
|
)
|
|
|
|
// CollectionFactory is a single place to generate all desired collections
|
|
type CollectionFactory struct {
|
|
*sync.Mutex
|
|
db database.Storage
|
|
packages *PackageCollection
|
|
remoteRepos *RemoteRepoCollection
|
|
snapshots *SnapshotCollection
|
|
localRepos *LocalRepoCollection
|
|
publishedRepos *PublishedRepoCollection
|
|
checksums *ChecksumCollection
|
|
}
|
|
|
|
// NewCollectionFactory creates new factory
|
|
func NewCollectionFactory(db database.Storage) *CollectionFactory {
|
|
return &CollectionFactory{Mutex: &sync.Mutex{}, db: db}
|
|
}
|
|
|
|
// TemporaryDB creates new temporary DB
|
|
//
|
|
// DB should be closed/droped after being used
|
|
func (factory *CollectionFactory) TemporaryDB() (database.Storage, error) {
|
|
return factory.db.CreateTemporary()
|
|
}
|
|
|
|
// PackageCollection returns (or creates) new PackageCollection
|
|
func (factory *CollectionFactory) PackageCollection() *PackageCollection {
|
|
factory.Lock()
|
|
defer factory.Unlock()
|
|
|
|
if factory.packages == nil {
|
|
factory.packages = NewPackageCollection(factory.db)
|
|
}
|
|
|
|
return factory.packages
|
|
}
|
|
|
|
// RemoteRepoCollection returns (or creates) new RemoteRepoCollection
|
|
func (factory *CollectionFactory) RemoteRepoCollection() *RemoteRepoCollection {
|
|
factory.Lock()
|
|
defer factory.Unlock()
|
|
|
|
if factory.remoteRepos == nil {
|
|
factory.remoteRepos = NewRemoteRepoCollection(factory.db)
|
|
}
|
|
|
|
return factory.remoteRepos
|
|
}
|
|
|
|
// SnapshotCollection returns (or creates) new SnapshotCollection
|
|
func (factory *CollectionFactory) SnapshotCollection() *SnapshotCollection {
|
|
factory.Lock()
|
|
defer factory.Unlock()
|
|
|
|
if factory.snapshots == nil {
|
|
factory.snapshots = NewSnapshotCollection(factory.db)
|
|
}
|
|
|
|
return factory.snapshots
|
|
}
|
|
|
|
// LocalRepoCollection returns (or creates) new LocalRepoCollection
|
|
func (factory *CollectionFactory) LocalRepoCollection() *LocalRepoCollection {
|
|
factory.Lock()
|
|
defer factory.Unlock()
|
|
|
|
if factory.localRepos == nil {
|
|
factory.localRepos = NewLocalRepoCollection(factory.db)
|
|
}
|
|
|
|
return factory.localRepos
|
|
}
|
|
|
|
// PublishedRepoCollection returns (or creates) new PublishedRepoCollection
|
|
func (factory *CollectionFactory) PublishedRepoCollection() *PublishedRepoCollection {
|
|
factory.Lock()
|
|
defer factory.Unlock()
|
|
|
|
if factory.publishedRepos == nil {
|
|
factory.publishedRepos = NewPublishedRepoCollection(factory.db)
|
|
}
|
|
|
|
return factory.publishedRepos
|
|
}
|
|
|
|
// ChecksumCollection returns (or creates) new ChecksumCollection
|
|
func (factory *CollectionFactory) ChecksumCollection(db database.ReaderWriter) aptly.ChecksumStorage {
|
|
factory.Lock()
|
|
defer factory.Unlock()
|
|
|
|
if db != nil {
|
|
return NewChecksumCollection(db)
|
|
}
|
|
|
|
if factory.checksums == nil {
|
|
factory.checksums = NewChecksumCollection(factory.db)
|
|
}
|
|
|
|
return factory.checksums
|
|
}
|
|
|
|
// Flush removes all references to collections, so that memory could be reclaimed
|
|
func (factory *CollectionFactory) Flush() {
|
|
factory.Lock()
|
|
defer factory.Unlock()
|
|
|
|
factory.localRepos = nil
|
|
factory.snapshots = nil
|
|
factory.remoteRepos = nil
|
|
factory.publishedRepos = nil
|
|
factory.packages = nil
|
|
factory.checksums = nil
|
|
}
|