@@ -47,6 +47,8 @@ func (rlg *ReplicationLagResult) HasLag() bool {
4747// knownDBs is a DB cache by uri
4848var knownDBs map [string ]* gosql.DB = make (map [string ]* gosql.DB )
4949var knownDBsMutex = & sync.Mutex {}
50+ var knownDBsVersions map [string ]string = make (map [string ]string )
51+ var knownDBsVersionsMutex = & sync.Mutex {}
5052
5153func GetDB (migrationUuid string , mysql_uri string ) (db * gosql.DB , exists bool , err error ) {
5254 cacheKey := migrationUuid + ":" + mysql_uri
@@ -66,6 +68,30 @@ func GetDB(migrationUuid string, mysql_uri string) (db *gosql.DB, exists bool, e
6668 return db , exists , nil
6769}
6870
71+ // GetDBVersion returns the MySQL version for a given mysql_uri, and caches it for future calls.
72+ // Uses GetDB to get a connection to the database.
73+ func GetDBVersion (migrationUuid string , mysql_uri string ) (dbVersion string , err error ) {
74+ cacheKey := migrationUuid + ":" + mysql_uri
75+
76+ knownDBsVersionsMutex .Lock ()
77+ defer knownDBsVersionsMutex .Unlock ()
78+
79+ if dbVersion , exists := knownDBsVersions [cacheKey ]; exists {
80+ return dbVersion , nil
81+ }
82+
83+ db , _ , err := GetDB (migrationUuid , mysql_uri )
84+ if err != nil {
85+ return "" , err
86+ }
87+ var version string
88+ if err := db .QueryRow (`select @@global.version` ).Scan (& version ); err != nil {
89+ return "" , err
90+ }
91+ knownDBsVersions [cacheKey ] = version
92+ return version , nil
93+ }
94+
6995// GetReplicationLagFromSlaveStatus returns replication lag for a given db; via SHOW SLAVE STATUS
7096func GetReplicationLagFromSlaveStatus (dbVersion string , informationSchemaDb * gosql.DB ) (replicationLag time.Duration , err error ) {
7197 showReplicaStatusQuery := fmt .Sprintf ("show %s" , ReplicaTermFor (dbVersion , `slave status` ))
0 commit comments