dbconn/version.go (50 lines of code) (raw):
package dbconn
import (
"regexp"
"strings"
"github.com/blang/semver"
)
type GPDBVersion struct {
VersionString string
SemVer semver.Version
}
/*
* This constructor is intended as a convenience function for testing and
* setting defaults; the dbconn.Connect function will automatically initialize
* the version of the database to which it is connecting.
*
* The versionStr argument here should be a semantic version in the form X.Y.Z,
* not a GPDB version string like the one returned by "SELECT version()". If
* an invalid semantic version is passed, that is considered programmer error
* and the function will panic.
*/
func NewVersion(versionStr string) GPDBVersion {
version := GPDBVersion{
VersionString: versionStr,
SemVer: semver.MustParse(versionStr),
}
return version
}
func InitializeVersion(dbconn *DBConn) (dbversion GPDBVersion, err error) {
err = dbconn.Get(&dbversion, "SELECT pg_catalog.version() AS versionstring")
if err != nil {
return
}
versionStart := strings.Index(dbversion.VersionString, "(Greenplum Database ") + len("(Greenplum Database ")
versionEnd := strings.Index(dbversion.VersionString, ")")
dbversion.VersionString = dbversion.VersionString[versionStart:versionEnd]
pattern := regexp.MustCompile(`\d+\.\d+\.\d+`)
threeDigitVersion := pattern.FindStringSubmatch(dbversion.VersionString)[0]
dbversion.SemVer, err = semver.Make(threeDigitVersion)
return
}
func StringToSemVerRange(versionStr string) semver.Range {
numDigits := len(strings.Split(versionStr, "."))
if numDigits < 3 {
versionStr += ".x"
}
validRange := semver.MustParseRange(versionStr)
return validRange
}
func (dbversion GPDBVersion) Before(targetVersion string) bool {
validRange := StringToSemVerRange("<" + targetVersion)
return validRange(dbversion.SemVer)
}
func (dbversion GPDBVersion) AtLeast(targetVersion string) bool {
validRange := StringToSemVerRange(">=" + targetVersion)
return validRange(dbversion.SemVer)
}
func (dbversion GPDBVersion) Is(targetVersion string) bool {
validRange := StringToSemVerRange("==" + targetVersion)
return validRange(dbversion.SemVer)
}