mirror of
https://github.com/Fabio286/antares.git
synced 2025-06-05 21:59:22 +02:00
refactor(Firebird SQL): improve fields metadata detection
This commit is contained in:
@ -58,7 +58,7 @@ export const customizations: Customizations = {
|
|||||||
foreigns: false,
|
foreigns: false,
|
||||||
sortableFields: false,
|
sortableFields: false,
|
||||||
unsigned: false,
|
unsigned: false,
|
||||||
nullable: false,
|
nullable: true,
|
||||||
nullablePrimary: false,
|
nullablePrimary: false,
|
||||||
zerofill: false,
|
zerofill: false,
|
||||||
autoIncrement: false,
|
autoIncrement: false,
|
||||||
|
@ -6,21 +6,21 @@ export default [
|
|||||||
types: [
|
types: [
|
||||||
{
|
{
|
||||||
name: 'SMALLINT',
|
name: 'SMALLINT',
|
||||||
length: true,
|
length: false,
|
||||||
collation: false,
|
collation: false,
|
||||||
unsigned: true,
|
unsigned: true,
|
||||||
zerofill: true
|
zerofill: true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: 'INTEGER',
|
name: 'INTEGER',
|
||||||
length: true,
|
length: false,
|
||||||
collation: false,
|
collation: false,
|
||||||
unsigned: true,
|
unsigned: true,
|
||||||
zerofill: true
|
zerofill: true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: 'BIGINT',
|
name: 'BIGINT',
|
||||||
length: true,
|
length: false,
|
||||||
collation: false,
|
collation: false,
|
||||||
unsigned: true,
|
unsigned: true,
|
||||||
zerofill: true
|
zerofill: true
|
||||||
@ -33,6 +33,7 @@ export default [
|
|||||||
{
|
{
|
||||||
name: 'DECIMAL',
|
name: 'DECIMAL',
|
||||||
length: true,
|
length: true,
|
||||||
|
scale: true,
|
||||||
collation: false,
|
collation: false,
|
||||||
unsigned: false,
|
unsigned: false,
|
||||||
zerofill: false
|
zerofill: false
|
||||||
@ -40,20 +41,21 @@ export default [
|
|||||||
{
|
{
|
||||||
name: 'NUMERIC',
|
name: 'NUMERIC',
|
||||||
length: true,
|
length: true,
|
||||||
|
scale: true,
|
||||||
collation: false,
|
collation: false,
|
||||||
unsigned: false,
|
unsigned: false,
|
||||||
zerofill: false
|
zerofill: false
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: 'FLOAT',
|
name: 'FLOAT',
|
||||||
length: true,
|
length: false,
|
||||||
collation: false,
|
collation: false,
|
||||||
unsigned: false,
|
unsigned: false,
|
||||||
zerofill: false
|
zerofill: false
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: 'DOUBLE PRECISION',
|
name: 'DOUBLE PRECISION',
|
||||||
length: true,
|
length: false,
|
||||||
collation: false,
|
collation: false,
|
||||||
unsigned: false,
|
unsigned: false,
|
||||||
zerofill: false
|
zerofill: false
|
||||||
@ -110,7 +112,7 @@ export default [
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: 'TIMESTAMP',
|
name: 'TIMESTAMP',
|
||||||
length: true,
|
length: false,
|
||||||
collation: false,
|
collation: false,
|
||||||
unsigned: false,
|
unsigned: false,
|
||||||
zerofill: false
|
zerofill: false
|
||||||
|
@ -35,7 +35,8 @@ export const NUMBER = [
|
|||||||
'SERIAL',
|
'SERIAL',
|
||||||
'BIGSERIAL',
|
'BIGSERIAL',
|
||||||
'OID',
|
'OID',
|
||||||
'XID'
|
'XID',
|
||||||
|
'INT64'
|
||||||
];
|
];
|
||||||
|
|
||||||
export const FLOAT = [
|
export const FLOAT = [
|
||||||
|
@ -3,6 +3,7 @@ import * as antares from 'common/interfaces/antares';
|
|||||||
import * as firebird from 'node-firebird';
|
import * as firebird from 'node-firebird';
|
||||||
import { AntaresCore } from '../AntaresCore';
|
import { AntaresCore } from '../AntaresCore';
|
||||||
import dataTypes from 'common/data-types/sqlite';
|
import dataTypes from 'common/data-types/sqlite';
|
||||||
|
import { FLOAT, NUMBER } from 'common/fieldTypes';
|
||||||
|
|
||||||
export class FirebirdSQLClient extends AntaresCore {
|
export class FirebirdSQLClient extends AntaresCore {
|
||||||
private _schema?: string;
|
private _schema?: string;
|
||||||
@ -168,39 +169,64 @@ export class FirebirdSQLClient extends AntaresCore {
|
|||||||
|
|
||||||
async getTableColumns ({ schema, table }: { schema: string; table: string }) {
|
async getTableColumns ({ schema, table }: { schema: string; table: string }) {
|
||||||
interface TableColumnsResult {
|
interface TableColumnsResult {
|
||||||
POSITION: number;
|
|
||||||
DESCRIPTION?: string;
|
DESCRIPTION?: string;
|
||||||
/* eslint-disable camelcase */
|
/* eslint-disable camelcase */
|
||||||
FIELD_NAME: string;
|
FIELD_NAME: string;
|
||||||
FIELD_TYPE: string;
|
FIELD_TYPE: string;
|
||||||
|
FIELD_POSITION: number;
|
||||||
NOT_NULL: 0 | 1;
|
NOT_NULL: 0 | 1;
|
||||||
DEFAULT_VALUE: string;
|
DEFAULT_VALUE: Buffer;
|
||||||
|
DEFAULT_SOURCE: string;
|
||||||
FIELD_LENGTH: number;
|
FIELD_LENGTH: number;
|
||||||
FIELD_PRECISION: number;
|
FIELD_PRECISION: number;
|
||||||
FIELD_SCALE: number;
|
FIELD_SCALE: number;
|
||||||
/* eslint-enable camelcase */
|
/* eslint-enable camelcase */
|
||||||
SUBTYPE: string;
|
SUBTYPE: number;
|
||||||
|
EXTERNAL_TYPE: number;
|
||||||
COLLATION: string;
|
COLLATION: string;
|
||||||
CHARSET: string;
|
CHARSET: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
FIELD_SUB_TYPE
|
||||||
|
|
||||||
|
BLOB
|
||||||
|
0 - untyped
|
||||||
|
1 - text
|
||||||
|
2 - BLR
|
||||||
|
3 - access control list
|
||||||
|
4 - reserved for future use
|
||||||
|
5 - encoded table metadata description
|
||||||
|
6 - for storing the details of a cross-database transaction that ends abnormally
|
||||||
|
CHAR
|
||||||
|
0 - untyped data
|
||||||
|
1 - fixed binary data
|
||||||
|
NUMERIC FIELD
|
||||||
|
0 or NULL - the data type matches the value in the RDB$FIELD_TYPE field
|
||||||
|
1 - NUMERIC
|
||||||
|
2 - DECIMAL
|
||||||
|
*/
|
||||||
|
|
||||||
const { rows: fields } = await this.raw<antares.QueryResult<TableColumnsResult>>(`
|
const { rows: fields } = await this.raw<antares.QueryResult<TableColumnsResult>>(`
|
||||||
SELECT
|
SELECT
|
||||||
r.RDB$FIELD_NAME AS field_name,
|
r.RDB$FIELD_NAME AS field_name,
|
||||||
r.RDB$DESCRIPTION AS description,
|
r.RDB$DESCRIPTION AS description,
|
||||||
r.RDB$DEFAULT_VALUE AS default_value,
|
r.RDB$DEFAULT_VALUE AS default_value,
|
||||||
r.RDB$NULL_FLAG AS not_null,
|
r.RDB$NULL_FLAG AS not_null,
|
||||||
|
r.RDB$FIELD_POSITION AS field_position,
|
||||||
f.RDB$FIELD_LENGTH AS field_length,
|
f.RDB$FIELD_LENGTH AS field_length,
|
||||||
f.RDB$FIELD_PRECISION AS field_precision,
|
f.RDB$FIELD_PRECISION AS field_precision,
|
||||||
f.RDB$FIELD_SCALE AS field_scale,
|
f.RDB$FIELD_SCALE AS field_scale,
|
||||||
|
f.RDB$EXTERNAL_TYPE AS external_type,
|
||||||
|
r.RDB$DEFAULT_SOURCE AS default_source,
|
||||||
CASE f.RDB$FIELD_TYPE
|
CASE f.RDB$FIELD_TYPE
|
||||||
WHEN 261 THEN 'BLOB'
|
WHEN 261 THEN 'BLOB'
|
||||||
WHEN 14 THEN 'CHAR'
|
WHEN 14 THEN 'CHAR'
|
||||||
WHEN 40 THEN 'CSTRING'
|
WHEN 40 THEN 'CSTRING'
|
||||||
WHEN 11 THEN 'D_FLOAT'
|
WHEN 11 THEN 'D_FLOAT'
|
||||||
WHEN 27 THEN 'DOUBLE'
|
WHEN 27 THEN 'DOUBLE PRECISION'
|
||||||
WHEN 10 THEN 'FLOAT'
|
WHEN 10 THEN 'FLOAT'
|
||||||
WHEN 16 THEN 'INT64'
|
WHEN 16 THEN 'BIGINT'
|
||||||
WHEN 8 THEN 'INTEGER'
|
WHEN 8 THEN 'INTEGER'
|
||||||
WHEN 9 THEN 'QUAD'
|
WHEN 9 THEN 'QUAD'
|
||||||
WHEN 7 THEN 'SMALLINT'
|
WHEN 7 THEN 'SMALLINT'
|
||||||
@ -222,20 +248,31 @@ export class FirebirdSQLClient extends AntaresCore {
|
|||||||
`);
|
`);
|
||||||
|
|
||||||
return fields.map(field => {
|
return fields.map(field => {
|
||||||
|
const defaultValue = field.DEFAULT_SOURCE ? field.DEFAULT_SOURCE.replace('DEFAULT ', '') : null;
|
||||||
|
let fieldType = field.FIELD_TYPE.trim();
|
||||||
|
|
||||||
|
if ([...NUMBER, ...FLOAT].includes(fieldType)) {
|
||||||
|
if (field.SUBTYPE === 1)
|
||||||
|
fieldType = 'NUMERIC';
|
||||||
|
else if (field.SUBTYPE === 2)
|
||||||
|
fieldType = 'DECIMAL';
|
||||||
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
name: field.FIELD_NAME.trim(),
|
name: field.FIELD_NAME.trim(),
|
||||||
key: null,
|
key: null,
|
||||||
type: field.FIELD_TYPE.trim(),
|
type: fieldType,
|
||||||
schema: schema,
|
schema: schema,
|
||||||
table: table,
|
table: table,
|
||||||
numPrecision: field.FIELD_PRECISION,
|
numPrecision: field.FIELD_PRECISION ? field.FIELD_PRECISION : null,
|
||||||
datePrecision: null,
|
numScale: Math.abs(field.FIELD_SCALE),
|
||||||
charLength: field.FIELD_LENGTH,
|
datePrecision: field.FIELD_NAME.trim() === 'TIMESTAMP' ? 4 : null,
|
||||||
|
charLength: ![...NUMBER, ...FLOAT].includes(fieldType) ? field.FIELD_LENGTH : null,
|
||||||
nullable: !field.NOT_NULL,
|
nullable: !field.NOT_NULL,
|
||||||
unsigned: null,
|
unsigned: null,
|
||||||
zerofill: null,
|
zerofill: null,
|
||||||
order: field.POSITION,
|
order: field.FIELD_POSITION+1,
|
||||||
default: field.DEFAULT_VALUE,
|
default: defaultValue,
|
||||||
charset: field.CHARSET,
|
charset: field.CHARSET,
|
||||||
collation: null,
|
collation: null,
|
||||||
autoIncrement: false,
|
autoIncrement: false,
|
||||||
@ -784,6 +821,15 @@ export class FirebirdSQLClient extends AntaresCore {
|
|||||||
|
|
||||||
if (fields) {
|
if (fields) {
|
||||||
remappedFields = fields.map(field => {
|
remappedFields = fields.map(field => {
|
||||||
|
let fieldType = this.types[field.type];
|
||||||
|
|
||||||
|
if ([...NUMBER, ...FLOAT].includes(fieldType)) {
|
||||||
|
if (field.subType === 1)
|
||||||
|
fieldType = 'NUMERIC';
|
||||||
|
else if (field.subType === 2)
|
||||||
|
fieldType = 'DECIMAL';
|
||||||
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
name: field.alias,
|
name: field.alias,
|
||||||
alias: field.alias,
|
alias: field.alias,
|
||||||
@ -792,8 +838,8 @@ export class FirebirdSQLClient extends AntaresCore {
|
|||||||
table: field.relation,
|
table: field.relation,
|
||||||
tableAlias: field.relation,
|
tableAlias: field.relation,
|
||||||
orgTable: field.relation,
|
orgTable: field.relation,
|
||||||
type: this.types[field.type],
|
type: fieldType,
|
||||||
length: field.length,
|
length: fieldType === 'TIMESTAMP' ? 4 : field.length,
|
||||||
key: undefined as string
|
key: undefined as string
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
@ -300,7 +300,7 @@ const getFieldsData = async () => {
|
|||||||
field.defaultType = 'noval';
|
field.defaultType = 'noval';
|
||||||
else if (field.default === 'NULL')
|
else if (field.default === 'NULL')
|
||||||
field.defaultType = 'null';
|
field.defaultType = 'null';
|
||||||
else if (isNaN(+field.default) && field.default.charAt(0) !== '\'')
|
else if (typeof field.default === 'string' && isNaN(+field.default) && field.default.charAt(0) !== '\'')
|
||||||
field.defaultType = 'expression';
|
field.defaultType = 'expression';
|
||||||
else {
|
else {
|
||||||
field.defaultType = 'custom';
|
field.defaultType = 'custom';
|
||||||
|
Reference in New Issue
Block a user