cweijan / vscode-database-client

Database Client For Visual Studio Code
https://database-client.com
MIT License
2.43k stars 268 forks source link

AS400:DB2 Dialect #1203

Open dtrywets opened 1 month ago

dtrywets commented 1 month ago

Hey there, I've translated the db2 dialect part of extensions.js. I also added JDBC Driver 'com.ibm.as400.access.AS400JDBCDriver', which was needed to successfully connect to AS400/db2.

Here's my result which works absolutely fine for me.

Release: V7R3M0

// src/service/main/dialect/sql-other/db2Dialect.ts
// manually translated to match sys-tables of AS400

var Uw = class extends $a {
  showVersion() {
    return `SELECT SYSTEM_VALUE_NAME, CURRENT_CHARACTER_VALUE FROM QSYS2.SYSTEM_VALUE_INFO WHERE SYSTEM_VALUE_NAME IN ('QSRLNBR', 'QMODEL');`;
  }

  showUsers() {
    return `SELECT AUTHORIZATION_NAME AS "user" FROM QSYS2.USER_INFO WHERE STATUS = 'ENABLED';`;
  }

  pingDataBase(e) {
    return e ? `SET SCHEMA ${e}` : null;
  }

  showDatabases() {
    return `SELECT SCHEMA_NAME AS "database" FROM QSYS2.SYSSCHEMAS;`;
  }

  showTableSource(e, t) {
    return null;
  }

  showTables(e, t) {
    return `SELECT TABLE_NAME AS "name", TABLE_TEXT AS "comment" FROM QSYS2.SYSTABLES WHERE TABLE_SCHEMA='${t}' AND TABLE_TYPE='T' ORDER BY TABLE_NAME;`;
  }

  showColumns(e, t) {
    return `SELECT COLUMN_NAME AS "name",
                   DATA_TYPE AS "type",
                   IS_NULLABLE AS "nullable",
                   NUMERIC_PRECISION AS "precision",
                   NUMERIC_SCALE AS "scale",
                   CHARACTER_MAXIMUM_LENGTH AS "maximum_length",
                   COLUMN_DEFAULT AS "defaultValue",
                   COLUMN_TEXT AS "comment",
                   IDENTITY AS "isAutoIncrement"
            FROM QSYS2.SYSCOLUMNS
            WHERE TABLE_SCHEMA = '${e}'
              AND TABLE_NAME = '${t}'
            ORDER BY ORDINAL_POSITION;`;
  }

  updateColumnSql(e) {
    return new Bw(e).genAlterSQL();
  }

  showAllForeignKeys() {
    return `SELECT 
                CONSTRAINT_NAME AS "constraint_name",
                TABLE_SCHEMA AS "table_schema",
                TABLE_NAME AS "table_name",
                CONSTRAINT_KEYS AS "column_name",
                SYSTEM_TABLE_NAME AS "referenced_table",
                SYSTEM_CONSTRAINT_SCHEMA AS "referenced_column"
            FROM QSYS2.SYSCST
            WHERE CONSTRAINT_TYPE = 'FOREIGN KEY';`;
  }

  showForeignKeys(e, t) {
    return `SELECT 
                CONSTRAINT_KEYS AS "column_name",
                CONSTRAINT_NAME AS "constraint_name",
                SYSTEM_TABLE_NAME AS "referenced_table",
                SYSTEM_CONSTRAINT_SCHEMA AS "referenced_column"
            FROM QSYS2.SYSCST
            WHERE TABLE_SCHEMA='${e}' AND TABLE_NAME='${t}' AND CONSTRAINT_TYPE='FOREIGN KEY';`;
  }

  showIndex(e, t) {
    return `SELECT 
                INDEX_NAME AS "index_name",
                COLUMN_NAME AS "column_name",
                CASE WHEN NON_UNIQUE = 0 THEN 'YES' ELSE 'NO' END AS "isUnique"
            FROM QSYS2.SYSINDEXES
            WHERE TABLE_NAME = '${t}' AND TABLE_SCHEMA = '${e}';`;
  }

  showViews(e, t) {
    return `SELECT VIEW_NAME AS "name", VIEW_DEFINITION AS "source" FROM QSYS2.SYSVIEWS WHERE TABLE_SCHEMA = '${t}';`;
  }

  showProcedures(e) {
    return `SELECT SPECIFIC_NAME AS "routine_name", ROUTINE_DEFINITION AS "source" FROM QSYS2.SYSROUTINES WHERE ROUTINE_SCHEMA = '${e}' ORDER BY SPECIFIC_NAME;`;
  }

  showChecks(e, t) {
    return `SELECT CONSTRAINT_NAME AS "name", CHECK_CLAUSE AS "clause" FROM QSYS2.SYSCST WHERE TABLE_NAME = '${t}' AND TABLE_SCHEMA = '${e}' AND CONSTRAINT_TYPE = 'CHECK';`;
  }

  showTriggers(e, t) {
    return `SELECT TRIGGER_NAME AS "trigger_name", ACTION_STATEMENT AS "source", EVENT_OBJECT_TABLE AS "table_name", EVENT_MANIPULATION AS "event" FROM QSYS2.SYSTRIGGERS WHERE EVENT_OBJECT_SCHEMA = '${e}'${t ? ` AND EVENT_OBJECT_TABLE = '${t}'` : ''};`;
  }

  showFunctions(e) {
    return `SELECT SPECIFIC_NAME AS "routine_name", ROUTINE_DEFINITION AS "source" FROM QSYS2.SYSFUNCS WHERE FUNCTION_SCHEMA = '${e}' ORDER BY SPECIFIC_NAME;`;
  }

  dropIndex(e, t) {
    return `DROP INDEX ${e}.${t};`;
  }

  tableTemplate() {
    return `CREATE TABLE table_name$1(  
              id INT NOT NULL PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
              create_time DATE,
              update_time DATE,
              content VARCHAR(255)
            );`;
  }

  processList() {
    return `SELECT JOB_NAME, 
                   AUTHORIZATION_NAME, 
                   TOTAL_CPU_TIME, 
                   TOTAL_DISK_IO_COUNT, 
                   TOTAL_MEMORY_USAGE 
            FROM QSYS2.ACTIVE_JOB_INFO 
            ORDER BY TOTAL_CPU_TIME DESC;`;
  }
};
cweijan commented 1 month ago

Thanks for your contribution, I added Db2 for i (AS400) dialect for JDBC in version 7.5.5, but since I can't install AS400, please check if it works.

image