mirror of
https://github.com/DeNNiiInc/dbgate.git
synced 2026-04-26 15:36:28 +00:00
feat: basic firebird analyser
This commit is contained in:
45
integration-tests/firebird.conf
Normal file
45
integration-tests/firebird.conf
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
# Custom Firebird Configuration
|
||||||
|
|
||||||
|
# Wire encryption settings
|
||||||
|
# Options: Enabled, Required, Disabled
|
||||||
|
WireCrypt = Disabled
|
||||||
|
|
||||||
|
# Authentication settings
|
||||||
|
# Add Legacy_Auth to support older clients
|
||||||
|
AuthServer = Legacy_Auth
|
||||||
|
|
||||||
|
# User manager plugin
|
||||||
|
UserManager = Legacy_UserManager
|
||||||
|
|
||||||
|
# Default character set
|
||||||
|
DefaultCharSet = UTF8
|
||||||
|
|
||||||
|
# Buffer settings for better performance
|
||||||
|
DefaultDbCachePages = 2048
|
||||||
|
TempCacheLimit = 512M
|
||||||
|
|
||||||
|
# Connection settings
|
||||||
|
ConnectionTimeout = 180
|
||||||
|
DatabaseGrowthIncrement = 128M
|
||||||
|
|
||||||
|
# TCP Protocol settings
|
||||||
|
TcpRemoteBufferSize = 8192
|
||||||
|
TcpNoNagle = 1
|
||||||
|
|
||||||
|
# Security settings
|
||||||
|
RemoteServiceName = gds_db
|
||||||
|
RemoteServicePort = 3050
|
||||||
|
RemoteAuxPort = 0
|
||||||
|
RemotePipeName = firebird
|
||||||
|
|
||||||
|
# Lock settings
|
||||||
|
LockMemSize = 1M
|
||||||
|
LockHashSlots = 8191
|
||||||
|
LockAcquireSpins = 0
|
||||||
|
|
||||||
|
# Log settings
|
||||||
|
FileSystemCacheThreshold = 65536
|
||||||
|
FileSystemCacheSize = 0
|
||||||
|
|
||||||
|
# Compatibility settings for older clients
|
||||||
|
CompatiblityDialect = 3
|
||||||
46
plugins/dbgate-plugin-firebird/package.json
Normal file
46
plugins/dbgate-plugin-firebird/package.json
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
{
|
||||||
|
"name": "dbgate-plugin-firebird",
|
||||||
|
"main": "dist/backend.js",
|
||||||
|
"version": "6.0.0-alpha.1",
|
||||||
|
"license": "GPL-3.0",
|
||||||
|
"description": "firebirdQL connector plugin for DbGate",
|
||||||
|
"homepage": "https://dbgate.org",
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/dbgate/dbgate"
|
||||||
|
},
|
||||||
|
"author": "Jan Prochazka",
|
||||||
|
"keywords": [
|
||||||
|
"dbgate",
|
||||||
|
"firebird",
|
||||||
|
"dbgatebuiltin"
|
||||||
|
],
|
||||||
|
"files": [
|
||||||
|
"dist",
|
||||||
|
"icon.svg"
|
||||||
|
],
|
||||||
|
"scripts": {
|
||||||
|
"build:frontend": "webpack --config webpack-frontend.config",
|
||||||
|
"build:frontend:watch": "webpack --watch --config webpack-frontend.config",
|
||||||
|
"build:backend": "webpack --config webpack-backend.config.js",
|
||||||
|
"build": "yarn build:frontend && yarn build:backend",
|
||||||
|
"plugin": "yarn build && yarn pack && dbgate-plugin dbgate-plugin-firebird",
|
||||||
|
"copydist": "yarn build && yarn pack && dbgate-copydist ../dist/dbgate-plugin-firebird",
|
||||||
|
"plugout": "dbgate-plugout dbgate-plugin-firebird",
|
||||||
|
"prepublishOnly": "yarn build"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"dbgate-plugin-tools": "^1.0.7",
|
||||||
|
"webpack": "^5.91.0",
|
||||||
|
"webpack-cli": "^5.1.4"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"wkx": "^0.5.0",
|
||||||
|
"pg-copy-streams": "^6.0.6",
|
||||||
|
"node-firebird": "^1.1.9",
|
||||||
|
"dbgate-query-splitter": "^4.11.3",
|
||||||
|
"dbgate-tools": "^6.0.0-alpha.1",
|
||||||
|
"lodash": "^4.17.21",
|
||||||
|
"pg": "^8.11.5"
|
||||||
|
}
|
||||||
|
}
|
||||||
9
plugins/dbgate-plugin-firebird/prettier.config.js
Normal file
9
plugins/dbgate-plugin-firebird/prettier.config.js
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
module.exports = {
|
||||||
|
trailingComma: 'es5',
|
||||||
|
tabWidth: 2,
|
||||||
|
semi: true,
|
||||||
|
singleQuote: true,
|
||||||
|
arrowParen: 'avoid',
|
||||||
|
arrowParens: 'avoid',
|
||||||
|
printWidth: 120,
|
||||||
|
};
|
||||||
51
plugins/dbgate-plugin-firebird/src/backend/Analyser.js
Normal file
51
plugins/dbgate-plugin-firebird/src/backend/Analyser.js
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
const _ = require('lodash');
|
||||||
|
const sql = require('./sql');
|
||||||
|
const { getDataTypeString } = require('./helpers');
|
||||||
|
|
||||||
|
const { DatabaseAnalyser } = require('dbgate-tools');
|
||||||
|
|
||||||
|
class Analyser extends DatabaseAnalyser {
|
||||||
|
constructor(dbhan, driver, version) {
|
||||||
|
super(dbhan, driver, version);
|
||||||
|
}
|
||||||
|
|
||||||
|
async _runAnalysis() {
|
||||||
|
const tablesResult = await this.driver.query(this.dbhan, sql.tables);
|
||||||
|
const columnsResult = await this.driver.query(this.dbhan, sql.columns);
|
||||||
|
|
||||||
|
const columns = columnsResult.rows.map(i => ({
|
||||||
|
tableName: i.TABLENAME,
|
||||||
|
columnName: i.COLUMNNAME,
|
||||||
|
notNull: i.NOTNULL,
|
||||||
|
isPrimaryKey: i.ISPRIMARYKEY,
|
||||||
|
dataType: getDataTypeString(i),
|
||||||
|
precision: i.NUMBERPRECISION,
|
||||||
|
scale: i.SCALE,
|
||||||
|
length: i.LENGTH,
|
||||||
|
defaultValue: i.DEFAULTVALUE,
|
||||||
|
columnComment: i.COLUMNCOMMENT,
|
||||||
|
isUnsigned: i.ISUNSIGNED,
|
||||||
|
pureName: i.PURENAME,
|
||||||
|
schemaName: i.SCHEMANAME,
|
||||||
|
}));
|
||||||
|
const tables = tablesResult.rows.map(i => ({
|
||||||
|
pureName: i.PURENAME,
|
||||||
|
objectId: i.OBJECTID,
|
||||||
|
schemaName: i.SCHEMANAME,
|
||||||
|
objectComment: i.OBJECTCOMMENT,
|
||||||
|
}));
|
||||||
|
|
||||||
|
return {
|
||||||
|
tables: tables.map(table => ({
|
||||||
|
...table,
|
||||||
|
columns: columns.filter(column => column.tableName === table.pureName),
|
||||||
|
})),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
async _getFastSnapshot() {
|
||||||
|
return this._runAnalysis();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = Analyser;
|
||||||
146
plugins/dbgate-plugin-firebird/src/backend/driver.js
Normal file
146
plugins/dbgate-plugin-firebird/src/backend/driver.js
Normal file
@@ -0,0 +1,146 @@
|
|||||||
|
const _ = require('lodash');
|
||||||
|
const driverBase = require('../frontend/driver');
|
||||||
|
const Analyser = require('./Analyser');
|
||||||
|
const Firebird = require('node-firebird');
|
||||||
|
const { getLogger, extractErrorLogData, createBulkInsertStreamBase } = require('dbgate-tools');
|
||||||
|
const sql = require('./sql');
|
||||||
|
|
||||||
|
const logger = getLogger('firebird');
|
||||||
|
|
||||||
|
/** @type {import('dbgate-types').EngineDriver<Firebird.Database>} */
|
||||||
|
const driver = {
|
||||||
|
...driverBase,
|
||||||
|
analyserClass: Analyser,
|
||||||
|
async connect({ port, user, password, server, databaseFile }) {
|
||||||
|
const options = {
|
||||||
|
host: server,
|
||||||
|
port,
|
||||||
|
database: databaseFile,
|
||||||
|
user,
|
||||||
|
password,
|
||||||
|
};
|
||||||
|
|
||||||
|
/**@type {Firebird.Database} */
|
||||||
|
const db = await new Promise((resolve, reject) => {
|
||||||
|
Firebird.attach(options, (err, db) => {
|
||||||
|
if (err) {
|
||||||
|
reject(err);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
resolve(db);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
return {
|
||||||
|
client: db,
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
async query(dbhan, sql) {
|
||||||
|
const res = await new Promise((resolve, reject) => {
|
||||||
|
dbhan.client.query(sql, (err, result) => {
|
||||||
|
if (err) {
|
||||||
|
reject(err);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
resolve(result);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
const columns = res[0] ? Object.keys(res[0]).map(i => ({ columnName: i })) : [];
|
||||||
|
|
||||||
|
return {
|
||||||
|
rows: res,
|
||||||
|
columns,
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
async script(dbhan, sql) {
|
||||||
|
throw new Error('Not implemented');
|
||||||
|
},
|
||||||
|
|
||||||
|
async stream(dbhan, sql, options) {
|
||||||
|
try {
|
||||||
|
await new Promise((resolve, reject) => {
|
||||||
|
let hasSentColumns = false;
|
||||||
|
dbhan.client.sequentially(
|
||||||
|
sql,
|
||||||
|
[],
|
||||||
|
(row, index) => {
|
||||||
|
if (!hasSentColumns) {
|
||||||
|
hasSentColumns = true;
|
||||||
|
const columns = Object.keys(row).map(i => ({ columnName: i }));
|
||||||
|
options.recordset(columns);
|
||||||
|
}
|
||||||
|
|
||||||
|
options.row(row);
|
||||||
|
},
|
||||||
|
err => {
|
||||||
|
if (err) {
|
||||||
|
reject(err);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
resolve();
|
||||||
|
}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
options.done();
|
||||||
|
} catch (err) {
|
||||||
|
logger.error(extractErrorLogData(err), 'Stream error');
|
||||||
|
options.info({
|
||||||
|
message: err.message,
|
||||||
|
line: err.line,
|
||||||
|
// procedure: procName,
|
||||||
|
time: new Date(),
|
||||||
|
severity: 'error',
|
||||||
|
});
|
||||||
|
options.done();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
async readQuery(dbhan, sql, structure) {
|
||||||
|
throw new Error('Not implemented');
|
||||||
|
},
|
||||||
|
|
||||||
|
async writeTable(dbhan, name, options) {
|
||||||
|
return createBulkInsertStream(this, stream, dbhan, name, options);
|
||||||
|
},
|
||||||
|
|
||||||
|
async getVersion(dbhan) {
|
||||||
|
const res = await this.query(dbhan, sql.version);
|
||||||
|
const version = res.rows?.[0]?.VERSION;
|
||||||
|
|
||||||
|
return {
|
||||||
|
version,
|
||||||
|
versionText: `Firebird ${version}`,
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
async listDatabases(dbhan) {
|
||||||
|
return [
|
||||||
|
{
|
||||||
|
name: 'default',
|
||||||
|
},
|
||||||
|
];
|
||||||
|
},
|
||||||
|
|
||||||
|
async createDatabase(dbhan, name) {},
|
||||||
|
|
||||||
|
async dropDatabase(dbhan, name) {},
|
||||||
|
|
||||||
|
async close(dbhan) {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
dbhan.client.detach(err => {
|
||||||
|
if (err) {
|
||||||
|
reject(err);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
resolve();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports = driver;
|
||||||
54
plugins/dbgate-plugin-firebird/src/backend/helpers.js
Normal file
54
plugins/dbgate-plugin-firebird/src/backend/helpers.js
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
function getDataTypeString(column) {
|
||||||
|
if (!column) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
const { DATATYPECODE, SCALE, LENGTH, NUMBERPRECISION } = column;
|
||||||
|
|
||||||
|
switch (DATATYPECODE) {
|
||||||
|
case 7:
|
||||||
|
return 'SMALLINT';
|
||||||
|
|
||||||
|
case 8:
|
||||||
|
return 'INTEGER';
|
||||||
|
|
||||||
|
case 9:
|
||||||
|
return 'BIGINT';
|
||||||
|
|
||||||
|
case 10:
|
||||||
|
return 'FLOAT';
|
||||||
|
|
||||||
|
case 11:
|
||||||
|
return 'DOUBLE PRECISION';
|
||||||
|
|
||||||
|
case 12:
|
||||||
|
return 'DATE';
|
||||||
|
|
||||||
|
case 13:
|
||||||
|
return 'TIME';
|
||||||
|
|
||||||
|
case 14:
|
||||||
|
return `CHAR(${LENGTH})`;
|
||||||
|
|
||||||
|
case 16:
|
||||||
|
return `DECIMAL(${NUMBERPRECISION}, ${SCALE})`;
|
||||||
|
|
||||||
|
case 27:
|
||||||
|
return 'DOUBLE PRECISION';
|
||||||
|
|
||||||
|
case 35:
|
||||||
|
return 'BLOB';
|
||||||
|
|
||||||
|
case 37:
|
||||||
|
return `VARCHAR(${LENGTH})`;
|
||||||
|
|
||||||
|
case 261:
|
||||||
|
return 'CSTRING';
|
||||||
|
|
||||||
|
default:
|
||||||
|
return `UNKNOWN (${DATATYPECODE})`;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
getDataTypeString,
|
||||||
|
};
|
||||||
7
plugins/dbgate-plugin-firebird/src/backend/index.js
Normal file
7
plugins/dbgate-plugin-firebird/src/backend/index.js
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
const driver = require('./driver');
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
packageName: 'dbgate-plugin-firebird',
|
||||||
|
drivers: [driver],
|
||||||
|
initialize(dbgateEnv) {},
|
||||||
|
};
|
||||||
43
plugins/dbgate-plugin-firebird/src/backend/sql/columns.js
Normal file
43
plugins/dbgate-plugin-firebird/src/backend/sql/columns.js
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
module.exports = `
|
||||||
|
SELECT DISTINCT
|
||||||
|
CAST(TRIM(rf.rdb$relation_name) AS VARCHAR(255)) AS tableName,
|
||||||
|
CAST(TRIM(rf.rdb$field_name) AS VARCHAR(255)) AS columnName,
|
||||||
|
CASE rf.rdb$null_flag WHEN 1 THEN FALSE ELSE TRUE END AS notNull,
|
||||||
|
CASE
|
||||||
|
WHEN EXISTS (
|
||||||
|
SELECT 1
|
||||||
|
FROM rdb$relation_constraints rc
|
||||||
|
JOIN rdb$index_segments idx ON rc.rdb$index_name = idx.rdb$index_name
|
||||||
|
WHERE rc.rdb$relation_name = rf.rdb$relation_name
|
||||||
|
AND idx.rdb$field_name = rf.rdb$field_name
|
||||||
|
AND rc.rdb$constraint_type = 'PRIMARY KEY'
|
||||||
|
) THEN TRUE
|
||||||
|
ELSE FALSE
|
||||||
|
END AS isPrimaryKey,
|
||||||
|
f.rdb$field_type AS dataTypeCode,
|
||||||
|
f.rdb$field_precision AS numberprecision,
|
||||||
|
f.rdb$field_scale AS scale,
|
||||||
|
f.rdb$field_length AS length,
|
||||||
|
CAST(TRIM(rf.rdb$default_value) AS VARCHAR(255)) AS defaultValue,
|
||||||
|
CAST(TRIM(rf.rdb$description) AS VARCHAR(255)) AS columnComment,
|
||||||
|
CASE
|
||||||
|
WHEN f.rdb$field_type IN (8, 9, 16) AND f.rdb$field_scale < 0 THEN TRUE
|
||||||
|
ELSE FALSE
|
||||||
|
END AS isUnsigned,
|
||||||
|
CAST(TRIM(rf.rdb$field_name) AS VARCHAR(255)) AS pureName,
|
||||||
|
CAST(TRIM(r.rdb$owner_name) AS VARCHAR(255)) AS schemaName
|
||||||
|
FROM
|
||||||
|
rdb$relation_fields rf
|
||||||
|
JOIN
|
||||||
|
rdb$relations r ON rf.rdb$relation_name = r.rdb$relation_name
|
||||||
|
LEFT JOIN
|
||||||
|
rdb$fields f ON rf.rdb$field_source = f.rdb$field_name
|
||||||
|
LEFT JOIN
|
||||||
|
rdb$character_sets cs ON f.rdb$character_set_id = cs.rdb$character_set_id
|
||||||
|
LEFT JOIN
|
||||||
|
rdb$collations co ON f.rdb$collation_id = co.rdb$collation_id
|
||||||
|
WHERE
|
||||||
|
r.rdb$system_flag = 0
|
||||||
|
ORDER BY
|
||||||
|
tableName, rf.rdb$field_position;
|
||||||
|
`;
|
||||||
9
plugins/dbgate-plugin-firebird/src/backend/sql/index.js
Normal file
9
plugins/dbgate-plugin-firebird/src/backend/sql/index.js
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
const version = require('./version');
|
||||||
|
const tables = require('./tables');
|
||||||
|
const columns = require('./columns');
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
version,
|
||||||
|
columns,
|
||||||
|
tables,
|
||||||
|
};
|
||||||
9
plugins/dbgate-plugin-firebird/src/backend/sql/tables.js
Normal file
9
plugins/dbgate-plugin-firebird/src/backend/sql/tables.js
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
module.exports = `
|
||||||
|
SELECT
|
||||||
|
TRIM(RDB$RELATION_NAME) AS pureName,
|
||||||
|
RDB$DESCRIPTION AS objectComment,
|
||||||
|
RDB$FORMAT AS objectTypeField
|
||||||
|
FROM RDB$RELATIONS
|
||||||
|
WHERE RDB$SYSTEM_FLAG = 0 -- only user-defined tables
|
||||||
|
ORDER BY pureName;
|
||||||
|
`;
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
module.exports = `SELECT rdb$get_context('SYSTEM', 'ENGINE_VERSION') as version from rdb$database;`;
|
||||||
5
plugins/dbgate-plugin-firebird/src/frontend/Dumper.js
Normal file
5
plugins/dbgate-plugin-firebird/src/frontend/Dumper.js
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
const { SqlDumper } = global.DBGATE_PACKAGES['dbgate-tools'];
|
||||||
|
|
||||||
|
class Dumper extends SqlDumper {}
|
||||||
|
|
||||||
|
module.exports = Dumper;
|
||||||
85
plugins/dbgate-plugin-firebird/src/frontend/driver.js
Normal file
85
plugins/dbgate-plugin-firebird/src/frontend/driver.js
Normal file
@@ -0,0 +1,85 @@
|
|||||||
|
const { driverBase } = global.DBGATE_PACKAGES['dbgate-tools'];
|
||||||
|
const Dumper = require('./Dumper');
|
||||||
|
|
||||||
|
/** @type {import('dbgate-types').SqlDialect} */
|
||||||
|
const dialect = {
|
||||||
|
rangeSelect: true,
|
||||||
|
ilike: true,
|
||||||
|
defaultSchemaName: 'public',
|
||||||
|
multipleSchema: true,
|
||||||
|
stringEscapeChar: "'",
|
||||||
|
fallbackDataType: 'varchar',
|
||||||
|
anonymousPrimaryKey: false,
|
||||||
|
enableConstraintsPerTable: true,
|
||||||
|
stringAgg: true,
|
||||||
|
|
||||||
|
createColumn: true,
|
||||||
|
dropColumn: true,
|
||||||
|
changeColumn: true,
|
||||||
|
createIndex: true,
|
||||||
|
dropIndex: true,
|
||||||
|
createForeignKey: true,
|
||||||
|
dropForeignKey: true,
|
||||||
|
createPrimaryKey: true,
|
||||||
|
dropPrimaryKey: true,
|
||||||
|
createUnique: true,
|
||||||
|
dropUnique: true,
|
||||||
|
createCheck: true,
|
||||||
|
dropCheck: true,
|
||||||
|
allowMultipleValuesInsert: true,
|
||||||
|
renameSqlObject: true,
|
||||||
|
filteredIndexes: true,
|
||||||
|
};
|
||||||
|
|
||||||
|
const firebirdSplitterOptions = {
|
||||||
|
stringsBegins: ["'", '"'],
|
||||||
|
stringsEnds: {
|
||||||
|
"'": "'",
|
||||||
|
'"': '"',
|
||||||
|
},
|
||||||
|
stringEscapes: {
|
||||||
|
"'": "'", // Single quote is escaped by another single quote
|
||||||
|
'"': '"', // Double quote is escaped by another double quote
|
||||||
|
},
|
||||||
|
allowSemicolon: true,
|
||||||
|
allowCustomDelimiter: false,
|
||||||
|
allowCustomSqlTerminator: false,
|
||||||
|
allowGoDelimiter: false,
|
||||||
|
allowSlashDelimiter: false,
|
||||||
|
allowDollarDollarString: false,
|
||||||
|
noSplit: false,
|
||||||
|
doubleDashComments: true,
|
||||||
|
multilineComments: true,
|
||||||
|
javaScriptComments: false,
|
||||||
|
skipSeparatorBeginEnd: false,
|
||||||
|
ignoreComments: false,
|
||||||
|
preventSingleLineSplit: false,
|
||||||
|
adaptiveGoSplit: false,
|
||||||
|
returnRichInfo: false,
|
||||||
|
splitByLines: false,
|
||||||
|
splitByEmptyLine: false,
|
||||||
|
copyFromStdin: false,
|
||||||
|
queryParameterStyle: ':', // Firebird uses colon-prefixed parameters (:param_name)
|
||||||
|
};
|
||||||
|
|
||||||
|
/** @type {import('dbgate-types').EngineDriver} */
|
||||||
|
const firebirdDriverBase = {
|
||||||
|
...driverBase,
|
||||||
|
defaultPort: 3050,
|
||||||
|
showConnectionField: field => ['port', 'user', 'password', 'server', 'databaseFile'].includes(field),
|
||||||
|
getQuerySplitterOptions: () => firebirdSplitterOptions,
|
||||||
|
// beforeConnectionSave: connection => {
|
||||||
|
// const { databaseFile } = connection;
|
||||||
|
// return {
|
||||||
|
// singleDatabase: true,
|
||||||
|
// defaultDatabase: databaseFile,
|
||||||
|
// };
|
||||||
|
// },
|
||||||
|
engine: 'firebird@dbgate-plugin-firebird',
|
||||||
|
title: 'Firebird',
|
||||||
|
supportsTransactions: true,
|
||||||
|
dumperClass: Dumper,
|
||||||
|
dialect,
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports = firebirdDriverBase;
|
||||||
6
plugins/dbgate-plugin-firebird/src/frontend/index.js
Normal file
6
plugins/dbgate-plugin-firebird/src/frontend/index.js
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
import driver from './driver';
|
||||||
|
|
||||||
|
export default {
|
||||||
|
packageName: 'dbgate-plugin-firebird',
|
||||||
|
drivers: [driver],
|
||||||
|
};
|
||||||
46
plugins/dbgate-plugin-firebird/webpack-backend.config.js
Normal file
46
plugins/dbgate-plugin-firebird/webpack-backend.config.js
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
var webpack = require('webpack');
|
||||||
|
var path = require('path');
|
||||||
|
|
||||||
|
const packageJson = require('./package.json');
|
||||||
|
const buildPluginExternals = require('../../common/buildPluginExternals');
|
||||||
|
const externals = buildPluginExternals(packageJson);
|
||||||
|
|
||||||
|
var config = {
|
||||||
|
context: __dirname + '/src/backend',
|
||||||
|
|
||||||
|
entry: {
|
||||||
|
app: './index.js',
|
||||||
|
},
|
||||||
|
target: 'node',
|
||||||
|
output: {
|
||||||
|
path: path.resolve(__dirname, 'dist'),
|
||||||
|
filename: 'backend.js',
|
||||||
|
libraryTarget: 'commonjs2',
|
||||||
|
},
|
||||||
|
|
||||||
|
// uncomment for disable minimalization
|
||||||
|
// optimization: {
|
||||||
|
// minimize: false,
|
||||||
|
// },
|
||||||
|
|
||||||
|
plugins: [
|
||||||
|
new webpack.IgnorePlugin({
|
||||||
|
checkResource(resource) {
|
||||||
|
const lazyImports = ['pg-native', 'uws'];
|
||||||
|
if (!lazyImports.includes(resource)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
require.resolve(resource);
|
||||||
|
} catch (err) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
],
|
||||||
|
|
||||||
|
externals,
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports = config;
|
||||||
30
plugins/dbgate-plugin-firebird/webpack-frontend.config.js
Normal file
30
plugins/dbgate-plugin-firebird/webpack-frontend.config.js
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
var webpack = require('webpack');
|
||||||
|
var path = require('path');
|
||||||
|
|
||||||
|
var config = {
|
||||||
|
context: __dirname + '/src/frontend',
|
||||||
|
|
||||||
|
entry: {
|
||||||
|
app: './index.js',
|
||||||
|
},
|
||||||
|
target: 'web',
|
||||||
|
output: {
|
||||||
|
path: path.resolve(__dirname, 'dist'),
|
||||||
|
filename: 'frontend.js',
|
||||||
|
libraryTarget: 'var',
|
||||||
|
library: 'plugin',
|
||||||
|
},
|
||||||
|
|
||||||
|
plugins: [
|
||||||
|
new webpack.DefinePlugin({
|
||||||
|
'global.DBGATE_PACKAGES': 'window.DBGATE_PACKAGES',
|
||||||
|
}),
|
||||||
|
],
|
||||||
|
|
||||||
|
// uncomment for disable minimalization
|
||||||
|
// optimization: {
|
||||||
|
// minimize: false,
|
||||||
|
// },
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports = config;
|
||||||
18
yarn.lock
18
yarn.lock
@@ -3310,6 +3310,11 @@ better-sqlite3@11.8.1:
|
|||||||
bindings "^1.5.0"
|
bindings "^1.5.0"
|
||||||
prebuild-install "^7.1.1"
|
prebuild-install "^7.1.1"
|
||||||
|
|
||||||
|
big-integer@^1.6.51:
|
||||||
|
version "1.6.52"
|
||||||
|
resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.52.tgz#60a887f3047614a8e1bffe5d7173490a97dc8c85"
|
||||||
|
integrity sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==
|
||||||
|
|
||||||
big.js@^5.2.2:
|
big.js@^5.2.2:
|
||||||
version "5.2.2"
|
version "5.2.2"
|
||||||
resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328"
|
resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328"
|
||||||
@@ -7873,6 +7878,11 @@ long@*, long@^5.2.1, long@~5.2.3:
|
|||||||
resolved "https://registry.yarnpkg.com/long/-/long-5.2.3.tgz#a3ba97f3877cf1d778eccbcb048525ebb77499e1"
|
resolved "https://registry.yarnpkg.com/long/-/long-5.2.3.tgz#a3ba97f3877cf1d778eccbcb048525ebb77499e1"
|
||||||
integrity sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==
|
integrity sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==
|
||||||
|
|
||||||
|
long@^5.2.3:
|
||||||
|
version "5.3.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/long/-/long-5.3.2.tgz#1d84463095999262d7d7b7f8bfd4a8cc55167f83"
|
||||||
|
integrity sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==
|
||||||
|
|
||||||
lru-cache@^10.2.0:
|
lru-cache@^10.2.0:
|
||||||
version "10.4.3"
|
version "10.4.3"
|
||||||
resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119"
|
resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119"
|
||||||
@@ -8437,6 +8447,14 @@ node-cron@^2.0.3:
|
|||||||
opencollective-postinstall "^2.0.0"
|
opencollective-postinstall "^2.0.0"
|
||||||
tz-offset "0.0.1"
|
tz-offset "0.0.1"
|
||||||
|
|
||||||
|
node-firebird@^1.1.9:
|
||||||
|
version "1.1.9"
|
||||||
|
resolved "https://registry.yarnpkg.com/node-firebird/-/node-firebird-1.1.9.tgz#0e6815b4e209812a4c85b71227e40e268bedeb8b"
|
||||||
|
integrity sha512-6Ol+Koide1WbfUp4BJ1dSA4wm091jAgCwwSoihxO/RRdcfR+dMVDE9jd2Z2ixjk7q/vSNJUYORXv7jmRfvwdrw==
|
||||||
|
dependencies:
|
||||||
|
big-integer "^1.6.51"
|
||||||
|
long "^5.2.3"
|
||||||
|
|
||||||
node-gyp@^7.1.0:
|
node-gyp@^7.1.0:
|
||||||
version "7.1.2"
|
version "7.1.2"
|
||||||
resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-7.1.2.tgz#21a810aebb187120251c3bcec979af1587b188ae"
|
resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-7.1.2.tgz#21a810aebb187120251c3bcec979af1587b188ae"
|
||||||
|
|||||||
Reference in New Issue
Block a user