diff --git a/public/app/plugins/datasource/postgres/config_ctrl.ts b/public/app/plugins/datasource/postgres/config_ctrl.ts new file mode 100644 index 00000000000..282410cfbbe --- /dev/null +++ b/public/app/plugins/datasource/postgres/config_ctrl.ts @@ -0,0 +1,50 @@ +import _ from 'lodash'; + +export class PostgresConfigCtrl { + static templateUrl = 'partials/config.html'; + + current: any; + datasourceSrv: any; + + /** @ngInject **/ + constructor($scope, datasourceSrv) { + this.datasourceSrv = datasourceSrv; + this.current.jsonData.sslmode = this.current.jsonData.sslmode || 'verify-full'; + this.current.jsonData.postgresVersion = this.current.jsonData.postgresVersion || 903; + this.autoDetectPostgresVersion(); + } + + autoDetectPostgresVersion() { + if (!this.current.id) { + return; + } + + this.datasourceSrv + .loadDatasource(this.current.name) + .then(ds => { + return ds.getVersion(); + }) + .then(version => { + version = Number(version[0].text); + let major = Math.trunc(version / 100); + let minor = version % 100; + let name = String(major); + if (version < 1000) { + name = String(major) + '.' + String(minor); + } + if (!_.find(this.postgresVersions, (p: any) => p.value === version)) { + this.postgresVersions.push({ name: name, value: version }); + } + this.current.jsonData.postgresVersion = version; + }); + } + + // the value portion is derived from postgres server_version_num/100 + postgresVersions = [ + { name: '9.3', value: 903 }, + { name: '9.4', value: 904 }, + { name: '9.5', value: 905 }, + { name: '9.6', value: 906 }, + { name: '10', value: 1000 }, + ]; +} diff --git a/public/app/plugins/datasource/postgres/datasource.ts b/public/app/plugins/datasource/postgres/datasource.ts index 6b0f9b80ba8..9e2d67f903a 100644 --- a/public/app/plugins/datasource/postgres/datasource.ts +++ b/public/app/plugins/datasource/postgres/datasource.ts @@ -124,6 +124,10 @@ export class PostgresDatasource { .then(data => this.responseParser.parseMetricFindQueryResult(refId, data)); } + getVersion() { + return this.metricFindQuery("SELECT current_setting('server_version_num')::int/100", {}); + } + testDatasource() { return this.metricFindQuery('SELECT 1', {}) .then(res => { diff --git a/public/app/plugins/datasource/postgres/module.ts b/public/app/plugins/datasource/postgres/module.ts index b798155e255..b5b052f12b9 100644 --- a/public/app/plugins/datasource/postgres/module.ts +++ b/public/app/plugins/datasource/postgres/module.ts @@ -1,24 +1,6 @@ import { PostgresDatasource } from './datasource'; import { PostgresQueryCtrl } from './query_ctrl'; - -class PostgresConfigCtrl { - static templateUrl = 'partials/config.html'; - - current: any; - - /** @ngInject **/ - constructor($scope) { - this.current.jsonData.sslmode = this.current.jsonData.sslmode || 'verify-full'; - } - - // the value portion is derived from postgres server_version_num/100 - postgresVersions = [ - { name: '9.3.x', value: 903 }, - { name: '9.4.x', value: 904 }, - { name: '9.5.x', value: 905 }, - { name: '9.6.x', value: 906 }, - ]; -} +import { PostgresConfigCtrl } from './config_ctrl'; const defaultQuery = `SELECT extract(epoch from time_column) AS time,