Source File
version.go
Belonging Package
golang.org/x/pkgsite/internal/postgres
package postgres
import (
)
func ( *DB) ( context.Context, string) ( []*internal.ModuleInfo, error) {
defer derrors.WrapStack(&, "GetVersionsForPath(ctx, %q)", )
defer middleware.ElapsedStat(, "GetVersionsForPath")()
, := getPathVersions(, , , version.TypeRelease, version.TypePrerelease)
if != nil {
return nil,
}
if len() != 0 {
return , nil
}
, = getPathVersions(, , , version.TypePseudo)
if != nil {
return nil,
}
return , nil
}
func ( context.Context, *DB, string, ...version.Type) ( []*internal.ModuleInfo, error) {
defer derrors.WrapStack(&, "getPathVersions(ctx, db, %q, %v)", , )
:= `
SELECT
m.module_path,
m.version,
m.commit_time,
m.redistributable,
m.has_go_mod,
m.source_info
FROM modules m
INNER JOIN units u
ON u.module_id = m.id
WHERE
u.v1path_id = (
SELECT u2.v1path_id
FROM units as u2
INNER JOIN paths p
ON p.id = u2.path_id
WHERE p.path = $1
LIMIT 1
)
AND version_type in (%s)
ORDER BY
m.incompatible,
m.module_path DESC,
m.sort_version DESC %s`
:= `;`
if len() == 0 {
return nil, fmt.Errorf("error: must specify at least one version type")
} else if len() == 1 && [0] == version.TypePseudo {
= `LIMIT 10;`
}
:= fmt.Sprintf(, versionTypeExpr(), )
var []*internal.ModuleInfo
:= func( *sql.Rows) error {
, := scanModuleInfo(.Scan)
if != nil {
return fmt.Errorf("row.Scan(): %v", )
}
= append(, )
return nil
}
if := .db.RunQuery(, , , ); != nil {
return nil,
}
if := populateLatestInfos(, , ); != nil {
return nil,
}
return , nil
}
, := .GetLatestModuleVersions(, .ModulePath)
if != nil {
return
}
if != nil {
.PopulateModuleInfo()
}
return nil
}
func ( context.Context, *DB, []*internal.ModuleInfo) ( error) {
defer derrors.WrapStack(&, "populateLatestInfos(%d ModuleInfos)", len())
:= map[string]*internal.LatestModuleVersions{}
for , := range {
if , := [.ModulePath]; ! {
, := .GetLatestModuleVersions(, .ModulePath)
if != nil {
return
}
[.ModulePath] =
}
for , := range {
:= [.ModulePath]
if != nil {
.PopulateModuleInfo()
}
}
return nil
}
func ( *DB) ( context.Context, , string, *internal.UnitMeta) ( internal.LatestInfo, error) {
defer derrors.WrapStack(&, "DB.GetLatestInfo(ctx, %q, %q)", , )
defer middleware.ElapsedStat(, "DB.GetLatestInfo")()
, := errgroup.WithContext()
if != nil {
.MinorVersion = .Version
.MinorModulePath = .ModulePath
} else {
.Go(func() error {
, := .GetUnitMeta(, , internal.UnknownModulePath, internal.LatestVersion)
if != nil {
return
}
.MinorVersion = .Version
.MinorModulePath = .ModulePath
return nil
})
}
.Go(func() ( error) {
.MajorModulePath, .MajorUnitPath, = .getLatestMajorVersion(, , )
return
})
.Go(func() ( error) {
.UnitExistsAtMinor, = .unitExistsAtLatest(, , )
return
})
if := .Wait(); != nil {
return internal.LatestInfo{},
}
return , nil
}
func ( *DB) ( context.Context, , string) (, string, error) {
defer derrors.WrapStack(&, "DB.getLatestMajorVersion2(%q)", )
defer middleware.ElapsedStat(, "DB.getLatestMajorVersion")()
:= internal.SeriesPathForModule()
, , := squirrel.Select("p.path", "l.good_version").
From("latest_module_versions l").
Join("paths p ON p.id = l.module_path_id").
Where(squirrel.Eq{"l.series_path": }).
Where("NOT l.deprecated").
Where(squirrel.NotEq{"l.good_version": ""}).
PlaceholderFormat(squirrel.Dollar).
ToSql()
if != nil {
return "", "",
}
type struct {
, string
}
var []
= .db.RunQuery(, , func( *sql.Rows) error {
var
if := .Scan(&., &.); != nil {
return
}
= append(, )
return nil
}, ...)
if != nil {
return "", "",
}
if . == "" {
return "", "", nil
}
:= internal.V1Path(, )
:= .db.QueryRow(, `
SELECT p.path
FROM units u
INNER JOIN modules m ON m.id = u.module_id
INNER JOIN paths p ON p.id = u.path_id
INNER JOIN paths p2 ON p2.id = u.v1path_id
WHERE p2.path = $1 AND m.module_path = $2 AND m.version = $3`,
, ., .)
var string
switch := .Scan(&); {
case nil:
return ., , nil
case sql.ErrNoRows:
return ., ., nil
default:
return "", "",
}
}
func ( *DB) ( context.Context, , string) ( bool, error) {
defer derrors.WrapStack(&, "DB.unitExistsAtLatest(ctx, %q, %q)", , )
defer middleware.ElapsedStat(, "DB.unitExistsAtLatest")()
var string
, := .GetLatestModuleVersions(, )
if != nil {
return false,
}
= .GoodVersion
var int
= .db.QueryRow(, `
SELECT 1
FROM units u
INNER JOIN paths p ON p.id = u.path_id
INNER JOIN modules m ON m.id = u.module_id
WHERE p.path = $1 AND m.module_path = $2 AND m.version = $3
`, , , ).Scan(&)
switch {
case nil:
return true, nil
case sql.ErrNoRows:
return false, nil
default:
return false,
}
}
func ( *DB) ( context.Context, []string) ( []*internal.LatestModuleVersions, error) {
defer derrors.WrapStack(&, "getMultiLatestModuleVersions(%v)", )
defer middleware.ElapsedStat(, "getMultiLatestModuleVersions")()
:= func( *sql.Rows) error {
var (
, , , string
[]byte
)
if := .Scan(&, &, &, &, &); != nil {
return
}
, := internal.NewLatestModuleVersions(, , , , )
if != nil {
return
}
= append(, )
return nil
}
= .db.RunQuery(, `
SELECT p.path, r.raw_version, r.cooked_version, r.good_version, r.raw_go_mod_bytes
FROM latest_module_versions r
INNER JOIN paths p ON p.id = r.module_path_id
WHERE p.path = ANY($1)
AND r.status = 200
ORDER BY p.path DESC
`, , pq.Array())
if != nil {
return nil,
}
return , nil
}
:= squirrel.Select("version").
From("modules").
Where(squirrel.Eq{"module_path": }).
PlaceholderFormat(squirrel.Dollar)
if != nil && !version.IsIncompatible(.CookedVersion) {
= .Where("NOT incompatible")
}
, , := .ToSql()
if != nil {
return "",
}
, := collectStrings(, , , ...)
if != nil {
return "",
func ( *DB) ( context.Context, string) ( *internal.LatestModuleVersions, error) {
, , := getLatestModuleVersions(, .db, )
return ,
}
func ( context.Context, *database.DB, string) ( *internal.LatestModuleVersions, int, error) {
derrors.WrapStack(&, "getLatestModuleVersions(%q)", )
var (
, , string
[]byte
int
)
= .QueryRow(, `
SELECT
r.module_path_id, r.raw_version, r.cooked_version, r.good_version, r.raw_go_mod_bytes, r.status
FROM latest_module_versions r
INNER JOIN paths p ON p.id = r.module_path_id
WHERE p.path = $1`,
).Scan(&, &, &, &, &, &)
if != nil {
if == sql.ErrNoRows {
return nil, 0, nil
}
return nil, 0,
}
func (, string) bool {
return version.Later(, ) || (version.IsIncompatible() && !version.IsIncompatible())
}
func ( *DB) ( context.Context, *internal.LatestModuleVersions) ( *internal.LatestModuleVersions, error) {
defer derrors.WrapStack(&, "UpdateLatestModuleVersions(%q)", .ModulePath)
= .db.Transact(, sql.LevelRepeatableRead, func( *database.DB) error {
, , := getLatestModuleVersions(, , .ModulePath)
if != nil {
return
(.RawVersion == .RawVersion && .CookedVersion != .CookedVersion)
if ! {
log.Debugf(, "%s: not updating latest module versions", .ModulePath)
=
return nil
}
if == nil {
log.Debugf(, "%s: inserting latest_module_versions raw=%q, cooked=%q",
.ModulePath, .RawVersion, .CookedVersion)
} else {
log.Debugf(, "%s: updating latest_module_versions raw=%q, cooked=%q to raw=%q, cooked=%q",
.ModulePath, .RawVersion, .CookedVersion,
if .GoodVersion != "" && .IsRetracted(.GoodVersion) {
, := getLatestGoodVersion(, , .ModulePath, )
if != nil {
return
}
.GoodVersion =
log.Debugf(, "%s: updating latest_module_versions good=%q", .ModulePath, .GoodVersion)
} else {
.GoodVersion = .GoodVersion
}
}
=
return upsertLatestModuleVersions(, , .ModulePath, , , 200)
})
if != nil {
return nil,
}
return , nil
}
return .db.Transact(, sql.LevelRepeatableRead, func( *database.DB) error {
var , int
:= .QueryRow(, `
SELECT r.module_path_id, r.status
FROM latest_module_versions r
INNER JOIN paths p ON p.id = r.module_path_id
WHERE p.path = $1`,
).Scan(&, &)
if != nil && != sql.ErrNoRows {
return
}
if == 200 {
return nil
}
log.Debugf(, "%s: updating latest_module_versions status to %d", , )
return upsertLatestModuleVersions(, , , , nil, )
})
}
func ( context.Context, *database.DB, string, int, *internal.LatestModuleVersions, int) ( error) {
defer derrors.WrapStack(&, "upsertLatestModuleVersions(%s, %d)", , )
if == 0 {
, = upsertPath(, , )
if != nil {
return
}
}
var (
, , string
= []byte{} // not nil, a zero-length slice
bool
)
if != nil {
= .RawVersion
= .CookedVersion
= .GoodVersion
, = .GoModFile.Format()
if != nil {
return
}
}
_, = .Exec(, `
INSERT INTO latest_module_versions (
module_path_id,
series_path,
raw_version,
cooked_version,
good_version,
deprecated,
raw_go_mod_bytes,
status
) VALUES ($1, $2, $3, $4, $5, $6, $7, $8)
ON CONFLICT (module_path_id)
DO UPDATE SET
series_path=excluded.series_path,
raw_version=excluded.raw_version,
cooked_version=excluded.cooked_version,
good_version=excluded.good_version,
deprecated=excluded.deprecated,
raw_go_mod_bytes=excluded.raw_go_mod_bytes,
status=excluded.status
`,
, internal.SeriesPathForModule(), , , , , , )
return
}
func ( context.Context, *database.DB, , string) ( error) {
defer derrors.WrapStack(&, "updateLatestGoodVersion(%q, %q)", , )
, := .Exec(, `
UPDATE latest_module_versions
SET good_version = $2
WHERE module_path_id = (
SELECT id FROM paths
WHERE path = $1
)`, , )
if != nil {
return
}
switch {
case 0:
log.Debugf(, "updateLatestGoodVersion(%q, %q): no change", , )
case 1:
log.Debugf(, "updateLatestGoodVersion(%q, %q): updated", , )
default:
return errors.New("more than one row affected")
}
return nil
![]() |
The pages are generated with Golds v0.3.2-preview. (GOOS=darwin GOARCH=amd64) Golds is a Go 101 project developed by Tapir Liu. PR and bug reports are welcome and can be submitted to the issue list. Please follow @Go100and1 (reachable from the left QR code) to get the latest news of Golds. |