{"version":3,"file":"postgresPlugin.0821689f280b14010c04.js","mappings":"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","sources":["webpack://grafana/./public/app/features/plugins/sql/components/configuration/TLSSecretsConfig.tsx","webpack://grafana/./public/app/plugins/datasource/postgres/QueryEditor.tsx","webpack://grafana/./public/app/plugins/datasource/postgres/types.ts","webpack://grafana/./public/app/plugins/datasource/postgres/PostgresQueryModel.ts","webpack://grafana/./public/app/plugins/datasource/postgres/sqlCompletionProvider.ts","webpack://grafana/./public/app/plugins/datasource/postgres/sqlUtil.ts","webpack://grafana/./public/app/plugins/datasource/postgres/datasource.ts","webpack://grafana/./public/app/plugins/datasource/postgres/postgresMetaQuery.ts","webpack://grafana/./public/app/plugins/datasource/postgres/configuration/useAutoDetectFeatures.ts","webpack://grafana/./public/app/plugins/datasource/postgres/configuration/ConfigurationEditor.tsx","webpack://grafana/./public/app/plugins/datasource/postgres/module.ts","webpack://grafana/./.yarn/__virtual__/react-use-virtual-0c21d950b6/3/opt/drone/yarncache/react-use-npm-17.4.0-0ef4521544-0889da919b.zip/node_modules/react-use/esm/useCustomCompareEffect.js","webpack://grafana/./.yarn/__virtual__/react-use-virtual-0c21d950b6/3/opt/drone/yarncache/react-use-npm-17.4.0-0ef4521544-0889da919b.zip/node_modules/react-use/esm/misc/isDeepEqual.js","webpack://grafana/./.yarn/__virtual__/react-use-virtual-0c21d950b6/3/opt/drone/yarncache/react-use-npm-17.4.0-0ef4521544-0889da919b.zip/node_modules/react-use/esm/useDeepCompareEffect.js","webpack://grafana/../../opt/drone/yarncache/fast-deep-equal-npm-3.1.3-790edcfcf5-e21a9d8d84.zip/node_modules/fast-deep-equal/react.js"],"sourcesContent":["import React from 'react';\n\nimport {\n DataSourceJsonData,\n DataSourcePluginOptionsEditorProps,\n KeyValue,\n onUpdateDatasourceSecureJsonDataOption,\n updateDatasourcePluginResetOption,\n} from '@grafana/data';\nimport { InlineField, SecretTextArea } from '@grafana/ui';\n\nexport interface Props<T extends DataSourceJsonData, S> {\n editorProps: DataSourcePluginOptionsEditorProps<T, S>;\n showCACert?: boolean;\n showKeyPair?: boolean;\n secureJsonFields?: KeyValue<Boolean>;\n labelWidth?: number;\n}\n\nexport const TLSSecretsConfig = <T extends DataSourceJsonData, S extends {} = {}>(props: Props<T, S>) => {\n const { labelWidth, editorProps, showCACert, showKeyPair = true } = props;\n const { secureJsonFields } = editorProps.options;\n return (\n <>\n {showKeyPair ? (\n <InlineField\n tooltip={\n <span>To authenticate with an TLS/SSL client certificate, provide the client certificate here.</span>\n }\n labelWidth={labelWidth}\n label=\"TLS/SSL Client Certificate\"\n >\n <SecretTextArea\n placeholder=\"Begins with -----BEGIN CERTIFICATE-----\"\n cols={45}\n rows={7}\n isConfigured={secureJsonFields && secureJsonFields.tlsClientCert}\n onChange={onUpdateDatasourceSecureJsonDataOption(editorProps, 'tlsClientCert')}\n onReset={() => {\n updateDatasourcePluginResetOption(editorProps, 'tlsClientCert');\n }}\n ></SecretTextArea>\n </InlineField>\n ) : null}\n {showCACert ? (\n <InlineField\n tooltip={<span>If the selected TLS/SSL mode requires a server root certificate, provide it here.</span>}\n labelWidth={labelWidth}\n label=\"TLS/SSL Root Certificate\"\n >\n <SecretTextArea\n placeholder=\"Begins with -----BEGIN CERTIFICATE-----\"\n cols={45}\n rows={7}\n isConfigured={secureJsonFields && secureJsonFields.tlsCACert}\n onChange={onUpdateDatasourceSecureJsonDataOption(editorProps, 'tlsCACert')}\n onReset={() => {\n updateDatasourcePluginResetOption(editorProps, 'tlsCACert');\n }}\n ></SecretTextArea>\n </InlineField>\n ) : null}\n {showKeyPair ? (\n <InlineField\n tooltip={<span>To authenticate with a client TLS/SSL certificate, provide the key here.</span>}\n labelWidth={labelWidth}\n label=\"TLS/SSL Client Key\"\n >\n <SecretTextArea\n placeholder=\"Begins with -----BEGIN RSA PRIVATE KEY-----\"\n cols={45}\n rows={7}\n isConfigured={secureJsonFields && secureJsonFields.tlsClientKey}\n onChange={onUpdateDatasourceSecureJsonDataOption(editorProps, 'tlsClientKey')}\n onReset={() => {\n updateDatasourcePluginResetOption(editorProps, 'tlsClientKey');\n }}\n ></SecretTextArea>\n </InlineField>\n ) : null}\n </>\n );\n};\n","import React from 'react';\n\nimport { QueryEditorProps } from '@grafana/data';\nimport { SqlQueryEditor } from 'app/features/plugins/sql/components/QueryEditor';\nimport { SQLOptions, SQLQuery } from 'app/features/plugins/sql/types';\n\nimport { PostgresDatasource } from './datasource';\n\nconst queryHeaderProps = { isDatasetSelectorHidden: true };\n\nexport function QueryEditor(props: QueryEditorProps<PostgresDatasource, SQLQuery, SQLOptions>) {\n return <SqlQueryEditor {...props} queryHeaderProps={queryHeaderProps} />;\n}\n","import { SQLOptions } from 'app/features/plugins/sql/types';\n\nexport enum PostgresTLSModes {\n disable = 'disable',\n require = 'require',\n verifyCA = 'verify-ca',\n verifyFull = 'verify-full',\n}\n\nexport enum PostgresTLSMethods {\n filePath = 'file-path',\n fileContent = 'file-content',\n}\nexport interface PostgresOptions extends SQLOptions {\n tlsConfigurationMethod?: PostgresTLSMethods;\n sslmode?: PostgresTLSModes;\n sslRootCertFile?: string;\n sslCertFile?: string;\n sslKeyFile?: string;\n postgresVersion?: number;\n timescaledb?: boolean;\n}\n\nexport interface SecureJsonData {\n password: string;\n}\n","import { ScopedVars } from '@grafana/data';\nimport { TemplateSrv } from '@grafana/runtime';\nimport { applyQueryDefaults } from 'app/features/plugins/sql/defaults';\nimport { SQLQuery, SqlQueryModel } from 'app/features/plugins/sql/types';\nimport { FormatRegistryID } from 'app/features/templating/formatRegistry';\n\nexport class PostgresQueryModel implements SqlQueryModel {\n target: SQLQuery;\n templateSrv?: TemplateSrv;\n scopedVars?: ScopedVars;\n\n constructor(target?: SQLQuery, templateSrv?: TemplateSrv, scopedVars?: ScopedVars) {\n this.target = applyQueryDefaults(target || { refId: 'A' });\n this.templateSrv = templateSrv;\n this.scopedVars = scopedVars;\n }\n\n interpolate() {\n return this.templateSrv?.replace(this.target.rawSql, this.scopedVars, FormatRegistryID.sqlString) || '';\n }\n\n quoteLiteral(value: string) {\n return \"'\" + value.replace(/'/g, \"''\") + \"'\";\n }\n}\n","import {\n ColumnDefinition,\n getStandardSQLCompletionProvider,\n LanguageCompletionProvider,\n TableDefinition,\n TableIdentifier,\n} from '@grafana/experimental';\nimport { DB, SQLQuery } from 'app/features/plugins/sql/types';\n\ninterface CompletionProviderGetterArgs {\n getColumns: React.MutableRefObject<(t: SQLQuery) => Promise<ColumnDefinition[]>>;\n getTables: React.MutableRefObject<(d?: string) => Promise<TableDefinition[]>>;\n}\n\nexport const getSqlCompletionProvider: (args: CompletionProviderGetterArgs) => LanguageCompletionProvider =\n ({ getColumns, getTables }) =>\n (monaco, language) => ({\n ...(language && getStandardSQLCompletionProvider(monaco, language)),\n tables: {\n resolve: async () => {\n return await getTables.current();\n },\n },\n columns: {\n resolve: async (t?: TableIdentifier) => {\n return await getColumns.current({ table: t?.table, refId: 'A' });\n },\n },\n });\n\nexport async function fetchColumns(db: DB, q: SQLQuery) {\n const cols = await db.fields(q);\n if (cols.length > 0) {\n return cols.map((c) => {\n return { name: c.value, type: c.value, description: c.value };\n });\n } else {\n return [];\n }\n}\n\nexport async function fetchTables(db: DB) {\n const tables = await db.lookup?.();\n return tables || [];\n}\n","import { isEmpty } from 'lodash';\n\nimport { RAQBFieldTypes, SQLExpression, SQLQuery } from 'app/features/plugins/sql/types';\n\nexport function getFieldConfig(type: string): { raqbFieldType: RAQBFieldTypes; icon: string } {\n switch (type) {\n case 'boolean': {\n return { raqbFieldType: 'boolean', icon: 'toggle-off' };\n }\n case 'bit':\n case 'bit varying':\n case 'character':\n case 'character varying':\n case 'text': {\n return { raqbFieldType: 'text', icon: 'text' };\n }\n case 'smallint':\n case 'integer':\n case 'bigint':\n case 'decimal':\n case 'numeric':\n case 'real':\n case 'double precision':\n case 'serial':\n case 'bigserial':\n case 'smallserial': {\n return { raqbFieldType: 'number', icon: 'calculator-alt' };\n }\n case 'date': {\n return { raqbFieldType: 'date', icon: 'clock-nine' };\n }\n case 'time':\n case 'time with time zone':\n case 'time without time zone':\n case 'interval': {\n return { raqbFieldType: 'time', icon: 'clock-nine' };\n }\n case 'timestamp':\n case 'timestamp with time zone':\n case 'timestamp without time zone': {\n return { raqbFieldType: 'datetime', icon: 'clock-nine' };\n }\n default:\n return { raqbFieldType: 'text', icon: 'text' };\n }\n}\n\nexport function toRawSql({ sql, table }: SQLQuery): string {\n let rawQuery = '';\n\n // Return early with empty string if there is no sql column\n if (!sql || !haveColumns(sql.columns)) {\n return rawQuery;\n }\n\n rawQuery += createSelectClause(sql.columns);\n\n if (table) {\n rawQuery += `FROM ${table} `;\n }\n\n if (sql.whereString) {\n rawQuery += `WHERE ${sql.whereString} `;\n }\n\n if (sql.groupBy?.[0]?.property.name) {\n const groupBy = sql.groupBy.map((g) => g.property.name).filter((g) => !isEmpty(g));\n rawQuery += `GROUP BY ${groupBy.join(', ')} `;\n }\n\n if (sql.orderBy?.property.name) {\n rawQuery += `ORDER BY ${sql.orderBy.property.name} `;\n }\n\n if (sql.orderBy?.property.name && sql.orderByDirection) {\n rawQuery += `${sql.orderByDirection} `;\n }\n\n // Altough LIMIT 0 doesn't make sense, it is still possible to have LIMIT 0\n if (sql.limit !== undefined && sql.limit >= 0) {\n rawQuery += `LIMIT ${sql.limit} `;\n }\n return rawQuery;\n}\n\nfunction createSelectClause(sqlColumns: NonNullable<SQLExpression['columns']>): string {\n const columns = sqlColumns.map((c) => {\n let rawColumn = '';\n if (c.name && c.alias) {\n rawColumn += `${c.name}(${c.parameters?.map((p) => `${p.name}`)}) AS ${c.alias}`;\n } else if (c.name) {\n rawColumn += `${c.name}(${c.parameters?.map((p) => `${p.name}`)})`;\n } else if (c.alias) {\n rawColumn += `${c.parameters?.map((p) => `${p.name}`)} AS ${c.alias}`;\n } else {\n rawColumn += `${c.parameters?.map((p) => `${p.name}`)}`;\n }\n return rawColumn;\n });\n\n return `SELECT ${columns.join(', ')} `;\n}\n\nexport const haveColumns = (columns: SQLExpression['columns']): columns is NonNullable<SQLExpression['columns']> => {\n if (!columns) {\n return false;\n }\n\n const haveColumn = columns.some((c) => c.parameters?.length || c.parameters?.some((p) => p.name));\n const haveFunction = columns.some((c) => c.name);\n return haveColumn || haveFunction;\n};\n","import { DataSourceInstanceSettings, ScopedVars } from '@grafana/data';\nimport { LanguageDefinition } from '@grafana/experimental';\nimport { SqlDatasource } from 'app/features/plugins/sql/datasource/SqlDatasource';\nimport { DB, SQLQuery, SQLSelectableValue } from 'app/features/plugins/sql/types';\nimport { formatSQL } from 'app/features/plugins/sql/utils/formatSQL';\nimport { TemplateSrv } from 'app/features/templating/template_srv';\n\nimport { PostgresQueryModel } from './PostgresQueryModel';\nimport { getSchema, getTimescaleDBVersion, getVersion, showTables } from './postgresMetaQuery';\nimport { fetchColumns, fetchTables, getSqlCompletionProvider } from './sqlCompletionProvider';\nimport { getFieldConfig, toRawSql } from './sqlUtil';\nimport { PostgresOptions } from './types';\n\nexport class PostgresDatasource extends SqlDatasource {\n sqlLanguageDefinition: LanguageDefinition | undefined = undefined;\n\n constructor(instanceSettings: DataSourceInstanceSettings<PostgresOptions>) {\n super(instanceSettings);\n }\n\n getQueryModel(target?: SQLQuery, templateSrv?: TemplateSrv, scopedVars?: ScopedVars): PostgresQueryModel {\n return new PostgresQueryModel(target, templateSrv, scopedVars);\n }\n\n async getVersion(): Promise<string> {\n const value = await this.runSql<{ version: number }>(getVersion());\n const results = value.fields.version.values.toArray();\n return results[0].toString();\n }\n\n async getTimescaleDBVersion(): Promise<string | undefined> {\n const value = await this.runSql<{ extversion: string }>(getTimescaleDBVersion());\n const results = value.fields.extversion.values.toArray();\n return results[0];\n }\n\n async fetchTables(): Promise<string[]> {\n const tables = await this.runSql<{ table: string[] }>(showTables(), { refId: 'tables' });\n return tables.fields.table.values.toArray().flat();\n }\n\n getSqlLanguageDefinition(db: DB): LanguageDefinition {\n if (this.sqlLanguageDefinition !== undefined) {\n return this.sqlLanguageDefinition;\n }\n\n const args = {\n getColumns: { current: (query: SQLQuery) => fetchColumns(db, query) },\n getTables: { current: () => fetchTables(db) },\n };\n this.sqlLanguageDefinition = {\n id: 'pgsql',\n completionProvider: getSqlCompletionProvider(args),\n formatter: formatSQL,\n };\n return this.sqlLanguageDefinition;\n }\n\n async fetchFields(query: SQLQuery): Promise<SQLSelectableValue[]> {\n const schema = await this.runSql<{ column: string; type: string }>(getSchema(query.table), { refId: 'columns' });\n const result: SQLSelectableValue[] = [];\n for (let i = 0; i < schema.length; i++) {\n const column = schema.fields.column.values.get(i);\n const type = schema.fields.type.values.get(i);\n result.push({ label: column, value: column, type, ...getFieldConfig(type) });\n }\n return result;\n }\n\n getDB(): DB {\n if (this.db !== undefined) {\n return this.db;\n }\n return {\n init: () => Promise.resolve(true),\n datasets: () => Promise.resolve([]),\n tables: () => this.fetchTables(),\n getEditorLanguageDefinition: () => this.getSqlLanguageDefinition(this.db),\n fields: async (query: SQLQuery) => {\n if (!query?.table) {\n return [];\n }\n return this.fetchFields(query);\n },\n validateQuery: (query) =>\n Promise.resolve({ isError: false, isValid: true, query, error: '', rawSql: query.rawSql }),\n dsID: () => this.id,\n toRawSql,\n lookup: async () => {\n const tables = await this.fetchTables();\n return tables.map((t) => ({ name: t, completion: t }));\n },\n };\n }\n}\n","export function getVersion() {\n return \"SELECT current_setting('server_version_num')::int/100 as version\";\n}\n\nexport function getTimescaleDBVersion() {\n return \"SELECT extversion FROM pg_extension WHERE extname = 'timescaledb'\";\n}\n\nexport function showTables() {\n return `select quote_ident(table_name) as \"table\" from information_schema.tables\n where quote_ident(table_schema) not in ('information_schema',\n 'pg_catalog',\n '_timescaledb_cache',\n '_timescaledb_catalog',\n '_timescaledb_internal',\n '_timescaledb_config',\n 'timescaledb_information',\n 'timescaledb_experimental')\n and table_type = 'BASE TABLE' and ${buildSchemaConstraint()}`;\n}\n\nexport function getSchema(table?: string) {\n return `select quote_ident(column_name) as \"column\", data_type as \"type\"\n from information_schema.columns\n where quote_ident(table_name) = '${table}'`;\n}\n\nfunction buildSchemaConstraint() {\n // quote_ident protects hyphenated schemes\n return `\n quote_ident(table_schema) IN (\n SELECT\n CASE WHEN trim(s[i]) = '\"$user\"' THEN user ELSE trim(s[i]) END\n FROM\n generate_series(\n array_lower(string_to_array(current_setting('search_path'),','),1),\n array_upper(string_to_array(current_setting('search_path'),','),1)\n ) as i,\n string_to_array(current_setting('search_path'),',') s\n )`;\n}\n","import { Dispatch, SetStateAction, useState } from 'react';\nimport { useDeepCompareEffect } from 'react-use';\n\nimport {\n DataSourcePluginOptionsEditorProps,\n DataSourceSettings,\n SelectableValue,\n updateDatasourcePluginJsonDataOption,\n updateDatasourcePluginOption,\n} from '@grafana/data';\nimport { getBackendSrv } from '@grafana/runtime';\nimport { getDatasourceSrv } from 'app/features/plugins/datasource_srv';\n\nimport { PostgresDatasource } from '../datasource';\nimport { PostgresOptions, PostgresTLSModes, SecureJsonData } from '../types';\n\nimport { postgresVersions } from './ConfigurationEditor';\n\ntype Options = {\n props: DataSourcePluginOptionsEditorProps<PostgresOptions, SecureJsonData>;\n setVersionOptions: Dispatch<SetStateAction<Array<SelectableValue<number>>>>;\n};\n\nexport function useAutoDetectFeatures({ props, setVersionOptions }: Options) {\n const [saved, setSaved] = useState(false);\n const { options, onOptionsChange } = props;\n\n useDeepCompareEffect(() => {\n const getVersion = async () => {\n if (!saved) {\n // We need to save the datasource before we can get the version so we can query the database with the options we have.\n const result = await getBackendSrv().put<{ datasource: DataSourceSettings }>(\n `/api/datasources/${options.id}`,\n options\n );\n\n setSaved(true);\n // This is needed or else we get an error when we try to save the datasource.\n updateDatasourcePluginOption({ options, onOptionsChange }, 'version', result.datasource.version);\n } else {\n const datasource = await getDatasourceSrv().loadDatasource(options.name);\n\n if (datasource instanceof PostgresDatasource) {\n const version = await datasource.getVersion();\n const versionNumber = parseInt(version, 10);\n\n // timescaledb is only available for 9.6+\n if (versionNumber >= 906 && !options.jsonData.timescaledb) {\n const timescaledbVersion = await datasource.getTimescaleDBVersion();\n if (timescaledbVersion) {\n updateDatasourcePluginJsonDataOption({ options, onOptionsChange }, 'timescaledb', true);\n }\n }\n const major = Math.trunc(versionNumber / 100);\n const minor = versionNumber % 100;\n let name = String(major);\n if (versionNumber < 1000) {\n name = String(major) + '.' + String(minor);\n }\n if (!postgresVersions.find((p) => p.value === versionNumber)) {\n setVersionOptions((prev) => [...prev, { label: name, value: versionNumber }]);\n }\n if (options.jsonData.postgresVersion === undefined || options.jsonData.postgresVersion !== versionNumber) {\n updateDatasourcePluginJsonDataOption({ options, onOptionsChange }, 'postgresVersion', versionNumber);\n }\n }\n }\n };\n // This logic is only going to run when we create a new datasource\n if (isValidConfig(options)) {\n getVersion();\n }\n }, [options, saved, setVersionOptions]);\n}\n\nfunction isValidConfig(options: DataSourceSettings<PostgresOptions, SecureJsonData>) {\n return (\n options.url &&\n options.database &&\n options.user &&\n (options.secureJsonData?.password || options.secureJsonFields?.password) &&\n (options.jsonData.sslmode === PostgresTLSModes.disable ||\n (options.jsonData.sslCertFile && options.jsonData.sslKeyFile && options.jsonData.sslRootCertFile)) &&\n !options.jsonData.postgresVersion &&\n !options.readOnly\n );\n}\n","import React, { SyntheticEvent, useState } from 'react';\n\nimport {\n DataSourcePluginOptionsEditorProps,\n onUpdateDatasourceJsonDataOption,\n onUpdateDatasourceSecureJsonDataOption,\n SelectableValue,\n updateDatasourcePluginJsonDataOption,\n updateDatasourcePluginResetOption,\n} from '@grafana/data';\nimport {\n Alert,\n InlineSwitch,\n FieldSet,\n InlineField,\n InlineFieldRow,\n Input,\n Select,\n SecretInput,\n Link,\n} from '@grafana/ui';\nimport { ConnectionLimits } from 'app/features/plugins/sql/components/configuration/ConnectionLimits';\nimport { TLSSecretsConfig } from 'app/features/plugins/sql/components/configuration/TLSSecretsConfig';\n\nimport { PostgresOptions, PostgresTLSMethods, PostgresTLSModes, SecureJsonData } from '../types';\n\nimport { useAutoDetectFeatures } from './useAutoDetectFeatures';\n\nexport const postgresVersions: Array<SelectableValue<number>> = [\n { label: '9.0', value: 900 },\n { label: '9.1', value: 901 },\n { label: '9.2', value: 902 },\n { label: '9.3', value: 903 },\n { label: '9.4', value: 904 },\n { label: '9.5', value: 905 },\n { label: '9.6', value: 906 },\n { label: '10', value: 1000 },\n { label: '11', value: 1100 },\n { label: '12', value: 1200 },\n { label: '13', value: 1300 },\n { label: '14', value: 1400 },\n { label: '15', value: 1500 },\n];\n\nexport const PostgresConfigEditor = (props: DataSourcePluginOptionsEditorProps<PostgresOptions, SecureJsonData>) => {\n const [versionOptions, setVersionOptions] = useState(postgresVersions);\n\n useAutoDetectFeatures({ props, setVersionOptions });\n\n const { options, onOptionsChange } = props;\n const jsonData = options.jsonData;\n\n const onResetPassword = () => {\n updateDatasourcePluginResetOption(props, 'password');\n };\n\n const tlsModes: Array<SelectableValue<PostgresTLSModes>> = [\n { value: PostgresTLSModes.disable, label: 'disable' },\n { value: PostgresTLSModes.require, label: 'require' },\n { value: PostgresTLSModes.verifyCA, label: 'verify-ca' },\n { value: PostgresTLSModes.verifyFull, label: 'verify-full' },\n ];\n\n const tlsMethods: Array<SelectableValue<PostgresTLSMethods>> = [\n { value: PostgresTLSMethods.filePath, label: 'File system path' },\n { value: PostgresTLSMethods.fileContent, label: 'Certificate content' },\n ];\n\n const onJSONDataOptionSelected = (property: keyof PostgresOptions) => {\n return (value: SelectableValue) => {\n updateDatasourcePluginJsonDataOption(props, property, value.value);\n };\n };\n\n const onTimeScaleDBChanged = (event: SyntheticEvent<HTMLInputElement>) => {\n updateDatasourcePluginJsonDataOption(props, 'timescaledb', event.currentTarget.checked);\n };\n\n const onDSOptionChanged = (property: keyof PostgresOptions) => {\n return (event: SyntheticEvent<HTMLInputElement>) => {\n onOptionsChange({ ...options, ...{ [property]: event.currentTarget.value } });\n };\n };\n\n const labelWidthSSLDetails = 25;\n const labelWidthConnection = 20;\n const labelWidthShort = 20;\n\n return (\n <>\n <FieldSet label=\"PostgreSQL Connection\" width={400}>\n <InlineField labelWidth={labelWidthConnection} label=\"Host\">\n <Input\n width={40}\n name=\"host\"\n type=\"text\"\n value={options.url || ''}\n placeholder=\"localhost:5432\"\n onChange={onDSOptionChanged('url')}\n ></Input>\n </InlineField>\n <InlineField labelWidth={labelWidthConnection} label=\"Database\">\n <Input\n width={40}\n name=\"database\"\n value={options.database || ''}\n placeholder=\"database name\"\n onChange={onDSOptionChanged('database')}\n ></Input>\n </InlineField>\n <InlineFieldRow>\n <InlineField labelWidth={labelWidthConnection} label=\"User\">\n <Input value={options.user || ''} placeholder=\"user\" onChange={onDSOptionChanged('user')}></Input>\n </InlineField>\n <InlineField label=\"Password\">\n <SecretInput\n placeholder=\"Password\"\n isConfigured={options.secureJsonFields?.password}\n onReset={onResetPassword}\n onBlur={onUpdateDatasourceSecureJsonDataOption(props, 'password')}\n ></SecretInput>\n </InlineField>\n </InlineFieldRow>\n <InlineField\n labelWidth={labelWidthConnection}\n label=\"TLS/SSL Mode\"\n htmlFor=\"tlsMode\"\n tooltip=\"This option determines whether or with what priority a secure TLS/SSL TCP/IP connection will be negotiated with the server.\"\n >\n <Select\n options={tlsModes}\n inputId=\"tlsMode\"\n value={jsonData.sslmode || PostgresTLSModes.verifyFull}\n onChange={onJSONDataOptionSelected('sslmode')}\n ></Select>\n </InlineField>\n {options.jsonData.sslmode !== PostgresTLSModes.disable ? (\n <InlineField\n labelWidth={labelWidthConnection}\n label=\"TLS/SSL Method\"\n htmlFor=\"tlsMethod\"\n tooltip={\n <span>\n This option determines how TLS/SSL certifications are configured. Selecting <i>File system path</i> will\n allow you to configure certificates by specifying paths to existing certificates on the local file\n system where Grafana is running. Be sure that the file is readable by the user executing the Grafana\n process.\n <br />\n <br />\n Selecting <i>Certificate content</i> will allow you to configure certificates by specifying its content.\n The content will be stored encrypted in Grafana's database. When connecting to the database the\n certificates will be written as files to Grafana's configured data path on the local file system.\n </span>\n }\n >\n <Select\n options={tlsMethods}\n inputId=\"tlsMethod\"\n value={jsonData.tlsConfigurationMethod || PostgresTLSMethods.filePath}\n onChange={onJSONDataOptionSelected('tlsConfigurationMethod')}\n ></Select>\n </InlineField>\n ) : null}\n </FieldSet>\n\n {jsonData.sslmode !== PostgresTLSModes.disable ? (\n <FieldSet label=\"TLS/SSL Auth Details\">\n {jsonData.tlsConfigurationMethod === PostgresTLSMethods.fileContent ? (\n <TLSSecretsConfig\n showCACert={\n jsonData.sslmode === PostgresTLSModes.verifyCA || jsonData.sslmode === PostgresTLSModes.verifyFull\n }\n editorProps={props}\n labelWidth={labelWidthSSLDetails}\n ></TLSSecretsConfig>\n ) : (\n <>\n <InlineField\n tooltip={\n <span>\n If the selected TLS/SSL mode requires a server root certificate, provide the path to the file here.\n </span>\n }\n labelWidth={labelWidthSSLDetails}\n label=\"TLS/SSL Root Certificate\"\n >\n <Input\n value={jsonData.sslRootCertFile || ''}\n onChange={onUpdateDatasourceJsonDataOption(props, 'sslRootCertFile')}\n placeholder=\"TLS/SSL root cert file\"\n ></Input>\n </InlineField>\n <InlineField\n tooltip={\n <span>\n To authenticate with an TLS/SSL client certificate, provide the path to the file here. Be sure that\n the file is readable by the user executing the grafana process.\n </span>\n }\n labelWidth={labelWidthSSLDetails}\n label=\"TLS/SSL Client Certificate\"\n >\n <Input\n value={jsonData.sslCertFile || ''}\n onChange={onUpdateDatasourceJsonDataOption(props, 'sslCertFile')}\n placeholder=\"TLS/SSL client cert file\"\n ></Input>\n </InlineField>\n <InlineField\n tooltip={\n <span>\n To authenticate with a client TLS/SSL certificate, provide the path to the corresponding key file\n here. Be sure that the file is <i>only</i> readable by the user executing the grafana process.\n </span>\n }\n labelWidth={labelWidthSSLDetails}\n label=\"TLS/SSL Client Key\"\n >\n <Input\n value={jsonData.sslKeyFile || ''}\n onChange={onUpdateDatasourceJsonDataOption(props, 'sslKeyFile')}\n placeholder=\"TLS/SSL client key file\"\n ></Input>\n </InlineField>\n </>\n )}\n </FieldSet>\n ) : null}\n\n <ConnectionLimits\n labelWidth={labelWidthShort}\n jsonData={jsonData}\n onPropertyChanged={(property, value) => {\n updateDatasourcePluginJsonDataOption(props, property, value);\n }}\n ></ConnectionLimits>\n\n <FieldSet label=\"PostgreSQL details\">\n <InlineField\n tooltip=\"This option controls what functions are available in the PostgreSQL query builder\"\n labelWidth={labelWidthShort}\n htmlFor=\"postgresVersion\"\n label=\"Version\"\n >\n <Select\n value={jsonData.postgresVersion || 903}\n inputId=\"postgresVersion\"\n onChange={onJSONDataOptionSelected('postgresVersion')}\n options={versionOptions}\n ></Select>\n </InlineField>\n <InlineField\n tooltip={\n <span>\n TimescaleDB is a time-series database built as a PostgreSQL extension. If enabled, Grafana will use\n <code>time_bucket</code> in the <code>$__timeGroup</code> macro and display TimescaleDB specific aggregate\n functions in the query builder.\n </span>\n }\n labelWidth={labelWidthShort}\n label=\"TimescaleDB\"\n htmlFor=\"timescaledb\"\n >\n <InlineSwitch\n id=\"timescaledb\"\n value={jsonData.timescaledb || false}\n onChange={onTimeScaleDBChanged}\n ></InlineSwitch>\n </InlineField>\n <InlineField\n tooltip={\n <span>\n A lower limit for the auto group by time interval. Recommended to be set to write frequency, for example\n <code>1m</code> if your data is written every minute.\n </span>\n }\n labelWidth={labelWidthShort}\n label=\"Min time interval\"\n >\n <Input\n placeholder=\"1m\"\n value={jsonData.timeInterval || ''}\n onChange={onUpdateDatasourceJsonDataOption(props, 'timeInterval')}\n ></Input>\n </InlineField>\n </FieldSet>\n\n <Alert title=\"User Permission\" severity=\"info\">\n The database user should only be granted SELECT permissions on the specified database & tables you want to\n query. Grafana does not validate that queries are safe so queries can contain any SQL statement. For example,\n statements like <code>DELETE FROM user;</code> and <code>DROP TABLE user;</code> would be executed. To protect\n against this we <strong>Highly</strong> recommend you create a specific PostgreSQL user with restricted\n permissions. Check out the{' '}\n <Link rel=\"noreferrer\" target=\"_blank\" href=\"http://docs.grafana.org/features/datasources/postgres/\">\n PostgreSQL Data Source Docs\n </Link>{' '}\n for more information.\n </Alert>\n </>\n );\n};\n","import { DataSourcePlugin } from '@grafana/data';\nimport { SQLQuery } from 'app/features/plugins/sql/types';\n\nimport { QueryEditor } from './QueryEditor';\nimport { PostgresConfigEditor } from './configuration/ConfigurationEditor';\nimport { PostgresDatasource } from './datasource';\nimport { PostgresOptions, SecureJsonData } from './types';\n\nexport const plugin = new DataSourcePlugin<PostgresDatasource, SQLQuery, PostgresOptions, SecureJsonData>(\n PostgresDatasource\n)\n .setQueryEditor(QueryEditor)\n .setConfigEditor(PostgresConfigEditor);\n","import { useEffect, useRef } from 'react';\nvar isPrimitive = function (val) { return val !== Object(val); };\nvar useCustomCompareEffect = function (effect, deps, depsEqual) {\n if (process.env.NODE_ENV !== 'production') {\n if (!(deps instanceof Array) || !deps.length) {\n console.warn('`useCustomCompareEffect` should not be used with no dependencies. Use React.useEffect instead.');\n }\n if (deps.every(isPrimitive)) {\n console.warn('`useCustomCompareEffect` should not be used with dependencies that are all primitive values. Use React.useEffect instead.');\n }\n if (typeof depsEqual !== 'function') {\n console.warn('`useCustomCompareEffect` should be used with depsEqual callback for comparing deps list');\n }\n }\n var ref = useRef(undefined);\n if (!ref.current || !depsEqual(deps, ref.current)) {\n ref.current = deps;\n }\n useEffect(effect, ref.current);\n};\nexport default useCustomCompareEffect;\n","import isDeepEqualReact from 'fast-deep-equal/react';\nexport default isDeepEqualReact;\n","import useCustomCompareEffect from './useCustomCompareEffect';\nimport isDeepEqual from './misc/isDeepEqual';\nvar isPrimitive = function (val) { return val !== Object(val); };\nvar useDeepCompareEffect = function (effect, deps) {\n if (process.env.NODE_ENV !== 'production') {\n if (!(deps instanceof Array) || !deps.length) {\n console.warn('`useDeepCompareEffect` should not be used with no dependencies. Use React.useEffect instead.');\n }\n if (deps.every(isPrimitive)) {\n console.warn('`useDeepCompareEffect` should not be used with dependencies that are all primitive values. Use React.useEffect instead.');\n }\n }\n useCustomCompareEffect(effect, deps, isDeepEqual);\n};\nexport default useDeepCompareEffect;\n","'use strict';\n\n// do not edit .js files directly - edit src/index.jst\n\n\n\nmodule.exports = function equal(a, b) {\n if (a === b) return true;\n\n if (a && b && typeof a == 'object' && typeof b == 'object') {\n if (a.constructor !== b.constructor) return false;\n\n var length, i, keys;\n if (Array.isArray(a)) {\n length = a.length;\n if (length != b.length) return false;\n for (i = length; i-- !== 0;)\n if (!equal(a[i], b[i])) return false;\n return true;\n }\n\n\n\n if (a.constructor === RegExp) return a.source === b.source && a.flags === b.flags;\n if (a.valueOf !== Object.prototype.valueOf) return a.valueOf() === b.valueOf();\n if (a.toString !== Object.prototype.toString) return a.toString() === b.toString();\n\n keys = Object.keys(a);\n length = keys.length;\n if (length !== Object.keys(b).length) return false;\n\n for (i = length; i-- !== 0;)\n if (!Object.prototype.hasOwnProperty.call(b, keys[i])) return false;\n\n for (i = length; i-- !== 0;) {\n var key = keys[i];\n\n if (key === '_owner' && a.$$typeof) {\n // React-specific: avoid traversing React elements' _owner.\n // _owner contains circular references\n // and is not needed when comparing the actual elements (and not their owners)\n continue;\n }\n\n if (!equal(a[key], b[key])) return false;\n }\n\n return true;\n }\n\n // true if both NaN, false otherwise\n return a!==a && b!==b;\n};\n"],"names":["TLSSecretsConfig","props","labelWidth","editorProps","showCACert","showKeyPair","secureJsonFields","options","tooltip","label","placeholder","cols","rows","isConfigured","tlsClientCert","onChange","onUpdateDatasourceSecureJsonDataOption","onReset","updateDatasourcePluginResetOption","tlsCACert","tlsClientKey","queryHeaderProps","isDatasetSelectorHidden","PostgresTLSModes","PostgresTLSMethods","PostgresQueryModel","constructor","target","templateSrv","scopedVars","this","applyQueryDefaults","refId","interpolate","replace","rawSql","FormatRegistryID","quoteLiteral","value","getSqlCompletionProvider","getColumns","getTables","monaco","language","getStandardSQLCompletionProvider","tables","resolve","async","current","columns","table","t","getFieldConfig","type","raqbFieldType","icon","toRawSql","sql","rawQuery","haveColumns","map","c","rawColumn","name","alias","parameters","p","join","whereString","groupBy","property","g","filter","isEmpty","orderBy","orderByDirection","undefined","limit","haveColumn","some","length","haveFunction","PostgresDatasource","SqlDatasource","instanceSettings","super","getQueryModel","runSql","fields","version","values","toArray","toString","extversion","flat","getSqlLanguageDefinition","db","sqlLanguageDefinition","args","query","q","description","fetchColumns","lookup","fetchTables","id","completionProvider","formatter","formatSQL","schema","result","i","column","get","push","getDB","init","Promise","datasets","getEditorLanguageDefinition","fetchFields","validateQuery","isError","isValid","error","dsID","completion","useAutoDetectFeatures","setVersionOptions","saved","setSaved","useState","onOptionsChange","useDeepCompareEffect","url","database","user","secureJsonData","password","jsonData","sslmode","disable","sslCertFile","sslKeyFile","sslRootCertFile","postgresVersion","readOnly","isValidConfig","datasource","getDatasourceSrv","loadDatasource","getVersion","versionNumber","parseInt","timescaledb","getTimescaleDBVersion","updateDatasourcePluginJsonDataOption","major","Math","trunc","minor","String","postgresVersions","find","prev","getBackendSrv","put","updateDatasourcePluginOption","plugin","DataSourcePlugin","setQueryEditor","setConfigEditor","versionOptions","tlsModes","require","verifyCA","verifyFull","tlsMethods","filePath","fileContent","onJSONDataOptionSelected","onDSOptionChanged","event","currentTarget","FieldSet","width","InlineField","Input","I","InlineFieldRow","SecretInput","onBlur","htmlFor","Select","inputId","tlsConfigurationMethod","onUpdateDatasourceJsonDataOption","ConnectionLimits","onPropertyChanged","checked","timeInterval","Alert","title","severity","Link","rel","href","effect","deps","depsEqual","ref","useRef","useEffect","isDeepEqual","module","exports","equal","a","b","keys","Array","isArray","RegExp","source","flags","valueOf","Object","prototype","hasOwnProperty","call","key","$$typeof"],"sourceRoot":""}