Copyright 2019 The Go Authors. All rights reserved. Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.

package postgres

import (
	
	
	

	
	
	
	
	
)
UpsertVersionMap inserts a version_map entry into the database.
func ( *DB) ( context.Context,  *internal.VersionMap) ( error) {
	defer derrors.WrapStack(&, "DB.UpsertVersionMap(ctx, tx, %q, %q, %q)",
		.ModulePath, .RequestedVersion, .ResolvedVersion)

	var  int
	if .ResolvedVersion != "" {
		if  := .db.QueryRow(, `SELECT id FROM modules WHERE module_path=$1 AND version=$2`,
			.ModulePath, .ResolvedVersion).Scan(&);  != nil &&  != sql.ErrNoRows {
			return 
		}
	}

	var  string
	if .ResolvedVersion != "" {
		 = version.ForSorting(.ResolvedVersion)
	}
	_,  = .db.Exec(,
		`INSERT INTO version_map(
				module_path,
				requested_version,
				resolved_version,
				go_mod_path,
				status,
				error,
				sort_version,
				module_id)
			VALUES($1,$2,$3,$4,$5,$6,$7,$8)
			ON CONFLICT (module_path, requested_version)
			DO UPDATE SET
				module_path=excluded.module_path,
				go_mod_path=excluded.go_mod_path,
				requested_version=excluded.requested_version,
				resolved_version=excluded.resolved_version,
				status=excluded.status,
				error=excluded.error,
				sort_version=excluded.sort_version,
				module_id=excluded.module_id`,
		.ModulePath,
		.RequestedVersion,
		.ResolvedVersion,
		.GoModPath,
		.Status,
		.Error,
		,
		)
	return 
}
GetVersionMap fetches a version_map entry corresponding to the given modulePath and requestedVersion.
func ( *DB) ( context.Context, ,  string) ( *internal.VersionMap,  error) {
	defer derrors.WrapStack(&, "DB.GetVersionMap(ctx, tx, %q, %q)", , )
	if  == internal.UnknownModulePath {
		return nil, fmt.Errorf("modulePath must be specified: %w", derrors.InvalidArgument)
	}

	, ,  := versionMapSelect().
		Where(squirrel.Eq{"module_path": }).
		Where(squirrel.Eq{"requested_version": }).
		PlaceholderFormat(squirrel.Dollar).ToSql()
	if  != nil {
		return nil, 
	}
	var  internal.VersionMap
	 = .db.QueryRow(, , ...).Scan(
		&.ModulePath, &.RequestedVersion, &.ResolvedVersion, &.GoModPath,
		&.Status, &.Error, &.UpdatedAt)
	switch  {
	case nil:
		return &, nil
	case sql.ErrNoRows:
		return nil, derrors.NotFound
	default:
		return nil, 
	}
}
GetVersionMaps returns all of the version maps for the provided path and requested version if they are present.
func ( *DB) ( context.Context,  []string,  string) ( []*internal.VersionMap,  error) {
	defer derrors.WrapStack(&, "DB.GetVersionMapsWith4xxStatus(ctx, %v, %q)", , )

	var  []*internal.VersionMap
	 := map[string]*internal.VersionMap{}
	 := func( *sql.Rows) error {
		var  internal.VersionMap
		if  := .Scan(
			&.ModulePath, &.RequestedVersion, &.ResolvedVersion, &.GoModPath,
			&.Status, &.Error, &.UpdatedAt);  != nil {
			return 
		}
		if ,  := [.ModulePath]; ! {
			[.ModulePath] = &
			 = append(, &)
		}
		return nil
	}
	, ,  := versionMapSelect().
		Where("module_path = ANY(?)", pq.Array()).
		Where(squirrel.Or{squirrel.Eq{"requested_version": }, squirrel.Eq{"resolved_version": }}).
		OrderBy("module_path DESC").
		PlaceholderFormat(squirrel.Dollar).ToSql()
	if  != nil {
		return nil, fmt.Errorf("squirrel.ToSql: %v", )
	}
	if  := .db.RunQuery(, , , ...);  != nil {
		return nil, 
	}
	return , nil
}

func () squirrel.SelectBuilder {
	return squirrel.Select(
		"module_path",
		"requested_version",
		"resolved_version",
		"go_mod_path",
		"status",
		"error",
		"updated_at",
	).From("version_map")