mirror of
https://github.com/Fabio286/antares.git
synced 2025-06-05 21:59:22 +02:00
Improvements
This commit is contained in:
99
package-lock.json
generated
99
package-lock.json
generated
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "antares",
|
"name": "antares",
|
||||||
"version": "0.0.0",
|
"version": "0.0.0-alpha",
|
||||||
"lockfileVersion": 1,
|
"lockfileVersion": 1,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
@ -1656,11 +1656,6 @@
|
|||||||
"color-convert": "^2.0.1"
|
"color-convert": "^2.0.1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"ansicolors": {
|
|
||||||
"version": "0.3.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz",
|
|
||||||
"integrity": "sha1-ZlWX3oap/+Oqm/vmyuXG6kJrSXk="
|
|
||||||
},
|
|
||||||
"anymatch": {
|
"anymatch": {
|
||||||
"version": "2.0.0",
|
"version": "2.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz",
|
||||||
@ -2769,15 +2764,6 @@
|
|||||||
"integrity": "sha512-g1iSHKVxornw0K8LG9LLdf+Fxnv7T1Z+mMsf0/YYLclQX4Cd522Ap0Lrw6NFqHgezit78dtyWxzlV2Xfc7vgRg==",
|
"integrity": "sha512-g1iSHKVxornw0K8LG9LLdf+Fxnv7T1Z+mMsf0/YYLclQX4Cd522Ap0Lrw6NFqHgezit78dtyWxzlV2Xfc7vgRg==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"cardinal": {
|
|
||||||
"version": "2.1.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/cardinal/-/cardinal-2.1.1.tgz",
|
|
||||||
"integrity": "sha1-fMEFXYItISlU0HsIXeolHMe8VQU=",
|
|
||||||
"requires": {
|
|
||||||
"ansicolors": "~0.3.2",
|
|
||||||
"redeyed": "~2.1.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"caseless": {
|
"caseless": {
|
||||||
"version": "0.12.0",
|
"version": "0.12.0",
|
||||||
"resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
|
"resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
|
||||||
@ -3782,11 +3768,6 @@
|
|||||||
"integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=",
|
"integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"denque": {
|
|
||||||
"version": "1.4.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/denque/-/denque-1.4.1.tgz",
|
|
||||||
"integrity": "sha512-OfzPuSZKGcgr96rf1oODnfjqBFmr1DVoc/TrItj3Ohe0Ah1C5WX5Baquw/9U9KovnQ88EqmJbD66rKYUQYN1tQ=="
|
|
||||||
},
|
|
||||||
"depd": {
|
"depd": {
|
||||||
"version": "1.1.2",
|
"version": "1.1.2",
|
||||||
"resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
|
"resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
|
||||||
@ -6384,14 +6365,6 @@
|
|||||||
"globule": "^1.0.0"
|
"globule": "^1.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"generate-function": {
|
|
||||||
"version": "2.3.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz",
|
|
||||||
"integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==",
|
|
||||||
"requires": {
|
|
||||||
"is-property": "^1.0.2"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"gensync": {
|
"gensync": {
|
||||||
"version": "1.0.0-beta.1",
|
"version": "1.0.0-beta.1",
|
||||||
"resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz",
|
"resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz",
|
||||||
@ -7512,11 +7485,6 @@
|
|||||||
"isobject": "^3.0.1"
|
"isobject": "^3.0.1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"is-property": {
|
|
||||||
"version": "1.0.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz",
|
|
||||||
"integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ="
|
|
||||||
},
|
|
||||||
"is-regex": {
|
"is-regex": {
|
||||||
"version": "1.0.5",
|
"version": "1.0.5",
|
||||||
"resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz",
|
"resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz",
|
||||||
@ -7991,11 +7959,6 @@
|
|||||||
"integrity": "sha512-bsU7+gc9AJ2SqpzxwU3+1fedl8zAntbtC5XYlt3s2j1hJcn2PsXSmgN8TaLG/J1/2mod4+cE/3vNL70/c1RNCA==",
|
"integrity": "sha512-bsU7+gc9AJ2SqpzxwU3+1fedl8zAntbtC5XYlt3s2j1hJcn2PsXSmgN8TaLG/J1/2mod4+cE/3vNL70/c1RNCA==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"long": {
|
|
||||||
"version": "4.0.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz",
|
|
||||||
"integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA=="
|
|
||||||
},
|
|
||||||
"longest": {
|
"longest": {
|
||||||
"version": "1.0.1",
|
"version": "1.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz",
|
||||||
@ -8057,6 +8020,7 @@
|
|||||||
"version": "5.1.1",
|
"version": "5.1.1",
|
||||||
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
|
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
|
||||||
"integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
|
"integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
|
||||||
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"yallist": "^3.0.2"
|
"yallist": "^3.0.2"
|
||||||
}
|
}
|
||||||
@ -8573,46 +8537,6 @@
|
|||||||
"sqlstring": "2.3.1"
|
"sqlstring": "2.3.1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"mysql2": {
|
|
||||||
"version": "2.1.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/mysql2/-/mysql2-2.1.0.tgz",
|
|
||||||
"integrity": "sha512-9kGVyi930rG2KaHrz3sHwtc6K+GY9d8wWk1XRSYxQiunvGcn4DwuZxOwmK11ftuhhwrYDwGx9Ta4VBwznJn36A==",
|
|
||||||
"requires": {
|
|
||||||
"cardinal": "^2.1.1",
|
|
||||||
"denque": "^1.4.1",
|
|
||||||
"generate-function": "^2.3.1",
|
|
||||||
"iconv-lite": "^0.5.0",
|
|
||||||
"long": "^4.0.0",
|
|
||||||
"lru-cache": "^5.1.1",
|
|
||||||
"named-placeholders": "^1.1.2",
|
|
||||||
"seq-queue": "^0.0.5",
|
|
||||||
"sqlstring": "^2.3.1"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"named-placeholders": {
|
|
||||||
"version": "1.1.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.2.tgz",
|
|
||||||
"integrity": "sha512-wiFWqxoLL3PGVReSZpjLVxyJ1bRqe+KKJVbr4hGs1KWfTZTQyezHFBbuKj9hsizHyGV2ne7EMjHdxEGAybD5SA==",
|
|
||||||
"requires": {
|
|
||||||
"lru-cache": "^4.1.3"
|
|
||||||
},
|
|
||||||
"dependencies": {
|
|
||||||
"lru-cache": {
|
|
||||||
"version": "4.1.5",
|
|
||||||
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz",
|
|
||||||
"integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==",
|
|
||||||
"requires": {
|
|
||||||
"pseudomap": "^1.0.2",
|
|
||||||
"yallist": "^2.1.2"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"yallist": {
|
|
||||||
"version": "2.1.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
|
|
||||||
"integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI="
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"nan": {
|
"nan": {
|
||||||
"version": "2.14.1",
|
"version": "2.14.1",
|
||||||
"resolved": "https://registry.npmjs.org/nan/-/nan-2.14.1.tgz",
|
"resolved": "https://registry.npmjs.org/nan/-/nan-2.14.1.tgz",
|
||||||
@ -9960,7 +9884,8 @@
|
|||||||
"pseudomap": {
|
"pseudomap": {
|
||||||
"version": "1.0.2",
|
"version": "1.0.2",
|
||||||
"resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
|
||||||
"integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM="
|
"integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=",
|
||||||
|
"dev": true
|
||||||
},
|
},
|
||||||
"psl": {
|
"psl": {
|
||||||
"version": "1.8.0",
|
"version": "1.8.0",
|
||||||
@ -10285,14 +10210,6 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"redeyed": {
|
|
||||||
"version": "2.1.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/redeyed/-/redeyed-2.1.1.tgz",
|
|
||||||
"integrity": "sha1-iYS1gV2ZyyIEacme7v/jiRPmzAs=",
|
|
||||||
"requires": {
|
|
||||||
"esprima": "~4.0.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"regenerate": {
|
"regenerate": {
|
||||||
"version": "1.4.0",
|
"version": "1.4.0",
|
||||||
"resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz",
|
"resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz",
|
||||||
@ -11068,11 +10985,6 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"seq-queue": {
|
|
||||||
"version": "0.0.5",
|
|
||||||
"resolved": "https://registry.npmjs.org/seq-queue/-/seq-queue-0.0.5.tgz",
|
|
||||||
"integrity": "sha1-1WgS4cAXpuTnw+Ojeh2m143TyT4="
|
|
||||||
},
|
|
||||||
"serialize-error": {
|
"serialize-error": {
|
||||||
"version": "5.0.0",
|
"version": "5.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-5.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-5.0.0.tgz",
|
||||||
@ -13786,7 +13698,8 @@
|
|||||||
"yallist": {
|
"yallist": {
|
||||||
"version": "3.1.1",
|
"version": "3.1.1",
|
||||||
"resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
|
"resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
|
||||||
"integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="
|
"integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
|
||||||
|
"dev": true
|
||||||
},
|
},
|
||||||
"yargs": {
|
"yargs": {
|
||||||
"version": "15.3.1",
|
"version": "15.3.1",
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "antares",
|
"name": "antares",
|
||||||
"productName": "Antares",
|
"productName": "Antares",
|
||||||
"version": "0.0.0",
|
"version": "0.0.0-alpha",
|
||||||
"description": "A cross-platform easy to use SQL client.",
|
"description": "A cross-platform easy to use SQL client.",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"repository": "https://github.com/Fabio286/antares.git",
|
"repository": "https://github.com/Fabio286/antares.git",
|
||||||
@ -35,7 +35,6 @@
|
|||||||
"material-design-icons": "^3.0.1",
|
"material-design-icons": "^3.0.1",
|
||||||
"mssql": "^6.2.0",
|
"mssql": "^6.2.0",
|
||||||
"mysql": "^2.18.1",
|
"mysql": "^2.18.1",
|
||||||
"mysql2": "^2.1.0",
|
|
||||||
"pg": "^8.2.1",
|
"pg": "^8.2.1",
|
||||||
"source-map-support": "^0.5.16",
|
"source-map-support": "^0.5.16",
|
||||||
"spectre.css": "^0.5.8",
|
"spectre.css": "^0.5.8",
|
||||||
|
@ -2,6 +2,8 @@ import { ipcMain } from 'electron';
|
|||||||
import InformationSchema from '../models/InformationSchema';
|
import InformationSchema from '../models/InformationSchema';
|
||||||
import Generic from '../models/Generic';
|
import Generic from '../models/Generic';
|
||||||
|
|
||||||
|
// TODO: remap objects based on client
|
||||||
|
|
||||||
export default (connections) => {
|
export default (connections) => {
|
||||||
ipcMain.handle('getTableColumns', async (event, { uid, schema, table }) => {
|
ipcMain.handle('getTableColumns', async (event, { uid, schema, table }) => {
|
||||||
try {
|
try {
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
import mysql from 'mysql2';
|
import mysql from 'mysql';
|
||||||
import mssql from 'mssql';
|
import mssql from 'mssql';
|
||||||
|
// import pg from 'pg'; TODO: PostgreSQL
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* As Simple As Possible Query Builder
|
* As Simple As Possible Query Builder
|
||||||
@ -56,6 +57,11 @@ export class AntaresConnector {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Resets the query object after a query
|
||||||
|
*
|
||||||
|
* @memberof AntaresConnector
|
||||||
|
*/
|
||||||
_resetQuery () {
|
_resetQuery () {
|
||||||
this._query = Object.assign({}, this._queryDefaults);
|
this._query = Object.assign({}, this._queryDefaults);
|
||||||
}
|
}
|
||||||
@ -71,10 +77,10 @@ export class AntaresConnector {
|
|||||||
const connection = mysql.createConnection(this._params);
|
const connection = mysql.createConnection(this._params);
|
||||||
this._connection = connection.promise();
|
this._connection = connection.promise();
|
||||||
}
|
}
|
||||||
else {
|
else
|
||||||
const pool = mysql.createPool({ ...this._params, connectionLimit: this._poolSize });
|
this._connection = mysql.createPool({ ...this._params, connectionLimit: this._poolSize });
|
||||||
this._connection = pool.promise();
|
// this._connection = pool.promise();
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case 'mssql': {
|
case 'mssql': {
|
||||||
const mssqlParams = {
|
const mssqlParams = {
|
||||||
@ -125,11 +131,30 @@ export class AntaresConnector {
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
use (schema) {
|
||||||
|
let sql;
|
||||||
|
|
||||||
|
switch (this._client) {
|
||||||
|
case 'maria':
|
||||||
|
case 'mysql':
|
||||||
|
sql = `USE \`${schema}\``;
|
||||||
|
break;
|
||||||
|
case 'mssql':
|
||||||
|
sql = `USE "${schema}"`;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return this.raw(sql);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @returns {string} SQL string
|
* @returns {string} SQL string
|
||||||
* @memberof AntaresConnector
|
* @memberof AntaresConnector
|
||||||
*/
|
*/
|
||||||
getSQL () {
|
getSQL () {
|
||||||
|
// SELECT
|
||||||
const selectArray = this._query.select.reduce(this._reducer, []);
|
const selectArray = this._query.select.reduce(this._reducer, []);
|
||||||
let selectRaw;
|
let selectRaw;
|
||||||
switch (this._client) {
|
switch (this._client) {
|
||||||
@ -146,6 +171,7 @@ export class AntaresConnector {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// FROM
|
||||||
let fromRaw;
|
let fromRaw;
|
||||||
switch (this._client) {
|
switch (this._client) {
|
||||||
case 'maria':
|
case 'maria':
|
||||||
@ -166,6 +192,7 @@ export class AntaresConnector {
|
|||||||
const orderByArray = this._query.orderBy.reduce(this._reducer, []);
|
const orderByArray = this._query.orderBy.reduce(this._reducer, []);
|
||||||
const orderByRaw = orderByArray.length ? `ORDER BY ${orderByArray.join(', ')} ` : '';
|
const orderByRaw = orderByArray.length ? `ORDER BY ${orderByArray.join(', ')} ` : '';
|
||||||
|
|
||||||
|
// LIMIT
|
||||||
let limitRaw;
|
let limitRaw;
|
||||||
switch (this._client) {
|
switch (this._client) {
|
||||||
case 'maria':
|
case 'maria':
|
||||||
@ -188,7 +215,6 @@ export class AntaresConnector {
|
|||||||
*/
|
*/
|
||||||
async run () {
|
async run () {
|
||||||
const rawQuery = this.getSQL();
|
const rawQuery = this.getSQL();
|
||||||
if (process.env.NODE_ENV === 'development') console.log(rawQuery);
|
|
||||||
this._resetQuery();
|
this._resetQuery();
|
||||||
return this.raw(rawQuery);
|
return this.raw(rawQuery);
|
||||||
}
|
}
|
||||||
@ -199,15 +225,24 @@ export class AntaresConnector {
|
|||||||
* @memberof AntaresConnector
|
* @memberof AntaresConnector
|
||||||
*/
|
*/
|
||||||
async raw (sql) {
|
async raw (sql) {
|
||||||
|
if (process.env.NODE_ENV === 'development') console.log(sql);
|
||||||
|
|
||||||
switch (this._client) {
|
switch (this._client) {
|
||||||
case 'maria':
|
case 'maria':
|
||||||
case 'mysql': {
|
case 'mysql': {
|
||||||
const [rows, fields] = await this._connection.query(sql);
|
const { rows, fields } = await new Promise((resolve, reject) => {
|
||||||
|
this._connection.query(sql, (err, rows, fields) => {
|
||||||
|
if (err)
|
||||||
|
reject(err);
|
||||||
|
else
|
||||||
|
resolve({ rows, fields });
|
||||||
|
});
|
||||||
|
});
|
||||||
return { rows, fields };
|
return { rows, fields };
|
||||||
}
|
}
|
||||||
case 'mssql': {
|
case 'mssql': {
|
||||||
const results = await this._connection.request().query(sql);
|
const results = await this._connection.request().query(sql);
|
||||||
return { rows: results.recordsets[0] };
|
return { rows: results.recordsets[0] };// TODO: fields
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
@ -1,7 +1,14 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
export default class {
|
export default class {
|
||||||
static async raw (connection, query, schema) {
|
static async raw (connection, query, schema) {
|
||||||
if (schema) await connection.raw(`USE \`${schema}\``);
|
if (schema) {
|
||||||
|
try {
|
||||||
|
await connection.use(schema);
|
||||||
|
}
|
||||||
|
catch (err) {
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
}
|
||||||
return connection.raw(query);
|
return connection.raw(query);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -145,10 +145,6 @@ export default {
|
|||||||
width: auto;
|
width: auto;
|
||||||
border-collapse: separate;
|
border-collapse: separate;
|
||||||
|
|
||||||
.tr:focus{
|
|
||||||
background: rgba($color: #000000, $alpha: .3);
|
|
||||||
}
|
|
||||||
|
|
||||||
.th{
|
.th{
|
||||||
position: sticky;
|
position: sticky;
|
||||||
top: 0;
|
top: 0;
|
||||||
@ -171,6 +167,12 @@ export default {
|
|||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
font-size: .7rem;
|
font-size: .7rem;
|
||||||
|
|
||||||
|
&:focus{
|
||||||
|
box-shadow:inset 0px 0px 0px 1px $body-font-color;
|
||||||
|
background: rgba($color: #000000, $alpha: .3);
|
||||||
|
outline: none;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -13,10 +13,10 @@
|
|||||||
<span>{{ $t('word.run') }}</span>
|
<span>{{ $t('word.run') }}</span>
|
||||||
<i class="material-icons text-success">play_arrow</i>
|
<i class="material-icons text-success">play_arrow</i>
|
||||||
</button>
|
</button>
|
||||||
<button class="btn btn-link btn-sm">
|
<!-- <button class="btn btn-link btn-sm">
|
||||||
<span>{{ $t('word.save') }}</span>
|
<span>{{ $t('word.save') }}</span>
|
||||||
<i class="material-icons ml-1">save</i>
|
<i class="material-icons ml-1">save</i>
|
||||||
</button>
|
</button> -->
|
||||||
</div>
|
</div>
|
||||||
<div class="workspace-query-info">
|
<div class="workspace-query-info">
|
||||||
<div v-if="results.rows">
|
<div v-if="results.rows">
|
||||||
@ -29,7 +29,11 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="workspace-query-results column col-12">
|
<div class="workspace-query-results column col-12">
|
||||||
<WorkspaceQueryTable v-if="results" :results="results" />
|
<WorkspaceQueryTable
|
||||||
|
v-if="results"
|
||||||
|
:results="results"
|
||||||
|
:fields="resultsFields"
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
@ -62,6 +66,11 @@ export default {
|
|||||||
}),
|
}),
|
||||||
workspace () {
|
workspace () {
|
||||||
return this.getWorkspace(this.connection.uid);
|
return this.getWorkspace(this.connection.uid);
|
||||||
|
},
|
||||||
|
resultsFields () {
|
||||||
|
return this.results.rows && this.results.rows.length ? Object.keys(this.results.rows[0]).map(field => {
|
||||||
|
return { name: field, key: '', type: '' }; // TODO: extract getting table name from query
|
||||||
|
}) : [];
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
@ -73,13 +82,13 @@ export default {
|
|||||||
this.isQuering = true;
|
this.isQuering = true;
|
||||||
this.results = {};
|
this.results = {};
|
||||||
|
|
||||||
const params = {
|
|
||||||
uid: this.connection.uid,
|
|
||||||
query: this.query,
|
|
||||||
schema: this.workspace.breadcrumbs.schema
|
|
||||||
};
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
const params = {
|
||||||
|
uid: this.connection.uid,
|
||||||
|
query: this.query,
|
||||||
|
schema: this.workspace.breadcrumbs.schema
|
||||||
|
};
|
||||||
|
|
||||||
const { status, response } = await Connection.rawQuery(params);
|
const { status, response } = await Connection.rawQuery(params);
|
||||||
if (status === 'success')
|
if (status === 'success')
|
||||||
this.results = response;
|
this.results = response;
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
<BaseVirtualScroll
|
<BaseVirtualScroll
|
||||||
v-if="results.rows"
|
v-if="results.rows"
|
||||||
ref="resultTable"
|
ref="resultTable"
|
||||||
:items="rows"
|
:items="localResults"
|
||||||
:item-height="25"
|
:item-height="25"
|
||||||
class="vscroll"
|
class="vscroll"
|
||||||
:style="{'height': resultsSize+'px'}"
|
:style="{'height': resultsSize+'px'}"
|
||||||
@ -12,11 +12,19 @@
|
|||||||
<div class="thead">
|
<div class="thead">
|
||||||
<div class="tr">
|
<div class="tr">
|
||||||
<div
|
<div
|
||||||
v-for="field in results.fields"
|
v-for="field in fields"
|
||||||
:key="field.name"
|
:key="field.name"
|
||||||
class="th"
|
class="th"
|
||||||
>
|
>
|
||||||
{{ field.name }}
|
<div class="table-column-title">
|
||||||
|
<i
|
||||||
|
v-if="field.key"
|
||||||
|
class="material-icons column-key c-help"
|
||||||
|
:class="`key-${field.key}`"
|
||||||
|
:title="keyName(field.key)"
|
||||||
|
>vpn_key</i>
|
||||||
|
<span>{{ field.name }}</span>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -25,7 +33,6 @@
|
|||||||
v-for="row in items"
|
v-for="row in items"
|
||||||
:key="row._id"
|
:key="row._id"
|
||||||
class="tr"
|
class="tr"
|
||||||
tabindex="0"
|
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
v-for="(col, cKey) in row"
|
v-for="(col, cKey) in row"
|
||||||
@ -33,6 +40,7 @@
|
|||||||
class="td"
|
class="td"
|
||||||
:class="fieldType(col)"
|
:class="fieldType(col)"
|
||||||
:style="{'display': cKey === '_id'? 'none' : ''}"
|
:style="{'display': cKey === '_id'? 'none' : ''}"
|
||||||
|
tabindex="0"
|
||||||
>
|
>
|
||||||
{{ col }}
|
{{ col }}
|
||||||
</div>
|
</div>
|
||||||
@ -53,16 +61,18 @@ export default {
|
|||||||
BaseVirtualScroll
|
BaseVirtualScroll
|
||||||
},
|
},
|
||||||
props: {
|
props: {
|
||||||
results: Object
|
results: Object,
|
||||||
|
fields: Array
|
||||||
},
|
},
|
||||||
data () {
|
data () {
|
||||||
return {
|
return {
|
||||||
resultsSize: 1000
|
resultsSize: 1000,
|
||||||
|
localResults: []
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
computed: {
|
watch: {
|
||||||
rows () { // Adds uid to rows
|
results () {
|
||||||
return this.results.rows ? this.results.rows.map(item => {
|
this.localResults = this.results.rows ? this.results.rows.map(item => {
|
||||||
return { ...item, _id: uidGen() };
|
return { ...item, _id: uidGen() };
|
||||||
}) : [];
|
}) : [];
|
||||||
}
|
}
|
||||||
@ -78,7 +88,7 @@ export default {
|
|||||||
window.removeEventListener('resize', this.resizeResults);
|
window.removeEventListener('resize', this.resizeResults);
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
fieldType (col) {
|
fieldType (col) { // TODO: get from fields
|
||||||
let type = typeof col;
|
let type = typeof col;
|
||||||
if (type === 'object')
|
if (type === 'object')
|
||||||
if (col instanceof Date) type = 'date';
|
if (col instanceof Date) type = 'date';
|
||||||
@ -87,6 +97,18 @@ export default {
|
|||||||
|
|
||||||
return `type-${type}`;
|
return `type-${type}`;
|
||||||
},
|
},
|
||||||
|
keyName (key) {
|
||||||
|
switch (key) {
|
||||||
|
case 'pri':
|
||||||
|
return 'PRIMARY';
|
||||||
|
case 'uni':
|
||||||
|
return 'UNIQUE';
|
||||||
|
case 'mul':
|
||||||
|
return 'INDEX';
|
||||||
|
default:
|
||||||
|
return 'UNKNOWN ' + key;
|
||||||
|
}
|
||||||
|
},
|
||||||
resizeResults (e) {
|
resizeResults (e) {
|
||||||
if (this.$refs.resultTable) {
|
if (this.$refs.resultTable) {
|
||||||
const el = this.$refs.resultTable.$el;
|
const el = this.$refs.resultTable.$el;
|
||||||
@ -102,10 +124,34 @@ export default {
|
|||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style>
|
<style lang="scss">
|
||||||
.vscroll {
|
.vscroll {
|
||||||
height: 1000px;
|
height: 1000px;
|
||||||
overflow: auto;
|
overflow: auto;
|
||||||
overflow-anchor: none;
|
overflow-anchor: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.table-column-title{
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.column-key{
|
||||||
|
transform: rotate(90deg);
|
||||||
|
font-size: .7rem;
|
||||||
|
line-height: 1.5;
|
||||||
|
margin-right: .2rem;
|
||||||
|
|
||||||
|
&.key-pri{
|
||||||
|
color: goldenrod;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.key-uni{
|
||||||
|
color: deepskyblue;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.key-mul{
|
||||||
|
color: palegreen;
|
||||||
|
}
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
@ -11,10 +11,10 @@
|
|||||||
<span>{{ $t('word.refresh') }}</span>
|
<span>{{ $t('word.refresh') }}</span>
|
||||||
<i class="material-icons ml-1">refresh</i>
|
<i class="material-icons ml-1">refresh</i>
|
||||||
</button>
|
</button>
|
||||||
<button class="btn btn-link btn-sm">
|
<!-- <button class="btn btn-link btn-sm">
|
||||||
<span>{{ $t('word.save') }}</span>
|
<span>{{ $t('word.save') }}</span>
|
||||||
<i class="material-icons ml-1">save</i>
|
<i class="material-icons ml-1">save</i>
|
||||||
</button>
|
</button> -->
|
||||||
</div>
|
</div>
|
||||||
<div class="workspace-query-info">
|
<div class="workspace-query-info">
|
||||||
<div v-if="results.rows">
|
<div v-if="results.rows">
|
||||||
@ -27,7 +27,11 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="workspace-query-results column col-12">
|
<div class="workspace-query-results column col-12">
|
||||||
<WorkspaceQueryTable v-if="results" :results="results" />
|
<WorkspaceQueryTable
|
||||||
|
v-if="results"
|
||||||
|
:results="results"
|
||||||
|
:fields="resultsFields"
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
@ -50,7 +54,7 @@ export default {
|
|||||||
return {
|
return {
|
||||||
isQuering: false,
|
isQuering: false,
|
||||||
results: {},
|
results: {},
|
||||||
fields: {},
|
fields: [],
|
||||||
lastTable: null
|
lastTable: null
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
@ -63,6 +67,15 @@ export default {
|
|||||||
},
|
},
|
||||||
isSelected () {
|
isSelected () {
|
||||||
return this.workspace.selected_tab === 1;
|
return this.workspace.selected_tab === 1;
|
||||||
|
},
|
||||||
|
resultsFields () {
|
||||||
|
return this.fields.map(field => { // TODO: move to main process
|
||||||
|
return {
|
||||||
|
name: field.COLUMN_NAME,
|
||||||
|
key: field.COLUMN_KEY.toLowerCase(),
|
||||||
|
type: field.DATA_TYPE
|
||||||
|
};
|
||||||
|
});
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
watch: {
|
watch: {
|
||||||
@ -110,7 +123,7 @@ export default {
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
const { status, response } = await Structure.getTableData(params);
|
const { status, response } = await Structure.getTableData(params);
|
||||||
console.log(status, response);
|
|
||||||
if (status === 'success')
|
if (status === 'success')
|
||||||
this.results = response;
|
this.results = response;
|
||||||
else
|
else
|
||||||
|
@ -32,6 +32,10 @@ body{
|
|||||||
align-items: center;
|
align-items: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.c-help{
|
||||||
|
cursor: help;
|
||||||
|
}
|
||||||
|
|
||||||
// Scrollbars
|
// Scrollbars
|
||||||
::-webkit-scrollbar {
|
::-webkit-scrollbar {
|
||||||
width: 10px;
|
width: 10px;
|
||||||
|
Reference in New Issue
Block a user