database

package
v0.10.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Oct 20, 2026 License: GPL-3.0 Imports: 19 Imported by: 0

Documentation

Index

Constants

View Source
const (
	CacheEntryArtifact = "artifact"
	CacheEntryMetadata = "metadata"
)

Kinds of CacheEntry.

View Source
const (
	SourceUpstream = "upstream"
	SourceLocal    = "local"
)

Artifact sources. Upstream artifacts are a cache of a registry and may be evicted; local artifacts were pushed to the proxy and are only removed by a delete.

View Source
const SchemaVersion = 1

Variables

This section is empty.

Functions

func Exists

func Exists(path string) bool

func VersionFromPURL added in v0.7.0

func VersionFromPURL(p string) string

VersionFromPURL extracts the decoded version string from a PURL.

PURL percent-encodes characters that are not safe in a path component, so a Debian version like "7.91+dfsg1-2ubuntu0.1" is stored as "pkg:deb/nmap@7.91%2Bdfsg1-2ubuntu0.1". The raw substring after "@" is therefore not the version: it must be percent-decoded before being displayed or used to build a URL, otherwise "%2B" leaks into the UI and round-tripping the value back into a PURL double-encodes it.

e.g., "pkg:npm/lodash@4.17.21" -> "4.17.21"

Types

type Artifact

type Artifact struct {
	ID             int64          `db:"id" json:"id"`
	VersionPURL    string         `db:"version_purl" json:"version_purl"`
	Filename       string         `db:"filename" json:"filename"`
	UpstreamURL    string         `db:"upstream_url" json:"upstream_url"`
	StoragePath    sql.NullString `db:"storage_path" json:"storage_path,omitempty"`
	ContentHash    sql.NullString `db:"content_hash" json:"content_hash,omitempty"`
	Size           sql.NullInt64  `db:"size" json:"size,omitempty"`
	ContentType    sql.NullString `db:"content_type" json:"content_type,omitempty"`
	FetchedAt      sql.NullTime   `db:"fetched_at" json:"fetched_at,omitempty"`
	HitCount       int64          `db:"hit_count" json:"hit_count"`
	LastAccessedAt sql.NullTime   `db:"last_accessed_at" json:"last_accessed_at,omitempty"`
	CreatedAt      time.Time      `db:"created_at" json:"created_at"`
	UpdatedAt      time.Time      `db:"updated_at" json:"updated_at"`
	Source         string         `db:"source" json:"source"`
	Manifest       sql.NullString `db:"manifest" json:"manifest,omitempty"`
}

Artifact represents a cached artifact in the database. This table is proxy-specific and not part of git-pkgs.

func (*Artifact) IsCached

func (a *Artifact) IsCached() bool

IsCached returns true if the artifact has been fetched and stored locally.

type CacheEntry added in v0.10.0

type CacheEntry struct {
	Kind           string         `db:"kind"`
	Key            string         `db:"cache_key"`
	Name           string         `db:"name"`
	StoragePath    sql.NullString `db:"storage_path"`
	Size           sql.NullInt64  `db:"size"`
	LastAccessedAt sql.NullTime   `db:"last_accessed_at"`
	FetchedAt      sql.NullTime   `db:"fetched_at"`
	UpdatedAt      sql.NullTime   `db:"updated_at"`
}

CacheEntry is a cached object size eviction can remove: an artifact fetched from upstream or a metadata document. For an artifact Key is its version PURL and Name its filename; for metadata Key is the ecosystem and Name the cache key. FetchedAt is only read for artifacts, UpdatedAt for metadata not backfilled yet.

type CacheStats

type CacheStats struct {
	TotalPackages   int64
	TotalVersions   int64
	TotalArtifacts  int64
	TotalSize       int64
	TotalHits       int64
	EcosystemCounts map[string]int64
}

type CachedArtifact added in v0.7.0

type CachedArtifact struct {
	Ecosystem   string
	StoragePath string
	Artifact    artifacts.Artifact
	Integrity   sql.NullString
}

CachedArtifact contains the fields needed to serve a cached artifact.

type DB

type DB struct {
	*sqlx.DB
	// contains filtered or unexported fields
}

func Create

func Create(path string) (*DB, error)

func Open

func Open(path string) (*DB, error)

func OpenOrCreate

func OpenOrCreate(path string) (*DB, error)

func OpenPostgres

func OpenPostgres(url string) (*DB, error)

func OpenPostgresOrCreate

func OpenPostgresOrCreate(url string) (*DB, error)

func (*DB) BackfillMetadataLastAccessed added in v0.10.0

func (db *DB) BackfillMetadataLastAccessed(limit int) (int, error)

BackfillMetadataLastAccessed sets last_accessed_at from the write time on up to limit rows that have none, in one transaction, and reports how many it set. Rows served in the meantime keep the time of that hit.

func (*DB) BatchHits added in v0.9.1

func (db *DB) BatchHits(interval time.Duration, logger *slog.Logger)

BatchHits makes RecordArtifactHit buffer hits and write them every interval. An interval of zero or less leaves every hit written immediately. Close writes whatever is still pending. Failed writes are logged to logger.

func (*DB) ClearArtifactCache

func (db *DB) ClearArtifactCache(versionPURL, filename, storagePath string) (bool, error)

ClearArtifactCache marks an artifact uncached if its record still points at storagePath, and reports whether it did. A record a newer fetch has moved elsewhere is left alone, so a clear never orphans the object that fetch committed.

func (*DB) ClearExpiredArtifact added in v0.10.0

func (db *DB) ClearExpiredArtifact(versionPURL, filename, storagePath string, cutoff time.Time) (bool, error)

ClearExpiredArtifact marks an artifact uncached like ClearArtifactCache, but only while it is still expired before cutoff, so an artifact served between the scan and the clear stays cached. It queues storagePath for deletion in the same transaction: if queueing fails, the record keeps its path and a later sweep tries again, instead of the object staying in storage with nothing left pointing at it.

func (*DB) Close added in v0.9.1

func (db *DB) Close() error

Close writes any batched hits, then closes the database.

func (*DB) CountCachedPackages

func (db *DB) CountCachedPackages(ecosystem string) (int64, error)

func (*DB) CountCachedPackagesByEcosystem added in v0.9.1

func (db *DB) CountCachedPackagesByEcosystem() (map[string]int64, error)

CountCachedPackagesByEcosystem counts packages with at least one stored artifact.

func (*DB) CountSearchResults

func (db *DB) CountSearchResults(query string, ecosystem string) (int64, error)

func (*DB) CreateSchema

func (db *DB) CreateSchema() error

func (*DB) DeleteLocalArtifacts added in v0.10.0

func (db *DB) DeleteLocalArtifacts(versionPURL string) (int, error)

DeleteLocalArtifacts removes the pushed artifacts of a version and queues their stored objects for deletion in the same transaction, so a failed queue keeps the records instead of orphaning the objects. Artifacts cached from an upstream are left alone. It returns how many records it removed.

func (*DB) DeleteVulnerabilitiesForPackage

func (db *DB) DeleteVulnerabilitiesForPackage(ecosystem, name string) error

func (*DB) Dialect

func (db *DB) Dialect() Dialect

func (*DB) DiscardArtifact added in v0.9.0

func (db *DB) DiscardArtifact(versionPURL, filename, storagePath string) error

DiscardArtifact clears the record as ClearArtifactCache does and queues storagePath for deletion, for callers that must not delete an object another request may be reading.

func (*DB) EnsureArtifactsTable

func (db *DB) EnsureArtifactsTable() error

EnsureArtifactsTable adds the artifacts table to an existing database (e.g., a git-pkgs database) if it doesn't already exist.

func (*DB) EnsureMetadataCacheTable

func (db *DB) EnsureMetadataCacheTable() error

EnsureMetadataCacheTable creates the metadata_cache table if it doesn't exist.

func (*DB) EvictMetadataCache added in v0.10.0

func (db *DB) EvictMetadataCache(ecosystem, name, storagePath string, lastAccessed sql.NullTime) (bool, error)

EvictMetadataCache deletes a metadata cache row if it still points at storagePath and has not been used since lastAccessed, queueing the path in the same transaction so a crash before the blob is deleted cannot orphan it.

func (*DB) FlushHits added in v0.10.0

func (db *DB) FlushHits() error

FlushHits writes hits buffered by BatchHits now, so a caller about to read last_accessed_at sees them.

func (*DB) GetArtifact

func (db *DB) GetArtifact(versionPURL, filename string) (*Artifact, error)

func (*DB) GetArtifactByPath

func (db *DB) GetArtifactByPath(storagePath string) (*Artifact, error)

func (*DB) GetArtifactEcosystem added in v0.10.0

func (db *DB) GetArtifactEcosystem(versionPURL string) (string, error)

GetArtifactEcosystem returns the packages.ecosystem value of the package an artifact version belongs to, or "" when it has no package record.

func (*DB) GetArtifactsByVersionPURL

func (db *DB) GetArtifactsByVersionPURL(versionPURL string) ([]Artifact, error)

func (*DB) GetCacheStats

func (db *DB) GetCacheStats() (*CacheStats, error)

func (*DB) GetCachedArtifact added in v0.7.0

func (db *DB) GetCachedArtifact(packagePURL, versionPURL, filename string) (*CachedArtifact, error)

GetCachedArtifact returns the fields needed to serve a cached artifact.

func (*DB) GetCachedArtifactCount

func (db *DB) GetCachedArtifactCount() (int64, error)

func (*DB) GetDuePendingDeletes added in v0.9.0

func (db *DB) GetDuePendingDeletes(cutoff time.Time, limit int) ([]string, error)

GetDuePendingDeletes returns up to limit paths queued before cutoff, oldest first. A path a record points at again is skipped: a metadata document is stored at a path fixed by its key, so one fetched again after eviction reuses the path queued for it.

func (*DB) GetEcosystemStats added in v0.9.1

func (db *DB) GetEcosystemStats() ([]EcosystemStats, error)

GetEcosystemStats returns per-ecosystem cache and download totals, ordered by accumulated download volume descending. Ecosystems with rows in packages but nothing cached are included with zeroed artifact counters.

Artifacts evicted from the cache no longer contribute: eviction clears the size column, so their historical hits drop out of the accumulated total.

func (*DB) GetEnrichmentStats

func (db *DB) GetEnrichmentStats() (*EnrichmentStats, error)

func (*DB) GetEvictableCacheSize added in v0.10.0

func (db *DB) GetEvictableCacheSize() (int64, error)

GetEvictableCacheSize returns the bytes max_size limits: cached upstream artifacts and cached metadata documents.

func (*DB) GetLeastRecentlyUsedArtifacts

func (db *DB) GetLeastRecentlyUsedArtifacts(limit int) ([]Artifact, error)

func (*DB) GetLeastRecentlyUsedCacheEntries added in v0.10.0

func (db *DB) GetLeastRecentlyUsedCacheEntries(limit int) ([]CacheEntry, error)

GetLeastRecentlyUsedCacheEntries returns up to limit artifacts and metadata documents, least recently used first. An artifact counts as used when it was fetched until it is first served, so a fresh download does not go before every metadata document. Each kind is read in order on its own and the two are merged here, which keeps the queries simple for both dialects.

func (*DB) GetLocalArtifacts added in v0.10.0

func (db *DB) GetLocalArtifacts(packagePURL string) ([]LocalArtifact, error)

GetLocalArtifacts returns the artifacts pushed to the proxy for a package, ordered by version and filename.

func (*DB) GetMetadataCache

func (db *DB) GetMetadataCache(ecosystem, name string) (*MetadataCacheEntry, error)

func (*DB) GetMetadataCacheStats added in v0.10.0

func (db *DB) GetMetadataCacheStats() ([]MetadataCacheStats, error)

GetMetadataCacheStats returns the number and total size of cached metadata documents per ecosystem, largest first. Ecosystem names are normalized so aliases such as "gem" and "rubygems" share one row. Rows written before sizes were recorded count as entries with no size.

func (*DB) GetMetadataDate added in v0.10.0

func (db *DB) GetMetadataDate(ecosystem, proxyURL, name string) (*MetadataDate, error)

GetMetadataDate returns the date recorded for a package's metadata as rewritten for proxyURL, or nil when there is none.

func (*DB) GetMostPopularPackages

func (db *DB) GetMostPopularPackages(limit int) ([]PopularPackage, error)

func (*DB) GetPackageByEcosystemName

func (db *DB) GetPackageByEcosystemName(ecosystem, name string) (*Package, error)

func (*DB) GetPackageByPURL

func (db *DB) GetPackageByPURL(purl string) (*Package, error)

func (*DB) GetPackagesNeedingVulnSync

func (db *DB) GetPackagesNeedingVulnSync(limit int, minAge time.Duration) ([]Package, error)

func (*DB) GetRecentlyCachedPackages

func (db *DB) GetRecentlyCachedPackages(limit int) ([]RecentPackage, error)

func (*DB) GetRetentionCandidates added in v0.10.0

func (db *DB) GetRetentionCandidates(fromID, toID int64, cutoff time.Time) ([]RetentionCandidate, error)

GetRetentionCandidates returns the cached artifacts with fromID < id <= toID that expired before cutoff. Bounding the scan by id keeps each query short, which matters on SQLite, where every request shares one connection.

func (*DB) GetTotalCacheSize

func (db *DB) GetTotalCacheSize() (int64, error)

func (*DB) GetVersionByPURL

func (db *DB) GetVersionByPURL(purl string) (*Version, error)

func (*DB) GetVersionsByPackagePURL

func (db *DB) GetVersionsByPackagePURL(packagePURL string) ([]Version, error)

func (*DB) GetVulnCountForPackage

func (db *DB) GetVulnCountForPackage(ecosystem, name string) (int64, error)

func (*DB) GetVulnerabilitiesForPackage

func (db *DB) GetVulnerabilitiesForPackage(ecosystem, name string) ([]Vulnerability, error)

func (*DB) GetVulnsSyncedAt

func (db *DB) GetVulnsSyncedAt(ecosystem, name string) (time.Time, error)

func (*DB) HasColumn

func (db *DB) HasColumn(table, column string) (bool, error)

HasColumn checks if a column exists in a table.

func (*DB) HasTable

func (db *DB) HasTable(name string) (bool, error)

HasTable checks if a table exists in the database.

func (*DB) InsertMetadataDate added in v0.10.0

func (db *DB) InsertMetadataDate(ecosystem, proxyURL, name string, date MetadataDate) (bool, error)

InsertMetadataDate records the first date of a package's metadata and reports whether it did; it leaves a date another replica recorded first.

func (*DB) ListCachedPackages

func (db *DB) ListCachedPackages(ecosystem string, sortBy string, limit int, offset int) ([]PackageListItem, error)

func (*DB) MarkArtifactCached

func (db *DB) MarkArtifactCached(versionPURL, filename, storagePath, contentHash string, size int64, contentType string) error

func (*DB) MaxArtifactID added in v0.10.0

func (db *DB) MaxArtifactID() (int64, error)

MaxArtifactID returns the highest artifact id, or zero for an empty table.

func (*DB) MigrateSchema

func (db *DB) MigrateSchema() error

MigrateSchema applies any unapplied migrations in order. For a fully migrated database this executes a single SELECT query.

func (*DB) OptimizeForBulkWrites

func (db *DB) OptimizeForBulkWrites() error

func (*DB) OptimizeForReads

func (db *DB) OptimizeForReads() error

func (*DB) Path

func (db *DB) Path() string

func (*DB) QueuePendingDelete added in v0.9.0

func (db *DB) QueuePendingDelete(path string) error

QueuePendingDelete queues a storage path no record points at any more. Queueing a path again, as reclaim does after a failed delete, restarts its grace period and moves it behind the rest.

func (*DB) Rebind

func (db *DB) Rebind(query string) string

func (*DB) RecordArtifactHit

func (db *DB) RecordArtifactHit(versionPURL, filename string) error

func (*DB) RecordMetadataHit added in v0.10.0

func (db *DB) RecordMetadataHit(ecosystem, name string) error

RecordMetadataHit marks a cached metadata document as served now. Like RecordArtifactHit it is buffered when BatchHits is on.

func (*DB) RefreshMetadataCache added in v0.10.0

func (db *DB) RefreshMetadataCache(ecosystem, name, digest string, fetchedAt time.Time) (bool, error)

RefreshMetadataCache sets fetched_at on the metadata cache row for ecosystem and name, provided the row still records digest, and reports whether it did. It is for an upstream 304, which leaves the stored document as it is.

func (*DB) RemovePendingDelete added in v0.9.0

func (db *DB) RemovePendingDelete(path string) error

RemovePendingDelete drops a deleted path from the queue.

func (*DB) SchemaVersion

func (db *DB) SchemaVersion() (int, error)

func (*DB) SearchPackages

func (db *DB) SearchPackages(query string, ecosystem string, limit int, offset int) ([]SearchResult, error)

func (*DB) SetVersionPublishedAt added in v0.8.0

func (db *DB) SetVersionPublishedAt(versionPURL, packagePURL string, publishedAt time.Time) error

SetVersionPublishedAt records a version's publish time, creating the versions row if the proxy has not seen the version yet. It only writes published_at, so it never disturbs enrichment data on an existing row.

func (*DB) SetVulnsSyncedAt

func (db *DB) SetVulnsSyncedAt(ecosystem, name string) error

func (*DB) SwapMetadataDate added in v0.10.0

func (db *DB) SwapMetadataDate(ecosystem, proxyURL, name string, old, next MetadataDate) (bool, error)

SwapMetadataDate replaces a package's date with next if it is still old, and reports whether it did; it leaves a date another replica swapped in.

func (*DB) UpsertArtifact

func (db *DB) UpsertArtifact(a *Artifact) error

func (*DB) UpsertMetadataCache

func (db *DB) UpsertMetadataCache(entry *MetadataCacheEntry) error

UpsertMetadataCache writes entry and marks it accessed now, since a document is stored because a request asked for it.

func (*DB) UpsertPackage

func (db *DB) UpsertPackage(pkg *Package) error

func (*DB) UpsertVersion

func (db *DB) UpsertVersion(v *Version) error

func (*DB) UpsertVulnerability

func (db *DB) UpsertVulnerability(v *Vulnerability) error

type Dialect

type Dialect string
const (
	DialectSQLite   Dialect = "sqlite"
	DialectPostgres Dialect = "postgres"
)

type EcosystemStats added in v0.9.1

type EcosystemStats struct {
	Ecosystem       string `db:"ecosystem"`
	Packages        int64  `db:"packages"`
	Versions        int64  `db:"versions"`
	Artifacts       int64  `db:"artifacts"`
	CacheSize       int64  `db:"cache_size"`
	Downloads       int64  `db:"downloads"`
	DownloadedBytes int64  `db:"downloaded_bytes"`
}

EcosystemStats aggregates cache and download activity for one ecosystem.

DownloadedBytes is the accumulated download volume: every cache hit on an artifact served its full size, so the sum of hit_count * size is the number of bytes the proxy has handed to clients from cache for this ecosystem.

type EnrichmentStats

type EnrichmentStats struct {
	TotalPackages        int64
	EnrichedPackages     int64
	VulnSyncedPackages   int64
	TotalVulnerabilities int64
	CriticalVulns        int64
	HighVulns            int64
	MediumVulns          int64
	LowVulns             int64
}

type LocalArtifact added in v0.10.0

type LocalArtifact struct {
	Artifact
	Integrity sql.NullString `db:"integrity"`
}

LocalArtifact is a pushed artifact with the integrity of its version.

type MetadataCacheEntry

type MetadataCacheEntry struct {
	ID              int64          `db:"id" json:"id"`
	Ecosystem       string         `db:"ecosystem" json:"ecosystem"`
	Name            string         `db:"name" json:"name"`
	StoragePath     string         `db:"storage_path" json:"storage_path"`
	ETag            sql.NullString `db:"etag" json:"etag,omitempty"`
	Link            sql.NullString `db:"link" json:"link,omitempty"`
	ContentType     sql.NullString `db:"content_type" json:"content_type,omitempty"`
	ContentEncoding sql.NullString `db:"content_encoding" json:"content_encoding,omitempty"`
	ContentDigest   sql.NullString `db:"content_digest" json:"content_digest,omitempty"`
	Size            sql.NullInt64  `db:"size" json:"size,omitempty"`
	LastModified    sql.NullTime   `db:"last_modified" json:"last_modified,omitempty"`
	FetchedAt       sql.NullTime   `db:"fetched_at" json:"fetched_at,omitempty"`
	LastAccessedAt  sql.NullTime   `db:"last_accessed_at" json:"last_accessed_at,omitempty"`
	CreatedAt       time.Time      `db:"created_at" json:"created_at"`
	UpdatedAt       time.Time      `db:"updated_at" json:"updated_at"`
}

MetadataCacheEntry represents a cached metadata blob for offline serving.

type MetadataCacheStats added in v0.10.0

type MetadataCacheStats struct {
	Ecosystem string
	Entries   int64
	Size      int64
}

MetadataCacheStats is one ecosystem's share of the metadata cache.

type MetadataDate added in v0.10.0

type MetadataDate struct {
	ETag         string
	LastModified time.Time
}

MetadataDate is the Last-Modified a package's rewritten metadata is served with, and the ETag of the rewrite it dates.

Rewritten metadata has no date of its own, so the proxy assigns one when a package starts serving a new rewrite. Keeping it in the database rather than in process memory is what lets replicas sharing the database agree on it: a date one replica gave out is never given by another to a different rewrite.

type Package

type Package struct {
	ID            int64          `db:"id" json:"id"`
	PURL          string         `db:"purl" json:"purl"`
	Ecosystem     string         `db:"ecosystem" json:"ecosystem"`
	Name          string         `db:"name" json:"name"`
	LatestVersion sql.NullString `db:"latest_version" json:"latest_version,omitempty"`
	License       sql.NullString `db:"license" json:"license,omitempty"`
	Description   sql.NullString `db:"description" json:"description,omitempty"`
	Homepage      sql.NullString `db:"homepage" json:"homepage,omitempty"`
	RepositoryURL sql.NullString `db:"repository_url" json:"repository_url,omitempty"`
	RegistryURL   sql.NullString `db:"registry_url" json:"registry_url,omitempty"`
	SupplierName  sql.NullString `db:"supplier_name" json:"supplier_name,omitempty"`
	SupplierType  sql.NullString `db:"supplier_type" json:"supplier_type,omitempty"`
	Source        sql.NullString `db:"source" json:"source,omitempty"`
	EnrichedAt    sql.NullTime   `db:"enriched_at" json:"enriched_at,omitempty"`
	VulnsSyncedAt sql.NullTime   `db:"vulns_synced_at" json:"vulns_synced_at,omitempty"`
	CreatedAt     time.Time      `db:"created_at" json:"created_at"`
	UpdatedAt     time.Time      `db:"updated_at" json:"updated_at"`
}

Package represents a package in the database. Schema is compatible with git-pkgs.

type PackageListItem

type PackageListItem struct {
	Ecosystem     string         `db:"ecosystem"`
	Name          string         `db:"name"`
	LatestVersion sql.NullString `db:"latest_version"`
	License       sql.NullString `db:"license"`
	Hits          int64          `db:"hits"`
	Size          int64          `db:"size"`
	CachedAt      sql.NullString `db:"cached_at"`
	VulnCount     int64          `db:"vuln_count"`
}

type PopularPackage

type PopularPackage struct {
	Ecosystem string `db:"ecosystem"`
	Name      string `db:"name"`
	Hits      int64  `db:"hits"`
	Size      int64  `db:"size"`
}

type RecentPackage

type RecentPackage struct {
	Ecosystem   string    `db:"ecosystem"`
	Name        string    `db:"name"`
	VersionPURL string    `db:"version_purl"`
	CachedAt    time.Time `db:"fetched_at"`
	Size        int64     `db:"size"`
	// Version is derived from VersionPURL rather than selected, so that the
	// PURL percent-encoding is decoded (e.g. "%2B" back to "+").
	Version string `db:"-"`
}

type RetentionCandidate added in v0.10.0

type RetentionCandidate struct {
	ID             int64         `db:"id"`
	VersionPURL    string        `db:"version_purl"`
	Filename       string        `db:"filename"`
	StoragePath    string        `db:"storage_path"`
	Size           sql.NullInt64 `db:"size"`
	FetchedAt      sql.NullTime  `db:"fetched_at"`
	LastAccessedAt sql.NullTime  `db:"last_accessed_at"`
	Ecosystem      string        `db:"ecosystem"`
	PackagePURL    string        `db:"package_purl"`
}

RetentionCandidate is a cached artifact that has not been accessed since a cutoff, together with the package record it belongs to.

func (RetentionCandidate) ExpiredBefore added in v0.10.0

func (c RetentionCandidate) ExpiredBefore(cutoff time.Time) bool

ExpiredBefore reports whether the artifact was neither fetched nor accessed at or after cutoff. Both are checked: clearing a record keeps its last access time, so a record fetched again after an eviction has a fresh fetch time next to an old access time.

type SearchResult

type SearchResult struct {
	Ecosystem     string         `db:"ecosystem"`
	Name          string         `db:"name"`
	LatestVersion sql.NullString `db:"latest_version"`
	License       sql.NullString `db:"license"`
	Hits          int64          `db:"hits"`
	Size          int64          `db:"size"`
	CachedAt      sql.NullString `db:"cached_at"`
}

type Version

type Version struct {
	ID          int64          `db:"id" json:"id"`
	PURL        string         `db:"purl" json:"purl"`
	PackagePURL string         `db:"package_purl" json:"package_purl"`
	License     sql.NullString `db:"license" json:"license,omitempty"`
	PublishedAt sql.NullTime   `db:"published_at" json:"published_at,omitempty"`
	Integrity   sql.NullString `db:"integrity" json:"integrity,omitempty"`
	Yanked      bool           `db:"yanked" json:"yanked"`
	Source      sql.NullString `db:"source" json:"source,omitempty"`
	EnrichedAt  sql.NullTime   `db:"enriched_at" json:"enriched_at,omitempty"`
	CreatedAt   time.Time      `db:"created_at" json:"created_at"`
	UpdatedAt   time.Time      `db:"updated_at" json:"updated_at"`
}

Version represents a package version in the database. Schema is compatible with git-pkgs.

func (*Version) DisplayPURL added in v0.7.0

func (v *Version) DisplayPURL() string

DisplayPURL returns the PURL with its path components percent-decoded, for showing in the UI. The stored PURL keeps the canonical encoding (which is what the API and all lookups use); this is only a readable rendering, so that a version like "7.91+dfsg1-2ubuntu0.1" is not shown as "7.91%2Bdfsg1-2ubuntu0.1" and an npm scope is shown as "@babel" rather than "%40babel". Qualifiers and subpath keep their encoding, since decoding those would be ambiguous.

func (*Version) EscapedVersion added in v0.7.0

func (v *Version) EscapedVersion() string

EscapedVersion returns the version escaped for use as a single URL path segment.

Version returns decoded text, which is what should be shown to a user but is not safe to drop into a link: html/template preserves reserved characters and existing escapes in a URL, so "release/1" would split into two path segments, "v1?build" would start a query string, and a literal "%2B" would be read back as "+". Escaping here and decoding in splitWildcardPath round-trips the value, so the link resolves to the version that was stored.

func (*Version) Version

func (v *Version) Version() string

Version extracts the version string from the PURL. e.g., "pkg:npm/lodash@4.17.21" -> "4.17.21"

type Vulnerability

type Vulnerability struct {
	ID           int64           `db:"id" json:"id"`
	VulnID       string          `db:"vuln_id" json:"vuln_id"`
	Ecosystem    string          `db:"ecosystem" json:"ecosystem"`
	PackageName  string          `db:"package_name" json:"package_name"`
	Severity     sql.NullString  `db:"severity" json:"severity,omitempty"`
	Summary      sql.NullString  `db:"summary" json:"summary,omitempty"`
	FixedVersion sql.NullString  `db:"fixed_version" json:"fixed_version,omitempty"`
	CVSSScore    sql.NullFloat64 `db:"cvss_score" json:"cvss_score,omitempty"`
	References   sql.NullString  `db:"references" json:"references,omitempty"`
	FetchedAt    sql.NullTime    `db:"fetched_at" json:"fetched_at,omitempty"`
	CreatedAt    time.Time       `db:"created_at" json:"created_at"`
	UpdatedAt    time.Time       `db:"updated_at" json:"updated_at"`
}

Vulnerability represents a cached vulnerability record.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL