Files
dbgate/plugins/dbgate-plugin-mysql/src/frontend/drivers.js
Luboš Nguyen cdde770810 enum + set for mysql (#693)
* enum + set for mysql

* enum + set for mysql | dropdown

* enum for mysql | removed empty option
2024-01-23 10:05:49 +01:00

156 lines
3.6 KiB
JavaScript

const { driverBase } = global.DBGATE_TOOLS;
const { mysqlSplitterOptions } = require('dbgate-query-splitter/lib/options');
const Dumper = require('./Dumper');
const spatialTypes = [
'POINT',
'LINESTRING',
'POLYGON',
'GEOMETRY',
'MULTIPOINT',
'MULTILINESTRING',
'MULTIPOLYGON',
'GEOMCOLLECTION',
'GEOMETRYCOLLECTION',
];
/** @type {import('dbgate-types').SqlDialect} */
const dialect = {
rangeSelect: true,
stringEscapeChar: '\\',
fallbackDataType: 'longtext',
enableConstraintsPerTable: false,
anonymousPrimaryKey: true,
explicitDropConstraint: true,
quoteIdentifier(s) {
return '`' + s + '`';
},
createColumn: true,
dropColumn: true,
changeColumn: true,
createIndex: true,
dropIndex: true,
createForeignKey: true,
dropForeignKey: true,
createPrimaryKey: true,
dropPrimaryKey: true,
dropIndexContainsTableSpec: true,
createUnique: true,
dropUnique: true,
createCheck: true,
dropCheck: true,
dropReferencesWhenDropTable: false,
requireStandaloneSelectForScopeIdentity: true,
columnProperties: {
columnComment: true,
isUnsigned: true,
isZerofill: true,
},
predefinedDataTypes: [
'char(20)',
'varchar(250)',
'binary(250)',
'varbinary(250)',
'tinyblob',
'tinytext',
'text(1000)',
'blob(1000)',
'mediumtext',
'mediumblob',
'longtext',
'longblob',
"enum('val1','val2','val3')",
"set('val1','val2','val3')",
'bit(32)',
'tinyint',
'bool',
'smallint',
'mediumint',
'int',
'bigint',
'float',
'double',
'decimal',
'date',
'datetime',
'timestamp',
'time',
'year',
],
createColumnViewExpression(columnName, dataType, source, alias) {
if (dataType && spatialTypes.includes(dataType.toUpperCase())) {
return {
exprType: 'call',
func: 'ST_AsText',
alias: alias || columnName,
args: [
{
exprType: 'column',
columnName,
source,
},
],
};
}
},
};
const mysqlDriverBase = {
...driverBase,
showConnectionField: (field, values) =>
['authType', 'user', 'password', 'defaultDatabase', 'singleDatabase', 'isReadOnly'].includes(field) ||
(values.authType == 'socket' && ['socketPath'].includes(field)) ||
(values.authType != 'socket' && ['server', 'port'].includes(field)),
dumperClass: Dumper,
dialect,
defaultPort: 3306,
getQuerySplitterOptions: usage =>
usage == 'editor'
? { ...mysqlSplitterOptions, ignoreComments: true, preventSingleLineSplit: true }
: mysqlSplitterOptions,
readOnlySessions: true,
supportsDatabaseDump: true,
authTypeLabel: 'Connection mode',
defaultAuthTypeName: 'hostPort',
defaultSocketPath: '/var/run/mysqld/mysqld.sock',
getNewObjectTemplates() {
return [
{ label: 'New view', sql: 'CREATE VIEW myview\nAS\nSELECT * FROM table1' },
{
label: 'New procedure',
sql: 'DELIMITER //\n\nCREATE PROCEDURE myproc (IN arg1 INT)\nBEGIN\n SELECT * FROM table1;\nEND\n\nDELIMITER ;',
},
{ label: 'New function', sql: 'CREATE FUNCTION myfunc (arg1 INT)\nRETURNS INT DETERMINISTIC\nRETURN 1' },
];
},
};
/** @type {import('dbgate-types').EngineDriver} */
const mysqlDriver = {
...mysqlDriverBase,
engine: 'mysql@dbgate-plugin-mysql',
title: 'MySQL',
__analyserInternals: {
quoteDefaultValues: true,
},
};
/** @type {import('dbgate-types').EngineDriver} */
const mariaDriver = {
...mysqlDriverBase,
engine: 'mariadb@dbgate-plugin-mysql',
title: 'MariaDB',
__analyserInternals: {
quoteDefaultValues: false,
},
};
module.exports = [mysqlDriver, mariaDriver];